xref: /aosp_15_r20/tools/treble/hacksaw/codebase/codebase_test.go (revision 105f628577ac4ba0e277a494fbb614ed8c12a994)
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