- Added documentation for Nerdctl module tests, detailing test structure, running instructions, and individual test cases. - Added documentation for RFS module tests, covering test structure, running instructions, and individual test cases. These tests verify remote filesystem operations and filesystem layer management.
167 lines
5.8 KiB
Plaintext
167 lines
5.8 KiB
Plaintext
// 03_container_builder.rhai
|
|
// Tests for Nerdctl Container Builder pattern
|
|
|
|
// Custom assert function
|
|
fn assert_true(condition, message) {
|
|
if !condition {
|
|
print(`ASSERTION FAILED: ${message}`);
|
|
throw message;
|
|
}
|
|
}
|
|
|
|
// Custom assert_eq function
|
|
fn assert_eq(actual, expected, message) {
|
|
if actual != expected {
|
|
print(`ASSERTION FAILED: ${message}`);
|
|
print(`Expected: "${expected}"`);
|
|
print(`Actual: "${actual}"`);
|
|
throw message;
|
|
}
|
|
}
|
|
|
|
// Helper function to check if nerdctl is available
|
|
fn is_nerdctl_available() {
|
|
try {
|
|
let result = run("which nerdctl");
|
|
return result.success;
|
|
} catch(err) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Helper function to check if a container exists
|
|
fn container_exists(container_name) {
|
|
try {
|
|
let result = run(`nerdctl ps -a --format "{{.Names}}" | grep -w ${container_name}`);
|
|
return result.success;
|
|
} catch(err) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Helper function to clean up a container if it exists
|
|
fn cleanup_container(container_name) {
|
|
if container_exists(container_name) {
|
|
try {
|
|
run(`nerdctl stop ${container_name}`);
|
|
run(`nerdctl rm ${container_name}`);
|
|
print(`Cleaned up container: ${container_name}`);
|
|
} catch(err) {
|
|
print(`Error cleaning up container ${container_name}: ${err}`);
|
|
}
|
|
}
|
|
}
|
|
|
|
print("=== Testing Nerdctl Container Builder Pattern ===");
|
|
|
|
// Check if nerdctl is available
|
|
let nerdctl_available = is_nerdctl_available();
|
|
if !nerdctl_available {
|
|
print("nerdctl is not available. Skipping Nerdctl tests.");
|
|
// Exit gracefully without error
|
|
return;
|
|
}
|
|
|
|
print("✓ nerdctl is available");
|
|
|
|
// Define test container name
|
|
let container_name = "rhai_test_builder";
|
|
|
|
// Clean up any existing test container
|
|
cleanup_container(container_name);
|
|
|
|
// Create test directories
|
|
let work_dir = "rhai_test_nerdctl_work";
|
|
let config_dir = "rhai_test_nerdctl_config";
|
|
mkdir(work_dir);
|
|
mkdir(config_dir);
|
|
|
|
try {
|
|
// Test creating a container from an image with builder pattern
|
|
print("Testing nerdctl_container_from_image() with builder pattern...");
|
|
|
|
// Create a container with a rich set of options using the builder pattern
|
|
let container = nerdctl_container_from_image(container_name, "alpine:latest")
|
|
.reset() // Reset to default configuration
|
|
.with_detach(true)
|
|
.with_ports(["8080:80", "9090:90"])
|
|
.with_volumes([`${work_dir}:/data`, `${config_dir}:/config`])
|
|
.with_envs(#{
|
|
"ENV1": "value1",
|
|
"ENV2": "value2",
|
|
"TEST_MODE": "true"
|
|
})
|
|
.with_network("bridge")
|
|
.with_cpu_limit("0.5")
|
|
.with_memory_limit("256m");
|
|
|
|
// Verify container properties
|
|
assert_eq(container.name, container_name, "Container name should match");
|
|
assert_eq(container.image, "alpine:latest", "Container image should match");
|
|
assert_true(container.detach, "Container detach mode should be true");
|
|
|
|
// Run the container
|
|
print("Testing run() with builder pattern...");
|
|
let run_result = container.run();
|
|
assert_true(run_result.success, "Container run should succeed");
|
|
assert_true(container.container_id != "", "Container ID should not be empty after run");
|
|
print(`✓ run(): Container started with ID: ${container.container_id}`);
|
|
|
|
// Test environment variables
|
|
print("Testing environment variables...");
|
|
let env_result = container.exec("env");
|
|
assert_true(env_result.success, "Container exec should succeed");
|
|
assert_true(env_result.stdout.contains("ENV1=value1"), "Environment variable ENV1 should be set");
|
|
assert_true(env_result.stdout.contains("ENV2=value2"), "Environment variable ENV2 should be set");
|
|
assert_true(env_result.stdout.contains("TEST_MODE=true"), "Environment variable TEST_MODE should be set");
|
|
print("✓ Environment variables set correctly");
|
|
|
|
// Test volume mounts
|
|
print("Testing volume mounts...");
|
|
|
|
// Create a test file in the work directory
|
|
file_write(`${work_dir}/test.txt`, "Hello from host");
|
|
|
|
// Check if the file is accessible in the container
|
|
let volume_result = container.exec("cat /data/test.txt");
|
|
assert_true(volume_result.success, "Container exec should succeed");
|
|
assert_true(volume_result.stdout.contains("Hello from host"), "Volume mount should work correctly");
|
|
print("✓ Volume mounts working correctly");
|
|
|
|
// Test writing from container to volume
|
|
print("Testing writing from container to volume...");
|
|
let write_result = container.exec("echo 'Hello from container' > /config/container.txt");
|
|
assert_true(write_result.success, "Container exec should succeed");
|
|
|
|
// Check if the file was created on the host
|
|
let host_file_content = file_read(`${config_dir}/container.txt`);
|
|
assert_true(host_file_content.contains("Hello from container"), "Container should be able to write to volume");
|
|
print("✓ Container can write to volume");
|
|
|
|
// Test stopping the container
|
|
print("Testing stop()...");
|
|
let stop_result = container.stop();
|
|
assert_true(stop_result.success, "Container stop should succeed");
|
|
print("✓ stop(): Container stopped successfully");
|
|
|
|
// Test removing the container
|
|
print("Testing remove()...");
|
|
let remove_result = container.remove();
|
|
assert_true(remove_result.success, "Container remove should succeed");
|
|
print("✓ remove(): Container removed successfully");
|
|
|
|
print("All container builder pattern tests completed successfully!");
|
|
} catch(err) {
|
|
print(`Error: ${err}`);
|
|
|
|
// Clean up in case of error
|
|
cleanup_container(container_name);
|
|
|
|
throw err;
|
|
} finally {
|
|
// Clean up test directories
|
|
delete(work_dir);
|
|
delete(config_dir);
|
|
print("✓ Cleanup: Test directories removed");
|
|
}
|