201 lines
5.0 KiB
Nim
201 lines
5.0 KiB
Nim
## test_container_builds.nim
|
|
## End-to-end tests for container-based builds
|
|
|
|
import std/[unittest, os, osproc, strutils]
|
|
|
|
proc hasDocker(): bool =
|
|
## Check if Docker is available
|
|
try:
|
|
let output = execProcess("docker --version 2>&1")
|
|
return output.contains("Docker version")
|
|
except:
|
|
return false
|
|
|
|
proc hasPodman(): bool =
|
|
## Check if Podman is available
|
|
try:
|
|
let output = execProcess("podman --version 2>&1")
|
|
return output.contains("podman version")
|
|
except:
|
|
return false
|
|
|
|
proc hasContainerRuntime(): bool =
|
|
## Check if any container runtime is available
|
|
return hasPodman() or hasDocker()
|
|
|
|
suite "Container Runtime Detection":
|
|
test "Detect available runtime":
|
|
if not hasContainerRuntime():
|
|
skip()
|
|
|
|
check:
|
|
hasContainerRuntime() == true
|
|
|
|
test "Docker or Podman available":
|
|
if not hasContainerRuntime():
|
|
skip()
|
|
|
|
let dockerAvail = hasDocker()
|
|
let podmanAvail = hasPodman()
|
|
|
|
check:
|
|
dockerAvail or podmanAvail
|
|
|
|
suite "Container Image Operations":
|
|
test "Pull Gentoo image":
|
|
if not hasContainerRuntime():
|
|
skip()
|
|
|
|
let runtime = if hasPodman(): "podman" else: "docker"
|
|
|
|
echo "Pulling Gentoo stage3 image (this may take a while)..."
|
|
let output = execProcess(runtime & " pull gentoo/stage3:latest 2>&1")
|
|
|
|
check:
|
|
output.len > 0
|
|
|
|
test "Pull Nix image":
|
|
if not hasContainerRuntime():
|
|
skip()
|
|
|
|
let runtime = if hasPodman(): "podman" else: "docker"
|
|
|
|
echo "Pulling Nix image..."
|
|
let output = execProcess(runtime & " pull nixos/nix:latest 2>&1")
|
|
|
|
check:
|
|
output.len > 0
|
|
|
|
suite "Container Build Tests":
|
|
test "Simple container execution":
|
|
if not hasContainerRuntime():
|
|
skip()
|
|
|
|
let runtime = if hasPodman(): "podman" else: "docker"
|
|
|
|
# Test basic container execution
|
|
let output = execProcess(runtime & " run --rm alpine:latest echo 'Hello from container' 2>&1")
|
|
|
|
check:
|
|
output.contains("Hello from container")
|
|
|
|
test "Container with volume mount":
|
|
if not hasContainerRuntime():
|
|
skip()
|
|
|
|
let runtime = if hasPodman(): "podman" else: "docker"
|
|
let tempDir = getTempDir() / "test-container-mount"
|
|
createDir(tempDir)
|
|
|
|
writeFile(tempDir / "test.txt", "test content")
|
|
|
|
# Mount directory and read file
|
|
let cmd = runtime & " run --rm -v " & tempDir & ":/mnt alpine:latest cat /mnt/test.txt 2>&1"
|
|
let output = execProcess(cmd)
|
|
|
|
check:
|
|
output.contains("test content")
|
|
|
|
removeDir(tempDir)
|
|
|
|
test "Container environment variables":
|
|
if not hasContainerRuntime():
|
|
skip()
|
|
|
|
let runtime = if hasPodman(): "podman" else: "docker"
|
|
|
|
let cmd = runtime & " run --rm -e TEST_VAR=hello alpine:latest sh -c 'echo $TEST_VAR' 2>&1"
|
|
let output = execProcess(cmd)
|
|
|
|
check:
|
|
output.contains("hello")
|
|
|
|
suite "Gentoo Container Build":
|
|
test "Gentoo emerge available in container":
|
|
if not hasContainerRuntime():
|
|
skip()
|
|
|
|
let runtime = if hasPodman(): "podman" else: "docker"
|
|
|
|
echo "Testing Gentoo emerge in container..."
|
|
let cmd = runtime & " run --rm gentoo/stage3:latest emerge --version 2>&1"
|
|
let output = execProcess(cmd)
|
|
|
|
check:
|
|
output.contains("Portage") or output.len > 0
|
|
|
|
test "Gentoo portage tree available":
|
|
if not hasContainerRuntime():
|
|
skip()
|
|
|
|
let runtime = if hasPodman(): "podman" else: "docker"
|
|
|
|
let cmd = runtime & " run --rm gentoo/stage3:latest ls /var/db/repos/gentoo 2>&1"
|
|
let output = execProcess(cmd)
|
|
|
|
# May not have portage tree in minimal image, that's ok
|
|
check:
|
|
output.len >= 0
|
|
|
|
suite "Nix Container Build":
|
|
test "Nix available in container":
|
|
if not hasContainerRuntime():
|
|
skip()
|
|
|
|
let runtime = if hasPodman(): "podman" else: "docker"
|
|
|
|
echo "Testing Nix in container..."
|
|
let cmd = runtime & " run --rm nixos/nix:latest nix --version 2>&1"
|
|
let output = execProcess(cmd)
|
|
|
|
check:
|
|
output.contains("nix") or output.len > 0
|
|
|
|
test "Nix store accessible":
|
|
if not hasContainerRuntime():
|
|
skip()
|
|
|
|
let runtime = if hasPodman(): "podman" else: "docker"
|
|
|
|
let cmd = runtime & " run --rm nixos/nix:latest ls /nix/store 2>&1"
|
|
let output = execProcess(cmd)
|
|
|
|
# Store should exist even if empty
|
|
check:
|
|
output.len >= 0
|
|
|
|
suite "Container Cleanup":
|
|
test "Remove test containers":
|
|
if not hasContainerRuntime():
|
|
skip()
|
|
|
|
let runtime = if hasPodman(): "podman" else: "docker"
|
|
|
|
# Clean up any stopped containers
|
|
discard execProcess(runtime & " container prune -f 2>&1")
|
|
|
|
check:
|
|
true # Cleanup always succeeds
|
|
|
|
test "List images":
|
|
if not hasContainerRuntime():
|
|
skip()
|
|
|
|
let runtime = if hasPodman(): "podman" else: "docker"
|
|
|
|
let output = execProcess(runtime & " images 2>&1")
|
|
|
|
check:
|
|
output.len > 0
|
|
|
|
echo ""
|
|
if hasContainerRuntime():
|
|
echo "✅ Container build tests completed"
|
|
if hasPodman():
|
|
echo " Using: Podman"
|
|
elif hasDocker():
|
|
echo " Using: Docker"
|
|
else:
|
|
echo "⚠️ No container runtime available - tests skipped"
|
|
echo " Install Docker or Podman to run container tests"
|