83 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			V
		
	
	
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) {
 | 
						|
	mut ctx := unsafe { c }
 | 
						|
	time.sleep(ctx.timeout_ms * time.millisecond)
 | 
						|
	exit(ctx.exitcode)
 | 
						|
}
 | 
						|
 | 
						|
fn main() {
 | 
						|
	mut ctx := Context{}
 | 
						|
	args := os.args[1..]
 | 
						|
	if '-h' in args || '--help' in args {
 | 
						|
		println("Usage:
 | 
						|
	test_os_process [-v] [-h] [-target stderr/stdout/both/alternate] [-exitcode 0] [-timeout_ms 200] [-period_ms 50]
 | 
						|
		Prints lines periodically (-period_ms), to stdout/stderr (-target).
 | 
						|
		After a while (-timeout_ms), exit with (-exitcode).
 | 
						|
		This program is useful for platform independent testing
 | 
						|
		of child process/standart input/output control.
 | 
						|
		It is used in V's `os` module tests.
 | 
						|
")
 | 
						|
		return
 | 
						|
	}
 | 
						|
	ctx.is_verbose = '-v' in args
 | 
						|
	ctx.target = s2target(cmdline.option(args, '-target', 'both'))
 | 
						|
	ctx.exitcode = cmdline.option(args, '-exitcode', '0').int()
 | 
						|
	ctx.timeout_ms = cmdline.option(args, '-timeout_ms', '200').int()
 | 
						|
	ctx.period_ms = cmdline.option(args, '-period_ms', '50').int()
 | 
						|
	if ctx.target == .alternate {
 | 
						|
		ctx.omode = .stdout
 | 
						|
	}
 | 
						|
	if ctx.is_verbose {
 | 
						|
		eprintln('> args: $args | context: $ctx')
 | 
						|
	}
 | 
						|
	go do_timeout(&ctx)
 | 
						|
	for i := 1; true; i++ {
 | 
						|
		ctx.println('$i')
 | 
						|
		time.sleep(ctx.period_ms * time.millisecond)
 | 
						|
	}
 | 
						|
	time.sleep(100 * time.second)
 | 
						|
}
 |