benzcloud-server/internal/core/drive/drive_test.go

84 lines
2.3 KiB
Go

package drive
import (
"bytes"
"os"
"path/filepath"
"testing"
"github.com/benzjeremy/benzcloud-server/internal/core/crypto"
)
func TestDriveManager(t *testing.T) {
tempDir, err := os.MkdirTemp("", "benzcloud_drive_test")
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(tempDir)
salt, _ := crypto.GenerateSalt(16)
masterKey := crypto.DeriveKey("MasterSecretDriveKey2026", salt)
dm, err := NewDriveManager(tempDir, masterKey)
if err != nil {
t.Fatalf("NewDriveManager failed: %v", err)
}
username := "jeremy"
content := []byte("Strictly Confidential Cloud Document: Project BenzCloud Architecture")
// 1. Save file
item, err := dm.SaveFile(username, "docs/architecture.txt", bytes.NewReader(content))
if err != nil {
t.Fatalf("SaveFile failed: %v", err)
}
if item.Name != "architecture.txt" {
t.Fatalf("Expected file name architecture.txt, got %s", item.Name)
}
// Verify encryption on physical disk
rawOnDisk, err := os.ReadFile(filepath.Join(tempDir, "drive", username, "docs", "architecture.txt"))
if err != nil {
t.Fatalf("Failed to read raw file from disk: %v", err)
}
if bytes.Contains(rawOnDisk, content) {
t.Fatal("SECURITY BUG: Raw disk content contains unencrypted plaintext!")
}
// 2. Read and decrypt file
decrypted, readItem, err := dm.ReadFile(username, "docs/architecture.txt")
if err != nil {
t.Fatalf("ReadFile failed: %v", err)
}
if !bytes.Equal(content, decrypted) {
t.Fatalf("Decrypted content mismatch: got %s, want %s", string(decrypted), string(content))
}
if readItem.SHA256 != item.SHA256 {
t.Fatalf("SHA256 checksum mismatch: %s vs %s", readItem.SHA256, item.SHA256)
}
// 3. List directory
files, err := dm.ListDirectory(username, "docs")
if err != nil {
t.Fatalf("ListDirectory failed: %v", err)
}
if len(files) != 1 {
t.Fatalf("Expected 1 file in docs, got %d", len(files))
}
// 4. Path traversal test
_, _, err = dm.ReadFile(username, "../../etc/passwd")
if err == nil {
t.Fatal("SECURITY BUG: Path traversal did not return error!")
}
// 5. Delete file
if err := dm.DeleteFile(username, "docs/architecture.txt"); err != nil {
t.Fatalf("DeleteFile failed: %v", err)
}
_, _, err = dm.ReadFile(username, "docs/architecture.txt")
if err == nil {
t.Fatal("Expected error reading deleted file, got nil")
}
}