feat: Improve service manager testing and error handling

- Add comprehensive testing instructions to README.
- Improve error handling in examples to prevent crashes.
- Enhance launchctl error handling for production safety.
- Improve zinit error handling for production safety.
- Remove obsolete plan_to_fix.md file.
- Update Rhai integration tests for improved robustness.
- Improve service manager creation on Linux with systemd fallback.
This commit is contained in:
Mahmoud-Emad
2025-07-02 12:05:03 +03:00
parent a63cbe2bd9
commit 95122dffee
12 changed files with 473 additions and 422 deletions

View File

@@ -1,11 +1,11 @@
// Basic service manager functionality test script
// This script tests the service manager through Rhai integration
// This script tests the REAL service manager through Rhai integration
print("=== Service Manager Basic Functionality Test ===");
// Test configuration
let test_service_name = "rhai-test-service";
let test_binary = "echo";
let test_binary = "/bin/echo";
let test_args = ["Hello from Rhai service manager test"];
print(`Testing service: ${test_service_name}`);
@@ -15,11 +15,11 @@ print(`Args: ${test_args}`);
// Test results tracking
let test_results = #{
creation: "NOT_RUN",
start: "NOT_RUN",
exists_before: "NOT_RUN",
start: "NOT_RUN",
exists_after: "NOT_RUN",
status: "NOT_RUN",
exists: "NOT_RUN",
list: "NOT_RUN",
logs: "NOT_RUN",
stop: "NOT_RUN",
remove: "NOT_RUN",
cleanup: "NOT_RUN"
@@ -28,14 +28,11 @@ let test_results = #{
let passed_tests = 0;
let total_tests = 0;
// Note: Helper functions are defined inline to avoid scope issues
// Test 1: Service Manager Creation
print("\n1. Testing service manager creation...");
try {
// Note: This would require the service manager to be exposed to Rhai
// For now, we'll simulate this test
print("✓ Service manager creation test simulated");
let manager = create_service_manager();
print("✓ Service manager created successfully");
test_results["creation"] = "PASS";
passed_tests += 1;
total_tests += 1;
@@ -43,10 +40,36 @@ try {
print(`✗ Service manager creation failed: ${e}`);
test_results["creation"] = "FAIL";
total_tests += 1;
// Return early if we can't create the manager
return test_results;
}
// Test 2: Service Configuration
print("\n2. Testing service configuration...");
// Create the service manager for all subsequent tests
let manager = create_service_manager();
// Test 2: Check if service exists before creation
print("\n2. Testing service existence check (before creation)...");
try {
let exists_before = exists(manager, test_service_name);
print(`✓ Service existence check: ${exists_before}`);
if !exists_before {
print("✓ Service correctly doesn't exist before creation");
test_results["exists_before"] = "PASS";
passed_tests += 1;
} else {
print("⚠ Service unexpectedly exists before creation");
test_results["exists_before"] = "WARN";
}
total_tests += 1;
} catch(e) {
print(`✗ Service existence check failed: ${e}`);
test_results["exists_before"] = "FAIL";
total_tests += 1;
}
// Test 3: Start the service
print("\n3. Testing service start...");
try {
// Create a service configuration object
let service_config = #{
@@ -57,160 +80,127 @@ try {
environment: #{},
auto_restart: false
};
print(`✓ Service config created: ${service_config.name}`);
print(` Binary: ${service_config.binary_path}`);
print(` Args: ${service_config.args}`);
print(` Working dir: ${service_config.working_directory}`);
print(` Auto restart: ${service_config.auto_restart}`);
start(manager, service_config);
print("✓ Service started successfully");
test_results["start"] = "PASS";
passed_tests += 1;
total_tests += 1;
} catch(e) {
print(`✗ Service configuration failed: ${e}`);
print(`✗ Service start failed: ${e}`);
test_results["start"] = "FAIL";
total_tests += 1;
}
// Test 3: Service Status Simulation
print("\n3. Testing service status simulation...");
// Test 4: Check if service exists after creation
print("\n4. Testing service existence check (after creation)...");
try {
// Simulate different service statuses
let statuses = ["Running", "Stopped", "Failed", "Unknown"];
for status in statuses {
print(` Simulated status: ${status}`);
let exists_after = exists(manager, test_service_name);
print(`✓ Service existence check: ${exists_after}`);
if exists_after {
print("✓ Service correctly exists after creation");
test_results["exists_after"] = "PASS";
passed_tests += 1;
} else {
print("✗ Service doesn't exist after creation");
test_results["exists_after"] = "FAIL";
}
print("✓ Service status simulation completed");
total_tests += 1;
} catch(e) {
print(`✗ Service existence check failed: ${e}`);
test_results["exists_after"] = "FAIL";
total_tests += 1;
}
// Test 5: Check service status
print("\n5. Testing service status...");
try {
let service_status = status(manager, test_service_name);
print(`✓ Service status: ${service_status}`);
test_results["status"] = "PASS";
passed_tests += 1;
total_tests += 1;
} catch(e) {
print(`✗ Service status simulation failed: ${e}`);
print(`✗ Service status check failed: ${e}`);
test_results["status"] = "FAIL";
total_tests += 1;
}
// Test 4: Service Existence Check Simulation
print("\n4. Testing service existence check simulation...");
// Test 6: List services
print("\n6. Testing service list...");
try {
// Simulate checking if a service exists
let existing_service = true;
let non_existing_service = false;
if existing_service {
print("✓ Existing service check: true");
}
if !non_existing_service {
print("✓ Non-existing service check: false");
}
test_results["exists"] = "PASS";
passed_tests += 1;
total_tests += 1;
} catch(e) {
print(`✗ Service existence check simulation failed: ${e}`);
test_results["exists"] = "FAIL";
total_tests += 1;
}
let services = list(manager);
print(`✓ Service list retrieved (${services.len()} services)`);
// Test 5: Service List Simulation
print("\n5. Testing service list simulation...");
try {
// Simulate listing services
let mock_services = [
"system-service-1",
"user-service-2",
test_service_name,
"background-task"
];
// Check if our test service is in the list
let found_test_service = false;
for service in services {
if service.contains(test_service_name) {
found_test_service = true;
print(` ✓ Found test service: ${service}`);
break;
}
}
print(`✓ Simulated service list (${mock_services.len()} services):`);
for service in mock_services {
print(` - ${service}`);
if found_test_service {
print("✓ Test service found in service list");
} else {
print("⚠ Test service not found in service list");
}
test_results["list"] = "PASS";
passed_tests += 1;
total_tests += 1;
} catch(e) {
print(`✗ Service list simulation failed: ${e}`);
print(`✗ Service list failed: ${e}`);
test_results["list"] = "FAIL";
total_tests += 1;
}
// Test 6: Service Logs Simulation
print("\n6. Testing service logs simulation...");
// Test 7: Stop the service
print("\n7. Testing service stop...");
try {
// Simulate retrieving service logs
let mock_logs = [
"[2024-01-01 10:00:00] Service started",
"[2024-01-01 10:00:01] Processing request",
"[2024-01-01 10:00:02] Task completed",
"[2024-01-01 10:00:03] Service ready"
];
print(`✓ Simulated logs (${mock_logs.len()} entries):`);
for log_entry in mock_logs {
print(` ${log_entry}`);
}
test_results["logs"] = "PASS";
passed_tests += 1;
total_tests += 1;
} catch(e) {
print(`✗ Service logs simulation failed: ${e}`);
test_results["logs"] = "FAIL";
total_tests += 1;
}
// Test 7: Service Stop Simulation
print("\n7. Testing service stop simulation...");
try {
print(`✓ Simulated stopping service: ${test_service_name}`);
print(" Service stop command executed");
print(" Service status changed to: Stopped");
stop(manager, test_service_name);
print(`✓ Service stopped: ${test_service_name}`);
test_results["stop"] = "PASS";
passed_tests += 1;
total_tests += 1;
} catch(e) {
print(`✗ Service stop simulation failed: ${e}`);
print(`✗ Service stop failed: ${e}`);
test_results["stop"] = "FAIL";
total_tests += 1;
}
// Test 8: Service Remove Simulation
print("\n8. Testing service remove simulation...");
// Test 8: Remove the service
print("\n8. Testing service remove...");
try {
print(`✓ Simulated removing service: ${test_service_name}`);
print(" Service configuration deleted");
print(" Service no longer exists");
remove(manager, test_service_name);
print(`✓ Service removed: ${test_service_name}`);
test_results["remove"] = "PASS";
passed_tests += 1;
total_tests += 1;
} catch(e) {
print(`✗ Service remove simulation failed: ${e}`);
print(`✗ Service remove failed: ${e}`);
test_results["remove"] = "FAIL";
total_tests += 1;
}
// Test 9: Cleanup Simulation
print("\n9. Testing cleanup simulation...");
// Test 9: Verify cleanup
print("\n9. Testing cleanup verification...");
try {
print("✓ Cleanup simulation completed");
print(" All test resources cleaned up");
print(" System state restored");
test_results["cleanup"] = "PASS";
passed_tests += 1;
let exists_after_remove = exists(manager, test_service_name);
if !exists_after_remove {
print(" Service correctly doesn't exist after removal");
test_results["cleanup"] = "PASS";
passed_tests += 1;
} else {
print("✗ Service still exists after removal");
test_results["cleanup"] = "FAIL";
}
total_tests += 1;
} catch(e) {
print(`✗ Cleanup simulation failed: ${e}`);
print(`✗ Cleanup verification failed: ${e}`);
test_results["cleanup"] = "FAIL";
total_tests += 1;
}