Refactor snapshot management: integrate logging, enhance concurrency with mutex, add clean extraction option, and update gRPC ListSnapshots with ListOptions.
This commit is contained in:
183
manager_test.go
183
manager_test.go
@ -90,8 +90,8 @@ func TestCreateAndGetSnapshot(t *testing.T) {
|
||||
}
|
||||
createTestFiles(t, sourceDir)
|
||||
|
||||
// Create a snapshot manager
|
||||
manager, err := CreateSnapshotManager(metadataStore, blobStore)
|
||||
// Create a snapshot manager with nil logger
|
||||
manager, err := CreateSnapshotManager(metadataStore, blobStore, nil)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create snapshot manager: %v", err)
|
||||
}
|
||||
@ -142,8 +142,8 @@ func TestListSnapshots(t *testing.T) {
|
||||
}
|
||||
createTestFiles(t, sourceDir)
|
||||
|
||||
// Create a snapshot manager
|
||||
manager, err := CreateSnapshotManager(metadataStore, blobStore)
|
||||
// Create a snapshot manager with nil logger
|
||||
manager, err := CreateSnapshotManager(metadataStore, blobStore, nil)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create snapshot manager: %v", err)
|
||||
}
|
||||
@ -165,8 +165,8 @@ func TestListSnapshots(t *testing.T) {
|
||||
t.Fatalf("Failed to create snapshot: %v", err)
|
||||
}
|
||||
|
||||
// List the snapshots
|
||||
snapshots, err := manager.ListSnapshots(ctx)
|
||||
// List the snapshots with empty options
|
||||
snapshots, err := manager.ListSnapshots(ctx, store.ListOptions{})
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to list snapshots: %v", err)
|
||||
}
|
||||
@ -209,8 +209,8 @@ func TestDeleteSnapshot(t *testing.T) {
|
||||
}
|
||||
createTestFiles(t, sourceDir)
|
||||
|
||||
// Create a snapshot manager
|
||||
manager, err := CreateSnapshotManager(metadataStore, blobStore)
|
||||
// Create a snapshot manager with nil logger
|
||||
manager, err := CreateSnapshotManager(metadataStore, blobStore, nil)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create snapshot manager: %v", err)
|
||||
}
|
||||
@ -235,7 +235,7 @@ func TestDeleteSnapshot(t *testing.T) {
|
||||
}
|
||||
|
||||
// List snapshots to confirm it's gone
|
||||
snapshots, err := manager.ListSnapshots(ctx)
|
||||
snapshots, err := manager.ListSnapshots(ctx, store.ListOptions{})
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to list snapshots: %v", err)
|
||||
}
|
||||
@ -255,8 +255,8 @@ func TestOpenFile(t *testing.T) {
|
||||
}
|
||||
createTestFiles(t, sourceDir)
|
||||
|
||||
// Create a snapshot manager
|
||||
manager, err := CreateSnapshotManager(metadataStore, blobStore)
|
||||
// Create a snapshot manager with nil logger
|
||||
manager, err := CreateSnapshotManager(metadataStore, blobStore, nil)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create snapshot manager: %v", err)
|
||||
}
|
||||
@ -309,8 +309,8 @@ func TestExtractSnapshot(t *testing.T) {
|
||||
}
|
||||
createTestFiles(t, sourceDir)
|
||||
|
||||
// Create a snapshot manager
|
||||
manager, err := CreateSnapshotManager(metadataStore, blobStore)
|
||||
// Create a snapshot manager with nil logger
|
||||
manager, err := CreateSnapshotManager(metadataStore, blobStore, nil)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create snapshot manager: %v", err)
|
||||
}
|
||||
@ -328,8 +328,8 @@ func TestExtractSnapshot(t *testing.T) {
|
||||
t.Fatalf("Failed to create target directory: %v", err)
|
||||
}
|
||||
|
||||
// Extract the snapshot
|
||||
err = manager.ExtractSnapshot(ctx, snapshot.ID, targetDir)
|
||||
// Extract the snapshot with default behavior (cleanTarget=false)
|
||||
err = manager.ExtractSnapshot(ctx, snapshot.ID, targetDir, false)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to extract snapshot: %v", err)
|
||||
}
|
||||
@ -353,12 +353,159 @@ func TestExtractSnapshot(t *testing.T) {
|
||||
}
|
||||
|
||||
// Try to extract a non-existent snapshot
|
||||
err = manager.ExtractSnapshot(ctx, "nonexistent-id", targetDir)
|
||||
err = manager.ExtractSnapshot(ctx, "nonexistent-id", targetDir, false)
|
||||
if err == nil {
|
||||
t.Fatalf("Expected error when extracting non-existent snapshot, got nil")
|
||||
}
|
||||
}
|
||||
|
||||
// TestExtractSnapshot_SafeRestore tests that ExtractSnapshot with cleanTarget=false
|
||||
// does not remove extra files in the target directory
|
||||
func TestExtractSnapshot_SafeRestore(t *testing.T) {
|
||||
tempDir, metadataStore, blobStore, cleanup := setupTestEnvironment(t)
|
||||
defer cleanup()
|
||||
|
||||
// Create a source directory with test files
|
||||
sourceDir := filepath.Join(tempDir, "source")
|
||||
if err := os.MkdirAll(sourceDir, 0755); err != nil {
|
||||
t.Fatalf("Failed to create source directory: %v", err)
|
||||
}
|
||||
createTestFiles(t, sourceDir)
|
||||
|
||||
// Create a snapshot manager with nil logger
|
||||
manager, err := CreateSnapshotManager(metadataStore, blobStore, nil)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create snapshot manager: %v", err)
|
||||
}
|
||||
|
||||
// Create a snapshot (snapshot A)
|
||||
ctx := context.Background()
|
||||
snapshot, err := manager.CreateSnapshot(ctx, sourceDir, "Snapshot A", "")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create snapshot: %v", err)
|
||||
}
|
||||
|
||||
// Create a target directory and place an "extra" file in it
|
||||
targetDir := filepath.Join(tempDir, "target")
|
||||
if err := os.MkdirAll(targetDir, 0755); err != nil {
|
||||
t.Fatalf("Failed to create target directory: %v", err)
|
||||
}
|
||||
extraFilePath := filepath.Join(targetDir, "extra.txt")
|
||||
if err := os.WriteFile(extraFilePath, []byte("This is an extra file"), 0644); err != nil {
|
||||
t.Fatalf("Failed to create extra file: %v", err)
|
||||
}
|
||||
|
||||
// Extract the snapshot with cleanTarget=false
|
||||
err = manager.ExtractSnapshot(ctx, snapshot.ID, targetDir, false)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to extract snapshot: %v", err)
|
||||
}
|
||||
|
||||
// Check that all files from the snapshot were restored
|
||||
testFiles := map[string]string{
|
||||
filepath.Join(targetDir, "file1.txt"): "This is file 1",
|
||||
filepath.Join(targetDir, "file2.txt"): "This is file 2",
|
||||
filepath.Join(targetDir, "subdir/subfile1.txt"): "This is subfile 1",
|
||||
filepath.Join(targetDir, "subdir/subfile2.txt"): "This is subfile 2",
|
||||
}
|
||||
|
||||
for path, expectedContent := range testFiles {
|
||||
content, err := os.ReadFile(path)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to read extracted file %s: %v", path, err)
|
||||
}
|
||||
if string(content) != expectedContent {
|
||||
t.Errorf("Extracted file %s has wrong content: got %s, want %s", path, string(content), expectedContent)
|
||||
}
|
||||
}
|
||||
|
||||
// Check that the extra file was NOT deleted
|
||||
if _, err := os.Stat(extraFilePath); os.IsNotExist(err) {
|
||||
t.Errorf("Extra file was deleted, but should have been preserved with cleanTarget=false")
|
||||
} else if err != nil {
|
||||
t.Fatalf("Failed to check if extra file exists: %v", err)
|
||||
} else {
|
||||
// Read the content to make sure it wasn't modified
|
||||
content, err := os.ReadFile(extraFilePath)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to read extra file: %v", err)
|
||||
}
|
||||
if string(content) != "This is an extra file" {
|
||||
t.Errorf("Extra file content was modified: got %s, want %s", string(content), "This is an extra file")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TestExtractSnapshot_CleanRestore tests that ExtractSnapshot with cleanTarget=true
|
||||
// completely cleans the target directory before restoration
|
||||
func TestExtractSnapshot_CleanRestore(t *testing.T) {
|
||||
tempDir, metadataStore, blobStore, cleanup := setupTestEnvironment(t)
|
||||
defer cleanup()
|
||||
|
||||
// Create a source directory with test files
|
||||
sourceDir := filepath.Join(tempDir, "source")
|
||||
if err := os.MkdirAll(sourceDir, 0755); err != nil {
|
||||
t.Fatalf("Failed to create source directory: %v", err)
|
||||
}
|
||||
createTestFiles(t, sourceDir)
|
||||
|
||||
// Create a snapshot manager with nil logger
|
||||
manager, err := CreateSnapshotManager(metadataStore, blobStore, nil)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create snapshot manager: %v", err)
|
||||
}
|
||||
|
||||
// Create a snapshot (snapshot A)
|
||||
ctx := context.Background()
|
||||
snapshot, err := manager.CreateSnapshot(ctx, sourceDir, "Snapshot A", "")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create snapshot: %v", err)
|
||||
}
|
||||
|
||||
// Create a target directory and place an "extra" file in it
|
||||
targetDir := filepath.Join(tempDir, "target")
|
||||
if err := os.MkdirAll(targetDir, 0755); err != nil {
|
||||
t.Fatalf("Failed to create target directory: %v", err)
|
||||
}
|
||||
extraFilePath := filepath.Join(targetDir, "extra.txt")
|
||||
if err := os.WriteFile(extraFilePath, []byte("This is an extra file"), 0644); err != nil {
|
||||
t.Fatalf("Failed to create extra file: %v", err)
|
||||
}
|
||||
|
||||
// Extract the snapshot with cleanTarget=true
|
||||
err = manager.ExtractSnapshot(ctx, snapshot.ID, targetDir, true)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to extract snapshot: %v", err)
|
||||
}
|
||||
|
||||
// Check that all files from the snapshot were restored
|
||||
testFiles := map[string]string{
|
||||
filepath.Join(targetDir, "file1.txt"): "This is file 1",
|
||||
filepath.Join(targetDir, "file2.txt"): "This is file 2",
|
||||
filepath.Join(targetDir, "subdir/subfile1.txt"): "This is subfile 1",
|
||||
filepath.Join(targetDir, "subdir/subfile2.txt"): "This is subfile 2",
|
||||
}
|
||||
|
||||
for path, expectedContent := range testFiles {
|
||||
content, err := os.ReadFile(path)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to read extracted file %s: %v", path, err)
|
||||
}
|
||||
if string(content) != expectedContent {
|
||||
t.Errorf("Extracted file %s has wrong content: got %s, want %s", path, string(content), expectedContent)
|
||||
}
|
||||
}
|
||||
|
||||
// Check that the extra file WAS deleted
|
||||
if _, err := os.Stat(extraFilePath); os.IsNotExist(err) {
|
||||
// This is the expected behavior
|
||||
} else if err != nil {
|
||||
t.Fatalf("Failed to check if extra file exists: %v", err)
|
||||
} else {
|
||||
t.Errorf("Extra file was not deleted, but should have been removed with cleanTarget=true")
|
||||
}
|
||||
}
|
||||
|
||||
func TestUpdateSnapshotMetadata(t *testing.T) {
|
||||
tempDir, metadataStore, blobStore, cleanup := setupTestEnvironment(t)
|
||||
defer cleanup()
|
||||
@ -370,8 +517,8 @@ func TestUpdateSnapshotMetadata(t *testing.T) {
|
||||
}
|
||||
createTestFiles(t, sourceDir)
|
||||
|
||||
// Create a snapshot manager
|
||||
manager, err := CreateSnapshotManager(metadataStore, blobStore)
|
||||
// Create a snapshot manager with nil logger
|
||||
manager, err := CreateSnapshotManager(metadataStore, blobStore, nil)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create snapshot manager: %v", err)
|
||||
}
|
||||
|
Reference in New Issue
Block a user