fixes installers

This commit is contained in:
2024-12-25 22:30:33 +01:00
parent d8d852cd5a
commit 4373ec21aa
22 changed files with 1061 additions and 160 deletions

View File

@@ -1,13 +1,61 @@
# screen
# Screen
The Screen module provides a V interface to manage GNU Screen sessions.
## Example Script
Create a file `screen_example.vsh`:
```v
#!/usr/bin/env -S v run
import freeflowuniverse.herolib.osal.screen
// Create a new screen session with hardcoded parameters
mut s := screen.Screen{
name: 'test_session'
cmd: '/bin/bash' // Default shell
}
// Check if screen is running
is_running := s.is_running() or {
println('Error checking screen status: ${err}')
return
}
// Get session status
status := s.status() or {
println('Error getting status: ${err}')
return
}
// Send a command to the screen session
s.cmd_send('ls -la') or {
println('Error sending command: ${err}')
return
}
// Attach to the session
s.attach() or {
println('Error attaching: ${err}')
return
}
```
## Basic Screen Commands
```bash
#to see sessions which have been created
screen -ls
There is a screen on:
3230.test (Detached)
3230.test (Detached)
#now to attach to this screen
screen -r test
```
```
## Testing
```bash
vtest ~/code/github/freeflowuniverse/herolib/lib/osal/screen/screen_test.v

View File

@@ -1,17 +1,148 @@
module screen
import freeflowuniverse.herolib.ui.console
import freeflowuniverse.herolib.osal
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()!
}
pub fn test_screen_status() ! {
mut screen_factory := new()!
mut screen := screen_factory.add(name: 'testservice', cmd: 'redis-server --port 1234')!
// Cleanup after all tests
pub fn testsuite_end() ! {
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() ! {
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() ! {
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() ! {
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() ! {
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)
}