172 lines
5.5 KiB
Nim
172 lines
5.5 KiB
Nim
## Test suite for Nippels UTCP Protocol Integration (Task 8.5)
|
|
##
|
|
## Tests the integration of UTCP addressing with NippelManager
|
|
|
|
import std/[unittest, os, times, strutils, json]
|
|
import ../src/nimpak/nippels
|
|
|
|
suite "Nippels UTCP Protocol Integration (Task 8.5)":
|
|
var manager: NippelManager
|
|
let testRoot = getTempDir() / "nippels_utcp_test_" & $epochTime().int
|
|
|
|
setup:
|
|
createDir(testRoot)
|
|
manager = newNippelManager(testRoot)
|
|
|
|
teardown:
|
|
for name in manager.getActiveNippels():
|
|
discard manager.deactivateNippel(name)
|
|
|
|
if dirExists(testRoot):
|
|
removeDir(testRoot)
|
|
|
|
test "Create Nippel assigns UTCP address":
|
|
let result = manager.createNippel("test-utcp", Homestation)
|
|
check result.isOk
|
|
|
|
if result.isOk:
|
|
let nippel = result.value
|
|
|
|
# Verify UTCP address is assigned
|
|
check nippel.utcpAddress.scheme.len > 0
|
|
check nippel.utcpAddress.host.len > 0
|
|
check nippel.utcpAddress.resource.len > 0
|
|
|
|
echo " ✅ UTCP address assigned:"
|
|
echo " Scheme: ", nippel.utcpAddress.scheme
|
|
echo " Host: ", nippel.utcpAddress.host
|
|
echo " Resource: ", nippel.utcpAddress.resource
|
|
|
|
test "UTCP address contains correct resource path":
|
|
let result = manager.createNippel("my-app", Workstation)
|
|
check result.isOk
|
|
|
|
if result.isOk:
|
|
let nippel = result.value
|
|
check nippel.utcpAddress.resource == "nippel/my-app"
|
|
echo " ✅ Resource path correct: ", nippel.utcpAddress.resource
|
|
|
|
test "UTCP address uses utcp:// scheme":
|
|
let result = manager.createNippel("test-scheme", Server)
|
|
check result.isOk
|
|
|
|
if result.isOk:
|
|
let nippel = result.value
|
|
check nippel.utcpAddress.scheme == "utcp://"
|
|
echo " ✅ Scheme correct: ", nippel.utcpAddress.scheme
|
|
|
|
test "UTCP address can be formatted as string":
|
|
let result = manager.createNippel("test-format", Homestation)
|
|
check result.isOk
|
|
|
|
if result.isOk:
|
|
let nippel = result.value
|
|
let formatted = formatUTCPAddress(nippel.utcpAddress)
|
|
|
|
check formatted.len > 0
|
|
check formatted.startsWith("utcp://")
|
|
check "nippel/test-format" in formatted
|
|
|
|
echo " ✅ Formatted address: ", formatted
|
|
|
|
test "UTCP address is stored in configuration":
|
|
let result = manager.createNippel("test-config", Homestation)
|
|
check result.isOk
|
|
|
|
if result.isOk:
|
|
let nippel = result.value
|
|
let configPath = nippel.cellRoot / "cell.json"
|
|
check fileExists(configPath)
|
|
|
|
# Read and verify configuration contains UTCP address
|
|
let config = parseJson(readFile(configPath))
|
|
check config.hasKey("network")
|
|
check config["network"].hasKey("utcp_address")
|
|
|
|
let utcpAddr = config["network"]["utcp_address"].getStr()
|
|
check utcpAddr.len > 0
|
|
check utcpAddr.startsWith("utcp://")
|
|
|
|
echo " ✅ UTCP address in config: ", utcpAddr
|
|
|
|
test "Multiple Nippels have unique UTCP addresses":
|
|
let result1 = manager.createNippel("app-1", Homestation)
|
|
let result2 = manager.createNippel("app-2", Workstation)
|
|
let result3 = manager.createNippel("app-3", Server)
|
|
|
|
check result1.isOk
|
|
check result2.isOk
|
|
check result3.isOk
|
|
|
|
if result1.isOk and result2.isOk and result3.isOk:
|
|
let nippel1 = result1.value
|
|
let nippel2 = result2.value
|
|
let nippel3 = result3.value
|
|
|
|
# Verify each has unique resource path
|
|
check nippel1.utcpAddress.resource == "nippel/app-1"
|
|
check nippel2.utcpAddress.resource == "nippel/app-2"
|
|
check nippel3.utcpAddress.resource == "nippel/app-3"
|
|
|
|
# Verify all are different
|
|
check nippel1.utcpAddress.resource != nippel2.utcpAddress.resource
|
|
check nippel2.utcpAddress.resource != nippel3.utcpAddress.resource
|
|
check nippel1.utcpAddress.resource != nippel3.utcpAddress.resource
|
|
|
|
echo " ✅ All Nippels have unique UTCP addresses"
|
|
|
|
test "UTCP address uses localhost as default host":
|
|
let result = manager.createNippel("test-host", Homestation)
|
|
check result.isOk
|
|
|
|
if result.isOk:
|
|
let nippel = result.value
|
|
check nippel.utcpAddress.host == "localhost"
|
|
echo " ✅ Default host is localhost"
|
|
|
|
test "UTCP address format is AI-addressable":
|
|
let result = manager.createNippel("ai-test", Homestation)
|
|
check result.isOk
|
|
|
|
if result.isOk:
|
|
let nippel = result.value
|
|
let formatted = formatUTCPAddress(nippel.utcpAddress)
|
|
|
|
# Verify format is suitable for AI addressing
|
|
# Format: utcp://host/nippel/name
|
|
check formatted.contains("://")
|
|
check formatted.contains("/nippel/")
|
|
check formatted.contains("ai-test")
|
|
|
|
echo " ✅ AI-addressable format: ", formatted
|
|
|
|
test "UTCP address enables resource discovery":
|
|
let result = manager.createNippel("discoverable", Satellite)
|
|
check result.isOk
|
|
|
|
if result.isOk:
|
|
let nippel = result.value
|
|
|
|
# Verify address components enable discovery
|
|
check nippel.utcpAddress.scheme.len > 0 # Protocol
|
|
check nippel.utcpAddress.host.len > 0 # Location
|
|
check nippel.utcpAddress.resource.len > 0 # Resource identifier
|
|
|
|
echo " ✅ Resource discoverable via UTCP"
|
|
|
|
test "UTCP address supports different profiles":
|
|
let profiles = [Workstation, Homestation, Satellite, NetworkIOT, Server]
|
|
|
|
for i, profile in profiles:
|
|
let name = "test-profile-" & $i
|
|
let result = manager.createNippel(name, profile)
|
|
check result.isOk
|
|
|
|
if result.isOk:
|
|
let nippel = result.value
|
|
check nippel.utcpAddress.resource == "nippel/" & name
|
|
|
|
echo " ✅ UTCP addressing works for all profiles"
|
|
|
|
echo "✅ All Task 8.5 tests completed"
|