- Add a new installer for the `screen` utility. - This installer supports Ubuntu and macOS. - Includes functionality for installation, uninstallation, and status checking. - Fixed tests for osal.screen Co-authored-by: mahmmoud.hassanein <mahmmoud.hassanein@gmail.com>
156 lines
4.1 KiB
V
156 lines
4.1 KiB
V
module screen
|
|
|
|
import os
|
|
import time
|
|
|
|
const test_screen_name = 'test_screen_session'
|
|
const test_cmd = 'echo "test command"'
|
|
|
|
// Initialize test environment
|
|
pub fn testsuite_begin() ! {
|
|
// Check if screen is installed
|
|
res := os.execute('which screen')
|
|
if res.exit_code != 0 {
|
|
return error('screen is not installed. Please install screen first.')
|
|
}
|
|
|
|
// Ensure screen directory exists with proper permissions
|
|
home := os.home_dir()
|
|
screen_dir := '${home}/.screen'
|
|
if !os.exists(screen_dir) {
|
|
// Create directory with proper permissions using mkdir -m
|
|
res2 := os.execute('mkdir -m 700 ${screen_dir}')
|
|
if res2.exit_code != 0 {
|
|
return error('Failed to create screen directory: ${res2.output}')
|
|
}
|
|
}
|
|
|
|
mut screen_factory := new(reset: true)!
|
|
cleanup_test_screens()!
|
|
}
|
|
|
|
fn cleanup_test_screens() ! {
|
|
mut screen_factory := new(reset: false)!
|
|
screen_factory.scan()!
|
|
|
|
// Clean up main test screen
|
|
if screen_factory.exists(test_screen_name) {
|
|
screen_factory.kill(test_screen_name)!
|
|
time.sleep(200 * time.millisecond) // Give time for cleanup
|
|
}
|
|
|
|
// Clean up multiple test screens
|
|
if screen_factory.exists('${test_screen_name}_1') {
|
|
screen_factory.kill('${test_screen_name}_1')!
|
|
time.sleep(200 * time.millisecond)
|
|
}
|
|
if screen_factory.exists('${test_screen_name}_2') {
|
|
screen_factory.kill('${test_screen_name}_2')!
|
|
time.sleep(200 * time.millisecond)
|
|
}
|
|
|
|
// Final scan to ensure cleanup
|
|
screen_factory.scan()!
|
|
}
|
|
|
|
// Helper function to create and verify screen
|
|
fn create_and_verify_screen(mut screen_factory ScreensFactory, name string, cmd string) !&Screen {
|
|
mut screen := screen_factory.add(
|
|
name: name
|
|
cmd: cmd
|
|
)!
|
|
|
|
// Give screen time to initialize
|
|
time.sleep(500 * time.millisecond)
|
|
|
|
// Verify screen exists and is running
|
|
screen_factory.scan()!
|
|
if !screen_factory.exists(name) {
|
|
return error('Screen ${name} was not found after creation')
|
|
}
|
|
|
|
mut result := screen_factory.get(name)!
|
|
return &result
|
|
}
|
|
|
|
// Test screen creation and basic status
|
|
pub fn test_screen_creation() ! {
|
|
defer {
|
|
cleanup_test_screens() or { panic('failed to cleanup test screens: ${err}') }
|
|
}
|
|
mut screen_factory := new(reset: false)!
|
|
mut screen := create_and_verify_screen(mut &screen_factory, test_screen_name, '/bin/bash')!
|
|
|
|
assert screen.name == test_screen_name
|
|
status := screen.status()!
|
|
assert status == .active
|
|
}
|
|
|
|
// Test command sending functionality
|
|
pub fn test_screen_cmd_send() ! {
|
|
defer {
|
|
cleanup_test_screens() or { panic('failed to cleanup test screens: ${err}') }
|
|
}
|
|
mut screen_factory := new(reset: false)!
|
|
mut screen := create_and_verify_screen(mut &screen_factory, test_screen_name, '/bin/bash')!
|
|
|
|
// Send a test command
|
|
screen.cmd_send(test_cmd)!
|
|
|
|
// Give some time for command execution
|
|
time.sleep(200 * time.millisecond)
|
|
|
|
// Verify screen status after command
|
|
status := screen.status()!
|
|
assert status == .active
|
|
}
|
|
|
|
// Test error cases
|
|
pub fn test_screen_errors() ! {
|
|
defer {
|
|
cleanup_test_screens() or { panic('failed to cleanup test screens: ${err}') }
|
|
}
|
|
mut screen_factory := new(reset: false)!
|
|
|
|
// Test invalid screen name
|
|
if _ := screen_factory.get('nonexistent_screen') {
|
|
assert false, 'Should not find nonexistent screen'
|
|
} else {
|
|
assert true
|
|
}
|
|
|
|
// Test screen status after creation but before start
|
|
mut screen := screen_factory.add(
|
|
name: test_screen_name
|
|
cmd: '/bin/bash'
|
|
start: false
|
|
)!
|
|
status := screen.status()!
|
|
assert status == .inactive, 'Screen should be inactive before start'
|
|
}
|
|
|
|
// Test multiple screens
|
|
pub fn test_multiple_screens() ! {
|
|
defer {
|
|
cleanup_test_screens() or { panic('failed to cleanup test screens: ${err}') }
|
|
}
|
|
mut screen_factory := new(reset: false)!
|
|
|
|
screen1_name := '${test_screen_name}_1'
|
|
screen2_name := '${test_screen_name}_2'
|
|
|
|
mut screen1 := create_and_verify_screen(mut &screen_factory, screen1_name, '/bin/bash')!
|
|
mut screen2 := create_and_verify_screen(mut &screen_factory, screen2_name, '/bin/bash')!
|
|
|
|
assert screen1.status()! == .active
|
|
assert screen2.status()! == .active
|
|
|
|
screen_factory.kill(screen1_name)!
|
|
time.sleep(200 * time.millisecond)
|
|
assert screen1.status()! == .inactive
|
|
assert screen2.status()! == .active
|
|
|
|
screen_factory.kill(screen2_name)!
|
|
time.sleep(200 * time.millisecond)
|
|
}
|