nip/tests/test_binary_cache.nim

227 lines
5.7 KiB
Nim

## Test binary cache functionality
import std/[os, times, tables, options]
import ../src/nimpak/build/binary_cache
const TestDir = "/tmp/nip-cache-test"
proc setupTest() =
if dirExists(TestDir):
removeDir(TestDir)
createDir(TestDir)
proc cleanupTest() =
if dirExists(TestDir):
removeDir(TestDir)
proc testCacheManager() =
echo "Testing BinaryCacheManager..."
let bcm = newBinaryCacheManager(TestDir / "cache")
if dirExists(bcm.cacheDir):
echo "✓ Cache directory created"
else:
echo "✗ Cache directory not created"
return
echo "✓ BinaryCacheManager initialized"
proc testVariantFingerprint() =
echo "\nTesting variant fingerprint..."
# Test with USE flags
let fp1 = calculateVariantFingerprint(
useFlags = @["python", "ruby"],
cflags = "-O2"
)
# Same flags, different order - should be same fingerprint
let fp2 = calculateVariantFingerprint(
useFlags = @["ruby", "python"],
cflags = "-O2"
)
if fp1 == fp2:
echo "✓ Variant fingerprint is order-independent"
else:
echo "✗ Variant fingerprint order-dependent (unexpected)"
# Different flags - should be different fingerprint
let fp3 = calculateVariantFingerprint(
useFlags = @["python"],
cflags = "-O2"
)
if fp1 != fp3:
echo "✓ Different variants have different fingerprints"
else:
echo "✗ Different variants have same fingerprint (unexpected)"
proc testCacheStorage() =
echo "\nTesting cache storage..."
let bcm = newBinaryCacheManager(TestDir / "cache")
# Create a test artifact
let artifactPath = TestDir / "test-artifact.tar.gz"
writeFile(artifactPath, "test artifact content")
# Store in cache
let fp = calculateVariantFingerprint(useFlags = @["test"])
let stored = bcm.store(
"test-package",
"1.0.0",
fp,
artifactPath
)
if stored:
echo "✓ Artifact stored in cache"
else:
echo "✗ Failed to store artifact"
return
# Verify it's in the index
let stats = bcm.getStats()
if stats.totalEntries == 1:
echo "✓ Cache index updated"
else:
echo "✗ Cache index not updated"
proc testCacheLookup() =
echo "\nTesting cache lookup..."
let bcm = newBinaryCacheManager(TestDir / "cache")
# Create and store artifact
let artifactPath = TestDir / "test-artifact2.tar.gz"
writeFile(artifactPath, "test artifact content 2")
let fp = calculateVariantFingerprint(useFlags = @["lookup-test"])
discard bcm.store("lookup-package", "2.0.0", fp, artifactPath)
# Look it up
let entry = bcm.lookup("lookup-package", "2.0.0", fp)
if entry.isSome:
echo "✓ Cache lookup successful (hit)"
let e = entry.get()
if e.packageName == "lookup-package":
echo "✓ Correct package retrieved"
else:
echo "✗ Cache lookup failed (miss)"
return
# Try lookup with wrong fingerprint
let wrongFp = calculateVariantFingerprint(useFlags = @["wrong"])
let missEntry = bcm.lookup("lookup-package", "2.0.0", wrongFp)
if missEntry.isNone:
echo "✓ Cache miss works correctly"
else:
echo "✗ Cache returned entry for wrong fingerprint"
proc testCacheVerification() =
echo "\nTesting cache verification..."
let bcm = newBinaryCacheManager(TestDir / "cache")
# Create and store artifact
let artifactPath = TestDir / "test-artifact3.tar.gz"
writeFile(artifactPath, "test artifact content 3")
let fp = calculateVariantFingerprint(useFlags = @["verify-test"])
discard bcm.store("verify-package", "3.0.0", fp, artifactPath)
# Look it up and verify
let entry = bcm.lookup("verify-package", "3.0.0", fp)
if entry.isSome:
if bcm.verify(entry.get()):
echo "✓ Cache verification successful"
else:
echo "✗ Cache verification failed"
else:
echo "✗ Could not find entry to verify"
proc testCacheRemoval() =
echo "\nTesting cache removal..."
let bcm = newBinaryCacheManager(TestDir / "cache")
# Create and store artifact
let artifactPath = TestDir / "test-artifact4.tar.gz"
writeFile(artifactPath, "test artifact content 4")
let fp = calculateVariantFingerprint(useFlags = @["remove-test"])
discard bcm.store("remove-package", "4.0.0", fp, artifactPath)
# Verify it's there
let beforeStats = bcm.getStats()
let entriesBefore = beforeStats.totalEntries
# Remove it
let removed = bcm.remove("remove-package", "4.0.0", fp)
if removed:
echo "✓ Cache entry removed"
# Verify it's gone
let afterStats = bcm.getStats()
if afterStats.totalEntries == entriesBefore - 1:
echo "✓ Cache index updated after removal"
else:
echo "✗ Cache index not updated correctly"
else:
echo "✗ Failed to remove cache entry"
proc testCacheStats() =
echo "\nTesting cache statistics..."
let bcm = newBinaryCacheManager(TestDir / "cache")
# Add some entries
for i in 1..3:
let artifactPath = TestDir / "artifact" & $i & ".tar.gz"
writeFile(artifactPath, "content " & $i)
let fp = calculateVariantFingerprint(useFlags = @["test" & $i])
discard bcm.store("pkg" & $i, "1.0.0", fp, artifactPath)
# Do some lookups
let fp1 = calculateVariantFingerprint(useFlags = @["test1"])
discard bcm.lookup("pkg1", "1.0.0", fp1) # Hit
discard bcm.lookup("pkg-nonexistent", "1.0.0", fp1) # Miss
let stats = bcm.getStats()
echo " Entries: ", stats.totalEntries
echo " Hits: ", stats.hits
echo " Misses: ", stats.misses
if stats.totalEntries == 3:
echo "✓ Correct number of entries"
else:
echo "✗ Incorrect number of entries"
proc main() =
echo "Binary Cache Tests"
echo "==================\n"
setupTest()
testCacheManager()
testVariantFingerprint()
testCacheStorage()
testCacheLookup()
testCacheVerification()
testCacheRemoval()
testCacheStats()
cleanupTest()
echo "\n✅ All tests complete!"
when isMainModule:
main()