116 lines
2.7 KiB
Go
116 lines
2.7 KiB
Go
package agate
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestSnapshotAsync(t *testing.T) {
|
|
// Setup temporary work directory
|
|
workDir, err := os.MkdirTemp("", "agate_async_test")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer os.RemoveAll(workDir)
|
|
|
|
// Initialize Agate
|
|
opts := AgateOptions{
|
|
WorkDir: workDir,
|
|
Logger: nil, // Disable logging for test
|
|
}
|
|
|
|
ag, err := New(opts)
|
|
if err != nil {
|
|
t.Fatalf("Failed to initialize Agate: %v", err)
|
|
}
|
|
defer ag.Close()
|
|
|
|
// Get active directory and create some dummy files
|
|
activeDir := ag.GetActiveDir()
|
|
if err := os.MkdirAll(activeDir, 0755); err != nil {
|
|
t.Fatalf("Failed to create active dir: %v", err)
|
|
}
|
|
|
|
// Create a large-ish file to ensure it takes some time (though still fast)
|
|
dummyFile := filepath.Join(activeDir, "data.bin")
|
|
data := make([]byte, 1024*1024) // 1MB
|
|
if err := os.WriteFile(dummyFile, data, 0644); err != nil {
|
|
t.Fatalf("Failed to create dummy file: %v", err)
|
|
}
|
|
|
|
// Start async snapshot
|
|
ctx := context.Background()
|
|
snapshotID, err := ag.SnapshotAsync(ctx, "async-snap", "")
|
|
if err != nil {
|
|
t.Fatalf("SnapshotAsync failed: %v", err)
|
|
}
|
|
|
|
if snapshotID == "" {
|
|
t.Fatal("SnapshotAsync returned empty ID")
|
|
}
|
|
|
|
// Check status immediately
|
|
status, err := ag.GetSnapshotStatus(ctx, snapshotID)
|
|
if err != nil {
|
|
t.Fatalf("GetSnapshotStatus failed: %v", err)
|
|
}
|
|
|
|
// Status should be pending or running
|
|
if status.Status != "pending" && status.Status != "running" {
|
|
t.Errorf("Initial status should be pending or running, got: %s", status.Status)
|
|
}
|
|
|
|
// Poll for completion
|
|
timeout := time.After(5 * time.Second)
|
|
ticker := time.NewTicker(10 * time.Millisecond)
|
|
defer ticker.Stop()
|
|
|
|
done := false
|
|
for !done {
|
|
select {
|
|
case <-timeout:
|
|
t.Fatal("Timeout waiting for snapshot completion")
|
|
case <-ticker.C:
|
|
status, err := ag.GetSnapshotStatus(ctx, snapshotID)
|
|
if err != nil {
|
|
t.Fatalf("GetSnapshotStatus failed during polling: %v", err)
|
|
}
|
|
|
|
if status.Status == "done" {
|
|
done = true
|
|
if status.Progress != 1.0 {
|
|
t.Errorf("Expected progress 1.0, got %f", status.Progress)
|
|
}
|
|
} else if status.Status == "failed" {
|
|
t.Fatalf("Snapshot creation failed: %s", status.Error)
|
|
}
|
|
}
|
|
}
|
|
|
|
// Verify snapshot exists
|
|
snaps, err := ag.ListSnapshots(ctx)
|
|
if err != nil {
|
|
t.Fatalf("ListSnapshots failed: %v", err)
|
|
}
|
|
|
|
found := false
|
|
for _, s := range snaps {
|
|
if s.ID == snapshotID {
|
|
found = true
|
|
break
|
|
}
|
|
}
|
|
|
|
if !found {
|
|
t.Errorf("Snapshot %s not found in list", snapshotID)
|
|
}
|
|
|
|
// Verify current snapshot ID is updated
|
|
if ag.GetCurrentSnapshotID() != snapshotID {
|
|
t.Errorf("Current snapshot ID not updated. Expected %s, got %s", snapshotID, ag.GetCurrentSnapshotID())
|
|
}
|
|
}
|