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()) } }