archiver/archive_fs_test.go

114 lines
2.7 KiB
Go

package archiver
import (
"archive/tar"
"compress/gzip"
"github.com/go-git/go-billy/v5/memfs"
"github.com/stretchr/testify/assert"
"os"
"strconv"
"testing"
)
func TestArchiveFS(t *testing.T) {
err := os.MkdirAll(testArchiveBaseDir, os.ModePerm)
assert.NoError(t, err)
memoryFS := memfs.New()
archiveF, err := memoryFS.OpenFile("archive.tar.gz", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, os.ModePerm)
assert.NoError(t, err)
defer archiveF.Close()
gzipWriter := gzip.NewWriter(archiveF)
defer gzipWriter.Close()
tarWriter := tar.NewWriter(gzipWriter)
defer tarWriter.Close()
for i := 0; i < 10; i++ {
tarHeader := &tar.Header{
Name: "test" + strconv.Itoa(i) + ".txt",
Size: int64(len([]byte("Hello, World! #" + strconv.Itoa(i)))),
Mode: 0600,
}
err = tarWriter.WriteHeader(tarHeader)
assert.NoError(t, err)
_, err = tarWriter.Write([]byte("Hello, World! #" + strconv.Itoa(i)))
assert.NoError(t, err)
}
err = tarWriter.Close()
assert.NoError(t, err)
err = gzipWriter.Close()
assert.NoError(t, err)
err = archiveF.Close()
assert.NoError(t, err)
t.Log("== OpenArchive ==")
archive, err := OpenFS(WrapBillyFS(memoryFS), "archive.tar.gz")
assert.NoError(t, err)
assert.Equal(t, 10, archive.FileCount())
t.Log("== ExtractArchiveFile ==")
archiveFile, err := archive.GetFile("test0.txt")
assert.NoError(t, err)
err = archiveFile.Extract(ExtractFileOptions{
Folder: testArchiveBaseDir + "/extracted/fs",
})
assert.NoError(t, err)
err = os.RemoveAll(testArchiveBaseDir + "/extracted/fs")
assert.NoError(t, err)
t.Log("== ExtractArchive ==")
err = archive.Extract(ExtractOptions{
Folder: testArchiveBaseDir + "/extracted/fs",
})
assert.NoError(t, err)
err = os.RemoveAll(testArchiveBaseDir + "/extracted/fs")
assert.NoError(t, err)
t.Log("== ExtractArchiveFilter ==")
err = archive.Extract(ExtractOptions{
Folder: testArchiveBaseDir + "/extracted/fs",
Filter: archiveRegex,
})
assert.FileExists(t, testArchiveBaseDir+"/extracted/fs/test1.txt")
assert.FileExists(t, testArchiveBaseDir+"/extracted/fs/test5.txt")
err = os.RemoveAll(testArchiveBaseDir + "/extracted/fs")
assert.NoError(t, err)
err = archive.Close()
assert.NoError(t, err)
}
func TestExtractArchiveBillyFS(t *testing.T) {
err := os.MkdirAll(testArchiveBaseDir, os.ModePerm)
assert.NoError(t, err)
testGenerateTar(t)
archive, err := Open(testArchiveBaseDir + "/test.tar")
assert.NoError(t, err)
memoryFS := memfs.New()
err = archive.ExtractBillyFS(memoryFS, ExtractOptions{
Folder: memoryFS.Root(),
})
assert.NoError(t, err)
files, err := memoryFS.ReadDir(memoryFS.Root())
assert.NoError(t, err)
assert.Equal(t, 10, len(files))
for _, file := range files {
assert.NotEqual(t, int64(0), file.Size())
}
}