about summary refs log tree commit diff
path: root/src/libstd/timer.rs
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-05-21 17:29:00 -0700
committerBrian Anderson <banderson@mozilla.com>2012-05-21 17:29:00 -0700
commit6d8cffa9918d4a28ca852c47cb48875e29bbe6bc (patch)
tree0bdc2a1df08773163026a55585c80de5ad52d657 /src/libstd/timer.rs
parent248e439638dbabf822bf9017eb99b44f0e1a0370 (diff)
downloadrust-6d8cffa9918d4a28ca852c47cb48875e29bbe6bc.tar.gz
rust-6d8cffa9918d4a28ca852c47cb48875e29bbe6bc.zip
std: Make timer tests more reliable under valgrind
Diffstat (limited to 'src/libstd/timer.rs')
-rw-r--r--src/libstd/timer.rs68
1 files changed, 43 insertions, 25 deletions
diff --git a/src/libstd/timer.rs b/src/libstd/timer.rs
index 688bb35c46c..524accf6f1a 100644
--- a/src/libstd/timer.rs
+++ b/src/libstd/timer.rs
@@ -182,40 +182,58 @@ mod test {
         }
     }
 
+    // Because valgrind serializes multithreaded programs it can
+    // make timing-sensitive tests fail in wierd ways. In these
+    // next test we run them many times and expect them to pass
+    // the majority of tries.
+
     #[test]
     fn test_gl_timer_recv_timeout_before_time_passes() {
-        let expected = rand::rng().gen_str(16u);
-        let test_po = comm::port::<str>();
-        let test_ch = comm::chan(test_po);
+        let times = 100;
+        let mut successes = 0;
+        let mut failures = 0;
 
-        task::spawn() {||
-            delayed_send(1u, test_ch, expected);
-        };
+        iter::repeat(times as uint) {||
+            task::yield();
 
-        let actual = alt recv_timeout(1000u, test_po) {
-          some(val) { val }
-          _ { fail "test_timer_recv_timeout_before_time_passes:"+
-                    " didn't receive result before timeout"; }
-        };
-        assert actual == expected;
+            let expected = rand::rng().gen_str(16u);
+            let test_po = comm::port::<str>();
+            let test_ch = comm::chan(test_po);
+
+            task::spawn() {||
+                delayed_send(1u, test_ch, expected);
+            };
+
+            alt recv_timeout(10u, test_po) {
+              some(val) { assert val == expected; successes += 1; }
+              _ { failures += 1; }
+            };
+        }
+
+        assert successes > times / 2;
     }
 
     #[test]
     fn test_gl_timer_recv_timeout_after_time_passes() {
-        let expected = rand::rng().gen_str(16u);
-        let fail_msg = rand::rng().gen_str(16u);
-        let test_po = comm::port::<str>();
-        let test_ch = comm::chan(test_po);
+        let times = 100;
+        let mut successes = 0;
+        let mut failures = 0;
 
-        task::spawn() {||
-            delayed_send(1000u, test_ch, expected);
-        };
+        iter::repeat(times as uint) {||
+            let expected = rand::rng().gen_str(16u);
+            let test_po = comm::port::<str>();
+            let test_ch = comm::chan(test_po);
 
-        let actual = alt recv_timeout(1u, test_po) {
-          none { fail_msg }
-          _ { fail "test_timer_recv_timeout_before_time_passes:"+
-                    " didn't receive result before timeout"; }
-        };
-        assert actual == fail_msg;
+            task::spawn() {||
+                delayed_send(1000u, test_ch, expected);
+            };
+
+            let actual = alt recv_timeout(1u, test_po) {
+              none { successes += 1; }
+              _ { failures += 1; }
+            };
+        }
+
+        assert successes > times / 2;
     }
 }