[libcxx testing] Remove ALLOW_RETRIES from wait_for futures test
authorDavid Zarzycki <dave@znu.io>
Wed, 13 May 2020 10:43:16 +0000 (06:43 -0400)
committerDavid Zarzycki <dave@znu.io>
Wed, 13 May 2020 10:47:29 +0000 (06:47 -0400)
This test tried to verify that "wait()" returned quickly but "quick" is
impossible to define given a busy and/or slow system.

Instead, I've refactored the test to verify that `wait()` actually
waits which the old test did not verify.

libcxx/test/std/thread/futures/futures.shared_future/wait_for.pass.cpp

index 7e3cda0..d451ca0 100644 (file)
@@ -9,8 +9,6 @@
 // UNSUPPORTED: libcpp-has-no-threads
 // UNSUPPORTED: c++98, c++03
 
-// ALLOW_RETRIES: 2
-
 // <future>
 
 // class shared_future<R>
 
 typedef std::chrono::milliseconds ms;
 
+static const ms sleepTime(500);
+static const ms waitTime(5000);
+
 void func1(std::promise<int> p)
 {
-    std::this_thread::sleep_for(ms(500));
-    p.set_value(3);
+  std::this_thread::sleep_for(sleepTime);
+  p.set_value(3);
 }
 
 int j = 0;
 
 void func3(std::promise<int&> p)
 {
-    std::this_thread::sleep_for(ms(500));
-    j = 5;
-    p.set_value(j);
+  std::this_thread::sleep_for(sleepTime);
+  j = 5;
+  p.set_value(j);
 }
 
 void func5(std::promise<void> p)
 {
-    std::this_thread::sleep_for(ms(500));
-    p.set_value();
+  std::this_thread::sleep_for(sleepTime);
+  p.set_value();
 }
 
 int main(int, char**)
 {
-    typedef std::chrono::high_resolution_clock Clock;
-    {
-        typedef int T;
-        std::promise<T> p;
-        std::shared_future<T> f = p.get_future();
-        std::thread(func1, std::move(p)).detach();
-        assert(f.valid());
-        assert(f.wait_for(ms(300)) == std::future_status::timeout);
-        assert(f.valid());
-        assert(f.wait_for(ms(300)) == std::future_status::ready);
-        assert(f.valid());
-        Clock::time_point t0 = Clock::now();
-        f.wait();
-        Clock::time_point t1 = Clock::now();
-        assert(f.valid());
-        assert(t1-t0 < ms(5));
-    }
-    {
-        typedef int& T;
-        std::promise<T> p;
-        std::shared_future<T> f = p.get_future();
-        std::thread(func3, std::move(p)).detach();
-        assert(f.valid());
-        assert(f.wait_for(ms(300)) == std::future_status::timeout);
-        assert(f.valid());
-        assert(f.wait_for(ms(300)) == std::future_status::ready);
-        assert(f.valid());
-        Clock::time_point t0 = Clock::now();
-        f.wait();
-        Clock::time_point t1 = Clock::now();
-        assert(f.valid());
-        assert(t1-t0 < ms(5));
-    }
-    {
-        typedef void T;
-        std::promise<T> p;
-        std::shared_future<T> f = p.get_future();
-        std::thread(func5, std::move(p)).detach();
-        assert(f.valid());
-        assert(f.wait_for(ms(300)) == std::future_status::timeout);
-        assert(f.valid());
-        assert(f.wait_for(ms(300)) == std::future_status::ready);
-        assert(f.valid());
-        Clock::time_point t0 = Clock::now();
-        f.wait();
-        Clock::time_point t1 = Clock::now();
-        assert(f.valid());
-        assert(t1-t0 < ms(5));
-    }
+  typedef std::chrono::high_resolution_clock Clock;
+
+  {
+    typedef int T;
+    std::promise<T> p;
+    std::shared_future<T> f = p.get_future();
+    std::thread(func1, std::move(p)).detach();
+    assert(f.valid());
+    assert(f.wait_for(ms(1)) == std::future_status::timeout);
+    assert(f.valid());
+    assert(f.wait_for(waitTime) == std::future_status::ready);
+    assert(f.valid());
+    f.wait();
+    assert(f.valid());
+  }
+  {
+    typedef int& T;
+    std::promise<T> p;
+    std::shared_future<T> f = p.get_future();
+    std::thread(func3, std::move(p)).detach();
+    assert(f.valid());
+    assert(f.wait_for(ms(1)) == std::future_status::timeout);
+    assert(f.valid());
+    assert(f.wait_for(waitTime) == std::future_status::ready);
+    assert(f.valid());
+    f.wait();
+    assert(f.valid());
+  }
+  {
+    typedef void T;
+    std::promise<T> p;
+    std::shared_future<T> f = p.get_future();
+    std::thread(func5, std::move(p)).detach();
+    assert(f.valid());
+    assert(f.wait_for(ms(1)) == std::future_status::timeout);
+    assert(f.valid());
+    assert(f.wait_for(waitTime) == std::future_status::ready);
+    assert(f.valid());
+    f.wait();
+    assert(f.valid());
+  }
+
+  {
+    typedef int T;
+    std::promise<T> p;
+    std::shared_future<T> f = p.get_future();
+    Clock::time_point t0 = Clock::now();
+    std::thread(func1, std::move(p)).detach();
+    assert(f.valid());
+    assert(f.wait_for(ms(1)) == std::future_status::timeout);
+    assert(f.valid());
+    f.wait();
+    Clock::time_point t1 = Clock::now();
+    assert(f.valid());
+    assert(t1 - t0 >= sleepTime);
+    assert(f.wait_for(waitTime) == std::future_status::ready);
+    assert(f.valid());
+  }
+  {
+    typedef int& T;
+    std::promise<T> p;
+    std::shared_future<T> f = p.get_future();
+    Clock::time_point t0 = Clock::now();
+    std::thread(func3, std::move(p)).detach();
+    assert(f.valid());
+    assert(f.wait_for(ms(1)) == std::future_status::timeout);
+    assert(f.valid());
+    f.wait();
+    Clock::time_point t1 = Clock::now();
+    assert(f.valid());
+    assert(t1 - t0 >= sleepTime);
+    assert(f.wait_for(waitTime) == std::future_status::ready);
+    assert(f.valid());
+  }
+  {
+    typedef void T;
+    std::promise<T> p;
+    std::shared_future<T> f = p.get_future();
+    Clock::time_point t0 = Clock::now();
+    std::thread(func5, std::move(p)).detach();
+    assert(f.valid());
+    assert(f.wait_for(ms(1)) == std::future_status::timeout);
+    assert(f.valid());
+    f.wait();
+    Clock::time_point t1 = Clock::now();
+    assert(f.valid());
+    assert(t1 - t0 >= sleepTime);
+    assert(f.wait_for(waitTime) == std::future_status::ready);
+    assert(f.valid());
+  }
 
   return 0;
 }