1 | // vtest flaky: true |
2 | // vtest retry: 3 |
3 | import os |
4 | import time |
5 | |
6 | const ( |
7 | vexe = os.getenv('VEXE') |
8 | vroot = os.dir(vexe) |
9 | tfolder = os.join_path(os.vtmp_dir(), 'v', 'tests', 'os_process') |
10 | test_os_process = os.join_path(tfolder, 'test_os_process.exe') |
11 | test_os_process_source = os.join_path(vroot, 'cmd/tools/test_os_process.v') |
12 | ) |
13 | |
14 | fn testsuite_begin() { |
15 | os.rmdir_all(tfolder) or {} |
16 | os.mkdir_all(tfolder)! |
17 | if os.getenv('WINE_TEST_OS_PROCESS_EXE') != '' { |
18 | // Make it easier to run the test under wine emulation, by just |
19 | // prebuilding the executable with: |
20 | // v -os windows -o x.exe cmd/tools/test_os_process.v |
21 | // WINE_TEST_OS_PROCESS_EXE=x.exe ./v -os windows vlib/os/process_test.v |
22 | os.cp(os.getenv('WINE_TEST_OS_PROCESS_EXE'), test_os_process)! |
23 | } else { |
24 | os.system('${os.quoted_path(vexe)} -o ${os.quoted_path(test_os_process)} ${os.quoted_path(test_os_process_source)}') |
25 | } |
26 | assert os.exists(test_os_process) |
27 | } |
28 | |
29 | fn testsuite_end() { |
30 | os.rmdir_all(tfolder) or {} |
31 | } |
32 | |
33 | fn test_getpid() { |
34 | pid := os.getpid() |
35 | eprintln('current pid: ${pid}') |
36 | assert pid != 0 |
37 | } |
38 | |
39 | fn test_set_work_folder() { |
40 | new_work_folder := os.real_path(os.temp_dir()) |
41 | parent_working_folder := os.getwd() |
42 | dump(new_work_folder) |
43 | dump(parent_working_folder) |
44 | if new_work_folder == parent_working_folder { |
45 | eprintln('... skipping ${@METHOD} because the working folder is the temporary one') |
46 | return |
47 | } |
48 | mut p := os.new_process(test_os_process) |
49 | p.set_args(['-show_wd', '-target', 'stdout']) |
50 | p.set_work_folder(new_work_folder) |
51 | p.set_redirect_stdio() |
52 | p.wait() |
53 | assert p.code == 0 |
54 | output := p.stdout_slurp().trim_space() |
55 | p.close() |
56 | $if trace_process_output ? { |
57 | eprintln('p output: "${output}"') |
58 | } |
59 | child_work_folder := output.find_between('stdout, WORK_DIR=', '\n').trim_space() |
60 | dump(child_work_folder) |
61 | assert child_work_folder == new_work_folder |
62 | new_parent_work_folder := os.getwd() |
63 | dump(new_parent_work_folder) |
64 | assert new_parent_work_folder == parent_working_folder |
65 | assert new_parent_work_folder != child_work_folder |
66 | } |
67 | |
68 | fn test_done() { |
69 | exit(0) |
70 | } |
71 | |
72 | fn test_run() { |
73 | mut p := os.new_process(test_os_process) |
74 | p.set_args(['-timeout_ms', '150', '-period_ms', '50']) |
75 | p.run() |
76 | assert p.status == .running |
77 | assert p.pid > 0 |
78 | assert p.pid != os.getpid() |
79 | mut i := 0 |
80 | for { |
81 | if !p.is_alive() { |
82 | break |
83 | } |
84 | $if trace_process_output ? { |
85 | os.system('ps -opid= -oppid= -ouser= -onice= -of= -ovsz= -orss= -otime= -oargs= -p ${p.pid}') |
86 | } |
87 | time.sleep(50 * time.millisecond) |
88 | i++ |
89 | } |
90 | p.wait() |
91 | assert p.code == 0 |
92 | assert p.status == .exited |
93 | // |
94 | eprintln('polling iterations: ${i}') |
95 | assert i < 50 |
96 | p.close() |
97 | } |
98 | |
99 | fn test_wait() { |
100 | mut p := os.new_process(test_os_process) |
101 | assert p.status != .exited |
102 | p.wait() |
103 | assert p.status == .exited |
104 | assert p.code == 0 |
105 | assert p.pid != os.getpid() |
106 | p.close() |
107 | } |
108 | |
109 | fn test_slurping_output() { |
110 | mut p := os.new_process(test_os_process) |
111 | p.set_args(['-timeout_ms', '500', '-period_ms', '50']) |
112 | p.set_redirect_stdio() |
113 | assert p.status != .exited |
114 | p.wait() |
115 | assert p.status == .exited |
116 | assert p.code == 0 |
117 | output := p.stdout_slurp().trim_space() |
118 | errors := p.stderr_slurp().trim_space() |
119 | p.close() |
120 | $if trace_process_output ? { |
121 | eprintln('---------------------------') |
122 | eprintln('p output: "${output}"') |
123 | eprintln('p errors: "${errors}"') |
124 | eprintln('---------------------------') |
125 | } |
126 | // dump(output) |
127 | assert output.contains('stdout, 1') |
128 | assert output.contains('stdout, 2') |
129 | assert output.contains('stdout, 3') |
130 | assert output.contains('stdout, 4') |
131 | // |
132 | // dump(errors) |
133 | assert errors.contains('stderr, 1') |
134 | assert errors.contains('stderr, 2') |
135 | assert errors.contains('stderr, 3') |
136 | assert errors.contains('stderr, 4') |
137 | } |