From f4a8e8478cb9a3f0bd10e9ec3566b37252192e20 Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Sat, 15 Nov 2025 07:38:40 +0200 Subject: [PATCH] os: fix `v test pipe_test.c.v`, uncomment more tests (#25733) --- vlib/os/pipe.c.v | 20 ++++++++++---- vlib/os/pipe_test.c.v | 63 ++++++------------------------------------- 2 files changed, 23 insertions(+), 60 deletions(-) diff --git a/vlib/os/pipe.c.v b/vlib/os/pipe.c.v index 83da06ffa..b176318c6 100644 --- a/vlib/os/pipe.c.v +++ b/vlib/os/pipe.c.v @@ -92,16 +92,18 @@ pub fn (mut p Pipe) slurp() []string { @[noinit] pub struct IOCapture { pub mut: - stdout &Pipe = unsafe { nil } - stderr &Pipe = unsafe { nil } + stdout Pipe + stderr Pipe mut: original_stdout_fd int = -1 original_stderr_fd int = -1 } // stdio_capture starts capturing stdout and stderr by redirecting them to pipes -// example: +// Example: // ```v +// import os +// unbuffer_stdout() // mut cap := os.stdio_capture()! // println('hello println') // eprintln('hello eprintln') @@ -109,13 +111,21 @@ mut: // sout := cap.stdout.slurp() // serr := cap.stderr.slurp() // cap.close() +// assert sout == ['hello println\n'] +// assert serr == ['hello eprintln\n'] // ``` // or // ```v +// import os +// unbuffer_stdout() // mut cap := os.stdio_capture()! // println('hello println') // eprintln('hello eprintln') +// eprintln('World eprintln') +// println('World println') // sout, serr := cap.finish() +// assert sout == ['hello println\nWorld println\n'] +// assert serr == ['hello eprintln\nWorld eprintln\n'] // ``` pub fn stdio_capture() !IOCapture { mut c := IOCapture{} @@ -149,8 +159,8 @@ pub fn stdio_capture() !IOCapture { pipe_stderr.write_fd = -1 // Store pipes for later reading - c.stdout = &pipe_stdout - c.stderr = &pipe_stderr + c.stdout = pipe_stdout + c.stderr = pipe_stderr return c } diff --git a/vlib/os/pipe_test.c.v b/vlib/os/pipe_test.c.v index 71fbc27bf..903c9775d 100644 --- a/vlib/os/pipe_test.c.v +++ b/vlib/os/pipe_test.c.v @@ -1,136 +1,110 @@ -module main - 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') - println('') } 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') - println('') } -// Note: following tests can only passed by `v pipe_test.c.v` not `v test pipe_test.c.v` -/* 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') - println('') } 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') - println('') } 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) @@ -138,30 +112,22 @@ fn test_capture_both() { assert !stdout.contains(stderr_msg) assert !stderr.contains(stdout_msg) println('✓ Both stdout and stderr capture test passed') - println('') } 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) @@ -169,43 +135,30 @@ fn test_capture_both_finish() { assert !stdout.contains(stderr_msg) assert !stderr.contains(stdout_msg) println('✓ Both stdout and stderr capture test passed') - println('') } 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') - println('') } -*/ -- 2.39.5