xref: /aosp_15_r20/tools/treble/hacksaw/workspace/copier_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 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	"testing"
22*105f6285SAndroid Build Coastguard Worker)
23*105f6285SAndroid Build Coastguard Worker
24*105f6285SAndroid Build Coastguard Workerfunc TestCopy(t *testing.T) {
25*105f6285SAndroid Build Coastguard Worker	// Setup codebase
26*105f6285SAndroid Build Coastguard Worker	codebaseDir, err := ioutil.TempDir("", "codebase")
27*105f6285SAndroid Build Coastguard Worker	if err != nil {
28*105f6285SAndroid Build Coastguard Worker		t.Error(err)
29*105f6285SAndroid Build Coastguard Worker	}
30*105f6285SAndroid Build Coastguard Worker	defer os.RemoveAll(codebaseDir)
31*105f6285SAndroid Build Coastguard Worker	project1GitDir := path.Join(codebaseDir, "project1", ".git")
32*105f6285SAndroid Build Coastguard Worker	if err = os.MkdirAll(project1GitDir, os.ModePerm); err != nil {
33*105f6285SAndroid Build Coastguard Worker		t.Error(err)
34*105f6285SAndroid Build Coastguard Worker	}
35*105f6285SAndroid Build Coastguard Worker	emptyBytes := []byte{}
36*105f6285SAndroid Build Coastguard Worker	project1File := path.Join(codebaseDir, "project1", "projectfile")
37*105f6285SAndroid Build Coastguard Worker	if err = ioutil.WriteFile(project1File, emptyBytes, os.ModePerm); err != nil {
38*105f6285SAndroid Build Coastguard Worker		t.Error(err)
39*105f6285SAndroid Build Coastguard Worker	}
40*105f6285SAndroid Build Coastguard Worker	symlink := path.Join(codebaseDir, "symlink")
41*105f6285SAndroid Build Coastguard Worker	if err = os.Symlink(path.Join(codebaseDir, "project1"), symlink); err != nil {
42*105f6285SAndroid Build Coastguard Worker		t.Error(err)
43*105f6285SAndroid Build Coastguard Worker	}
44*105f6285SAndroid Build Coastguard Worker	project2GitDir := path.Join(codebaseDir, "dirwithprojects", "project2", ".git")
45*105f6285SAndroid Build Coastguard Worker	if err = os.MkdirAll(project2GitDir, os.ModePerm); err != nil {
46*105f6285SAndroid Build Coastguard Worker		t.Error(err)
47*105f6285SAndroid Build Coastguard Worker	}
48*105f6285SAndroid Build Coastguard Worker	dirWithoutProjects := path.Join(codebaseDir, "dirwithoutprojects")
49*105f6285SAndroid Build Coastguard Worker	if err = os.Mkdir(dirWithoutProjects, os.ModePerm); err != nil {
50*105f6285SAndroid Build Coastguard Worker		t.Error(err)
51*105f6285SAndroid Build Coastguard Worker	}
52*105f6285SAndroid Build Coastguard Worker	projectSiblingFile := path.Join(codebaseDir, "dirwithprojects", "projectsiblingfile")
53*105f6285SAndroid Build Coastguard Worker	if err = ioutil.WriteFile(projectSiblingFile, emptyBytes, os.ModePerm); err != nil {
54*105f6285SAndroid Build Coastguard Worker		t.Error(err)
55*105f6285SAndroid Build Coastguard Worker	}
56*105f6285SAndroid Build Coastguard Worker	noProjectFile1 := path.Join(dirWithoutProjects, "noprojectfile1")
57*105f6285SAndroid Build Coastguard Worker	if err = ioutil.WriteFile(noProjectFile1, emptyBytes, os.ModePerm); err != nil {
58*105f6285SAndroid Build Coastguard Worker		t.Error(err)
59*105f6285SAndroid Build Coastguard Worker	}
60*105f6285SAndroid Build Coastguard Worker	noProjectFile2 := path.Join(dirWithoutProjects, "noprojectfile2")
61*105f6285SAndroid Build Coastguard Worker	if err = ioutil.WriteFile(noProjectFile2, emptyBytes, os.ModePerm); err != nil {
62*105f6285SAndroid Build Coastguard Worker		t.Error(err)
63*105f6285SAndroid Build Coastguard Worker	}
64*105f6285SAndroid Build Coastguard Worker	topFile := path.Join(codebaseDir, "topfile")
65*105f6285SAndroid Build Coastguard Worker	if err = ioutil.WriteFile(topFile, emptyBytes, os.ModePerm); err != nil {
66*105f6285SAndroid Build Coastguard Worker		t.Error(err)
67*105f6285SAndroid Build Coastguard Worker	}
68*105f6285SAndroid Build Coastguard Worker	gitProjects := []string{
69*105f6285SAndroid Build Coastguard Worker		"project1",
70*105f6285SAndroid Build Coastguard Worker		"dirwithprojects/project2",
71*105f6285SAndroid Build Coastguard Worker	}
72*105f6285SAndroid Build Coastguard Worker
73*105f6285SAndroid Build Coastguard Worker	// Set up workspace
74*105f6285SAndroid Build Coastguard Worker	workspaceDir, err := ioutil.TempDir("", "workspace")
75*105f6285SAndroid Build Coastguard Worker	if err != nil {
76*105f6285SAndroid Build Coastguard Worker		t.Error(err)
77*105f6285SAndroid Build Coastguard Worker	}
78*105f6285SAndroid Build Coastguard Worker	//This dir may already exist if the projects have been mounted
79*105f6285SAndroid Build Coastguard Worker	wsDirWithProjects := path.Join(workspaceDir, "dirwithprojects")
80*105f6285SAndroid Build Coastguard Worker	if err = os.Mkdir(wsDirWithProjects, os.ModePerm); err != nil {
81*105f6285SAndroid Build Coastguard Worker		t.Error(err)
82*105f6285SAndroid Build Coastguard Worker	}
83*105f6285SAndroid Build Coastguard Worker
84*105f6285SAndroid Build Coastguard Worker	copier := NewFileCopier()
85*105f6285SAndroid Build Coastguard Worker	if err = copier.Copy(codebaseDir, gitProjects, workspaceDir); err != nil {
86*105f6285SAndroid Build Coastguard Worker		t.Error(err)
87*105f6285SAndroid Build Coastguard Worker	}
88*105f6285SAndroid Build Coastguard Worker
89*105f6285SAndroid Build Coastguard Worker	wsTopFile := path.Join(workspaceDir, "topfile")
90*105f6285SAndroid Build Coastguard Worker	_, err = os.Stat(wsTopFile)
91*105f6285SAndroid Build Coastguard Worker	if err != nil {
92*105f6285SAndroid Build Coastguard Worker		t.Error(err)
93*105f6285SAndroid Build Coastguard Worker	}
94*105f6285SAndroid Build Coastguard Worker	wsNoProjectFile1 := path.Join(workspaceDir, "dirwithoutprojects", "noprojectfile1")
95*105f6285SAndroid Build Coastguard Worker	_, err = os.Stat(wsNoProjectFile1)
96*105f6285SAndroid Build Coastguard Worker	if err != nil {
97*105f6285SAndroid Build Coastguard Worker		t.Error(err)
98*105f6285SAndroid Build Coastguard Worker	}
99*105f6285SAndroid Build Coastguard Worker	wsNoProjectFile2 := path.Join(workspaceDir, "dirwithoutprojects", "noprojectfile2")
100*105f6285SAndroid Build Coastguard Worker	_, err = os.Stat(wsNoProjectFile2)
101*105f6285SAndroid Build Coastguard Worker	if err != nil {
102*105f6285SAndroid Build Coastguard Worker		t.Error(err)
103*105f6285SAndroid Build Coastguard Worker	}
104*105f6285SAndroid Build Coastguard Worker	wsProjectSiblingFile := path.Join(workspaceDir, "dirwithprojects", "projectsiblingfile")
105*105f6285SAndroid Build Coastguard Worker	_, err = os.Stat(wsProjectSiblingFile)
106*105f6285SAndroid Build Coastguard Worker	if err != nil {
107*105f6285SAndroid Build Coastguard Worker		t.Error(err)
108*105f6285SAndroid Build Coastguard Worker	}
109*105f6285SAndroid Build Coastguard Worker	wsSymlink := path.Join(workspaceDir, "symlink")
110*105f6285SAndroid Build Coastguard Worker	_, err = os.Stat(wsSymlink)
111*105f6285SAndroid Build Coastguard Worker	if err != nil {
112*105f6285SAndroid Build Coastguard Worker		t.Error(err)
113*105f6285SAndroid Build Coastguard Worker	}
114*105f6285SAndroid Build Coastguard Worker	//TODO: check why this is failing
115*105f6285SAndroid Build Coastguard Worker	//	if linkInfo.Mode() & os.ModeSymlink != os.ModeSymlink {
116*105f6285SAndroid Build Coastguard Worker	//		t.Error("Symlink not copied as symlink")
117*105f6285SAndroid Build Coastguard Worker	//	}
118*105f6285SAndroid Build Coastguard Worker	wsProject2Dir := path.Join(workspaceDir, "dirwithprojects", "project2")
119*105f6285SAndroid Build Coastguard Worker	_, err = os.Stat(wsProject2Dir)
120*105f6285SAndroid Build Coastguard Worker	if err == nil {
121*105f6285SAndroid Build Coastguard Worker		t.Error("Project2 mistakenly copied")
122*105f6285SAndroid Build Coastguard Worker	} else if os.IsNotExist(err) {
123*105f6285SAndroid Build Coastguard Worker		//This error is expected
124*105f6285SAndroid Build Coastguard Worker	} else {
125*105f6285SAndroid Build Coastguard Worker		t.Error(err)
126*105f6285SAndroid Build Coastguard Worker	}
127*105f6285SAndroid Build Coastguard Worker	wsProject1Dir := path.Join(workspaceDir, "project1")
128*105f6285SAndroid Build Coastguard Worker	_, err = os.Stat(wsProject1Dir)
129*105f6285SAndroid Build Coastguard Worker	if err == nil {
130*105f6285SAndroid Build Coastguard Worker		t.Error("Project1 mistakenly copied")
131*105f6285SAndroid Build Coastguard Worker	} else if os.IsNotExist(err) {
132*105f6285SAndroid Build Coastguard Worker		//This error is expected
133*105f6285SAndroid Build Coastguard Worker	} else {
134*105f6285SAndroid Build Coastguard Worker		t.Error(err)
135*105f6285SAndroid Build Coastguard Worker	}
136*105f6285SAndroid Build Coastguard Worker}
137