252 lines
5.9 KiB
Go
252 lines
5.9 KiB
Go
package archiver
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"zipprine/internal/models"
|
|
)
|
|
|
|
func setupTestDir(t *testing.T) string {
|
|
tmpDir, err := os.MkdirTemp("", "zipprine-test-*")
|
|
if err != nil {
|
|
t.Fatalf("Failed to create temp dir: %v", err)
|
|
}
|
|
return tmpDir
|
|
}
|
|
|
|
func createTestFiles(t *testing.T, dir string) {
|
|
files := map[string]string{
|
|
"test1.txt": "Hello World",
|
|
"test2.go": "package main",
|
|
"subdir/test3.txt": "Nested file",
|
|
}
|
|
|
|
for path, content := range files {
|
|
fullPath := filepath.Join(dir, path)
|
|
if err := os.MkdirAll(filepath.Dir(fullPath), 0755); err != nil {
|
|
t.Fatalf("Failed to create dir: %v", err)
|
|
}
|
|
if err := os.WriteFile(fullPath, []byte(content), 0644); err != nil {
|
|
t.Fatalf("Failed to write file: %v", err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestCompressZip(t *testing.T) {
|
|
tmpDir := setupTestDir(t)
|
|
defer os.RemoveAll(tmpDir)
|
|
|
|
sourceDir := filepath.Join(tmpDir, "source")
|
|
if err := os.Mkdir(sourceDir, 0755); err != nil {
|
|
t.Fatalf("Failed to create source dir: %v", err)
|
|
}
|
|
createTestFiles(t, sourceDir)
|
|
|
|
outputPath := filepath.Join(tmpDir, "test.zip")
|
|
config := &models.CompressConfig{
|
|
SourcePath: sourceDir,
|
|
OutputPath: outputPath,
|
|
ArchiveType: models.ZIP,
|
|
CompressionLevel: 5,
|
|
}
|
|
|
|
err := Compress(config)
|
|
if err != nil {
|
|
t.Fatalf("Compress failed: %v", err)
|
|
}
|
|
|
|
if _, err := os.Stat(outputPath); os.IsNotExist(err) {
|
|
t.Error("Output file was not created")
|
|
}
|
|
}
|
|
|
|
func TestCompressTarGz(t *testing.T) {
|
|
tmpDir := setupTestDir(t)
|
|
defer os.RemoveAll(tmpDir)
|
|
|
|
sourceDir := filepath.Join(tmpDir, "source")
|
|
if err := os.Mkdir(sourceDir, 0755); err != nil {
|
|
t.Fatalf("Failed to create source dir: %v", err)
|
|
}
|
|
createTestFiles(t, sourceDir)
|
|
|
|
outputPath := filepath.Join(tmpDir, "test.tar.gz")
|
|
config := &models.CompressConfig{
|
|
SourcePath: sourceDir,
|
|
OutputPath: outputPath,
|
|
ArchiveType: models.TARGZ,
|
|
CompressionLevel: 5,
|
|
}
|
|
|
|
err := Compress(config)
|
|
if err != nil {
|
|
t.Fatalf("Compress failed: %v", err)
|
|
}
|
|
|
|
if _, err := os.Stat(outputPath); os.IsNotExist(err) {
|
|
t.Error("Output file was not created")
|
|
}
|
|
}
|
|
|
|
func TestCompressWithExcludes(t *testing.T) {
|
|
tmpDir := setupTestDir(t)
|
|
defer os.RemoveAll(tmpDir)
|
|
|
|
sourceDir := filepath.Join(tmpDir, "source")
|
|
if err := os.Mkdir(sourceDir, 0755); err != nil {
|
|
t.Fatalf("Failed to create source dir: %v", err)
|
|
}
|
|
createTestFiles(t, sourceDir)
|
|
|
|
outputPath := filepath.Join(tmpDir, "test.zip")
|
|
config := &models.CompressConfig{
|
|
SourcePath: sourceDir,
|
|
OutputPath: outputPath,
|
|
ArchiveType: models.ZIP,
|
|
ExcludePaths: []string{"*.go"},
|
|
CompressionLevel: 5,
|
|
}
|
|
|
|
err := Compress(config)
|
|
if err != nil {
|
|
t.Fatalf("Compress failed: %v", err)
|
|
}
|
|
|
|
if _, err := os.Stat(outputPath); os.IsNotExist(err) {
|
|
t.Error("Output file was not created")
|
|
}
|
|
}
|
|
|
|
func TestExtractZip(t *testing.T) {
|
|
tmpDir := setupTestDir(t)
|
|
defer os.RemoveAll(tmpDir)
|
|
|
|
// First create an archive
|
|
sourceDir := filepath.Join(tmpDir, "source")
|
|
if err := os.Mkdir(sourceDir, 0755); err != nil {
|
|
t.Fatalf("Failed to create source dir: %v", err)
|
|
}
|
|
createTestFiles(t, sourceDir)
|
|
|
|
archivePath := filepath.Join(tmpDir, "test.zip")
|
|
compressConfig := &models.CompressConfig{
|
|
SourcePath: sourceDir,
|
|
OutputPath: archivePath,
|
|
ArchiveType: models.ZIP,
|
|
CompressionLevel: 5,
|
|
}
|
|
|
|
if err := Compress(compressConfig); err != nil {
|
|
t.Fatalf("Compress failed: %v", err)
|
|
}
|
|
|
|
// Now extract it
|
|
destDir := filepath.Join(tmpDir, "dest")
|
|
if err := os.Mkdir(destDir, 0755); err != nil {
|
|
t.Fatalf("Failed to create dest dir: %v", err)
|
|
}
|
|
|
|
extractConfig := &models.ExtractConfig{
|
|
ArchivePath: archivePath,
|
|
DestPath: destDir,
|
|
ArchiveType: models.ZIP,
|
|
OverwriteAll: true,
|
|
PreservePerms: true,
|
|
}
|
|
|
|
err := Extract(extractConfig)
|
|
if err != nil {
|
|
t.Fatalf("Extract failed: %v", err)
|
|
}
|
|
|
|
// Verify extracted files exist
|
|
if _, err := os.Stat(filepath.Join(destDir, "test1.txt")); os.IsNotExist(err) {
|
|
t.Error("Extracted file test1.txt not found")
|
|
}
|
|
}
|
|
|
|
func TestExtractTarGz(t *testing.T) {
|
|
tmpDir := setupTestDir(t)
|
|
defer os.RemoveAll(tmpDir)
|
|
|
|
// First create an archive
|
|
sourceDir := filepath.Join(tmpDir, "source")
|
|
if err := os.Mkdir(sourceDir, 0755); err != nil {
|
|
t.Fatalf("Failed to create source dir: %v", err)
|
|
}
|
|
createTestFiles(t, sourceDir)
|
|
|
|
archivePath := filepath.Join(tmpDir, "test.tar.gz")
|
|
compressConfig := &models.CompressConfig{
|
|
SourcePath: sourceDir,
|
|
OutputPath: archivePath,
|
|
ArchiveType: models.TARGZ,
|
|
CompressionLevel: 5,
|
|
}
|
|
|
|
if err := Compress(compressConfig); err != nil {
|
|
t.Fatalf("Compress failed: %v", err)
|
|
}
|
|
|
|
// Now extract it
|
|
destDir := filepath.Join(tmpDir, "dest")
|
|
if err := os.Mkdir(destDir, 0755); err != nil {
|
|
t.Fatalf("Failed to create dest dir: %v", err)
|
|
}
|
|
|
|
extractConfig := &models.ExtractConfig{
|
|
ArchivePath: archivePath,
|
|
DestPath: destDir,
|
|
ArchiveType: models.TARGZ,
|
|
OverwriteAll: true,
|
|
PreservePerms: true,
|
|
}
|
|
|
|
err := Extract(extractConfig)
|
|
if err != nil {
|
|
t.Fatalf("Extract failed: %v", err)
|
|
}
|
|
|
|
// Verify extracted files exist
|
|
if _, err := os.Stat(filepath.Join(destDir, "test1.txt")); os.IsNotExist(err) {
|
|
t.Error("Extracted file test1.txt not found")
|
|
}
|
|
}
|
|
|
|
func TestCompressInvalidType(t *testing.T) {
|
|
config := &models.CompressConfig{
|
|
SourcePath: "/nonexistent",
|
|
OutputPath: "/tmp/test.invalid",
|
|
ArchiveType: "INVALID",
|
|
}
|
|
|
|
err := Compress(config)
|
|
if err != nil {
|
|
t.Logf("Expected behavior: %v", err)
|
|
}
|
|
}
|
|
|
|
func BenchmarkCompressZip(b *testing.B) {
|
|
tmpDir := setupTestDir(&testing.T{})
|
|
defer os.RemoveAll(tmpDir)
|
|
|
|
sourceDir := filepath.Join(tmpDir, "source")
|
|
os.Mkdir(sourceDir, 0755)
|
|
createTestFiles(&testing.T{}, sourceDir)
|
|
|
|
b.ResetTimer()
|
|
for i := 0; i < b.N; i++ {
|
|
outputPath := filepath.Join(tmpDir, "bench.zip")
|
|
config := &models.CompressConfig{
|
|
SourcePath: sourceDir,
|
|
OutputPath: outputPath,
|
|
ArchiveType: models.ZIP,
|
|
CompressionLevel: 5,
|
|
}
|
|
Compress(config)
|
|
os.Remove(outputPath)
|
|
}
|
|
}
|