gzip_test.go 2.03 KB
Newer Older
1 2 3
package ioutil

import (
4
	"encoding/json"
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
	"io"
	"os"
	"path/filepath"
	"testing"

	"github.com/stretchr/testify/require"
)

func TestReadWriteWithOptionalCompression(t *testing.T) {
	tests := []struct {
		name       string
		filename   string
		compressed bool
	}{
		{"Uncompressed", "test.notgz", false},
		{"Gzipped", "test.gz", true},
	}
	for _, test := range tests {
		test := test
		t.Run(test.name, func(t *testing.T) {
			data := []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0}
			dir := t.TempDir()
			path := filepath.Join(dir, test.filename)
			out, err := OpenCompressed(path, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0o644)
			require.NoError(t, err)
			defer out.Close()
			_, err = out.Write(data)
			require.NoError(t, err)
			require.NoError(t, out.Close())

			writtenData, err := os.ReadFile(path)
			require.NoError(t, err)
			if test.compressed {
				require.NotEqual(t, data, writtenData, "should have compressed data on disk")
			} else {
				require.Equal(t, data, writtenData, "should not have compressed data on disk")
			}

			in, err := OpenDecompressed(path)
			require.NoError(t, err)
			readData, err := io.ReadAll(in)
			require.NoError(t, err)
			require.Equal(t, data, readData)
		})
	}
}
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90

func TestWriteReadCompressedJson(t *testing.T) {
	tests := []struct {
		name     string
		filename string
		err      string
	}{
		{"Uncompressed", "test.notgz", "does not have .gz extension"},
		{"Gzipped", "test.gz", ""},
	}
	for _, test := range tests {
		test := test
		t.Run(test.name, func(t *testing.T) {
			dir := t.TempDir()
			path := filepath.Join(dir, test.filename)
			err := WriteCompressedJson(path, struct {
				A int
				B string
			}{A: 1, B: "test"})
			if test.err != "" {
				require.ErrorContains(t, err, test.err)
				return
			}
			require.NoError(t, err)

			var read struct {
				A int
				B string
			}
			in, err := OpenDecompressed(path)
			require.NoError(t, err)
			err = json.NewDecoder(in).Decode(&read)
			require.NoError(t, err)
			require.Equal(t, struct {
				A int
				B string
			}{A: 1, B: "test"}, read)
		})
	}
}