128 lines
4.4 KiB
Nim
128 lines
4.4 KiB
Nim
import unittest
|
|
import os
|
|
import strutils
|
|
|
|
# Import all public symbols from graft module
|
|
from ../src/nip/graft import GraftError, GraftAuditLog, calculateBlake2b, archiveExists, reuseExistingArchive, storeArchiveHash, parseVersionFromFilename, detectPackageVersion
|
|
|
|
suite "BLAKE2b Grafting Tests":
|
|
|
|
setup:
|
|
# Create test directories
|
|
createDir("/tmp/test_nexusos/Programs")
|
|
createDir("/tmp/test_nexusos/cache")
|
|
|
|
teardown:
|
|
# Clean up test directories
|
|
if dirExists("/tmp/test_nexusos"):
|
|
removeDir("/tmp/test_nexusos")
|
|
|
|
test "calculateBlake2b should calculate correct hash":
|
|
# Create a test file with known content
|
|
let testFile = "/tmp/test_file.txt"
|
|
let testContent = "Hello, NexusOS!"
|
|
writeFile(testFile, testContent)
|
|
|
|
# Calculate hash
|
|
let hash = calculateBlake2b(testFile)
|
|
|
|
# Verify hash format
|
|
check hash.startsWith("blake2b-")
|
|
check hash.len > 10 # Should be a reasonable length
|
|
|
|
# Calculate same hash again - should be identical
|
|
let hash2 = calculateBlake2b(testFile)
|
|
check hash == hash2
|
|
|
|
# Clean up
|
|
removeFile(testFile)
|
|
|
|
test "calculateBlake2b should handle file read errors":
|
|
expect(GraftError):
|
|
discard calculateBlake2b("/nonexistent/file.txt")
|
|
|
|
test "archiveExists should detect existing archives":
|
|
let cacheDir = "/tmp/test_nexusos/cache"
|
|
let testHash = "blake2b-testhash123"
|
|
|
|
# Initially should not exist
|
|
check not archiveExists(cacheDir, testHash)
|
|
|
|
# Create hash file
|
|
let hashFile = joinPath(cacheDir, testHash & ".hash")
|
|
writeFile(hashFile, "/path/to/archive.pkg.tar.zst")
|
|
|
|
# Now should exist
|
|
check archiveExists(cacheDir, testHash)
|
|
|
|
test "storeArchiveHash and reuseExistingArchive should work together":
|
|
let cacheDir = "/tmp/test_nexusos/cache"
|
|
let testHash = "blake2b-testhash456"
|
|
let archivePath = "/path/to/test/archive.pkg.tar.zst"
|
|
|
|
# Store hash mapping
|
|
storeArchiveHash(cacheDir, archivePath, testHash)
|
|
|
|
# Should be able to retrieve it
|
|
check archiveExists(cacheDir, testHash)
|
|
let retrievedPath = reuseExistingArchive(cacheDir, testHash)
|
|
check retrievedPath == archivePath
|
|
|
|
test "reuseExistingArchive should handle missing hash files":
|
|
let cacheDir = "/tmp/test_nexusos/cache"
|
|
let nonexistentHash = "blake2b-nonexistent"
|
|
|
|
expect(GraftError):
|
|
discard reuseExistingArchive(cacheDir, nonexistentHash)
|
|
|
|
test "parseVersionFromFilename should parse pacman filenames correctly":
|
|
# Test typical pacman filename
|
|
check parseVersionFromFilename("neofetch-7.1.0-2-any.pkg.tar.zst") == "7.1.0-2"
|
|
check parseVersionFromFilename("vim-9.0.1000-1-x86_64.pkg.tar.xz") == "9.0.1000-1"
|
|
check parseVersionFromFilename("simple-1.0-any.pkg.tar.zst") == "1.0"
|
|
|
|
# Test edge cases
|
|
check parseVersionFromFilename("invalid-filename") == "unknown"
|
|
check parseVersionFromFilename("") == "unknown"
|
|
|
|
test "detectPackageVersion should handle command failures gracefully":
|
|
# Test with a package that definitely doesn't exist
|
|
let version = detectPackageVersion("nonexistent-package-xyz123")
|
|
check version == "latest" # Should fallback to "latest"
|
|
|
|
test "GraftAuditLog should contain all required fields":
|
|
let auditLog = GraftAuditLog(
|
|
timestamp: "2024-01-01T12:00:00+00:00",
|
|
source: "pacman",
|
|
packageName: "test-package",
|
|
version: "1.0.0",
|
|
downloadedFilename: "test-package-1.0.0-any.pkg.tar.zst",
|
|
blake2bHash: "blake2b-testhash",
|
|
hashAlgorithm: "blake2b",
|
|
sourceOutput: "test output",
|
|
archiveSize: 1024,
|
|
extractionTime: 0.5,
|
|
fileCount: 10,
|
|
deduplicationStatus: "New",
|
|
originalArchivePath: "/path/to/archive"
|
|
)
|
|
|
|
# Verify all fields are accessible
|
|
check auditLog.timestamp == "2024-01-01T12:00:00+00:00"
|
|
check auditLog.source == "pacman"
|
|
check auditLog.packageName == "test-package"
|
|
check auditLog.version == "1.0.0"
|
|
check auditLog.downloadedFilename == "test-package-1.0.0-any.pkg.tar.zst"
|
|
check auditLog.blake2bHash == "blake2b-testhash"
|
|
check auditLog.hashAlgorithm == "blake2b"
|
|
check auditLog.sourceOutput == "test output"
|
|
check auditLog.archiveSize == 1024
|
|
check auditLog.extractionTime == 0.5
|
|
check auditLog.fileCount == 10
|
|
check auditLog.deduplicationStatus == "New"
|
|
check auditLog.originalArchivePath == "/path/to/archive"
|
|
|
|
when isMainModule:
|
|
# Run the tests
|
|
echo "Running BLAKE2b Grafting Tests..."
|