@@ -182,40 +182,58 @@ mod test {
182
182
}
183
183
}
184
184
185
+ // Because valgrind serializes multithreaded programs it can
186
+ // make timing-sensitive tests fail in wierd ways. In these
187
+ // next test we run them many times and expect them to pass
188
+ // the majority of tries.
189
+
185
190
#[ test]
186
191
fn test_gl_timer_recv_timeout_before_time_passes ( ) {
187
- let expected = rand :: rng ( ) . gen_str ( 16 u ) ;
188
- let test_po = comm :: port :: < str > ( ) ;
189
- let test_ch = comm :: chan ( test_po ) ;
192
+ let times = 100 ;
193
+ let mut successes = 0 ;
194
+ let mut failures = 0 ;
190
195
191
- task:: spawn ( ) { ||
192
- delayed_send ( 1 u, test_ch, expected) ;
193
- } ;
196
+ iter:: repeat ( times as uint ) { ||
197
+ task:: yield ( ) ;
194
198
195
- let actual = alt recv_timeout ( 1000 u, test_po) {
196
- some ( val) { val }
197
- _ { fail "test_timer_recv_timeout_before_time_passes:" +
198
- " didn't receive result before timeout" ; }
199
- } ;
200
- assert actual == expected;
199
+ let expected = rand:: rng ( ) . gen_str ( 16 u) ;
200
+ let test_po = comm:: port :: < str > ( ) ;
201
+ let test_ch = comm:: chan ( test_po) ;
202
+
203
+ task:: spawn ( ) { ||
204
+ delayed_send ( 1 u, test_ch, expected) ;
205
+ } ;
206
+
207
+ alt recv_timeout ( 10 u, test_po) {
208
+ some ( val) { assert val == expected; successes += 1 ; }
209
+ _ { failures += 1 ; }
210
+ } ;
211
+ }
212
+
213
+ assert successes > times / 2 ;
201
214
}
202
215
203
216
#[ test]
204
217
fn test_gl_timer_recv_timeout_after_time_passes ( ) {
205
- let expected = rand:: rng ( ) . gen_str ( 16 u) ;
206
- let fail_msg = rand:: rng ( ) . gen_str ( 16 u) ;
207
- let test_po = comm:: port :: < str > ( ) ;
208
- let test_ch = comm:: chan ( test_po) ;
218
+ let times = 100 ;
219
+ let mut successes = 0 ;
220
+ let mut failures = 0 ;
209
221
210
- task:: spawn ( ) { ||
211
- delayed_send ( 1000 u, test_ch, expected) ;
212
- } ;
222
+ iter:: repeat ( times as uint ) { ||
223
+ let expected = rand:: rng ( ) . gen_str ( 16 u) ;
224
+ let test_po = comm:: port :: < str > ( ) ;
225
+ let test_ch = comm:: chan ( test_po) ;
213
226
214
- let actual = alt recv_timeout ( 1 u, test_po) {
215
- none { fail_msg }
216
- _ { fail "test_timer_recv_timeout_before_time_passes:" +
217
- " didn't receive result before timeout" ; }
218
- } ;
219
- assert actual == fail_msg;
227
+ task:: spawn ( ) { ||
228
+ delayed_send ( 1000 u, test_ch, expected) ;
229
+ } ;
230
+
231
+ let actual = alt recv_timeout ( 1 u, test_po) {
232
+ none { successes += 1 ; }
233
+ _ { failures += 1 ; }
234
+ } ;
235
+ }
236
+
237
+ assert successes > times / 2 ;
220
238
}
221
239
}
0 commit comments