github.com/secure-build/gitlab-runner@v12.5.0+incompatible/helpers/archives/zip_create_test.go (about) 1 package archives 2 3 import ( 4 "archive/zip" 5 "bytes" 6 "io/ioutil" 7 "os" 8 "syscall" 9 "testing" 10 11 "github.com/sirupsen/logrus" 12 "github.com/stretchr/testify/assert" 13 "github.com/stretchr/testify/require" 14 ) 15 16 var testZipFileContent = []byte("test content") 17 18 func createTestFile(t *testing.T) string { 19 err := ioutil.WriteFile("test_file.txt", testZipFileContent, 0640) 20 assert.NoError(t, err) 21 return "test_file.txt" 22 } 23 24 func createSymlinkFile(t *testing.T) string { 25 err := os.Symlink("old_symlink", "new_symlink") 26 assert.NoError(t, err) 27 return "new_symlink" 28 } 29 30 func createTestDirectory(t *testing.T) string { 31 err := os.Mkdir("test_directory", 0711) 32 assert.NoError(t, err) 33 return "test_directory" 34 } 35 36 func createTestPipe(t *testing.T) string { 37 err := syscall.Mkfifo("test_pipe", 0600) 38 assert.NoError(t, err) 39 return "test_pipe" 40 } 41 42 func createTestGitPathFile(t *testing.T) string { 43 err := os.Mkdir(".git", 0711) 44 assert.NoError(t, err) 45 46 err = ioutil.WriteFile(".git/test_file", testZipFileContent, 0640) 47 assert.NoError(t, err) 48 49 return ".git/test_file" 50 } 51 52 func testInWorkDir(t *testing.T, testCase func(t *testing.T, fileName string)) { 53 wd, err := os.Getwd() 54 assert.NoError(t, err) 55 defer os.Chdir(wd) 56 57 td, err := ioutil.TempDir("", "zip_create") 58 require.NoError(t, err) 59 60 err = os.Chdir(td) 61 assert.NoError(t, err) 62 63 tempFile, err := ioutil.TempFile("", "archive") 64 require.NoError(t, err) 65 tempFile.Close() 66 defer os.Remove(tempFile.Name()) 67 68 testCase(t, tempFile.Name()) 69 } 70 71 func TestZipCreate(t *testing.T) { 72 testInWorkDir(t, func(t *testing.T, fileName string) { 73 paths := []string{ 74 createTestFile(t), 75 createSymlinkFile(t), 76 createTestDirectory(t), 77 createTestPipe(t), 78 "non_existing_file.txt", 79 } 80 err := CreateZipFile(fileName, paths) 81 require.NoError(t, err) 82 83 archive, err := zip.OpenReader(fileName) 84 require.NoError(t, err) 85 defer archive.Close() 86 87 assert.Len(t, archive.File, 3) 88 89 assert.Equal(t, "test_file.txt", archive.File[0].Name) 90 assert.Equal(t, os.FileMode(0640), archive.File[0].Mode().Perm()) 91 assert.NotEmpty(t, archive.File[0].Extra) 92 93 assert.Equal(t, "new_symlink", archive.File[1].Name) 94 95 assert.Equal(t, "test_directory/", archive.File[2].Name) 96 assert.NotEmpty(t, archive.File[2].Extra) 97 assert.True(t, archive.File[2].Mode().IsDir()) 98 }) 99 } 100 101 func TestZipCreateWithGitPath(t *testing.T) { 102 testInWorkDir(t, func(t *testing.T, fileName string) { 103 output := logrus.StandardLogger().Out 104 var buf bytes.Buffer 105 logrus.SetOutput(&buf) 106 defer logrus.SetOutput(output) 107 108 paths := []string{ 109 createTestGitPathFile(t), 110 } 111 err := CreateZipFile(fileName, paths) 112 require.NoError(t, err) 113 114 assert.Contains(t, buf.String(), "Part of .git directory is on the list of files to archive") 115 116 archive, err := zip.OpenReader(fileName) 117 require.NoError(t, err) 118 defer archive.Close() 119 120 assert.Len(t, archive.File, 1) 121 122 assert.Equal(t, ".git/test_file", archive.File[0].Name) 123 assert.Equal(t, os.FileMode(0640), archive.File[0].Mode().Perm()) 124 assert.NotEmpty(t, archive.File[0].Extra) 125 }) 126 }