@@ -7,8 +7,51 @@ use std::*;
7
7
8
8
use fail:: fail_point;
9
9
10
+ #[ test]
11
+ #[ cfg_attr( not( feature = "failpoints" ) , ignore) ]
12
+ fn test_pause ( ) {
13
+ let local_registry = fail:: new_fail_group ( ) ;
14
+ local_registry. register_current ( ) ;
15
+ let f = || {
16
+ fail_point ! ( "pause" ) ;
17
+ } ;
18
+ f ( ) ;
19
+
20
+ fail:: cfg ( "pause" , "pause" ) . unwrap ( ) ;
21
+ let ( tx, rx) = mpsc:: channel ( ) ;
22
+ // control `f()` is executed before next failpoint config
23
+ let ( tx_before, rx_before) = mpsc:: channel ( ) ;
24
+ let thread_registry = local_registry. clone ( ) ;
25
+ thread:: spawn ( move || {
26
+ thread_registry. register_current ( ) ;
27
+ // pause
28
+ tx_before. send ( ( ) ) . unwrap ( ) ;
29
+ tx. send ( f ( ) ) . unwrap ( ) ;
30
+ // woken up by new order pause, and then pause again.
31
+ tx_before. send ( ( ) ) . unwrap ( ) ;
32
+ tx. send ( f ( ) ) . unwrap ( ) ;
33
+ // woken up by remove, and then quit immediately.
34
+ tx. send ( f ( ) ) . unwrap ( ) ;
35
+ } ) ;
36
+
37
+ rx_before. recv ( ) . unwrap ( ) ;
38
+ assert ! ( rx. recv_timeout( Duration :: from_millis( 2000 ) ) . is_err( ) ) ;
39
+ fail:: cfg ( "pause" , "pause" ) . unwrap ( ) ;
40
+ rx. recv_timeout ( Duration :: from_millis ( 500 ) ) . unwrap ( ) ;
41
+
42
+ rx_before. recv ( ) . unwrap ( ) ;
43
+ assert ! ( rx. recv_timeout( Duration :: from_millis( 2000 ) ) . is_err( ) ) ;
44
+ fail:: remove ( "pause" ) ;
45
+
46
+ rx. recv_timeout ( Duration :: from_millis ( 500 ) ) . unwrap ( ) ;
47
+ rx. recv_timeout ( Duration :: from_millis ( 500 ) ) . unwrap ( ) ;
48
+ }
49
+
10
50
#[ test]
11
51
fn test_off ( ) {
52
+ let local_registry = fail:: new_fail_group ( ) ;
53
+ local_registry. register_current ( ) ;
54
+
12
55
let f = || {
13
56
fail_point ! ( "off" , |_| 2 ) ;
14
57
0
@@ -22,6 +65,9 @@ fn test_off() {
22
65
#[ test]
23
66
#[ cfg_attr( not( feature = "failpoints" ) , ignore) ]
24
67
fn test_return ( ) {
68
+ let local_registry = fail:: new_fail_group ( ) ;
69
+ local_registry. register_current ( ) ;
70
+
25
71
let f = || {
26
72
fail_point ! ( "return" , |s: Option <String >| s
27
73
. map_or( 2 , |s| s. parse( ) . unwrap( ) ) ) ;
@@ -39,6 +85,9 @@ fn test_return() {
39
85
#[ test]
40
86
#[ cfg_attr( not( feature = "failpoints" ) , ignore) ]
41
87
fn test_sleep ( ) {
88
+ let local_registry = fail:: new_fail_group ( ) ;
89
+ local_registry. register_current ( ) ;
90
+
42
91
let f = || {
43
92
fail_point ! ( "sleep" ) ;
44
93
} ;
@@ -56,6 +105,9 @@ fn test_sleep() {
56
105
#[ should_panic]
57
106
#[ cfg_attr( not( feature = "failpoints" ) , ignore) ]
58
107
fn test_panic ( ) {
108
+ let local_registry = fail:: new_fail_group ( ) ;
109
+ local_registry. register_current ( ) ;
110
+
59
111
let f = || {
60
112
fail_point ! ( "panic" ) ;
61
113
} ;
@@ -66,6 +118,9 @@ fn test_panic() {
66
118
#[ test]
67
119
#[ cfg_attr( not( feature = "failpoints" ) , ignore) ]
68
120
fn test_print ( ) {
121
+ let local_registry = fail:: new_fail_group ( ) ;
122
+ local_registry. register_current ( ) ;
123
+
69
124
struct LogCollector ( Arc < Mutex < Vec < String > > > ) ;
70
125
impl log:: Log for LogCollector {
71
126
fn enabled ( & self , _: & log:: Metadata ) -> bool {
@@ -97,38 +152,11 @@ fn test_print() {
97
152
assert_eq ! ( msg, "failpoint print executed." ) ;
98
153
}
99
154
100
- #[ test]
101
- #[ cfg_attr( not( feature = "failpoints" ) , ignore) ]
102
- fn test_pause ( ) {
103
- let f = || {
104
- fail_point ! ( "pause" ) ;
105
- } ;
106
- f ( ) ;
107
-
108
- fail:: cfg ( "pause" , "pause" ) . unwrap ( ) ;
109
- let ( tx, rx) = mpsc:: channel ( ) ;
110
- thread:: spawn ( move || {
111
- // pause
112
- tx. send ( f ( ) ) . unwrap ( ) ;
113
- // woken up by new order pause, and then pause again.
114
- tx. send ( f ( ) ) . unwrap ( ) ;
115
- // woken up by remove, and then quit immediately.
116
- tx. send ( f ( ) ) . unwrap ( ) ;
117
- } ) ;
118
-
119
- assert ! ( rx. recv_timeout( Duration :: from_millis( 500 ) ) . is_err( ) ) ;
120
- fail:: cfg ( "pause" , "pause" ) . unwrap ( ) ;
121
- rx. recv_timeout ( Duration :: from_millis ( 500 ) ) . unwrap ( ) ;
122
-
123
- assert ! ( rx. recv_timeout( Duration :: from_millis( 500 ) ) . is_err( ) ) ;
124
- fail:: remove ( "pause" ) ;
125
- rx. recv_timeout ( Duration :: from_millis ( 500 ) ) . unwrap ( ) ;
126
-
127
- rx. recv_timeout ( Duration :: from_millis ( 500 ) ) . unwrap ( ) ;
128
- }
129
-
130
155
#[ test]
131
156
fn test_yield ( ) {
157
+ let local_registry = fail:: new_fail_group ( ) ;
158
+ local_registry. register_current ( ) ;
159
+
132
160
let f = || {
133
161
fail_point ! ( "yield" ) ;
134
162
} ;
@@ -139,6 +167,9 @@ fn test_yield() {
139
167
#[ test]
140
168
#[ cfg_attr( not( feature = "failpoints" ) , ignore) ]
141
169
fn test_callback ( ) {
170
+ let local_registry = fail:: new_fail_group ( ) ;
171
+ local_registry. register_current ( ) ;
172
+
142
173
let f1 = || {
143
174
fail_point ! ( "cb" ) ;
144
175
} ;
@@ -160,6 +191,9 @@ fn test_callback() {
160
191
#[ test]
161
192
#[ cfg_attr( not( feature = "failpoints" ) , ignore) ]
162
193
fn test_delay ( ) {
194
+ let local_registry = fail:: new_fail_group ( ) ;
195
+ local_registry. register_current ( ) ;
196
+
163
197
let f = || fail_point ! ( "delay" ) ;
164
198
let timer = Instant :: now ( ) ;
165
199
fail:: cfg ( "delay" , "delay(1000)" ) . unwrap ( ) ;
@@ -170,6 +204,9 @@ fn test_delay() {
170
204
#[ test]
171
205
#[ cfg_attr( not( feature = "failpoints" ) , ignore) ]
172
206
fn test_freq_and_count ( ) {
207
+ let local_registry = fail:: new_fail_group ( ) ;
208
+ local_registry. register_current ( ) ;
209
+
173
210
let f = || {
174
211
fail_point ! ( "freq_and_count" , |s: Option <String >| s
175
212
. map_or( 2 , |s| s. parse( ) . unwrap( ) ) ) ;
@@ -191,6 +228,9 @@ fn test_freq_and_count() {
191
228
#[ test]
192
229
#[ cfg_attr( not( feature = "failpoints" ) , ignore) ]
193
230
fn test_condition ( ) {
231
+ let local_registry = fail:: new_fail_group ( ) ;
232
+ local_registry. register_current ( ) ;
233
+
194
234
let f = |_enabled| {
195
235
fail_point ! ( "condition" , _enabled, |_| 2 ) ;
196
236
0
@@ -205,9 +245,61 @@ fn test_condition() {
205
245
206
246
#[ test]
207
247
fn test_list ( ) {
248
+ let local_registry = fail:: new_fail_group ( ) ;
249
+ local_registry. register_current ( ) ;
250
+
208
251
assert ! ( !fail:: list( ) . contains( & ( "list" . to_string( ) , "off" . to_string( ) ) ) ) ;
209
252
fail:: cfg ( "list" , "off" ) . unwrap ( ) ;
210
253
assert ! ( fail:: list( ) . contains( & ( "list" . to_string( ) , "off" . to_string( ) ) ) ) ;
211
254
fail:: cfg ( "list" , "return" ) . unwrap ( ) ;
212
255
assert ! ( fail:: list( ) . contains( & ( "list" . to_string( ) , "return" . to_string( ) ) ) ) ;
213
256
}
257
+
258
+ #[ test]
259
+ fn test_multiple_threads_cleanup ( ) {
260
+ let local_registry = fail:: new_fail_group ( ) ;
261
+ local_registry. register_current ( ) ;
262
+
263
+ let ( tx, rx) = mpsc:: channel ( ) ;
264
+ thread:: spawn ( move || {
265
+ local_registry. register_current ( ) ;
266
+ fail:: cfg ( "thread_point" , "sleep(10)" ) . unwrap ( ) ;
267
+ tx. send ( ( ) ) . unwrap ( ) ;
268
+ } ) ;
269
+ rx. recv ( ) . unwrap ( ) ;
270
+ let l = fail:: list ( ) ;
271
+ assert ! (
272
+ l. iter( )
273
+ . find( |& x| x == & ( "thread_point" . to_owned( ) , "sleep(10)" . to_owned( ) ) )
274
+ . is_some( )
275
+ && l. len( ) == 1
276
+ ) ;
277
+
278
+ let ( tx, rx) = mpsc:: channel ( ) ;
279
+ let t = thread:: spawn ( move || {
280
+ let local_registry = fail:: new_fail_group ( ) ;
281
+ local_registry. register_current ( ) ;
282
+ fail:: cfg ( "thread_point" , "panic" ) . unwrap ( ) ;
283
+ let l = fail:: list ( ) ;
284
+ assert ! (
285
+ l. iter( )
286
+ . find( |& x| x == & ( "thread_point" . to_owned( ) , "panic" . to_owned( ) ) )
287
+ . is_some( )
288
+ && l. len( ) == 1
289
+ ) ;
290
+ rx. recv ( ) . unwrap ( ) ;
291
+ local_registry. cleanup ( ) ;
292
+ let l = fail:: list ( ) ;
293
+ assert ! ( l. is_empty( ) ) ;
294
+ } ) ;
295
+
296
+ tx. send ( ( ) ) . unwrap ( ) ;
297
+ let l = fail:: list ( ) ;
298
+ assert ! (
299
+ l. iter( )
300
+ . find( |& x| x == & ( "thread_point" . to_owned( ) , "sleep(10)" . to_owned( ) ) )
301
+ . is_some( )
302
+ && l. len( ) == 1
303
+ ) ;
304
+ t. join ( ) . unwrap ( ) ;
305
+ }
0 commit comments