github.com/filecoin-project/bacalhau@v0.3.23-0.20230228154132-45c989550ace/pkg/util/targzip/targzip_test.go (about) 1 //go:build unit || !integration 2 3 package targzip 4 5 import ( 6 "context" 7 "os" 8 "path/filepath" 9 "testing" 10 11 "github.com/c2h5oh/datasize" 12 "github.com/stretchr/testify/require" 13 ) 14 15 const ( 16 testModeFile = "file" 17 testModeDir = "dir" 18 testModePwd = "pwd" 19 ) 20 21 type errorChecker func(require.TestingT, error, ...interface{}) 22 23 var testSizes = map[datasize.ByteSize]errorChecker{ 24 0 * datasize.B: require.NoError, 25 1 * datasize.B: require.NoError, 26 MaximumContextSize: require.NoError, 27 MaximumContextSize + 1*datasize.B: require.Error, 28 } 29 30 func setup(t *testing.T, size datasize.ByteSize, mode string) (tgzFile *os.File, tgzInput string) { 31 rootDir, err := os.MkdirTemp(os.TempDir(), "bacalhau-targzip-test*") 32 require.NoError(t, err) 33 34 testDir := rootDir 35 if mode == testModeDir { 36 testDir = filepath.Join(testDir, "testdir") 37 err := os.Mkdir(testDir, worldReadOwnerWritePermission) 38 require.NoError(t, err) 39 } 40 41 testFilename := filepath.Join(testDir, "data.txt") 42 testFile, err := os.Create(testFilename) 43 require.NoError(t, err) 44 45 err = testFile.Truncate(int64(size)) 46 require.NoError(t, err) 47 testFile.Close() 48 49 scratchDir, err := os.MkdirTemp(os.TempDir(), "bacalhau-targzip-test*") 50 require.NoError(t, err) 51 tgzFilename := filepath.Join(scratchDir, "data.tgz") 52 tgzFile, err = os.Create(tgzFilename) 53 require.NoError(t, err) 54 55 err = os.Chdir(rootDir) 56 require.NoError(t, err) 57 relFilename, err := filepath.Rel(rootDir, testFilename) 58 require.NoError(t, err) 59 relDir, err := filepath.Rel(rootDir, testDir) 60 require.NoError(t, err) 61 62 tgzInput = map[string]string{ 63 testModeFile: relFilename, 64 testModeDir: relDir, 65 testModePwd: ".", 66 }[mode] 67 return tgzFile, tgzInput 68 } 69 70 func TestRoundTrip(t *testing.T) { 71 for mode, expectedFile := range map[string]string{ 72 testModeFile: "data.txt", 73 testModeDir: filepath.Join("testdir", "data.txt"), 74 testModePwd: "data.txt", 75 } { 76 t.Run(mode, func(t *testing.T) { 77 tgzFile, tgzInput := setup(t, datasize.KB, mode) 78 defer tgzFile.Close() 79 80 err := Compress(context.Background(), tgzInput, tgzFile) 81 require.NoError(t, err) 82 83 _, err = tgzFile.Seek(0, 0) 84 require.NoError(t, err) 85 86 outputDir := filepath.Join(t.TempDir(), "outdir") 87 err = Decompress(tgzFile, outputDir) 88 require.NoError(t, err) 89 require.FileExists(t, filepath.Join(outputDir, expectedFile)) 90 }) 91 } 92 } 93 94 func TestCompressionSizeLimiting(t *testing.T) { 95 for _, mode := range []string{testModeFile, testModeDir} { 96 for size, errorChecker := range testSizes { 97 t.Run(mode+"/"+size.String(), func(t *testing.T) { 98 tgzFile, tgzInput := setup(t, size, mode) 99 defer tgzFile.Close() 100 101 err := Compress(context.Background(), tgzInput, tgzFile) 102 errorChecker(t, err) 103 }) 104 } 105 } 106 } 107 108 func TestDecompressionSizeLimiting(t *testing.T) { 109 for _, mode := range []string{testModeFile, testModeDir} { 110 for size, errorChecker := range testSizes { 111 t.Run(mode+"/"+size.String(), func(t *testing.T) { 112 tgzFile, tgzInput := setup(t, size, mode) 113 defer tgzFile.Close() 114 115 err := compress(context.Background(), tgzInput, tgzFile, size*2) 116 require.NoError(t, err) 117 118 _, err = tgzFile.Seek(0, 0) 119 require.NoError(t, err) 120 121 outputDir := filepath.Join(t.TempDir(), "outdir") 122 err = Decompress(tgzFile, outputDir) 123 errorChecker(t, err) 124 }) 125 } 126 } 127 } 128 129 func TestUncompressedSize(t *testing.T) { 130 for _, mode := range []string{testModeFile, testModeDir} { 131 for size := range testSizes { 132 t.Run(mode+"/"+size.String(), func(t *testing.T) { 133 tgzFile, tgzInput := setup(t, size, mode) 134 defer tgzFile.Close() 135 136 err := compress(context.Background(), tgzInput, tgzFile, size*2) 137 require.NoError(t, err) 138 139 _, err = tgzFile.Seek(0, 0) 140 require.NoError(t, err) 141 142 outsize, err := UncompressedSize(tgzFile) 143 require.NoError(t, err) 144 require.Equal(t, size, outsize) 145 }) 146 } 147 } 148 }