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