237 lines
4.9 KiB
Nim
237 lines
4.9 KiB
Nim
## test_multiplatform.nim
|
|
## Multi-platform compatibility tests
|
|
|
|
import std/[unittest, os, strutils, osproc]
|
|
|
|
type
|
|
Platform = object
|
|
os: string
|
|
arch: string
|
|
detected: bool
|
|
|
|
proc detectPlatform(): Platform =
|
|
## Detect current platform
|
|
result.os = hostOS
|
|
result.arch = hostCPU
|
|
result.detected = true
|
|
|
|
proc isLinux(): bool =
|
|
hostOS == "linux"
|
|
|
|
proc isBSD(): bool =
|
|
hostOS in ["freebsd", "openbsd", "netbsd", "dragonfly"]
|
|
|
|
proc isMacOS(): bool =
|
|
hostOS == "macosx"
|
|
|
|
proc isX86_64(): bool =
|
|
hostCPU in ["amd64", "x86_64"]
|
|
|
|
proc isARM64(): bool =
|
|
hostCPU in ["arm64", "aarch64"]
|
|
|
|
suite "Platform Detection":
|
|
test "Detect current platform":
|
|
let platform = detectPlatform()
|
|
|
|
check:
|
|
platform.detected == true
|
|
platform.os.len > 0
|
|
platform.arch.len > 0
|
|
|
|
echo " Detected: ", platform.os, "/", platform.arch
|
|
|
|
test "OS detection":
|
|
check:
|
|
isLinux() or isBSD() or isMacOS()
|
|
|
|
test "Architecture detection":
|
|
check:
|
|
isX86_64() or isARM64()
|
|
|
|
suite "File System Compatibility":
|
|
test "XDG directories":
|
|
let home = getHomeDir()
|
|
|
|
check:
|
|
home.len > 0
|
|
dirExists(home)
|
|
|
|
test "Temp directory":
|
|
let temp = getTempDir()
|
|
|
|
check:
|
|
temp.len > 0
|
|
dirExists(temp)
|
|
|
|
test "Create and remove directory":
|
|
let testDir = getTempDir() / "nip-multiplatform-test"
|
|
|
|
createDir(testDir)
|
|
check:
|
|
dirExists(testDir)
|
|
|
|
removeDir(testDir)
|
|
check:
|
|
not dirExists(testDir)
|
|
|
|
test "File operations":
|
|
let testFile = getTempDir() / "nip-test-file.txt"
|
|
|
|
writeFile(testFile, "test content")
|
|
check:
|
|
fileExists(testFile)
|
|
readFile(testFile) == "test content"
|
|
|
|
removeFile(testFile)
|
|
check:
|
|
not fileExists(testFile)
|
|
|
|
suite "Process Execution":
|
|
test "Execute simple command":
|
|
when defined(posix):
|
|
let output = execProcess("echo 'test'")
|
|
check:
|
|
output.contains("test")
|
|
|
|
test "Command with arguments":
|
|
when defined(posix):
|
|
let output = execProcess("printf '%s' 'hello'")
|
|
check:
|
|
output.contains("hello")
|
|
|
|
test "Environment variables":
|
|
putEnv("NIP_TEST_VAR", "test_value")
|
|
let value = getEnv("NIP_TEST_VAR")
|
|
|
|
check:
|
|
value == "test_value"
|
|
|
|
suite "Path Handling":
|
|
test "Path separator":
|
|
when defined(windows):
|
|
check:
|
|
DirSep == '\\'
|
|
else:
|
|
check:
|
|
DirSep == '/'
|
|
|
|
test "Path joining":
|
|
let path = "dir1" / "dir2" / "file.txt"
|
|
|
|
when defined(windows):
|
|
check:
|
|
path.contains("\\")
|
|
else:
|
|
check:
|
|
path.contains("/")
|
|
|
|
test "Absolute path":
|
|
let home = getHomeDir()
|
|
|
|
check:
|
|
isAbsolute(home)
|
|
|
|
suite "Binary Compatibility":
|
|
test "Nim runtime available":
|
|
check:
|
|
true # If we're running, Nim runtime works
|
|
|
|
test "Standard library available":
|
|
# Test that standard library functions work
|
|
let testStr = "a,b,c"
|
|
let parts = testStr.split(',')
|
|
check:
|
|
parts.len == 3
|
|
|
|
suite "Network Compatibility":
|
|
test "DNS resolution":
|
|
# Skip if no network
|
|
try:
|
|
when defined(posix):
|
|
let output = execProcess("ping -c 1 8.8.8.8 2>&1")
|
|
# Just check command executed, don't require success
|
|
check:
|
|
output.len > 0
|
|
except:
|
|
skip()
|
|
|
|
suite "Compression Support":
|
|
test "Gzip available":
|
|
when defined(posix):
|
|
try:
|
|
let output = execProcess("gzip --version 2>&1")
|
|
check:
|
|
output.contains("gzip") or output.len > 0
|
|
except:
|
|
skip()
|
|
|
|
test "Tar available":
|
|
when defined(posix):
|
|
try:
|
|
let output = execProcess("tar --version 2>&1")
|
|
check:
|
|
output.contains("tar") or output.len > 0
|
|
except:
|
|
skip()
|
|
|
|
suite "Git Compatibility":
|
|
test "Git available":
|
|
try:
|
|
let output = execProcess("git --version 2>&1")
|
|
check:
|
|
output.contains("git version")
|
|
except:
|
|
skip()
|
|
|
|
test "Git config":
|
|
try:
|
|
let output = execProcess("git config --list 2>&1")
|
|
check:
|
|
output.len >= 0 # May be empty, that's ok
|
|
except:
|
|
skip()
|
|
|
|
suite "Curl Compatibility":
|
|
test "Curl available":
|
|
try:
|
|
let output = execProcess("curl --version 2>&1")
|
|
check:
|
|
output.contains("curl") or output.len > 0
|
|
except:
|
|
skip()
|
|
|
|
suite "Platform-Specific Features":
|
|
test "Linux-specific":
|
|
when defined(linux):
|
|
check:
|
|
fileExists("/proc/version")
|
|
|
|
test "BSD-specific":
|
|
when defined(bsd):
|
|
check:
|
|
dirExists("/usr/local")
|
|
|
|
test "macOS-specific":
|
|
when defined(macosx):
|
|
check:
|
|
dirExists("/Applications")
|
|
|
|
echo ""
|
|
echo "✅ Multi-platform tests completed"
|
|
echo " Platform: ", hostOS, "/", hostCPU
|
|
|
|
when defined(linux):
|
|
echo " OS: Linux"
|
|
when defined(bsd):
|
|
echo " OS: BSD"
|
|
when defined(macosx):
|
|
echo " OS: macOS"
|
|
when defined(windows):
|
|
echo " OS: Windows"
|
|
|
|
when isX86_64():
|
|
echo " Arch: x86_64"
|
|
when isARM64():
|
|
echo " Arch: ARM64"
|