github.com/alloyci/alloy-runner@v1.0.1-0.20180222164613-925503ccafd6/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  }