1
- use assert_cmd:: cargo:: CommandCargoExt ;
2
- use retry:: delay:: Fixed ;
3
- use retry:: retry;
4
- use std:: process:: Command ;
1
+ #[ cfg( any( target_os = "linux" , feature = "proc" ) ) ]
2
+ fn create_command_for_sample ( name : & str ) -> std:: process:: Command {
3
+ let path = std:: path:: Path :: new ( env ! ( "CARGO_MANIFEST_DIR" ) )
4
+ . join ( "target" )
5
+ . join ( "release" )
6
+ . join ( name) ;
7
+ #[ cfg( target_os = "windows" ) ]
8
+ let path = path. with_extension ( "exe" ) ;
9
+
10
+ if !path. exists ( ) {
11
+ panic ! (
12
+ "{} does not exist, try running `cargo build --release --bins`" ,
13
+ path. display( )
14
+ ) ;
15
+ }
16
+
17
+ std:: process:: Command :: new ( path)
18
+ }
5
19
20
+ #[ cfg( any( target_os = "linux" , feature = "proc" ) ) ]
6
21
struct DropChild ( std:: process:: Child ) ;
7
22
23
+ #[ cfg( any( target_os = "linux" , feature = "proc" ) ) ]
8
24
impl DropChild {
9
- fn spawn ( mut cmd : Command ) -> Self {
25
+ fn spawn ( mut cmd : std :: process :: Command ) -> Self {
10
26
DropChild ( cmd. spawn ( ) . expect ( "Failed to spawn child process" ) )
11
27
}
12
28
}
13
29
30
+ #[ cfg( any( target_os = "linux" , feature = "proc" ) ) ]
14
31
impl Drop for DropChild {
15
32
fn drop ( & mut self ) {
16
33
self . 0 . kill ( ) . expect ( "Failed to kill child process" ) ;
17
34
}
18
35
}
19
36
37
+ #[ cfg( any( target_os = "linux" , feature = "proc" ) ) ]
20
38
impl std:: ops:: Deref for DropChild {
21
39
type Target = std:: process:: Child ;
22
40
@@ -25,6 +43,7 @@ impl std::ops::Deref for DropChild {
25
43
}
26
44
}
27
45
46
+ #[ cfg( any( target_os = "linux" , feature = "proc" ) ) ]
28
47
impl std:: ops:: DerefMut for DropChild {
29
48
fn deref_mut ( & mut self ) -> & mut Self :: Target {
30
49
& mut self . 0
@@ -34,16 +53,18 @@ impl std::ops::DerefMut for DropChild {
34
53
#[ cfg( target_os = "linux" ) ]
35
54
#[ test]
36
55
fn port_query ( ) {
37
- let mut binder = Command :: cargo_bin ( "port-binder" ) . unwrap ( ) ;
38
- let mut handle = binder. spawn ( ) . unwrap ( ) ;
56
+ use retry:: delay:: Fixed ;
57
+
58
+ let binder = create_command_for_sample ( "port-binder" ) ;
59
+ let mut handle = DropChild :: spawn ( binder) ;
39
60
40
61
let query = proc_ctl:: PortQuery :: new ( )
41
62
. tcp_only ( )
42
63
. ip_v4_only ( )
43
64
. process_id ( handle. id ( ) )
44
65
. expect_min_num_ports ( 1 ) ;
45
66
46
- let ports = retry ( Fixed :: from_millis ( 100 ) . take ( 10 ) , move || query. execute ( ) ) . unwrap ( ) ;
67
+ let ports = retry:: retry ( Fixed :: from_millis ( 100 ) . take ( 10 ) , move || query. execute ( ) ) . unwrap ( ) ;
47
68
48
69
handle. kill ( ) . unwrap ( ) ;
49
70
@@ -53,8 +74,10 @@ fn port_query() {
53
74
#[ cfg( target_os = "linux" ) ]
54
75
#[ test]
55
76
fn port_query_which_expects_too_many_ports ( ) {
56
- let mut binder = Command :: cargo_bin ( "port-binder" ) . unwrap ( ) ;
57
- let mut handle = binder. spawn ( ) . unwrap ( ) ;
77
+ use retry:: delay:: Fixed ;
78
+
79
+ let binder = create_command_for_sample ( "port-binder" ) ;
80
+ let mut handle = DropChild :: spawn ( binder) ;
58
81
59
82
let query = proc_ctl:: PortQuery :: new ( )
60
83
. tcp_only ( )
@@ -63,7 +86,7 @@ fn port_query_which_expects_too_many_ports() {
63
86
. expect_min_num_ports ( 2 ) ;
64
87
65
88
// Only retry once, getting no ports is still a valid test if the child program hasn't bound yet
66
- let result = retry ( Fixed :: from_millis ( 100 ) . take ( 1 ) , move || query. execute ( ) ) ;
89
+ let result = retry:: retry ( Fixed :: from_millis ( 100 ) . take ( 1 ) , move || query. execute ( ) ) ;
67
90
68
91
handle. kill ( ) . unwrap ( ) ;
69
92
@@ -75,8 +98,8 @@ fn port_query_which_expects_too_many_ports() {
75
98
fn port_query_with_sync_retry ( ) {
76
99
use std:: time:: Duration ;
77
100
78
- let mut binder = Command :: cargo_bin ( "port-binder" ) . unwrap ( ) ;
79
- let mut handle = binder . spawn ( ) . unwrap ( ) ;
101
+ let binder = create_command_for_sample ( "port-binder" ) ;
102
+ let mut handle = DropChild :: spawn ( binder ) ;
80
103
81
104
let query = proc_ctl:: PortQuery :: new ( )
82
105
. tcp_only ( )
@@ -98,8 +121,8 @@ fn port_query_with_sync_retry() {
98
121
async fn port_query_with_async_retry ( ) {
99
122
use std:: time:: Duration ;
100
123
101
- let mut binder = Command :: cargo_bin ( "port-binder" ) . unwrap ( ) ;
102
- let mut handle = binder . spawn ( ) . unwrap ( ) ;
124
+ let binder = create_command_for_sample ( "port-binder" ) ;
125
+ let mut handle = DropChild :: spawn ( binder ) ;
103
126
104
127
let query = proc_ctl:: PortQuery :: new ( )
105
128
. tcp_only ( )
@@ -121,18 +144,19 @@ async fn port_query_with_async_retry() {
121
144
#[ test]
122
145
fn proc_query_by_name ( ) {
123
146
use proc_ctl:: ProcQuery ;
147
+ use std:: process:: Stdio ;
124
148
125
- let _cmd = escargot:: CargoBuild :: new ( ) . bin ( "waiter" ) . run ( ) . unwrap ( ) . command ( ) . spawn ( ) . unwrap ( ) ;
149
+ let mut cmd = create_command_for_sample ( "waiter" )
150
+ . stdin ( Stdio :: piped ( ) )
151
+ . stdout ( Stdio :: inherit ( ) )
152
+ . spawn ( )
153
+ . unwrap ( ) ;
126
154
127
155
let query = ProcQuery :: new ( ) . process_name ( "waiter" ) ;
128
156
129
- let processes = retry ( Fixed :: from_millis ( 100 ) . take ( 10 ) , move || {
130
- match query. list_processes ( ) . ok ( ) {
131
- Some ( processes) if !processes. is_empty ( ) => Ok ( processes) ,
132
- _ => Err ( "No processes found" ) ,
133
- }
134
- } )
135
- . expect ( "Failed to find process in time" ) ;
157
+ let processes = query. list_processes ( ) . unwrap ( ) ;
158
+
159
+ cmd. kill ( ) . unwrap ( ) ;
136
160
137
161
assert_eq ! ( 1 , processes. len( ) ) ;
138
162
}
@@ -141,24 +165,25 @@ fn proc_query_by_name() {
141
165
#[ test]
142
166
fn proc_query_for_children ( ) {
143
167
use proc_ctl:: ProcQuery ;
168
+ use retry:: delay:: Fixed ;
144
169
145
- let binder = Command :: cargo_bin ( "port-binder" ) . unwrap ( ) ;
170
+ let binder = create_command_for_sample ( "port-binder" ) ;
146
171
let port_binder_path = binder. get_program ( ) ;
147
172
148
- let mut runner = Command :: cargo_bin ( "proc-runner" ) . unwrap ( ) ;
173
+ let mut runner = create_command_for_sample ( "proc-runner" ) ;
149
174
runner. args ( [ port_binder_path] ) ;
150
175
let mut handle = DropChild :: spawn ( runner) ;
151
176
152
177
let query = ProcQuery :: new ( )
153
178
. process_id_from_child ( & handle)
154
179
. expect_min_num_children ( 1 ) ;
155
180
156
- let process_names = retry ( Fixed :: from_millis ( 100 ) . take ( 10 ) , move || {
181
+ let process_names = retry:: retry ( Fixed :: from_millis ( 100 ) . take ( 10 ) , move || {
157
182
query
158
183
. children ( )
159
184
. map ( |v| v. into_iter ( ) . map ( |p| p. name ) . collect :: < Vec < String > > ( ) )
160
185
} )
161
- . unwrap ( ) ;
186
+ . unwrap ( ) ;
162
187
163
188
handle. kill ( ) . unwrap ( ) ;
164
189
@@ -176,10 +201,10 @@ fn proc_query_for_children_with_retry() {
176
201
use proc_ctl:: ProcQuery ;
177
202
use std:: time:: Duration ;
178
203
179
- let binder = Command :: cargo_bin ( "port-binder" ) . unwrap ( ) ;
204
+ let binder = create_command_for_sample ( "port-binder" ) ;
180
205
let port_binder_path = binder. get_program ( ) ;
181
206
182
- let mut runner = Command :: cargo_bin ( "proc-runner" ) . unwrap ( ) ;
207
+ let mut runner = create_command_for_sample ( "proc-runner" ) ;
183
208
runner. args ( [ port_binder_path] ) ;
184
209
let mut handle = DropChild :: spawn ( runner) ;
185
210
@@ -195,6 +220,10 @@ fn proc_query_for_children_with_retry() {
195
220
handle. kill ( ) . unwrap ( ) ;
196
221
197
222
assert_eq ! ( 1 , process_names. len( ) ) ;
223
+
224
+ #[ cfg( target_os = "windows" ) ]
225
+ assert_eq ! ( "port-binder.exe" , process_names. first( ) . unwrap( ) ) ;
226
+ #[ cfg( not( target_os = "windows" ) ) ]
198
227
assert_eq ! ( "port-binder" , process_names. first( ) . unwrap( ) ) ;
199
228
}
200
229
@@ -204,10 +233,10 @@ async fn proc_query_for_children_async_with_retry() {
204
233
use proc_ctl:: ProcQuery ;
205
234
use std:: time:: Duration ;
206
235
207
- let binder = Command :: cargo_bin ( "port-binder" ) . unwrap ( ) ;
236
+ let binder = create_command_for_sample ( "port-binder" ) ;
208
237
let port_binder_path = binder. get_program ( ) ;
209
238
210
- let mut runner = Command :: cargo_bin ( "proc-runner" ) . unwrap ( ) ;
239
+ let mut runner = create_command_for_sample ( "proc-runner" ) ;
211
240
runner. args ( [ port_binder_path] ) ;
212
241
let mut handle = DropChild :: spawn ( runner) ;
213
242
@@ -224,5 +253,9 @@ async fn proc_query_for_children_async_with_retry() {
224
253
handle. kill ( ) . unwrap ( ) ;
225
254
226
255
assert_eq ! ( 1 , process_names. len( ) ) ;
256
+
257
+ #[ cfg( target_os = "windows" ) ]
258
+ assert_eq ! ( "port-binder.exe" , process_names. first( ) . unwrap( ) ) ;
259
+ #[ cfg( not( target_os = "windows" ) ) ]
227
260
assert_eq ! ( "port-binder" , process_names. first( ) . unwrap( ) ) ;
228
261
}
0 commit comments