252 lines
5.4 KiB
Go
252 lines
5.4 KiB
Go
package zipext
|
|
|
|
import (
|
|
"archive/zip"
|
|
"bytes"
|
|
"io"
|
|
"testing"
|
|
|
|
"git.blackforestbytes.com/BlackForestBytes/goext/tst"
|
|
)
|
|
|
|
func readZipEntries(t *testing.T, data []byte) map[string][]byte {
|
|
t.Helper()
|
|
|
|
r, err := zip.NewReader(bytes.NewReader(data), int64(len(data)))
|
|
tst.AssertNoErr(t, err)
|
|
|
|
out := make(map[string][]byte, len(r.File))
|
|
for _, f := range r.File {
|
|
rc, err := f.Open()
|
|
tst.AssertNoErr(t, err)
|
|
|
|
body, err := io.ReadAll(rc)
|
|
tst.AssertNoErr(t, err)
|
|
|
|
err = rc.Close()
|
|
tst.AssertNoErr(t, err)
|
|
|
|
out[f.Name] = body
|
|
}
|
|
return out
|
|
}
|
|
|
|
func TestNewMemoryZipZipOnlyEmpty(t *testing.T) {
|
|
mz := NewMemoryZip(true, false)
|
|
|
|
data, err := mz.GetZip()
|
|
tst.AssertNoErr(t, err)
|
|
tst.AssertTrue(t, len(data) > 0)
|
|
|
|
entries := readZipEntries(t, data)
|
|
tst.AssertEqual(t, len(entries), 0)
|
|
}
|
|
|
|
func TestMemoryZipAddSingleFile(t *testing.T) {
|
|
mz := NewMemoryZip(true, false)
|
|
|
|
payload := []byte("Hello World")
|
|
err := mz.AddFile("hello.txt", payload)
|
|
tst.AssertNoErr(t, err)
|
|
|
|
data, err := mz.GetZip()
|
|
tst.AssertNoErr(t, err)
|
|
|
|
entries := readZipEntries(t, data)
|
|
tst.AssertEqual(t, len(entries), 1)
|
|
|
|
got, ok := entries["hello.txt"]
|
|
tst.AssertTrue(t, ok)
|
|
tst.AssertArrayEqual(t, got, payload)
|
|
}
|
|
|
|
func TestMemoryZipAddMultipleFiles(t *testing.T) {
|
|
mz := NewMemoryZip(true, false)
|
|
|
|
files := map[string][]byte{
|
|
"a.txt": []byte("aaa"),
|
|
"sub/b.txt": []byte("bbbb"),
|
|
"sub/dir/c.bin": {0, 1, 2, 3, 4, 5, 250, 251, 252, 253, 254, 255},
|
|
"empty.txt": {},
|
|
"d/e/f/g/h.json": []byte(`{"k":"v"}`),
|
|
}
|
|
|
|
for name, body := range files {
|
|
err := mz.AddFile(name, body)
|
|
tst.AssertNoErr(t, err)
|
|
}
|
|
|
|
data, err := mz.GetZip()
|
|
tst.AssertNoErr(t, err)
|
|
|
|
entries := readZipEntries(t, data)
|
|
tst.AssertEqual(t, len(entries), len(files))
|
|
|
|
for name, expected := range files {
|
|
got, ok := entries[name]
|
|
tst.AssertTrue(t, ok)
|
|
tst.AssertArrayEqual(t, got, expected)
|
|
}
|
|
}
|
|
|
|
func TestMemoryZipAddDuplicatePaths(t *testing.T) {
|
|
mz := NewMemoryZip(true, false)
|
|
|
|
err := mz.AddFile("dup.txt", []byte("first"))
|
|
tst.AssertNoErr(t, err)
|
|
|
|
err = mz.AddFile("dup.txt", []byte("second"))
|
|
tst.AssertNoErr(t, err)
|
|
|
|
data, err := mz.GetZip()
|
|
tst.AssertNoErr(t, err)
|
|
|
|
r, err := zip.NewReader(bytes.NewReader(data), int64(len(data)))
|
|
tst.AssertNoErr(t, err)
|
|
tst.AssertEqual(t, len(r.File), 2)
|
|
}
|
|
|
|
func TestMemoryZipAddLargerData(t *testing.T) {
|
|
mz := NewMemoryZip(true, false)
|
|
|
|
payload := make([]byte, 64*1024)
|
|
for i := range payload {
|
|
payload[i] = byte(i % 251)
|
|
}
|
|
|
|
err := mz.AddFile("big.bin", payload)
|
|
tst.AssertNoErr(t, err)
|
|
|
|
data, err := mz.GetZip()
|
|
tst.AssertNoErr(t, err)
|
|
|
|
entries := readZipEntries(t, data)
|
|
tst.AssertEqual(t, len(entries), 1)
|
|
tst.AssertArrayEqual(t, entries["big.bin"], payload)
|
|
}
|
|
|
|
func TestMemoryZipGetZipClosesWriter(t *testing.T) {
|
|
mz := NewMemoryZip(true, false)
|
|
|
|
err := mz.AddFile("a.txt", []byte("data"))
|
|
tst.AssertNoErr(t, err)
|
|
|
|
tst.AssertTrue(t, mz.open)
|
|
|
|
_, err = mz.GetZip()
|
|
tst.AssertNoErr(t, err)
|
|
|
|
tst.AssertFalse(t, mz.open)
|
|
}
|
|
|
|
func TestMemoryZipGetZipIdempotent(t *testing.T) {
|
|
mz := NewMemoryZip(true, false)
|
|
|
|
err := mz.AddFile("a.txt", []byte("data"))
|
|
tst.AssertNoErr(t, err)
|
|
|
|
first, err := mz.GetZip()
|
|
tst.AssertNoErr(t, err)
|
|
|
|
second, err := mz.GetZip()
|
|
tst.AssertNoErr(t, err)
|
|
|
|
tst.AssertArrayEqual(t, first, second)
|
|
}
|
|
|
|
func TestMemoryZipAddFileAfterCloseFails(t *testing.T) {
|
|
mz := NewMemoryZip(true, false)
|
|
|
|
err := mz.Close()
|
|
tst.AssertNoErr(t, err)
|
|
|
|
err = mz.AddFile("a.txt", []byte("data"))
|
|
tst.AssertTrue(t, err == errAlreadyClosed)
|
|
}
|
|
|
|
func TestMemoryZipAddFileAfterGetZipFails(t *testing.T) {
|
|
mz := NewMemoryZip(true, false)
|
|
|
|
_, err := mz.GetZip()
|
|
tst.AssertNoErr(t, err)
|
|
|
|
err = mz.AddFile("a.txt", []byte("data"))
|
|
tst.AssertTrue(t, err == errAlreadyClosed)
|
|
}
|
|
|
|
func TestMemoryZipDoubleCloseIsNoop(t *testing.T) {
|
|
mz := NewMemoryZip(true, false)
|
|
|
|
err := mz.Close()
|
|
tst.AssertNoErr(t, err)
|
|
|
|
err = mz.Close()
|
|
tst.AssertNoErr(t, err)
|
|
}
|
|
|
|
func TestMemoryZipGetZipNotEnabled(t *testing.T) {
|
|
mz := NewMemoryZip(false, false)
|
|
|
|
_, err := mz.GetZip()
|
|
tst.AssertTrue(t, err == errZipNotEnabled)
|
|
}
|
|
|
|
func TestMemoryZipGetTarGzNotEnabled(t *testing.T) {
|
|
mz := NewMemoryZip(true, false)
|
|
|
|
_, err := mz.GetTarGz()
|
|
tst.AssertTrue(t, err == errTgzNotEnabled)
|
|
}
|
|
|
|
func TestMemoryZipBothDisabledClose(t *testing.T) {
|
|
mz := NewMemoryZip(false, false)
|
|
|
|
err := mz.AddFile("a.txt", []byte("data"))
|
|
tst.AssertNoErr(t, err)
|
|
|
|
err = mz.Close()
|
|
tst.AssertNoErr(t, err)
|
|
|
|
_, err = mz.GetZip()
|
|
tst.AssertTrue(t, err == errZipNotEnabled)
|
|
|
|
_, err = mz.GetTarGz()
|
|
tst.AssertTrue(t, err == errTgzNotEnabled)
|
|
}
|
|
|
|
func TestMemoryZipBothDisabledAddFileAfterCloseFails(t *testing.T) {
|
|
mz := NewMemoryZip(false, false)
|
|
|
|
err := mz.Close()
|
|
tst.AssertNoErr(t, err)
|
|
|
|
err = mz.AddFile("a.txt", []byte("data"))
|
|
tst.AssertTrue(t, err == errAlreadyClosed)
|
|
}
|
|
|
|
func TestMemoryZipNewMemoryZipFlags(t *testing.T) {
|
|
z1 := NewMemoryZip(true, false)
|
|
tst.AssertTrue(t, z1.zipEnabled)
|
|
tst.AssertFalse(t, z1.tarEnabled)
|
|
tst.AssertTrue(t, z1.open)
|
|
|
|
z2 := NewMemoryZip(false, false)
|
|
tst.AssertFalse(t, z2.zipEnabled)
|
|
tst.AssertFalse(t, z2.tarEnabled)
|
|
tst.AssertTrue(t, z2.open)
|
|
}
|
|
|
|
func TestMemoryZipZipBytesAreValidZipMagic(t *testing.T) {
|
|
mz := NewMemoryZip(true, false)
|
|
|
|
err := mz.AddFile("x.txt", []byte("y"))
|
|
tst.AssertNoErr(t, err)
|
|
|
|
data, err := mz.GetZip()
|
|
tst.AssertNoErr(t, err)
|
|
|
|
tst.AssertTrue(t, len(data) >= 4)
|
|
tst.AssertEqual(t, data[0], byte(0x50))
|
|
tst.AssertEqual(t, data[1], byte(0x4B))
|
|
}
|