(Chore): Added unit tests for batch.go
This commit is contained in:
294
internal/archiver/batch_test.go
Normal file
294
internal/archiver/batch_test.go
Normal file
@@ -0,0 +1,294 @@
|
||||
package archiver
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
"zipprine/internal/models"
|
||||
)
|
||||
|
||||
func TestBatchCompressSequential(t *testing.T) {
|
||||
tmpDir, err := os.MkdirTemp("", "zipprine-batch-test-*")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create temp dir: %v", err)
|
||||
}
|
||||
defer os.RemoveAll(tmpDir)
|
||||
|
||||
// Create test directories
|
||||
dir1 := filepath.Join(tmpDir, "source1")
|
||||
dir2 := filepath.Join(tmpDir, "source2")
|
||||
os.Mkdir(dir1, 0755)
|
||||
os.Mkdir(dir2, 0755)
|
||||
|
||||
// Create test files
|
||||
os.WriteFile(filepath.Join(dir1, "test1.txt"), []byte("content1"), 0644)
|
||||
os.WriteFile(filepath.Join(dir2, "test2.txt"), []byte("content2"), 0644)
|
||||
|
||||
// Create batch config
|
||||
configs := []*models.CompressConfig{
|
||||
{
|
||||
SourcePath: dir1,
|
||||
OutputPath: filepath.Join(tmpDir, "archive1.zip"),
|
||||
ArchiveType: models.ZIP,
|
||||
CompressionLevel: 5,
|
||||
},
|
||||
{
|
||||
SourcePath: dir2,
|
||||
OutputPath: filepath.Join(tmpDir, "archive2.zip"),
|
||||
ArchiveType: models.ZIP,
|
||||
CompressionLevel: 5,
|
||||
},
|
||||
}
|
||||
|
||||
batchConfig := &BatchCompressConfig{
|
||||
Configs: configs,
|
||||
Parallel: false,
|
||||
MaxWorkers: 2,
|
||||
}
|
||||
|
||||
errors := BatchCompress(batchConfig)
|
||||
|
||||
// Check for errors
|
||||
for i, err := range errors {
|
||||
if err != nil {
|
||||
t.Errorf("Batch compress failed for config %d: %v", i, err)
|
||||
}
|
||||
}
|
||||
|
||||
// Verify archives were created
|
||||
if _, err := os.Stat(filepath.Join(tmpDir, "archive1.zip")); os.IsNotExist(err) {
|
||||
t.Error("archive1.zip was not created")
|
||||
}
|
||||
if _, err := os.Stat(filepath.Join(tmpDir, "archive2.zip")); os.IsNotExist(err) {
|
||||
t.Error("archive2.zip was not created")
|
||||
}
|
||||
}
|
||||
|
||||
func TestBatchCompressParallel(t *testing.T) {
|
||||
tmpDir, err := os.MkdirTemp("", "zipprine-batch-test-*")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create temp dir: %v", err)
|
||||
}
|
||||
defer os.RemoveAll(tmpDir)
|
||||
|
||||
// Create test directories
|
||||
dir1 := filepath.Join(tmpDir, "source1")
|
||||
dir2 := filepath.Join(tmpDir, "source2")
|
||||
dir3 := filepath.Join(tmpDir, "source3")
|
||||
os.Mkdir(dir1, 0755)
|
||||
os.Mkdir(dir2, 0755)
|
||||
os.Mkdir(dir3, 0755)
|
||||
|
||||
// Create test files
|
||||
os.WriteFile(filepath.Join(dir1, "test1.txt"), []byte("content1"), 0644)
|
||||
os.WriteFile(filepath.Join(dir2, "test2.txt"), []byte("content2"), 0644)
|
||||
os.WriteFile(filepath.Join(dir3, "test3.txt"), []byte("content3"), 0644)
|
||||
|
||||
// Create batch config
|
||||
configs := []*models.CompressConfig{
|
||||
{
|
||||
SourcePath: dir1,
|
||||
OutputPath: filepath.Join(tmpDir, "archive1.tar.gz"),
|
||||
ArchiveType: models.TARGZ,
|
||||
CompressionLevel: 5,
|
||||
},
|
||||
{
|
||||
SourcePath: dir2,
|
||||
OutputPath: filepath.Join(tmpDir, "archive2.tar.gz"),
|
||||
ArchiveType: models.TARGZ,
|
||||
CompressionLevel: 5,
|
||||
},
|
||||
{
|
||||
SourcePath: dir3,
|
||||
OutputPath: filepath.Join(tmpDir, "archive3.tar.gz"),
|
||||
ArchiveType: models.TARGZ,
|
||||
CompressionLevel: 5,
|
||||
},
|
||||
}
|
||||
|
||||
batchConfig := &BatchCompressConfig{
|
||||
Configs: configs,
|
||||
Parallel: true,
|
||||
MaxWorkers: 2,
|
||||
}
|
||||
|
||||
errors := BatchCompress(batchConfig)
|
||||
|
||||
// Check for errors
|
||||
for i, err := range errors {
|
||||
if err != nil {
|
||||
t.Errorf("Batch compress failed for config %d: %v", i, err)
|
||||
}
|
||||
}
|
||||
|
||||
// Verify archives were created
|
||||
for i := 1; i <= 3; i++ {
|
||||
archivePath := filepath.Join(tmpDir, "archive"+string(rune('0'+i))+".tar.gz")
|
||||
if _, err := os.Stat(archivePath); os.IsNotExist(err) {
|
||||
t.Errorf("archive%d.tar.gz was not created", i)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestBatchExtract(t *testing.T) {
|
||||
tmpDir, err := os.MkdirTemp("", "zipprine-batch-test-*")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create temp dir: %v", err)
|
||||
}
|
||||
defer os.RemoveAll(tmpDir)
|
||||
|
||||
// Create test archives first
|
||||
dir1 := filepath.Join(tmpDir, "source1")
|
||||
dir2 := filepath.Join(tmpDir, "source2")
|
||||
os.Mkdir(dir1, 0755)
|
||||
os.Mkdir(dir2, 0755)
|
||||
|
||||
os.WriteFile(filepath.Join(dir1, "test1.txt"), []byte("content1"), 0644)
|
||||
os.WriteFile(filepath.Join(dir2, "test2.txt"), []byte("content2"), 0644)
|
||||
|
||||
archive1 := filepath.Join(tmpDir, "archive1.zip")
|
||||
archive2 := filepath.Join(tmpDir, "archive2.zip")
|
||||
|
||||
Compress(&models.CompressConfig{
|
||||
SourcePath: dir1,
|
||||
OutputPath: archive1,
|
||||
ArchiveType: models.ZIP,
|
||||
CompressionLevel: 5,
|
||||
})
|
||||
Compress(&models.CompressConfig{
|
||||
SourcePath: dir2,
|
||||
OutputPath: archive2,
|
||||
ArchiveType: models.ZIP,
|
||||
CompressionLevel: 5,
|
||||
})
|
||||
|
||||
// Now batch extract
|
||||
dest1 := filepath.Join(tmpDir, "dest1")
|
||||
dest2 := filepath.Join(tmpDir, "dest2")
|
||||
|
||||
configs := []*models.ExtractConfig{
|
||||
{
|
||||
ArchivePath: archive1,
|
||||
DestPath: dest1,
|
||||
ArchiveType: models.ZIP,
|
||||
OverwriteAll: true,
|
||||
PreservePerms: true,
|
||||
},
|
||||
{
|
||||
ArchivePath: archive2,
|
||||
DestPath: dest2,
|
||||
ArchiveType: models.ZIP,
|
||||
OverwriteAll: true,
|
||||
PreservePerms: true,
|
||||
},
|
||||
}
|
||||
|
||||
batchConfig := &BatchExtractConfig{
|
||||
Configs: configs,
|
||||
Parallel: false,
|
||||
MaxWorkers: 2,
|
||||
}
|
||||
|
||||
errors := BatchExtract(batchConfig)
|
||||
|
||||
// Check for errors
|
||||
for i, err := range errors {
|
||||
if err != nil {
|
||||
t.Errorf("Batch extract failed for config %d: %v", i, err)
|
||||
}
|
||||
}
|
||||
|
||||
// Verify files were extracted
|
||||
if _, err := os.Stat(filepath.Join(dest1, "test1.txt")); os.IsNotExist(err) {
|
||||
t.Error("test1.txt was not extracted")
|
||||
}
|
||||
if _, err := os.Stat(filepath.Join(dest2, "test2.txt")); os.IsNotExist(err) {
|
||||
t.Error("test2.txt was not extracted")
|
||||
}
|
||||
}
|
||||
|
||||
func TestConvertArchive(t *testing.T) {
|
||||
tmpDir, err := os.MkdirTemp("", "zipprine-convert-test-*")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create temp dir: %v", err)
|
||||
}
|
||||
defer os.RemoveAll(tmpDir)
|
||||
|
||||
// Create source directory and file
|
||||
sourceDir := filepath.Join(tmpDir, "source")
|
||||
os.Mkdir(sourceDir, 0755)
|
||||
os.WriteFile(filepath.Join(sourceDir, "test.txt"), []byte("test content"), 0644)
|
||||
|
||||
// Create ZIP archive
|
||||
zipPath := filepath.Join(tmpDir, "test.zip")
|
||||
err = Compress(&models.CompressConfig{
|
||||
SourcePath: sourceDir,
|
||||
OutputPath: zipPath,
|
||||
ArchiveType: models.ZIP,
|
||||
CompressionLevel: 5,
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create ZIP: %v", err)
|
||||
}
|
||||
|
||||
// Convert to TAR.GZ
|
||||
targzPath := filepath.Join(tmpDir, "test.tar.gz")
|
||||
err = ConvertArchive(zipPath, targzPath, models.ZIP, models.TARGZ)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to convert archive: %v", err)
|
||||
}
|
||||
|
||||
// Verify TAR.GZ was created
|
||||
if _, err := os.Stat(targzPath); os.IsNotExist(err) {
|
||||
t.Error("Converted archive was not created")
|
||||
}
|
||||
|
||||
// Extract and verify contents
|
||||
destDir := filepath.Join(tmpDir, "dest")
|
||||
err = Extract(&models.ExtractConfig{
|
||||
ArchivePath: targzPath,
|
||||
DestPath: destDir,
|
||||
ArchiveType: models.TARGZ,
|
||||
OverwriteAll: true,
|
||||
PreservePerms: true,
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to extract converted archive: %v", err)
|
||||
}
|
||||
|
||||
// Verify file exists
|
||||
if _, err := os.Stat(filepath.Join(destDir, "test.txt")); os.IsNotExist(err) {
|
||||
t.Error("File was not found in converted archive")
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkBatchCompressParallel(b *testing.B) {
|
||||
tmpDir, _ := os.MkdirTemp("", "zipprine-bench-*")
|
||||
defer os.RemoveAll(tmpDir)
|
||||
|
||||
// Create test directories
|
||||
configs := make([]*models.CompressConfig, 4)
|
||||
for i := 0; i < 4; i++ {
|
||||
dir := filepath.Join(tmpDir, "source"+string(rune('0'+i)))
|
||||
os.Mkdir(dir, 0755)
|
||||
os.WriteFile(filepath.Join(dir, "test.txt"), []byte("content"), 0644)
|
||||
|
||||
configs[i] = &models.CompressConfig{
|
||||
SourcePath: dir,
|
||||
OutputPath: filepath.Join(tmpDir, "archive"+string(rune('0'+i))+".zip"),
|
||||
ArchiveType: models.ZIP,
|
||||
CompressionLevel: 5,
|
||||
}
|
||||
}
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
batchConfig := &BatchCompressConfig{
|
||||
Configs: configs,
|
||||
Parallel: true,
|
||||
MaxWorkers: 2,
|
||||
}
|
||||
BatchCompress(batchConfig)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user