142 lines
3.2 KiB
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"
|