github.com/projecteru2/core@v0.0.0-20240321043226-06bcc1c23f58/source/common/common_test.go (about) 1 package common 2 3 import ( 4 "archive/zip" 5 "context" 6 "io" 7 "net/http" 8 "net/http/httptest" 9 "os" 10 "path" 11 "path/filepath" 12 "testing" 13 "time" 14 15 "github.com/projecteru2/core/types" 16 17 "github.com/stretchr/testify/assert" 18 ) 19 20 const ( 21 repo = "https://github.com/VihaanVerma89/submoduleTest.git" 22 rev = "a2bf01635db316e660a2cbba80b399c21fe012cf" 23 subname = "subrepo" 24 privkey = `-----BEGIN OPENSSH PRIVATE KEY----- 25 b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAACFwAAAAdzc2gtcn 26 NhAAAAAwEAAQAAAgEAsOzmW0dNiURf7sTicoX6uFFMeJHw+r4tIX6BpSC3Qu7SL/l8c6P3 27 b5Hwg2GV/II7dtnXm2845V93q2SyB4BaGo3RCTMi+H+jbXimkB4fpBKOknt/O2o+bJTnH9 28 EnbOMKzE11scpc3RUZAjUkoIbRkw0nHAgp9HvBKSocwS6bhiY3yntfQiYfwqLabHps4BYq 29 BR6KGIPPDXVemrEpoqWJz/vHCPy75VMvmMTHBi8DaTmA+2KlKW0w9I/HBVKQyawGT9mqFl 30 0ka+NS7PpzOPvMFxg0NzdLkiT1yMsCtY4PxwakvsIlqQaJ0Vm6ghADtp5+sTuvcpgMsi7/ 31 ZKHZrUZq6mFU0eaPXzfO+rBtkjWO66D5RCGyrHTpOSNCWYf5YR2O8ZefpmzbXb6Odnf6D8 32 jEXKEeSSPFEdX1dUj5+UltAbE5pxe6/V3Y3l0hUrqCIiXtCGy+b8PRSP3TdotjO8GPUF8I 33 QtVgzW9IpTWvrZCziI5L/QWOqCwYwKRpHcpL0ERD1AGmDcq5dWDncF7ADGK5lupFFnlh4j 34 QVOs84LnbuI0fh6H4QRVKhqYt2P36Fh9z0KJ19HjlfV1fFrQRVovSRSZ2tH4z4Cmye2hCV 35 9pohBSnlSHHbrseDq5nhgeCyYRHjEZV4VCNgSO5J5HSKPrRxsBbHposxjRiQqHWUmWCCP+ 36 MAAAdABNqYpATamKQAAAAHc3NoLXJzYQAAAgEAsOzmW0dNiURf7sTicoX6uFFMeJHw+r4t 37 IX6BpSC3Qu7SL/l8c6P3b5Hwg2GV/II7dtnXm2845V93q2SyB4BaGo3RCTMi+H+jbXimkB 38 4fpBKOknt/O2o+bJTnH9EnbOMKzE11scpc3RUZAjUkoIbRkw0nHAgp9HvBKSocwS6bhiY3 39 yntfQiYfwqLabHps4BYqBR6KGIPPDXVemrEpoqWJz/vHCPy75VMvmMTHBi8DaTmA+2KlKW 40 0w9I/HBVKQyawGT9mqFl0ka+NS7PpzOPvMFxg0NzdLkiT1yMsCtY4PxwakvsIlqQaJ0Vm6 41 ghADtp5+sTuvcpgMsi7/ZKHZrUZq6mFU0eaPXzfO+rBtkjWO66D5RCGyrHTpOSNCWYf5YR 42 2O8ZefpmzbXb6Odnf6D8jEXKEeSSPFEdX1dUj5+UltAbE5pxe6/V3Y3l0hUrqCIiXtCGy+ 43 b8PRSP3TdotjO8GPUF8IQtVgzW9IpTWvrZCziI5L/QWOqCwYwKRpHcpL0ERD1AGmDcq5dW 44 DncF7ADGK5lupFFnlh4jQVOs84LnbuI0fh6H4QRVKhqYt2P36Fh9z0KJ19HjlfV1fFrQRV 45 ovSRSZ2tH4z4Cmye2hCV9pohBSnlSHHbrseDq5nhgeCyYRHjEZV4VCNgSO5J5HSKPrRxsB 46 bHposxjRiQqHWUmWCCP+MAAAADAQABAAACAQCA1OCg0vkI3XsluMRUNG9vS/PtUAgz7cub 47 Oi1Zess3uAPh3z/aTSleWtzSLnszFfoK/3Haw1Cg5bWUXoysna/+6gmvM0dhwD/W9SYEh4 48 ruxHyA+eCZ+TFfi8YJCxo0VdeFEVqEjiC09Cnzy5LSOZneBJPX+7HhT0RGn1205iVlt+qk 49 TNX+qxgxeLioiTVCr6EFfUl9tG1PFYpABoWU5AnII0S5rJ99y+c6zP9H53AKbU8YvqoZ0m 50 L1ksSPgaHg2Jz4BD2wbz6YOT4nRfAlLGVe48cR9ffXgYZgIkPkxH+Eo7fPGDyoKhStFzOS 51 herOTfdfQ2Dshv+nuEVMl/aUEFTFBMOTYX2MmPzNK+aeggXk+9ZgCfQ/qoihnnCT1xudXc 52 3QGOzaZvrQ5dRUwU9iv6+l7P39ZzpYTzdczxdE8Sz4fsKe0Hzp5R5YGEFrytjIp4uUv4q5 53 ju9Yk55T8CMdEw9C25OlCByIShwsGcVp1UoRP+M3WHF5s/s04o1u8I+Qx8/DcH3N2wyinZ 54 skh49jtBSVbp6Pscr75YXn1m+0Yex6O337djHzxSqm1C0YfHGX3axXgIrtKGwHL87ljSSI 55 Pydlx4WjQyI5J/jBQnhFPPJSU3uYCsMWTLlE1s68GVMBH1pSooCjdvqQFXo82Tt7gpdabh 56 n1y6tcpL61M4ydKZ2N4QAAAQEAp0kP9KmW5QljE4jLq7RbMfaY+027UZ1OPPIfhEX89lkE 57 8HP6xoAXJBR4o2jbpjJyPmTQ9+CBMQPsQx9QipeoiftLZk9qXhb5ahGhykQli1I+Oi/sBs 58 CWUt4YmystxTSTAAT0AMsUzAqtVHZpca3wOUENF6IXf04imTt0a+nO6AVddNSD7U8S8DMb 59 6OkQmaGIsHvO4Fld9hIpPJG34mp8ZoUQDnwrTzXdYjZsNnm9KqN3Tn8lLoBn8Cf9FEE5DQ 60 mFlu8oUFh6tZGduNvlIKoq7M8uucahTB+gF0SEW3zRmnAJbDYnRsLMh+g/sOWuDdciNZAa 61 gxNp28Eh8604FKAsTwAAAQEA3i+FjPcIJHoZEHo5r2TapcgzFDBoXwz0azFICUTTYpOWd3 62 N5VrjkZOtPmQfmboiGKrRKM7dOagaSy7u1qBbB9imeZygpXmEd5YqWNhF2IC0ChlkoTHnl 63 oHZeSBItDQ2Ee7xE5pTCc7PDTrd5ikQHwO9DBQHHX+XoGxQExe1rIhibOUyTRSbvmCkDP8 64 LazsfndTEV9r4R6A6kHC5Nr/BQ3h/OIyVTOOjA0g8QeU2i0lgvczM3xFsjlt7O9walK1cr 65 PmOSRz2RmJ/lpB0HJwpon1qFyKgN1WjEJKxNoUKc40lZWnlY+1rHITCKQqZwE71AOjk/Ob 66 JWav2T4H/0bmV/OwAAAQEAy9oDcSlJKwjjbGkXnIKgkPVfSRLZb9dgElv28V3v/Odu35n9 67 MaiCd1a6OOJ/RhJ69AGBgu60ubq+Gv0IamJqzC4IscxPnXK5Z4UImsY/YX2nMNh6qnWSJd 68 kUR7L2RlIFgf6fjYV0uO6H/ALm5xjlt7LBFcG6OEPV63/P0z/iyCa4QAtLwtTJFauxaraf 69 oEfZ3KHxQIZ+VkBYYne8kdCe4gFok/HKdleAlgUWL4hF8qwU57bSFircMlZHWuCbICoYdK 70 mHC6f5VjDAVCyXOxYZtFeFrS/NtRI805dmZNeN7K+ICECvOEwFknbiYOFYpIfHN+jxzAj9 71 wBtN56wGIEOHeQAAAAN0aHkBAgMEBQY= 72 -----END OPENSSH PRIVATE KEY-----` 73 ) 74 75 func TestSourceCode(t *testing.T) { 76 privFile, err := os.CreateTemp("", "priv") 77 assert.NoError(t, err) 78 _, err = privFile.WriteString(privkey) 79 assert.NoError(t, err) 80 privFile.Close() 81 config := types.GitConfig{ 82 CloneTimeout: time.Second * 300, 83 PrivateKey: privFile.Name(), 84 } 85 g, err := NewGitScm(config, nil) 86 assert.NoError(t, err) 87 ctx := context.Background() 88 89 dname, err := os.MkdirTemp("", "source") 90 assert.NoError(t, err) 91 err = g.SourceCode(ctx, "file:///xxxx", dname, "MASTER", false) 92 assert.Error(t, err) 93 err = g.SourceCode(ctx, "git@xxxx", dname, "MASTER", false) 94 assert.Error(t, err) 95 err = g.SourceCode(ctx, "gitlab@xxxx", dname, "MASTER", false) 96 assert.Error(t, err) 97 98 err = g.SourceCode(ctx, repo, dname, "NOTHING", false) 99 assert.Error(t, err) 100 101 os.RemoveAll(dname) 102 os.Mkdir(dname, 0755) 103 err = g.SourceCode(ctx, repo, dname, rev, true) 104 assert.NoError(t, err) 105 // auto clone submodule, so vendor can't remove by os.Remove 106 subrepo := filepath.Join(dname, subname) 107 err = os.Remove(subrepo) 108 assert.Error(t, err) 109 dotGit := filepath.Join(dname, ".git") 110 _, err = os.Stat(dotGit) 111 assert.NoError(t, err) 112 // Security dir 113 err = g.Security(dname) 114 assert.NoError(t, err) 115 _, err = os.Stat(dotGit) 116 assert.Error(t, err) 117 118 os.Remove(privFile.Name()) 119 os.Remove(privFile.Name()) 120 os.RemoveAll(dname) 121 } 122 123 func TestArtifact(t *testing.T) { 124 rawString := "test" 125 authValue := "test" 126 origFile, err := os.CreateTemp("", "orig") 127 assert.NoError(t, err) 128 origFile.WriteString(rawString) 129 origFile.Close() 130 zipFile, err := os.CreateTemp("", "zip") 131 assert.NoError(t, err) 132 assert.NoError(t, zipFiles(zipFile, []string{origFile.Name()})) 133 134 data, err := os.ReadFile(zipFile.Name()) 135 assert.NoError(t, err) 136 savedDir, err := os.MkdirTemp("", "saved") 137 assert.NoError(t, err) 138 139 g := &GitScm{} 140 testServer := httptest.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { 141 r := req.Header.Get("TEST") 142 if r != authValue { 143 res.WriteHeader(400) 144 return 145 } 146 res.Write(data) 147 })) 148 defer func() { testServer.Close() }() 149 err = g.Artifact(context.Background(), "invaildurl", savedDir) 150 assert.Error(t, err) 151 // no header 152 err = g.Artifact(context.Background(), testServer.URL, savedDir) 153 assert.Error(t, err) 154 // vaild 155 g.AuthHeaders = map[string]string{"TEST": authValue} 156 err = g.Artifact(context.Background(), testServer.URL, savedDir) 157 assert.NoError(t, err) 158 159 fname := filepath.Join(savedDir, path.Base(origFile.Name())) 160 _, err = os.Stat(fname) 161 assert.NoError(t, err) 162 saved, err := os.ReadFile(fname) 163 assert.NoError(t, err) 164 assert.Equal(t, string(saved), rawString) 165 166 os.Remove(origFile.Name()) 167 os.Remove(zipFile.Name()) 168 os.RemoveAll(savedDir) 169 } 170 171 func zipFiles(newfile *os.File, files []string) error { 172 defer newfile.Close() 173 174 zipWriter := zip.NewWriter(newfile) 175 defer zipWriter.Close() 176 177 // Add files to zip 178 for _, file := range files { 179 180 zipfile, err := os.Open(file) 181 if err != nil { 182 return err 183 } 184 defer zipfile.Close() 185 186 // Get the file information 187 info, err := zipfile.Stat() 188 if err != nil { 189 return err 190 } 191 192 header, err := zip.FileInfoHeader(info) 193 if err != nil { 194 return err 195 } 196 197 // Change to deflate to gain better compression 198 // see http://golang.org/pkg/archive/zip/#pkg-constants 199 header.Method = zip.Deflate 200 201 writer, err := zipWriter.CreateHeader(header) 202 if err != nil { 203 return err 204 } 205 _, err = io.Copy(writer, zipfile) 206 if err != nil { 207 return err 208 } 209 } 210 return nil 211 }