aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/cmd/tools/test_os_process.v
blob: bc275dd5330b4159ae93b92d32264b51eed09815 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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)
}