185 lines
6.8 KiB
Nim
185 lines
6.8 KiB
Nim
## Test suite for Nippels Profile Manager Integration (Task 8.1)
|
|
##
|
|
## Tests the integration of ProfileManager with NippelManager
|
|
|
|
import std/[unittest, os, times, options, json, strutils]
|
|
import ../src/nimpak/nippels
|
|
import ../src/nimpak/profile_manager
|
|
import ../src/nimpak/nippel_types
|
|
import ../src/nimpak/utils/resultutils
|
|
|
|
suite "Nippels Profile Manager Integration (Task 8.1)":
|
|
var manager: NippelManager
|
|
let testRoot = getTempDir() / "nippels_profile_test_" & $epochTime().int
|
|
|
|
setup:
|
|
# Create test directory
|
|
createDir(testRoot)
|
|
manager = newNippelManager(testRoot)
|
|
|
|
teardown:
|
|
# Clean up test directory
|
|
if dirExists(testRoot):
|
|
removeDir(testRoot)
|
|
|
|
test "ProfileManager is initialized in NippelManager":
|
|
check manager.profileManager.profilesDir.len > 0
|
|
check manager.profileManager.customProfilesDir.len > 0
|
|
|
|
test "Create Nippel with default Homestation profile":
|
|
let result = manager.createNippel("test-homestation")
|
|
check result.isOk
|
|
|
|
if result.isOk:
|
|
let nippel = result.value
|
|
check nippel.profile == Homestation
|
|
check nippel.isolationLevel == Standard
|
|
check nippel.profileSettings.desktopIntegration == true
|
|
check nippel.profileSettings.networkAccess == Relaxed
|
|
check nippel.profileSettings.auditingEnabled == false
|
|
|
|
test "Create Nippel with Workstation profile":
|
|
let result = manager.createNippel("test-workstation", Workstation)
|
|
check result.isOk
|
|
|
|
if result.isOk:
|
|
let nippel = result.value
|
|
check nippel.profile == Workstation
|
|
check nippel.isolationLevel == Standard
|
|
check nippel.profileSettings.desktopIntegration == true
|
|
check nippel.profileSettings.networkAccess == Full
|
|
check nippel.profileSettings.resourceLimits.maxMemory == 8 * 1024 * 1024 * 1024
|
|
|
|
test "Create Nippel with Server profile":
|
|
let result = manager.createNippel("test-server", Server)
|
|
check result.isOk
|
|
|
|
if result.isOk:
|
|
let nippel = result.value
|
|
check nippel.profile == Server
|
|
check nippel.isolationLevel == Strict
|
|
check nippel.profileSettings.desktopIntegration == false
|
|
check nippel.profileSettings.networkAccess == Full
|
|
check nippel.profileSettings.auditingEnabled == true
|
|
|
|
test "Create Nippel with Satellite profile":
|
|
let result = manager.createNippel("test-satellite", Satellite)
|
|
check result.isOk
|
|
|
|
if result.isOk:
|
|
let nippel = result.value
|
|
check nippel.profile == Satellite
|
|
check nippel.isolationLevel == Strict
|
|
check nippel.profileSettings.desktopIntegration == true
|
|
check nippel.profileSettings.networkAccess == Limited
|
|
check nippel.profileSettings.auditingEnabled == true
|
|
|
|
test "Create Nippel with NetworkIOT profile":
|
|
let result = manager.createNippel("test-iot", NetworkIOT)
|
|
check result.isOk
|
|
|
|
if result.isOk:
|
|
let nippel = result.value
|
|
check nippel.profile == NetworkIOT
|
|
check nippel.isolationLevel == Strict
|
|
check nippel.profileSettings.desktopIntegration == false
|
|
check nippel.profileSettings.networkAccess == Limited
|
|
check nippel.profileSettings.resourceLimits.maxMemory == 512 * 1024 * 1024
|
|
|
|
test "Create Nippel with profile overrides":
|
|
let overrides = ProfileOverrides(
|
|
isolationLevel: some(Strict),
|
|
networkAccess: some(Limited),
|
|
auditingEnabled: some(true)
|
|
)
|
|
|
|
let result = manager.createNippel("test-custom", Homestation, overrides)
|
|
check result.isOk
|
|
|
|
if result.isOk:
|
|
let nippel = result.value
|
|
check nippel.profile == Homestation
|
|
check nippel.isolationLevel == Strict # Overridden
|
|
check nippel.profileSettings.networkAccess == Limited # Overridden
|
|
check nippel.profileSettings.auditingEnabled == true # Overridden
|
|
check nippel.profileSettings.desktopIntegration == true # Not overridden
|
|
|
|
test "Change Nippel profile after creation":
|
|
# Create with Homestation profile
|
|
let createResult = manager.createNippel("test-change", Homestation)
|
|
check createResult.isOk
|
|
|
|
# Change to Server profile
|
|
let changeResult = manager.changeNippelProfile("test-change", Server)
|
|
check changeResult.isOk
|
|
|
|
# Verify the change
|
|
let cellRoot = testRoot / "test-change"
|
|
let configPath = cellRoot / "cell.json"
|
|
check fileExists(configPath)
|
|
|
|
# Read and verify configuration
|
|
let config = parseJson(readFile(configPath))
|
|
check config["profile"]["type"].getStr() == "Server"
|
|
check config["profile"]["isolation"].getStr() == "Strict"
|
|
check config["profile"]["desktopIntegration"].getBool() == false
|
|
check config["profile"]["auditingEnabled"].getBool() == true
|
|
|
|
test "Customize Nippel profile settings":
|
|
# Create with default Homestation profile
|
|
let createResult = manager.createNippel("test-customize", Homestation)
|
|
check createResult.isOk
|
|
|
|
# Customize settings
|
|
let overrides = ProfileOverrides(
|
|
isolationLevel: some(Strict),
|
|
desktopIntegration: some(false),
|
|
auditingEnabled: some(true)
|
|
)
|
|
|
|
let customizeResult = manager.customizeNippelProfile("test-customize", overrides)
|
|
check customizeResult.isOk
|
|
|
|
# Verify the customization
|
|
let cellRoot = testRoot / "test-customize"
|
|
let configPath = cellRoot / "cell.json"
|
|
check fileExists(configPath)
|
|
|
|
# Read and verify configuration
|
|
let config = parseJson(readFile(configPath))
|
|
check config["profile"]["type"].getStr() == "Homestation" # Profile unchanged
|
|
check config["profile"]["isolation"].getStr() == "Strict" # Customized
|
|
check config["profile"]["desktopIntegration"].getBool() == false # Customized
|
|
check config["profile"]["auditingEnabled"].getBool() == true # Customized
|
|
|
|
test "ProfileManager caches loaded profiles":
|
|
# Load same profile multiple times
|
|
let settings1 = manager.profileManager.loadProfile(Workstation)
|
|
let settings2 = manager.profileManager.loadProfile(Workstation)
|
|
|
|
# Should return same settings
|
|
check settings1.isolationLevel == settings2.isolationLevel
|
|
check settings1.desktopIntegration == settings2.desktopIntegration
|
|
check settings1.networkAccess == settings2.networkAccess
|
|
|
|
test "Error handling: Change profile for non-existent Nippel":
|
|
let result = manager.changeNippelProfile("non-existent", Server)
|
|
check result.isErr
|
|
check "not found" in result.error.toLowerAscii()
|
|
|
|
test "Error handling: Customize profile for non-existent Nippel":
|
|
let overrides = ProfileOverrides(isolationLevel: some(Strict))
|
|
let result = manager.customizeNippelProfile("non-existent", overrides)
|
|
check result.isErr
|
|
check "not found" in result.error.toLowerAscii()
|
|
|
|
test "Error handling: Create duplicate Nippel":
|
|
let result1 = manager.createNippel("test-duplicate")
|
|
check result1.isOk
|
|
|
|
let result2 = manager.createNippel("test-duplicate")
|
|
check result2.isErr
|
|
check "already exists" in result2.error.toLowerAscii()
|
|
|
|
echo "✅ All Task 8.1 tests completed"
|