v / vlib / os
Raw file | 137 loc (128 sloc) | 2.67 KB | Latest commit hash 017ace6ea
1// vtest flaky: true
2// vtest retry: 3
3import os
4import time
5
6const (
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
14fn 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
29fn testsuite_end() {
30 os.rmdir_all(tfolder) or {}
31}
32
33fn test_getpid() {
34 pid := os.getpid()
35 eprintln('current pid: ${pid}')
36 assert pid != 0
37}
38
39fn 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
68fn test_done() {
69 exit(0)
70}
71
72fn 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
99fn 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
109fn 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}