169 lines
5.4 KiB
Plaintext
169 lines
5.4 KiB
Plaintext
// 02_image_operations.rhai
|
|
// Tests for Nerdctl image operations
|
|
|
|
// 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 an image exists
|
|
fn image_exists(image_name) {
|
|
try {
|
|
let result = run(`nerdctl images -q ${image_name}`);
|
|
return result.success && result.stdout.trim() != "";
|
|
} catch(err) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Helper function to clean up an image if it exists
|
|
fn cleanup_image(image_name) {
|
|
if image_exists(image_name) {
|
|
try {
|
|
run(`nerdctl rmi ${image_name}`);
|
|
print(`Cleaned up image: ${image_name}`);
|
|
} catch(err) {
|
|
print(`Error cleaning up image ${image_name}: ${err}`);
|
|
}
|
|
}
|
|
}
|
|
|
|
print("=== Testing Nerdctl Image Operations ===");
|
|
|
|
// 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");
|
|
|
|
// Create a temporary directory for testing
|
|
let test_dir = "rhai_test_nerdctl";
|
|
mkdir(test_dir);
|
|
|
|
try {
|
|
// Test pulling an image
|
|
print("Testing nerdctl_image_pull()...");
|
|
// Use a small image for testing
|
|
let pull_result = nerdctl_image_pull("alpine:latest");
|
|
assert_true(pull_result.success, "Image pull should succeed");
|
|
print("✓ nerdctl_image_pull(): Image pulled successfully");
|
|
|
|
// Test listing images
|
|
print("Testing nerdctl_images()...");
|
|
let images_result = nerdctl_images();
|
|
assert_true(images_result.success, "Image listing should succeed");
|
|
assert_true(images_result.stdout.contains("alpine"), "Image list should contain alpine");
|
|
print("✓ nerdctl_images(): Images listed successfully");
|
|
|
|
// Test tagging an image
|
|
print("Testing nerdctl_image_tag()...");
|
|
let tag_result = nerdctl_image_tag("alpine:latest", "rhai_test_image:latest");
|
|
assert_true(tag_result.success, "Image tag should succeed");
|
|
print("✓ nerdctl_image_tag(): Image tagged successfully");
|
|
|
|
// Test building an image
|
|
print("Testing nerdctl_image_build()...");
|
|
|
|
// Create a simple Dockerfile
|
|
let dockerfile_content = `FROM alpine:latest
|
|
RUN echo "Hello from Dockerfile" > /hello.txt
|
|
CMD ["cat", "/hello.txt"]
|
|
`;
|
|
file_write(`${test_dir}/Dockerfile`, dockerfile_content);
|
|
|
|
// Build the image
|
|
let build_result = nerdctl_image_build("rhai_test_build:latest", test_dir);
|
|
assert_true(build_result.success, "Image build should succeed");
|
|
print("✓ nerdctl_image_build(): Image built successfully");
|
|
|
|
// Test running a container from the built image
|
|
print("Testing container from built image...");
|
|
let container_name = "rhai_test_container_from_build";
|
|
|
|
// Clean up any existing container with the same name
|
|
try {
|
|
run(`nerdctl stop ${container_name}`);
|
|
run(`nerdctl rm ${container_name}`);
|
|
} catch(e) {
|
|
// Ignore errors during cleanup
|
|
}
|
|
|
|
// Run the container
|
|
let run_result = nerdctl_run_with_name("rhai_test_build:latest", container_name);
|
|
assert_true(run_result.success, "Container run should succeed");
|
|
assert_true(run_result.stdout.contains("Hello from Dockerfile"), "Container output should contain expected text");
|
|
print("✓ Container from built image ran successfully");
|
|
|
|
// Clean up the container
|
|
let stop_result = nerdctl_stop(container_name);
|
|
assert_true(stop_result.success, "Container stop should succeed");
|
|
let remove_result = nerdctl_remove(container_name);
|
|
assert_true(remove_result.success, "Container remove should succeed");
|
|
print("✓ Cleanup: Container removed");
|
|
|
|
// Test removing images
|
|
print("Testing nerdctl_image_remove()...");
|
|
|
|
// Remove the tagged image
|
|
let remove_tag_result = nerdctl_image_remove("rhai_test_image:latest");
|
|
assert_true(remove_tag_result.success, "Image removal should succeed");
|
|
print("✓ nerdctl_image_remove(): Tagged image removed successfully");
|
|
|
|
// Remove the built image
|
|
let remove_build_result = nerdctl_image_remove("rhai_test_build:latest");
|
|
assert_true(remove_build_result.success, "Image removal should succeed");
|
|
print("✓ nerdctl_image_remove(): Built image removed successfully");
|
|
|
|
print("All image operations tests completed successfully!");
|
|
} catch(err) {
|
|
print(`Error: ${err}`);
|
|
|
|
// Clean up in case of error
|
|
try {
|
|
run("nerdctl stop rhai_test_container_from_build");
|
|
run("nerdctl rm rhai_test_container_from_build");
|
|
} catch(e) {
|
|
// Ignore errors during cleanup
|
|
}
|
|
|
|
try {
|
|
cleanup_image("rhai_test_image:latest");
|
|
cleanup_image("rhai_test_build:latest");
|
|
} catch(e) {
|
|
// Ignore errors during cleanup
|
|
}
|
|
|
|
throw err;
|
|
} finally {
|
|
// Clean up test directory
|
|
delete(test_dir);
|
|
print("✓ Cleanup: Test directory removed");
|
|
}
|