2020-11-16 19:32:50 +03:00
|
|
|
module main
|
|
|
|
|
|
|
|
import os
|
|
|
|
import time
|
|
|
|
import os.cmdline
|
|
|
|
|
|
|
|
enum Target {
|
|
|
|
both
|
|
|
|
stderr
|
|
|
|
stdout
|
|
|
|
alternate
|
|
|
|
}
|
|
|
|
|
|
|
|
fn s2target(s string) Target {
|
|
|
|
return match s {
|
|
|
|
'both' { Target.both }
|
|
|
|
'stderr' { Target.stderr }
|
|
|
|
'alternate' { Target.alternate }
|
|
|
|
else { Target.stdout }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
struct Context {
|
|
|
|
mut:
|
|
|
|
timeout_ms int
|
|
|
|
period_ms int
|
|
|
|
exitcode int
|
|
|
|
target Target
|
|
|
|
omode Target
|
|
|
|
is_verbose bool
|
|
|
|
}
|
|
|
|
|
|
|
|
fn (mut ctx Context) println(s string) {
|
|
|
|
if ctx.target == .alternate {
|
|
|
|
ctx.omode = if ctx.omode == .stderr { Target.stdout } else { Target.stderr }
|
|
|
|
}
|
|
|
|
if ctx.target in [.both, .stdout] || ctx.omode == .stdout {
|
|
|
|
println('stdout, $s')
|
|
|
|
}
|
|
|
|
if ctx.target in [.both, .stderr] || ctx.omode == .stderr {
|
|
|
|
eprintln('stderr, $s')
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn do_timeout(c &Context) {
|
2021-05-07 15:58:48 +03:00
|
|
|
mut ctx := unsafe { c }
|
2021-02-27 20:41:06 +03:00
|
|
|
time.sleep(ctx.timeout_ms * time.millisecond)
|
2020-11-16 19:32:50 +03:00
|
|
|
exit(ctx.exitcode)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
mut ctx := Context{}
|
|
|
|
args := os.args[1..]
|
|
|
|
if '-h' in args || '--help' in args {
|
|
|
|
println("Usage:
|
2021-02-22 10:42:00 +03:00
|
|
|
test_os_process [-v] [-h] [-target stderr/stdout/both/alternate] [-exitcode 0] [-timeout_ms 200] [-period_ms 50]
|
2021-04-09 13:22:14 +03:00
|
|
|
Prints lines periodically (-period_ms), to stdout/stderr (-target).
|
2020-11-16 19:32:50 +03:00
|
|
|
After a while (-timeout_ms), exit with (-exitcode).
|
|
|
|
This program is useful for platform independent testing
|
|
|
|
of child process/standart input/output control.
|
2021-02-21 18:05:03 +03:00
|
|
|
It is used in V's `os` module tests.
|
2020-11-16 19:32:50 +03:00
|
|
|
")
|
2021-02-22 10:42:00 +03:00
|
|
|
return
|
2020-11-16 19:32:50 +03:00
|
|
|
}
|
|
|
|
ctx.is_verbose = '-v' in args
|
|
|
|
ctx.target = s2target(cmdline.option(args, '-target', 'both'))
|
|
|
|
ctx.exitcode = cmdline.option(args, '-exitcode', '0').int()
|
2021-02-22 10:42:00 +03:00
|
|
|
ctx.timeout_ms = cmdline.option(args, '-timeout_ms', '200').int()
|
|
|
|
ctx.period_ms = cmdline.option(args, '-period_ms', '50').int()
|
2020-11-16 19:32:50 +03:00
|
|
|
if ctx.target == .alternate {
|
|
|
|
ctx.omode = .stdout
|
|
|
|
}
|
|
|
|
if ctx.is_verbose {
|
|
|
|
eprintln('> args: $args | context: $ctx')
|
|
|
|
}
|
2022-11-05 10:46:40 +03:00
|
|
|
spawn do_timeout(&ctx)
|
2020-11-16 19:32:50 +03:00
|
|
|
for i := 1; true; i++ {
|
|
|
|
ctx.println('$i')
|
2021-02-27 20:41:06 +03:00
|
|
|
time.sleep(ctx.period_ms * time.millisecond)
|
2020-11-16 19:32:50 +03:00
|
|
|
}
|
2021-02-27 20:41:06 +03:00
|
|
|
time.sleep(100 * time.second)
|
2020-11-16 19:32:50 +03:00
|
|
|
}
|