This commit introduces test cases for the API, archive, store, and filesystem functionalities, as well as a functional test for a full workflow. It ensures robust testing for snapshot operations, archiving, and blob management, significantly improving reliability.
		
			
				
	
	
		
			229 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			229 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
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))
 | 
						|
	}
 | 
						|
}
 |