165 lines
5.1 KiB
V
165 lines
5.1 KiB
V
import os
|
|
|
|
fn testsuite_begin() {
|
|
// Calling unbuffer_stdout() here is important, in order
|
|
// for `v test pipe_test.v` to work, since the test runner
|
|
// will start a non interactive process for the test, in which
|
|
// case libc buffers the output lines by default -> failures.
|
|
unbuffer_stdout()
|
|
}
|
|
|
|
fn test_pipe_basic() {
|
|
println('=== Testing basic pipe functionality ===')
|
|
mut pipe := os.pipe()!
|
|
defer {
|
|
pipe.close()
|
|
}
|
|
test_data := 'Hello, Pipe!'
|
|
bytes_written := pipe.write(test_data.bytes()) or {
|
|
eprintln('Failed to write to pipe: ${err}')
|
|
return
|
|
}
|
|
println('Written ${bytes_written} bytes to pipe')
|
|
mut buffer := []u8{len: 1024}
|
|
bytes_read := pipe.read(mut buffer) or {
|
|
eprintln('Failed to read from pipe: ${err}')
|
|
return
|
|
}
|
|
received_data := buffer[0..bytes_read].bytestr()
|
|
println('Read ${bytes_read} bytes from pipe: "${received_data}"')
|
|
assert bytes_written == bytes_read
|
|
assert test_data == received_data
|
|
println('✓ Basic pipe test passed')
|
|
}
|
|
|
|
fn test_pipe_large_data() {
|
|
println('=== Testing pipe with large data ===')
|
|
mut pipe := os.pipe()!
|
|
defer {
|
|
pipe.close()
|
|
}
|
|
large_data := 'X'.repeat(1000)
|
|
bytes_written := pipe.write(large_data.bytes()) or {
|
|
eprintln('Failed to write large data to pipe: ${err}')
|
|
return
|
|
}
|
|
println('Written ${bytes_written} bytes of large data to pipe')
|
|
mut buffer := []u8{len: 1024}
|
|
bytes_read := pipe.read(mut buffer) or {
|
|
eprintln('Failed to read large data from pipe: ${err}')
|
|
return
|
|
}
|
|
assert bytes_written == bytes_read
|
|
assert bytes_read == 1000
|
|
println('✓ Large data pipe test passed')
|
|
}
|
|
|
|
fn test_capture_stdout() {
|
|
println('=== Testing stdout capture ===')
|
|
mut cap := os.stdio_capture()!
|
|
test_output := 'This is stdout test message'
|
|
println(test_output)
|
|
println('Another stdout line')
|
|
cap.stop()
|
|
stdout := cap.stdout.slurp().join('\n')
|
|
stderr := cap.stderr.slurp().join('\n')
|
|
cap.close()
|
|
println('Captured stdout: "${stdout}"')
|
|
println('Captured stderr: "${stderr}"')
|
|
assert stdout.contains(test_output)
|
|
assert stdout.contains('Another stdout line')
|
|
assert stderr == ''
|
|
println('✓ Stdout capture test passed')
|
|
}
|
|
|
|
fn test_capture_stderr() {
|
|
println('=== Testing stderr capture ===')
|
|
mut cap := os.stdio_capture()!
|
|
test_error := 'This is stderr test message'
|
|
eprintln(test_error)
|
|
eprintln('Another stderr line')
|
|
cap.stop()
|
|
stdout := cap.stdout.slurp().join('\n')
|
|
stderr := cap.stderr.slurp().join('\n')
|
|
cap.close()
|
|
println('Captured stdout: "${stdout}"')
|
|
println('Captured stderr: "${stderr}"')
|
|
assert stderr.contains(test_error)
|
|
assert stderr.contains('Another stderr line')
|
|
assert stdout == ''
|
|
println('✓ Stderr capture test passed')
|
|
}
|
|
|
|
fn test_capture_both() {
|
|
println('=== Testing both stdout and stderr capture ===')
|
|
mut cap := os.stdio_capture()!
|
|
stdout_msg := 'Standard output message'
|
|
stderr_msg := 'Standard error message'
|
|
println(stdout_msg)
|
|
eprintln(stderr_msg)
|
|
println('More stdout')
|
|
eprintln('More stderr')
|
|
cap.stop()
|
|
stdout := cap.stdout.slurp().join('\n')
|
|
stderr := cap.stderr.slurp().join('\n')
|
|
cap.close()
|
|
println('Captured stdout: "${stdout}"')
|
|
println('Captured stderr: "${stderr}"')
|
|
assert stdout.contains(stdout_msg)
|
|
assert stdout.contains('More stdout')
|
|
assert stderr.contains(stderr_msg)
|
|
assert stderr.contains('More stderr')
|
|
assert !stdout.contains(stderr_msg)
|
|
assert !stderr.contains(stdout_msg)
|
|
println('✓ Both stdout and stderr capture test passed')
|
|
}
|
|
|
|
fn test_capture_both_finish() {
|
|
println('=== Testing both stdout and stderr capture (finish)===')
|
|
mut cap := os.stdio_capture()!
|
|
stdout_msg := 'Standard output message'
|
|
stderr_msg := 'Standard error message'
|
|
println(stdout_msg)
|
|
eprintln(stderr_msg)
|
|
println('More stdout')
|
|
eprintln('More stderr')
|
|
stdout_list, stderr_list := cap.finish()
|
|
stdout := stdout_list.join('\n')
|
|
stderr := stderr_list.join('\n')
|
|
println('Captured stdout: "${stdout}"')
|
|
println('Captured stderr: "${stderr}"')
|
|
assert stdout.contains(stdout_msg)
|
|
assert stdout.contains('More stdout')
|
|
assert stderr.contains(stderr_msg)
|
|
assert stderr.contains('More stderr')
|
|
assert !stdout.contains(stderr_msg)
|
|
assert !stderr.contains(stdout_msg)
|
|
println('✓ Both stdout and stderr capture test passed')
|
|
}
|
|
|
|
fn test_capture_restoration() {
|
|
println('=== Testing output restoration after capture ===')
|
|
original_stdout_msg := 'Before capture - stdout'
|
|
original_stderr_msg := 'Before capture - stderr'
|
|
println(original_stdout_msg)
|
|
eprintln(original_stderr_msg)
|
|
mut cap := os.stdio_capture()!
|
|
captured_stdout_msg := 'During capture - stdout'
|
|
captured_stderr_msg := 'During capture - stderr'
|
|
println(captured_stdout_msg)
|
|
eprintln(captured_stderr_msg)
|
|
cap.stop()
|
|
stdout := cap.stdout.slurp().join('\n')
|
|
stderr := cap.stderr.slurp().join('\n')
|
|
cap.close()
|
|
after_capture_stdout_msg := 'After capture - stdout'
|
|
after_capture_stderr_msg := 'After capture - stderr'
|
|
println(after_capture_stdout_msg)
|
|
eprintln(after_capture_stderr_msg)
|
|
assert stdout.contains(captured_stdout_msg)
|
|
assert stderr.contains(captured_stderr_msg)
|
|
assert !stdout.contains(original_stdout_msg)
|
|
assert !stderr.contains(original_stderr_msg)
|
|
println('✓ Output restoration test passed')
|
|
}
|