Index: webrtc/base/task_queue_unittest.cc |
diff --git a/webrtc/base/task_queue_unittest.cc b/webrtc/base/task_queue_unittest.cc |
index 432a0d5579b91945c43d70cb9c89794717203f13..856249da32072cce2940efdf10265a95e864c602 100644 |
--- a/webrtc/base/task_queue_unittest.cc |
+++ b/webrtc/base/task_queue_unittest.cc |
@@ -8,6 +8,13 @@ |
* be found in the AUTHORS file in the root of the source tree. |
*/ |
+#if defined(WEBRTC_WIN) |
+// clang-format off |
+#include <windows.h> // Must come first. |
+#include <mmsystem.h> |
+// clang-format on |
+#endif |
+ |
#include <memory> |
#include <vector> |
@@ -18,6 +25,26 @@ |
#include "webrtc/base/timeutils.h" |
namespace rtc { |
+namespace { |
+// Noop on all platforms except Windows, where it turns on high precision |
+// multimedia timers which increases the precision of TimeMillis() while in |
+// scope. |
+class EnableHighResTimers { |
+ public: |
+#if !defined(WEBRTC_WIN) |
+ EnableHighResTimers() {} |
+#else |
+ EnableHighResTimers() : enabled_(timeBeginPeriod(1) == TIMERR_NOERROR) {} |
+ ~EnableHighResTimers() { |
+ if (enabled_) |
+ timeEndPeriod(1); |
+ } |
+ |
+ private: |
+ const bool enabled_; |
+#endif |
+}; |
+} |
namespace { |
void CheckCurrent(const char* expected_queue, Event* signal, TaskQueue* queue) { |
@@ -115,6 +142,26 @@ TEST(TaskQueueTest, PostDelayed) { |
EXPECT_NEAR(end - start, 190u, 100u); // Accept 90-290. |
} |
+// This task needs to be run manually due to the slowness of some of our bots. |
+// TODO(tommi): Can we run this on the perf bots? |
+TEST(TaskQueueTest, DISABLED_PostDelayedHighRes) { |
+ EnableHighResTimers high_res_scope; |
+ |
+ static const char kQueueName[] = "PostDelayedHighRes"; |
+ Event event(false, false); |
+ TaskQueue queue(kQueueName, TaskQueue::Priority::HIGH); |
+ |
+ uint32_t start = Time(); |
+ queue.PostDelayedTask(Bind(&CheckCurrent, kQueueName, &event, &queue), 3); |
+ EXPECT_TRUE(event.Wait(1000)); |
+ uint32_t end = TimeMillis(); |
+ // These tests are a little relaxed due to how "powerful" our test bots can |
+ // be. Most recently we've seen windows bots fire the callback after 94-99ms, |
+ // which is why we have a little bit of leeway backwards as well. |
+ EXPECT_GE(end - start, 3u); |
+ EXPECT_NEAR(end - start, 3, 3u); |
+} |
+ |
TEST(TaskQueueTest, PostMultipleDelayed) { |
static const char kQueueName[] = "PostMultipleDelayed"; |
TaskQueue queue(kQueueName); |
@@ -123,7 +170,7 @@ TEST(TaskQueueTest, PostMultipleDelayed) { |
for (int i = 0; i < 100; ++i) { |
events.push_back(std::unique_ptr<Event>(new Event(false, false))); |
queue.PostDelayedTask( |
- Bind(&CheckCurrent, kQueueName, events.back().get(), &queue), 10); |
+ Bind(&CheckCurrent, kQueueName, events.back().get(), &queue), i); |
} |
for (const auto& e : events) |