Skip to content

Commit 6d8cffa

Browse files
committed
std: Make timer tests more reliable under valgrind
1 parent 248e439 commit 6d8cffa

File tree

1 file changed

+43
-25
lines changed

1 file changed

+43
-25
lines changed

src/libstd/timer.rs

Lines changed: 43 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -182,40 +182,58 @@ mod test {
182182
}
183183
}
184184

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+
185190
#[test]
186191
fn test_gl_timer_recv_timeout_before_time_passes() {
187-
let expected = rand::rng().gen_str(16u);
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;
190195

191-
task::spawn() {||
192-
delayed_send(1u, test_ch, expected);
193-
};
196+
iter::repeat(times as uint) {||
197+
task::yield();
194198

195-
let actual = alt recv_timeout(1000u, 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(16u);
200+
let test_po = comm::port::<str>();
201+
let test_ch = comm::chan(test_po);
202+
203+
task::spawn() {||
204+
delayed_send(1u, test_ch, expected);
205+
};
206+
207+
alt recv_timeout(10u, test_po) {
208+
some(val) { assert val == expected; successes += 1; }
209+
_ { failures += 1; }
210+
};
211+
}
212+
213+
assert successes > times / 2;
201214
}
202215

203216
#[test]
204217
fn test_gl_timer_recv_timeout_after_time_passes() {
205-
let expected = rand::rng().gen_str(16u);
206-
let fail_msg = rand::rng().gen_str(16u);
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;
209221

210-
task::spawn() {||
211-
delayed_send(1000u, test_ch, expected);
212-
};
222+
iter::repeat(times as uint) {||
223+
let expected = rand::rng().gen_str(16u);
224+
let test_po = comm::port::<str>();
225+
let test_ch = comm::chan(test_po);
213226

214-
let actual = alt recv_timeout(1u, 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(1000u, test_ch, expected);
229+
};
230+
231+
let actual = alt recv_timeout(1u, test_po) {
232+
none { successes += 1; }
233+
_ { failures += 1; }
234+
};
235+
}
236+
237+
assert successes > times / 2;
220238
}
221239
}

0 commit comments

Comments
 (0)