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