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