xref: /aosp_15_r20/tools/treble/hacksaw/workspace/compose_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, Ve
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 workspace
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/bind"
25*105f6285SAndroid Build Coastguard Worker)
26*105f6285SAndroid Build Coastguard Worker
27*105f6285SAndroid Build Coastguard Workerfunc TestBasicCompose(t *testing.T) {
28*105f6285SAndroid Build Coastguard Worker	var err error
29*105f6285SAndroid Build Coastguard Worker	var codebaseDir string
30*105f6285SAndroid Build Coastguard Worker	if codebaseDir, err = ioutil.TempDir("", "codebase"); err != nil {
31*105f6285SAndroid Build Coastguard Worker		t.Error(err)
32*105f6285SAndroid Build Coastguard Worker	}
33*105f6285SAndroid Build Coastguard Worker	defer os.RemoveAll(codebaseDir)
34*105f6285SAndroid Build Coastguard Worker	gitDir := path.Join(codebaseDir, "project", ".git")
35*105f6285SAndroid Build Coastguard Worker	if err = os.MkdirAll(gitDir, os.ModePerm); err != nil {
36*105f6285SAndroid Build Coastguard Worker		t.Error(err)
37*105f6285SAndroid Build Coastguard Worker	}
38*105f6285SAndroid Build Coastguard Worker	repoDir := path.Join(codebaseDir, ".repo")
39*105f6285SAndroid Build Coastguard Worker	if err = os.Mkdir(repoDir, os.ModePerm); err != nil {
40*105f6285SAndroid Build Coastguard Worker		t.Error(err)
41*105f6285SAndroid Build Coastguard Worker	}
42*105f6285SAndroid Build Coastguard Worker	listContents := []byte("project")
43*105f6285SAndroid Build Coastguard Worker	listPath := path.Join(repoDir, "project.list")
44*105f6285SAndroid Build Coastguard Worker	if err = ioutil.WriteFile(listPath, listContents, os.ModePerm); err != nil {
45*105f6285SAndroid Build Coastguard Worker		t.Error(err)
46*105f6285SAndroid Build Coastguard Worker	}
47*105f6285SAndroid Build Coastguard Worker	var wsTempDir string
48*105f6285SAndroid Build Coastguard Worker	if wsTempDir, err = ioutil.TempDir("", "workspace"); err != nil {
49*105f6285SAndroid Build Coastguard Worker		t.Error(err)
50*105f6285SAndroid Build Coastguard Worker	}
51*105f6285SAndroid Build Coastguard Worker	defer os.RemoveAll(wsTempDir)
52*105f6285SAndroid Build Coastguard Worker	wsTopDir := path.Join(wsTempDir, "hacksaw")
53*105f6285SAndroid Build Coastguard Worker	if err = os.Mkdir(wsTopDir, os.ModePerm); err != nil {
54*105f6285SAndroid Build Coastguard Worker		t.Error(err)
55*105f6285SAndroid Build Coastguard Worker	}
56*105f6285SAndroid Build Coastguard Worker	fakePathBinder := bind.NewFakePathBinder()
57*105f6285SAndroid Build Coastguard Worker	wsComposer := NewComposer(fakePathBinder)
58*105f6285SAndroid Build Coastguard Worker	list, err := wsComposer.Compose(codebaseDir, wsTopDir)
59*105f6285SAndroid Build Coastguard Worker	if err != nil {
60*105f6285SAndroid Build Coastguard Worker		t.Error(err)
61*105f6285SAndroid Build Coastguard Worker	}
62*105f6285SAndroid Build Coastguard Worker	expectedList := []string{
63*105f6285SAndroid Build Coastguard Worker		path.Join(wsTopDir, ".repo"),
64*105f6285SAndroid Build Coastguard Worker		path.Join(wsTopDir, "project"),
65*105f6285SAndroid Build Coastguard Worker	}
66*105f6285SAndroid Build Coastguard Worker	if !reflect.DeepEqual(expectedList, list) {
67*105f6285SAndroid Build Coastguard Worker		t.Errorf("Expected a list of binds %v and got %v", expectedList, list)
68*105f6285SAndroid Build Coastguard Worker	}
69*105f6285SAndroid Build Coastguard Worker	list, err = wsComposer.Dismantle(wsTopDir)
70*105f6285SAndroid Build Coastguard Worker	if err != nil {
71*105f6285SAndroid Build Coastguard Worker		t.Error(err)
72*105f6285SAndroid Build Coastguard Worker	}
73*105f6285SAndroid Build Coastguard Worker	expectedList = []string{
74*105f6285SAndroid Build Coastguard Worker		path.Join(wsTopDir, "project"),
75*105f6285SAndroid Build Coastguard Worker		path.Join(wsTopDir, ".repo"),
76*105f6285SAndroid Build Coastguard Worker	}
77*105f6285SAndroid Build Coastguard Worker	if !reflect.DeepEqual(expectedList, list) {
78*105f6285SAndroid Build Coastguard Worker		t.Errorf("Expected a list of unbinds %v and got %v", expectedList, list)
79*105f6285SAndroid Build Coastguard Worker	}
80*105f6285SAndroid Build Coastguard Worker}
81*105f6285SAndroid Build Coastguard Worker
82*105f6285SAndroid Build Coastguard Workerconst projectListContents = `project2/subprojectb
83*105f6285SAndroid Build Coastguard Workerproject1
84*105f6285SAndroid Build Coastguard Workerproject2
85*105f6285SAndroid Build Coastguard Workerproject1/subprojecta`
86*105f6285SAndroid Build Coastguard Worker
87*105f6285SAndroid Build Coastguard Workerfunc TestBindOrder(t *testing.T) {
88*105f6285SAndroid Build Coastguard Worker	var err error
89*105f6285SAndroid Build Coastguard Worker	var codebaseDir string
90*105f6285SAndroid Build Coastguard Worker	if codebaseDir, err = ioutil.TempDir("", "codebase"); err != nil {
91*105f6285SAndroid Build Coastguard Worker		t.Error(err)
92*105f6285SAndroid Build Coastguard Worker	}
93*105f6285SAndroid Build Coastguard Worker	defer os.RemoveAll(codebaseDir)
94*105f6285SAndroid Build Coastguard Worker	project2Git := path.Join(codebaseDir, "project2", ".git")
95*105f6285SAndroid Build Coastguard Worker	if err = os.MkdirAll(project2Git, os.ModePerm); err != nil {
96*105f6285SAndroid Build Coastguard Worker		t.Error(err)
97*105f6285SAndroid Build Coastguard Worker	}
98*105f6285SAndroid Build Coastguard Worker	project1Git := path.Join(codebaseDir, "project1", ".git")
99*105f6285SAndroid Build Coastguard Worker	if err = os.MkdirAll(project1Git, os.ModePerm); err != nil {
100*105f6285SAndroid Build Coastguard Worker		t.Error(err)
101*105f6285SAndroid Build Coastguard Worker	}
102*105f6285SAndroid Build Coastguard Worker	subProjectAGit := path.Join(codebaseDir, "project1", "subprojecta", ".git")
103*105f6285SAndroid Build Coastguard Worker	if err = os.MkdirAll(subProjectAGit, os.ModePerm); err != nil {
104*105f6285SAndroid Build Coastguard Worker		t.Error(err)
105*105f6285SAndroid Build Coastguard Worker	}
106*105f6285SAndroid Build Coastguard Worker	subProjectBGit := path.Join(codebaseDir, "project2", "subprojectb", ".git")
107*105f6285SAndroid Build Coastguard Worker	if err = os.MkdirAll(subProjectBGit, os.ModePerm); err != nil {
108*105f6285SAndroid Build Coastguard Worker		t.Error(err)
109*105f6285SAndroid Build Coastguard Worker	}
110*105f6285SAndroid Build Coastguard Worker	repoDir := path.Join(codebaseDir, ".repo")
111*105f6285SAndroid Build Coastguard Worker	if err = os.Mkdir(repoDir, os.ModePerm); err != nil {
112*105f6285SAndroid Build Coastguard Worker		t.Error(err)
113*105f6285SAndroid Build Coastguard Worker	}
114*105f6285SAndroid Build Coastguard Worker	listContents := []byte(projectListContents)
115*105f6285SAndroid Build Coastguard Worker	listPath := path.Join(repoDir, "project.list")
116*105f6285SAndroid Build Coastguard Worker	if err = ioutil.WriteFile(listPath, listContents, os.ModePerm); err != nil {
117*105f6285SAndroid Build Coastguard Worker		t.Error(err)
118*105f6285SAndroid Build Coastguard Worker	}
119*105f6285SAndroid Build Coastguard Worker	var wsTempDir string
120*105f6285SAndroid Build Coastguard Worker	if wsTempDir, err = ioutil.TempDir("", "workspace"); err != nil {
121*105f6285SAndroid Build Coastguard Worker		t.Error(err)
122*105f6285SAndroid Build Coastguard Worker	}
123*105f6285SAndroid Build Coastguard Worker	defer os.RemoveAll(wsTempDir)
124*105f6285SAndroid Build Coastguard Worker	wsTopDir := path.Join(wsTempDir, "hacksaw")
125*105f6285SAndroid Build Coastguard Worker	if err = os.Mkdir(wsTopDir, os.ModePerm); err != nil {
126*105f6285SAndroid Build Coastguard Worker		t.Error(err)
127*105f6285SAndroid Build Coastguard Worker	}
128*105f6285SAndroid Build Coastguard Worker	fakePathBinder := bind.NewFakePathBinder()
129*105f6285SAndroid Build Coastguard Worker	wsComposer := NewComposer(fakePathBinder)
130*105f6285SAndroid Build Coastguard Worker	bindList, err := wsComposer.Compose(codebaseDir, wsTopDir)
131*105f6285SAndroid Build Coastguard Worker	if err != nil {
132*105f6285SAndroid Build Coastguard Worker		t.Error(err)
133*105f6285SAndroid Build Coastguard Worker	}
134*105f6285SAndroid Build Coastguard Worker	expectedList := []string{
135*105f6285SAndroid Build Coastguard Worker		path.Join(wsTopDir, ".repo"),
136*105f6285SAndroid Build Coastguard Worker		path.Join(wsTopDir, "project1"),
137*105f6285SAndroid Build Coastguard Worker		path.Join(wsTopDir, "project1", "subprojecta"),
138*105f6285SAndroid Build Coastguard Worker		path.Join(wsTopDir, "project2"),
139*105f6285SAndroid Build Coastguard Worker		path.Join(wsTopDir, "project2", "subprojectb"),
140*105f6285SAndroid Build Coastguard Worker	}
141*105f6285SAndroid Build Coastguard Worker	if !reflect.DeepEqual(expectedList, bindList) {
142*105f6285SAndroid Build Coastguard Worker		t.Errorf("Expected a list of binds %v and got %v", expectedList, bindList)
143*105f6285SAndroid Build Coastguard Worker	}
144*105f6285SAndroid Build Coastguard Worker	unbindList, err := wsComposer.Dismantle(wsTopDir)
145*105f6285SAndroid Build Coastguard Worker	if err != nil {
146*105f6285SAndroid Build Coastguard Worker		t.Error(err)
147*105f6285SAndroid Build Coastguard Worker	}
148*105f6285SAndroid Build Coastguard Worker	expectedList = []string{
149*105f6285SAndroid Build Coastguard Worker		path.Join(wsTopDir, "project2", "subprojectb"),
150*105f6285SAndroid Build Coastguard Worker		path.Join(wsTopDir, "project2"),
151*105f6285SAndroid Build Coastguard Worker		path.Join(wsTopDir, "project1", "subprojecta"),
152*105f6285SAndroid Build Coastguard Worker		path.Join(wsTopDir, "project1"),
153*105f6285SAndroid Build Coastguard Worker		path.Join(wsTopDir, ".repo"),
154*105f6285SAndroid Build Coastguard Worker	}
155*105f6285SAndroid Build Coastguard Worker	if !reflect.DeepEqual(expectedList, unbindList) {
156*105f6285SAndroid Build Coastguard Worker		t.Errorf("Expected a list of unbinds %v and got %v", expectedList, unbindList)
157*105f6285SAndroid Build Coastguard Worker	}
158*105f6285SAndroid Build Coastguard Worker}
159