nip/tests/test_download_manager.nim

142 lines
3.2 KiB
Nim

## test_download_manager.nim
## Unit tests for download manager
import std/[unittest, os, strutils, times]
import ../src/nimpak/build/download_manager
import ../src/nimpak/cas
suite "Download Manager":
setup:
let tempDir = getTempDir() / "test-download-manager"
removeDir(tempDir)
createDir(tempDir)
let dm = newDownloadManager(tempDir)
teardown:
dm.close()
removeDir(tempDir)
test "Create download manager":
check:
dm != nil
dirExists(dm.cacheDir)
test "Get cached file path":
let path = dm.getCachedFile("test.txt")
check:
path.contains("test.txt")
path.startsWith(dm.cacheDir)
test "Verify checksum - valid":
let testFile = tempDir / "test.txt"
writeFile(testFile, "test content")
# Calculate actual checksum
let hashResult = calculateBlake2b(testFile)
check hashResult.isOk
let checksum = hashResult.value
let verified = verifyChecksum(testFile, checksum)
check:
verified == true
test "Verify checksum - invalid":
let testFile = tempDir / "test.txt"
writeFile(testFile, "test content")
let verified = verifyChecksum(testFile, "blake2b-invalid123")
check:
verified == false
test "Verify checksum - missing file":
let verified = verifyChecksum(tempDir / "nonexistent.txt", "blake2b-123")
check:
verified == false
suite "Download Resume Support":
setup:
let tempDir = getTempDir() / "test-download-resume"
removeDir(tempDir)
createDir(tempDir)
let dm = newDownloadManager(tempDir)
teardown:
dm.close()
removeDir(tempDir)
test "Detect partial download":
let partialFile = tempDir / "test.txt.partial"
writeFile(partialFile, "partial content")
check:
fileExists(partialFile)
getFileSize(partialFile) > 0
test "Resume from partial":
# Create a partial file
let destPath = tempDir / "download.txt"
let partialPath = destPath & ".partial"
writeFile(partialPath, "partial")
let partialSize = getFileSize(partialPath)
check:
partialSize > 0
fileExists(partialPath)
suite "Download Retry Logic":
setup:
let tempDir = getTempDir() / "test-download-retry"
removeDir(tempDir)
createDir(tempDir)
let dm = newDownloadManager(tempDir)
teardown:
dm.close()
removeDir(tempDir)
test "Max retries configured":
check:
dm.maxRetries == DefaultMaxRetries
dm.maxRetries > 0
test "Timeout configured":
# Just check timeout is set
check:
dm.timeout != initDuration()
suite "Checksum Algorithms":
test "Blake2b format":
let checksum = "blake2b-abc123def456"
let parts = checksum.split({'-', ':'}, maxsplit = 1)
check:
parts.len == 2
parts[0] == "blake2b"
parts[1] == "abc123def456"
test "SHA256 format":
let checksum = "sha256:abc123def456"
let parts = checksum.split({'-', ':'}, maxsplit = 1)
check:
parts.len == 2
parts[0] == "sha256"
parts[1] == "abc123def456"
test "Invalid format":
let checksum = "invalid"
let parts = checksum.split({'-', ':'}, maxsplit = 1)
check:
parts.len == 1
echo "✅ All download manager tests completed"