feat: Add support for new OS package
Some checks are pending
Rhai Tests / Run Rhai Tests (push) Waiting to run
Some checks are pending
Rhai Tests / Run Rhai Tests (push) Waiting to run
- Add a new `sal-os` package containing OS interaction utilities. - Update workspace members to include the new package. - Add README and basic usage examples for the new package.
This commit is contained in:
@@ -1,111 +0,0 @@
|
||||
// 01_file_operations.rhai
|
||||
// Tests for file system operations in the OS module
|
||||
|
||||
// Custom assert function
|
||||
fn assert_true(condition, message) {
|
||||
if !condition {
|
||||
print(`ASSERTION FAILED: ${message}`);
|
||||
throw message;
|
||||
}
|
||||
}
|
||||
|
||||
// Create a test directory structure
|
||||
let test_dir = "rhai_test_fs";
|
||||
let sub_dir = test_dir + "/subdir";
|
||||
|
||||
// Test mkdir function
|
||||
print("Testing mkdir...");
|
||||
let mkdir_result = mkdir(test_dir);
|
||||
assert_true(exist(test_dir), "Directory creation failed");
|
||||
print(`✓ mkdir: ${mkdir_result}`);
|
||||
|
||||
// Test nested directory creation
|
||||
let nested_result = mkdir(sub_dir);
|
||||
assert_true(exist(sub_dir), "Nested directory creation failed");
|
||||
print(`✓ mkdir (nested): ${nested_result}`);
|
||||
|
||||
// Test file_write function
|
||||
let test_file = test_dir + "/test.txt";
|
||||
let file_content = "This is a test file created by Rhai test script.";
|
||||
let write_result = file_write(test_file, file_content);
|
||||
assert_true(exist(test_file), "File creation failed");
|
||||
print(`✓ file_write: ${write_result}`);
|
||||
|
||||
// Test file_read function
|
||||
let read_content = file_read(test_file);
|
||||
assert_true(read_content == file_content, "File content doesn't match");
|
||||
print(`✓ file_read: Content matches`);
|
||||
|
||||
// Test file_size function
|
||||
let size = file_size(test_file);
|
||||
assert_true(size > 0, "File size should be greater than 0");
|
||||
print(`✓ file_size: ${size} bytes`);
|
||||
|
||||
// Test file_write_append function
|
||||
let append_content = "\nThis is appended content.";
|
||||
let append_result = file_write_append(test_file, append_content);
|
||||
let new_content = file_read(test_file);
|
||||
assert_true(new_content == file_content + append_content, "Appended content doesn't match");
|
||||
print(`✓ file_write_append: ${append_result}`);
|
||||
|
||||
// Test copy function
|
||||
let copied_file = test_dir + "/copied.txt";
|
||||
let copy_result = copy(test_file, copied_file);
|
||||
assert_true(exist(copied_file), "File copy failed");
|
||||
print(`✓ copy: ${copy_result}`);
|
||||
|
||||
// Test mv function
|
||||
let moved_file = test_dir + "/moved.txt";
|
||||
let mv_result = mv(copied_file, moved_file);
|
||||
assert_true(exist(moved_file), "File move failed");
|
||||
assert_true(!exist(copied_file), "Source file still exists after move");
|
||||
print(`✓ mv: ${mv_result}`);
|
||||
|
||||
// Test find_file function
|
||||
let found_file = find_file(test_dir, "*.txt");
|
||||
assert_true(found_file.contains("test.txt") || found_file.contains("moved.txt"), "find_file failed");
|
||||
print(`✓ find_file: ${found_file}`);
|
||||
|
||||
// Test find_files function
|
||||
let found_files = find_files(test_dir, "*.txt");
|
||||
assert_true(found_files.len() == 2, "find_files should find 2 files");
|
||||
print(`✓ find_files: Found ${found_files.len()} files`);
|
||||
|
||||
// Test find_dir function
|
||||
let found_dir = find_dir(test_dir, "sub*");
|
||||
assert_true(found_dir.contains("subdir"), "find_dir failed");
|
||||
print(`✓ find_dir: ${found_dir}`);
|
||||
|
||||
// Test find_dirs function
|
||||
let found_dirs = find_dirs(test_dir, "sub*");
|
||||
assert_true(found_dirs.len() == 1, "find_dirs should find 1 directory");
|
||||
print(`✓ find_dirs: Found ${found_dirs.len()} directories`);
|
||||
|
||||
// Test chdir function
|
||||
// Save current directory path before changing
|
||||
let chdir_result = chdir(test_dir);
|
||||
print(`✓ chdir: ${chdir_result}`);
|
||||
|
||||
// Change back to parent directory
|
||||
chdir("..");
|
||||
|
||||
// Test rsync function (if available)
|
||||
let rsync_dir = test_dir + "/rsync_dest";
|
||||
mkdir(rsync_dir);
|
||||
let rsync_result = rsync(test_dir, rsync_dir);
|
||||
print(`✓ rsync: ${rsync_result}`);
|
||||
|
||||
// Test delete function
|
||||
let delete_file_result = delete(test_file);
|
||||
assert_true(!exist(test_file), "File deletion failed");
|
||||
print(`✓ delete (file): ${delete_file_result}`);
|
||||
|
||||
// Clean up
|
||||
delete(moved_file);
|
||||
delete(sub_dir);
|
||||
delete(rsync_dir);
|
||||
delete(test_dir);
|
||||
assert_true(!exist(test_dir), "Directory deletion failed");
|
||||
print(`✓ delete (directory): Directory cleaned up`);
|
||||
|
||||
print("All file system tests completed successfully!");
|
@@ -1,53 +0,0 @@
|
||||
// 02_download_operations.rhai
|
||||
// Tests for download operations in the OS module
|
||||
|
||||
// Custom assert function
|
||||
fn assert_true(condition, message) {
|
||||
if !condition {
|
||||
print(`ASSERTION FAILED: ${message}`);
|
||||
throw message;
|
||||
}
|
||||
}
|
||||
|
||||
// Create a test directory
|
||||
let test_dir = "rhai_test_download";
|
||||
mkdir(test_dir);
|
||||
print(`Created test directory: ${test_dir}`);
|
||||
|
||||
// Test which function to ensure curl is available
|
||||
let curl_path = which("curl");
|
||||
if curl_path == "" {
|
||||
print("Warning: curl not found, download tests may fail");
|
||||
} else {
|
||||
print(`✓ which: curl found at ${curl_path}`);
|
||||
}
|
||||
|
||||
// Test cmd_ensure_exists function
|
||||
let ensure_result = cmd_ensure_exists("curl");
|
||||
print(`✓ cmd_ensure_exists: ${ensure_result}`);
|
||||
|
||||
// Test download function with a small file
|
||||
let download_url = "https://raw.githubusercontent.com/rust-lang/rust/master/LICENSE-MIT";
|
||||
let download_dest = test_dir + "/license.txt";
|
||||
let min_size_kb = 1; // Minimum size in KB
|
||||
|
||||
print(`Downloading ${download_url}...`);
|
||||
let download_result = download_file(download_url, download_dest, min_size_kb);
|
||||
assert_true(exist(download_dest), "Download failed");
|
||||
print(`✓ download_file: ${download_result}`);
|
||||
|
||||
// Verify the downloaded file
|
||||
let file_content = file_read(download_dest);
|
||||
assert_true(file_content.contains("Permission is hereby granted"), "Downloaded file content is incorrect");
|
||||
print("✓ Downloaded file content verified");
|
||||
|
||||
// Test chmod_exec function
|
||||
let chmod_result = chmod_exec(download_dest);
|
||||
print(`✓ chmod_exec: ${chmod_result}`);
|
||||
|
||||
// Clean up
|
||||
delete(test_dir);
|
||||
assert_true(!exist(test_dir), "Directory deletion failed");
|
||||
print(`✓ Cleanup: Directory ${test_dir} removed`);
|
||||
|
||||
print("All download tests completed successfully!");
|
@@ -1,56 +0,0 @@
|
||||
// 03_package_operations.rhai
|
||||
// Tests for package management operations in the OS module
|
||||
|
||||
// Custom assert function
|
||||
fn assert_true(condition, message) {
|
||||
if !condition {
|
||||
print(`ASSERTION FAILED: ${message}`);
|
||||
throw message;
|
||||
}
|
||||
}
|
||||
|
||||
// Test package_platform function
|
||||
let platform = package_platform();
|
||||
print(`Current platform: ${platform}`);
|
||||
|
||||
// Test package_set_debug function
|
||||
let debug_enabled = package_set_debug(true);
|
||||
assert_true(debug_enabled, "Debug mode should be enabled");
|
||||
print("✓ package_set_debug: Debug mode enabled");
|
||||
|
||||
// Disable debug mode for remaining tests
|
||||
package_set_debug(false);
|
||||
|
||||
// Test package_is_installed function with a package that should exist on most systems
|
||||
let common_packages = ["bash", "curl", "grep"];
|
||||
let found_package = false;
|
||||
|
||||
for pkg in common_packages {
|
||||
let is_installed = package_is_installed(pkg);
|
||||
if is_installed {
|
||||
print(`✓ package_is_installed: ${pkg} is installed`);
|
||||
found_package = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if !found_package {
|
||||
print("Warning: None of the common packages were found installed");
|
||||
}
|
||||
|
||||
// Test package_search function with a common term
|
||||
// Note: This might be slow and produce a lot of output
|
||||
print("Testing package_search (this might take a moment)...");
|
||||
let search_results = package_search("lib");
|
||||
print(`✓ package_search: Found ${search_results.len()} packages containing 'lib'`);
|
||||
|
||||
// Test package_list function
|
||||
// Note: This might be slow and produce a lot of output
|
||||
print("Testing package_list (this might take a moment)...");
|
||||
let installed_packages = package_list();
|
||||
print(`✓ package_list: Found ${installed_packages.len()} installed packages`);
|
||||
|
||||
// Note: We're not testing package_install, package_remove, package_update, or package_upgrade
|
||||
// as they require root privileges and could modify the system state
|
||||
|
||||
print("All package management tests completed successfully!");
|
@@ -1,148 +0,0 @@
|
||||
// run_all_tests.rhai
|
||||
// Runs all OS module tests
|
||||
|
||||
print("=== Running OS Module Tests ===");
|
||||
|
||||
// Custom assert function
|
||||
fn assert_true(condition, message) {
|
||||
if !condition {
|
||||
print(`ASSERTION FAILED: ${message}`);
|
||||
throw message;
|
||||
}
|
||||
}
|
||||
|
||||
// Run each test directly
|
||||
let passed = 0;
|
||||
let failed = 0;
|
||||
|
||||
// Test 1: File Operations
|
||||
print("\n--- Running File Operations Tests ---");
|
||||
try {
|
||||
// Create a test directory structure
|
||||
let test_dir = "rhai_test_fs";
|
||||
let sub_dir = test_dir + "/subdir";
|
||||
|
||||
// Test mkdir function
|
||||
print("Testing mkdir...");
|
||||
let mkdir_result = mkdir(test_dir);
|
||||
assert_true(exist(test_dir), "Directory creation failed");
|
||||
print(`✓ mkdir: ${mkdir_result}`);
|
||||
|
||||
// Test nested directory creation
|
||||
let nested_result = mkdir(sub_dir);
|
||||
assert_true(exist(sub_dir), "Nested directory creation failed");
|
||||
print(`✓ mkdir (nested): ${nested_result}`);
|
||||
|
||||
// Test file_write function
|
||||
let test_file = test_dir + "/test.txt";
|
||||
let file_content = "This is a test file created by Rhai test script.";
|
||||
let write_result = file_write(test_file, file_content);
|
||||
assert_true(exist(test_file), "File creation failed");
|
||||
print(`✓ file_write: ${write_result}`);
|
||||
|
||||
// Test file_read function
|
||||
let read_content = file_read(test_file);
|
||||
assert_true(read_content == file_content, "File content doesn't match");
|
||||
print(`✓ file_read: Content matches`);
|
||||
|
||||
// Test file_size function
|
||||
let size = file_size(test_file);
|
||||
assert_true(size > 0, "File size should be greater than 0");
|
||||
print(`✓ file_size: ${size} bytes`);
|
||||
|
||||
// Clean up
|
||||
delete(test_file);
|
||||
delete(sub_dir);
|
||||
delete(test_dir);
|
||||
assert_true(!exist(test_dir), "Directory deletion failed");
|
||||
print(`✓ delete: Directory cleaned up`);
|
||||
|
||||
print("--- File Operations Tests completed successfully ---");
|
||||
passed += 1;
|
||||
} catch(err) {
|
||||
print(`!!! Error in File Operations Tests: ${err}`);
|
||||
failed += 1;
|
||||
}
|
||||
|
||||
// Test 2: Download Operations
|
||||
print("\n--- Running Download Operations Tests ---");
|
||||
try {
|
||||
// Create a test directory
|
||||
let test_dir = "rhai_test_download";
|
||||
mkdir(test_dir);
|
||||
print(`Created test directory: ${test_dir}`);
|
||||
|
||||
// Test which function to ensure curl is available
|
||||
let curl_path = which("curl");
|
||||
if curl_path == "" {
|
||||
print("Warning: curl not found, download tests may fail");
|
||||
} else {
|
||||
print(`✓ which: curl found at ${curl_path}`);
|
||||
}
|
||||
|
||||
// Test cmd_ensure_exists function
|
||||
let ensure_result = cmd_ensure_exists("curl");
|
||||
print(`✓ cmd_ensure_exists: ${ensure_result}`);
|
||||
|
||||
// Test download function with a small file
|
||||
let download_url = "https://raw.githubusercontent.com/rust-lang/rust/master/LICENSE-MIT";
|
||||
let download_dest = test_dir + "/license.txt";
|
||||
let min_size_kb = 1; // Minimum size in KB
|
||||
|
||||
print(`Downloading ${download_url}...`);
|
||||
let download_result = download_file(download_url, download_dest, min_size_kb);
|
||||
assert_true(exist(download_dest), "Download failed");
|
||||
print(`✓ download_file: ${download_result}`);
|
||||
|
||||
// Verify the downloaded file
|
||||
let file_content = file_read(download_dest);
|
||||
assert_true(file_content.contains("Permission is hereby granted"), "Downloaded file content is incorrect");
|
||||
print("✓ Downloaded file content verified");
|
||||
|
||||
// Clean up
|
||||
delete(test_dir);
|
||||
assert_true(!exist(test_dir), "Directory deletion failed");
|
||||
print(`✓ Cleanup: Directory ${test_dir} removed`);
|
||||
|
||||
print("--- Download Operations Tests completed successfully ---");
|
||||
passed += 1;
|
||||
} catch(err) {
|
||||
print(`!!! Error in Download Operations Tests: ${err}`);
|
||||
failed += 1;
|
||||
}
|
||||
|
||||
// Test 3: Package Operations
|
||||
print("\n--- Running Package Operations Tests ---");
|
||||
try {
|
||||
// Test package_platform function
|
||||
let platform = package_platform();
|
||||
print(`Current platform: ${platform}`);
|
||||
|
||||
// Test package_set_debug function
|
||||
let debug_enabled = package_set_debug(true);
|
||||
assert_true(debug_enabled, "Debug mode should be enabled");
|
||||
print("✓ package_set_debug: Debug mode enabled");
|
||||
|
||||
// Disable debug mode for remaining tests
|
||||
package_set_debug(false);
|
||||
|
||||
print("--- Package Operations Tests completed successfully ---");
|
||||
passed += 1;
|
||||
} catch(err) {
|
||||
print(`!!! Error in Package Operations Tests: ${err}`);
|
||||
failed += 1;
|
||||
}
|
||||
|
||||
print("\n=== Test Summary ===");
|
||||
print(`Passed: ${passed}`);
|
||||
print(`Failed: ${failed}`);
|
||||
print(`Total: ${passed + failed}`);
|
||||
|
||||
if failed == 0 {
|
||||
print("\n✅ All tests passed!");
|
||||
} else {
|
||||
print("\n❌ Some tests failed!");
|
||||
}
|
||||
|
||||
// Return the number of failed tests (0 means success)
|
||||
failed;
|
Reference in New Issue
Block a user