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