package filesystem import ( "bytes" "context" "io" "os" "path/filepath" "testing" ) func TestNewFileSystemStore(t *testing.T) { // Create a temporary directory for tests tempDir, err := os.MkdirTemp("", "agate-test-*") if err != nil { t.Fatalf("Failed to create temp directory: %v", err) } defer os.RemoveAll(tempDir) // Clean up after test // Create a new store store, err := NewFileSystemStore(tempDir) if err != nil { t.Fatalf("Failed to create filesystem store: %v", err) } // Check that directories were created if _, err := os.Stat(tempDir); os.IsNotExist(err) { t.Fatalf("Base directory was not created") } // Check that the store's base directory matches the expected path if store.GetBaseDir() != tempDir { t.Fatalf("Store base directory does not match: got %s, want %s", store.GetBaseDir(), tempDir) } activeDir := filepath.Join(tempDir, "active") if _, err := os.Stat(activeDir); os.IsNotExist(err) { t.Fatalf("Active directory was not created") } // Check that the store's active directory matches the expected path if store.GetActiveDir() != activeDir { t.Fatalf("Store active directory does not match: got %s, want %s", store.GetActiveDir(), activeDir) } } func TestStoreAndRetrieveBlob(t *testing.T) { // Create a temporary directory for tests tempDir, err := os.MkdirTemp("", "agate-test-*") if err != nil { t.Fatalf("Failed to create temp directory: %v", err) } defer os.RemoveAll(tempDir) // Clean up after test // Create a new store store, err := NewFileSystemStore(tempDir) if err != nil { t.Fatalf("Failed to create filesystem store: %v", err) } // Create test data testData := []byte("test data for blob") reader := bytes.NewReader(testData) ctx := context.Background() // Store the blob snapshotID := "test-snapshot-id" path, err := store.StoreBlob(ctx, snapshotID, reader) if err != nil { t.Fatalf("Failed to store blob: %v", err) } // Check that the file was created if _, err := os.Stat(path); os.IsNotExist(err) { t.Fatalf("Blob file was not created") } // Retrieve the blob blobReader, err := store.RetrieveBlob(ctx, snapshotID) if err != nil { t.Fatalf("Failed to retrieve blob: %v", err) } defer blobReader.Close() // Read the data retrievedData, err := io.ReadAll(blobReader) if err != nil { t.Fatalf("Failed to read blob data: %v", err) } // Check that the data matches if !bytes.Equal(testData, retrievedData) { t.Fatalf("Retrieved data does not match original data") } } func TestDeleteBlob(t *testing.T) { // Create a temporary directory for tests tempDir, err := os.MkdirTemp("", "agate-test-*") if err != nil { t.Fatalf("Failed to create temp directory: %v", err) } defer os.RemoveAll(tempDir) // Clean up after test // Create a new store store, err := NewFileSystemStore(tempDir) if err != nil { t.Fatalf("Failed to create filesystem store: %v", err) } // Create test data testData := []byte("test data for blob") reader := bytes.NewReader(testData) ctx := context.Background() // Store the blob snapshotID := "test-snapshot-id" path, err := store.StoreBlob(ctx, snapshotID, reader) if err != nil { t.Fatalf("Failed to store blob: %v", err) } // Delete the blob err = store.DeleteBlob(ctx, snapshotID) if err != nil { t.Fatalf("Failed to delete blob: %v", err) } // Check that the file was deleted if _, err := os.Stat(path); !os.IsNotExist(err) { t.Fatalf("Blob file was not deleted") } // Deleting a non-existent blob should not return an error err = store.DeleteBlob(ctx, "non-existent-id") if err != nil { t.Fatalf("DeleteBlob returned an error for non-existent blob: %v", err) } } func TestGetBlobPath(t *testing.T) { // Create a temporary directory for tests tempDir, err := os.MkdirTemp("", "agate-test-*") if err != nil { t.Fatalf("Failed to create temp directory: %v", err) } defer os.RemoveAll(tempDir) // Clean up after test // Create a new store store, err := NewFileSystemStore(tempDir) if err != nil { t.Fatalf("Failed to create filesystem store: %v", err) } // Create test data testData := []byte("test data for blob") reader := bytes.NewReader(testData) ctx := context.Background() // Store the blob snapshotID := "test-snapshot-id" expectedPath, err := store.StoreBlob(ctx, snapshotID, reader) if err != nil { t.Fatalf("Failed to store blob: %v", err) } // Get the blob path path, err := store.GetBlobPath(ctx, snapshotID) if err != nil { t.Fatalf("Failed to get blob path: %v", err) } // Check that the path matches if path != expectedPath { t.Fatalf("GetBlobPath returned incorrect path: got %s, want %s", path, expectedPath) } // Getting path for non-existent blob should return ErrNotFound _, err = store.GetBlobPath(ctx, "non-existent-id") if err == nil { t.Fatalf("GetBlobPath did not return an error for non-existent blob") } } func TestCleanActiveDir(t *testing.T) { // Create a temporary directory for tests tempDir, err := os.MkdirTemp("", "agate-test-*") if err != nil { t.Fatalf("Failed to create temp directory: %v", err) } defer os.RemoveAll(tempDir) // Clean up after test // Create a new store store, err := NewFileSystemStore(tempDir) if err != nil { t.Fatalf("Failed to create filesystem store: %v", err) } // Get the active directory activeDir := store.GetActiveDir() // Create some test files in the active directory testFile1 := filepath.Join(activeDir, "test1.txt") testFile2 := filepath.Join(activeDir, "test2.txt") if err := os.WriteFile(testFile1, []byte("test1"), 0644); err != nil { t.Fatalf("Failed to create test file: %v", err) } if err := os.WriteFile(testFile2, []byte("test2"), 0644); err != nil { t.Fatalf("Failed to create test file: %v", err) } // Clean the active directory ctx := context.Background() err = store.CleanActiveDir(ctx) if err != nil { t.Fatalf("Failed to clean active directory: %v", err) } // Check that the files were deleted entries, err := os.ReadDir(activeDir) if err != nil { t.Fatalf("Failed to read active directory: %v", err) } if len(entries) > 0 { t.Fatalf("Active directory was not cleaned, %d files remain", len(entries)) } }