1// Copyright 2020 Google LLC 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// https://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15package codebase 16 17import ( 18 "io/ioutil" 19 "os" 20 "path" 21 "reflect" 22 "testing" 23 24 "android.googlesource.com/platform/tools/treble.git/hacksaw/config" 25) 26 27func TestAdd(t *testing.T) { 28 defer config.GetConfig().Reset() 29 firstCodebaseDir, err := ioutil.TempDir("", "first") 30 if err != nil { 31 t.Error(err) 32 } 33 defer os.RemoveAll(firstCodebaseDir) 34 outputConfig, err := Add("first-codebase", firstCodebaseDir) 35 if err != nil { 36 t.Error(err) 37 } 38 expectedConfig := config.Config{ 39 DefaultCodebase: "", 40 Codebases: map[string]string{ 41 "first-codebase": firstCodebaseDir, 42 }, 43 Workspaces: map[string]string{}} 44 if !reflect.DeepEqual(expectedConfig, *outputConfig) { 45 t.Errorf("Expected config %v different than output config %v", 46 expectedConfig, *outputConfig) 47 } 48 49 secondCodebaseDir, err := ioutil.TempDir("", "second") 50 if err != nil { 51 t.Error(err) 52 } 53 defer os.RemoveAll(secondCodebaseDir) 54 if outputConfig, err = Add("second-codebase", secondCodebaseDir); err != nil { 55 t.Error(err) 56 } 57 expectedConfig = config.Config{ 58 DefaultCodebase: "", 59 Codebases: map[string]string{ 60 "first-codebase": firstCodebaseDir, 61 "second-codebase": secondCodebaseDir, 62 }, 63 Workspaces: map[string]string{}} 64 if !reflect.DeepEqual(expectedConfig, *outputConfig) { 65 t.Errorf("Expected config %v different than output config %v", 66 expectedConfig, *outputConfig) 67 } 68} 69 70func TestAddDuplicate(t *testing.T) { 71 defer config.GetConfig().Reset() 72 codebaseDir, err := ioutil.TempDir("", "first") 73 if err != nil { 74 t.Error(err) 75 } 76 defer os.RemoveAll(codebaseDir) 77 _, err = Add("codebase", codebaseDir) 78 if err != nil { 79 t.Error(err) 80 } 81 _, err = Add("codebase", codebaseDir) 82 if err == nil { 83 t.Error("Allowed duplicate codebase") 84 } 85} 86 87func TestAddInvalidCodebase(t *testing.T) { 88 defer config.GetConfig().Reset() 89 tempDir, err := ioutil.TempDir("", "codebase") 90 if err != nil { 91 t.Error(err) 92 } 93 defer os.RemoveAll(tempDir) 94 testCodebaseDir := path.Join(tempDir, "doesnotexist") 95 _, err = Add("test-codebase", testCodebaseDir) 96 if err == nil { 97 t.Error("Adding a codebase with an invalid directory should not be allowed") 98 } 99} 100 101func TestList(t *testing.T) { 102 defer config.GetConfig().Reset() 103 firstCodebaseDir, err := ioutil.TempDir("", "first") 104 if err != nil { 105 t.Error(err) 106 } 107 defer os.RemoveAll(firstCodebaseDir) 108 _, err = Add("first-codebase", firstCodebaseDir) 109 if err != nil { 110 t.Error(err) 111 } 112 secondCodebaseDir, err := ioutil.TempDir("", "second") 113 if err != nil { 114 t.Error(err) 115 } 116 defer os.RemoveAll(secondCodebaseDir) 117 if _, err = Add("second-codebase", secondCodebaseDir); err != nil { 118 t.Error(err) 119 } 120 list := List() 121 expectedList := map[string]string{ 122 "first-codebase": firstCodebaseDir, 123 "second-codebase": secondCodebaseDir, 124 } 125 if !reflect.DeepEqual(expectedList, list) { 126 t.Errorf("Codebase list %v is different than expected list %v", 127 list, expectedList) 128 } 129} 130 131func TestSetGetDefault(t *testing.T) { 132 defer config.GetConfig().Reset() 133 firstCodebaseDir, err := ioutil.TempDir("", "first") 134 if err != nil { 135 t.Error(err) 136 } 137 defer os.RemoveAll(firstCodebaseDir) 138 _, err = Add("first-codebase", firstCodebaseDir) 139 if err != nil { 140 t.Error(err) 141 } 142 secondCodebaseDir, err := ioutil.TempDir("", "second") 143 if err != nil { 144 t.Error(err) 145 } 146 defer os.RemoveAll(secondCodebaseDir) 147 _, err = Add("second-codebase", secondCodebaseDir) 148 if err != nil { 149 t.Error(err) 150 } 151 if err = SetDefault("second-codebase"); err != nil { 152 t.Error(err) 153 } 154 def := Default() 155 if def != "second-codebase" { 156 t.Error("Setting default codebase failed") 157 } 158} 159 160func TestBadDefault(t *testing.T) { 161 defer config.GetConfig().Reset() 162 testCodebaseDir, err := ioutil.TempDir("", "test") 163 if err != nil { 164 t.Error(err) 165 } 166 defer os.RemoveAll(testCodebaseDir) 167 _, err = Add("test-codebase", testCodebaseDir) 168 if err != nil { 169 t.Error(err) 170 } 171 if err = SetDefault("does-not-exist"); err == nil { 172 t.Error("Allowed invalid default codebase") 173 } 174} 175 176func TestRemove(t *testing.T) { 177 defer config.GetConfig().Reset() 178 testCodebaseDir, err := ioutil.TempDir("", "test") 179 if err != nil { 180 t.Error(err) 181 } 182 defer os.RemoveAll(testCodebaseDir) 183 _, err = Add("remove-me", testCodebaseDir) 184 if err != nil { 185 t.Error(err) 186 } 187 SetDefault("remove-me") 188 cfg, err := Remove("remove-me") 189 if err != nil { 190 t.Error(err) 191 } 192 _, ok := cfg.Codebases["remove-me"] 193 if ok { 194 t.Error("Removed codebase is still in the configuration") 195 } 196 if cfg.DefaultCodebase != "" { 197 t.Error("Removing the default codebase did not reset the default") 198 } 199} 200 201func TestBadRemove(t *testing.T) { 202 defer config.GetConfig().Reset() 203 testCodebaseDir, err := ioutil.TempDir("", "test") 204 if err != nil { 205 t.Error(err) 206 } 207 defer os.RemoveAll(testCodebaseDir) 208 _, err = Add("remove-me", testCodebaseDir) 209 if err != nil { 210 t.Error(err) 211 } 212 _, err = Remove("does-not-exist") 213 if err == nil { 214 t.Error("Attempt to remove an unexistant codebase", 215 "should have failed") 216 } 217} 218