mirror of
https://github.com/Awuqing/BackupX.git
synced 2026-05-11 18:10:23 +08:00
70 lines
2.3 KiB
Go
70 lines
2.3 KiB
Go
package backup
|
|
|
|
import (
|
|
"archive/tar"
|
|
"context"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
type bufferWriter struct{ lines []string }
|
|
|
|
func (w *bufferWriter) WriteLine(message string) { w.lines = append(w.lines, message) }
|
|
|
|
func TestFileRunnerRunAndRestore(t *testing.T) {
|
|
tempDir := t.TempDir()
|
|
sourceDir := filepath.Join(tempDir, "site")
|
|
if err := os.MkdirAll(filepath.Join(sourceDir, "node_modules"), 0o755); err != nil {
|
|
t.Fatalf("MkdirAll returned error: %v", err)
|
|
}
|
|
if err := os.WriteFile(filepath.Join(sourceDir, "index.html"), []byte("ok"), 0o644); err != nil {
|
|
t.Fatalf("WriteFile returned error: %v", err)
|
|
}
|
|
if err := os.WriteFile(filepath.Join(sourceDir, "app.log"), []byte("skip"), 0o644); err != nil {
|
|
t.Fatalf("WriteFile returned error: %v", err)
|
|
}
|
|
if err := os.WriteFile(filepath.Join(sourceDir, "node_modules", "pkg.json"), []byte("skip-dir"), 0o644); err != nil {
|
|
t.Fatalf("WriteFile returned error: %v", err)
|
|
}
|
|
runner := NewFileRunner()
|
|
writer := &bufferWriter{}
|
|
result, err := runner.Run(context.Background(), TaskSpec{Name: "site files", Type: "file", SourcePath: sourceDir, ExcludePatterns: []string{"*.log", "node_modules"}}, writer)
|
|
if err != nil {
|
|
t.Fatalf("Run returned error: %v", err)
|
|
}
|
|
archiveFile, err := os.Open(result.ArtifactPath)
|
|
if err != nil {
|
|
t.Fatalf("Open returned error: %v", err)
|
|
}
|
|
defer archiveFile.Close()
|
|
reader := tar.NewReader(archiveFile)
|
|
entries := map[string]bool{}
|
|
for {
|
|
header, err := reader.Next()
|
|
if err != nil {
|
|
break
|
|
}
|
|
entries[header.Name] = true
|
|
}
|
|
if !entries["site/index.html"] {
|
|
t.Fatalf("expected site/index.html in archive, got %#v", entries)
|
|
}
|
|
if entries["site/app.log"] || entries["site/node_modules/pkg.json"] {
|
|
t.Fatalf("unexpected excluded entries: %#v", entries)
|
|
}
|
|
if err := os.RemoveAll(sourceDir); err != nil {
|
|
t.Fatalf("RemoveAll returned error: %v", err)
|
|
}
|
|
if err := runner.Restore(context.Background(), TaskSpec{Name: "site files", Type: "file", SourcePath: sourceDir}, result.ArtifactPath, writer); err != nil {
|
|
t.Fatalf("Restore returned error: %v", err)
|
|
}
|
|
content, err := os.ReadFile(filepath.Join(sourceDir, "index.html"))
|
|
if err != nil {
|
|
t.Fatalf("ReadFile returned error: %v", err)
|
|
}
|
|
if string(content) != "ok" {
|
|
t.Fatalf("unexpected restored content: %s", string(content))
|
|
}
|
|
}
|