| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  *  Copyright 2016 The WebRTC Project Authors. All rights reserved. | 2  *  Copyright 2016 The WebRTC Project Authors. All rights reserved. | 
| 3  * | 3  * | 
| 4  *  Use of this source code is governed by a BSD-style license | 4  *  Use of this source code is governed by a BSD-style license | 
| 5  *  that can be found in the LICENSE file in the root of the source | 5  *  that can be found in the LICENSE file in the root of the source | 
| 6  *  tree. An additional intellectual property rights grant can be found | 6  *  tree. An additional intellectual property rights grant can be found | 
| 7  *  in the file PATENTS.  All contributing project authors may | 7  *  in the file PATENTS.  All contributing project authors may | 
| 8  *  be found in the AUTHORS file in the root of the source tree. | 8  *  be found in the AUTHORS file in the root of the source tree. | 
| 9  */ | 9  */ | 
| 10 | 10 | 
| (...skipping 29 matching lines...) Expand all  Loading... | 
| 40       timeEndPeriod(1); | 40       timeEndPeriod(1); | 
| 41   } | 41   } | 
| 42 | 42 | 
| 43  private: | 43  private: | 
| 44   const bool enabled_; | 44   const bool enabled_; | 
| 45 #endif | 45 #endif | 
| 46 }; | 46 }; | 
| 47 } | 47 } | 
| 48 | 48 | 
| 49 namespace { | 49 namespace { | 
| 50 void CheckCurrent(const char* expected_queue, Event* signal, TaskQueue* queue) { | 50 void CheckCurrent(Event* signal, TaskQueue* queue) { | 
| 51   EXPECT_TRUE(TaskQueue::IsCurrent(expected_queue)); |  | 
| 52   EXPECT_TRUE(queue->IsCurrent()); | 51   EXPECT_TRUE(queue->IsCurrent()); | 
| 53   if (signal) | 52   if (signal) | 
| 54     signal->Set(); | 53     signal->Set(); | 
| 55 } | 54 } | 
| 56 | 55 | 
| 57 }  // namespace | 56 }  // namespace | 
| 58 | 57 | 
| 59 TEST(TaskQueueTest, Construct) { | 58 TEST(TaskQueueTest, Construct) { | 
| 60   static const char kQueueName[] = "Construct"; | 59   static const char kQueueName[] = "Construct"; | 
| 61   TaskQueue queue(kQueueName); | 60   TaskQueue queue(kQueueName); | 
| 62   EXPECT_FALSE(queue.IsCurrent()); | 61   EXPECT_FALSE(queue.IsCurrent()); | 
| 63 } | 62 } | 
| 64 | 63 | 
| 65 TEST(TaskQueueTest, PostAndCheckCurrent) { | 64 TEST(TaskQueueTest, PostAndCheckCurrent) { | 
| 66   static const char kQueueName[] = "PostAndCheckCurrent"; | 65   static const char kQueueName[] = "PostAndCheckCurrent"; | 
| 67   Event event(false, false); | 66   Event event(false, false); | 
| 68   TaskQueue queue(kQueueName); | 67   TaskQueue queue(kQueueName); | 
| 69 | 68 | 
| 70   // We're not running a task, so there shouldn't be a current queue. | 69   // We're not running a task, so there shouldn't be a current queue. | 
| 71   EXPECT_FALSE(queue.IsCurrent()); | 70   EXPECT_FALSE(queue.IsCurrent()); | 
| 72   EXPECT_FALSE(TaskQueue::Current()); | 71   EXPECT_FALSE(TaskQueue::Current()); | 
| 73 | 72 | 
| 74   queue.PostTask(Bind(&CheckCurrent, kQueueName, &event, &queue)); | 73   queue.PostTask(Bind(&CheckCurrent, &event, &queue)); | 
| 75   EXPECT_TRUE(event.Wait(1000)); | 74   EXPECT_TRUE(event.Wait(1000)); | 
| 76 } | 75 } | 
| 77 | 76 | 
| 78 TEST(TaskQueueTest, PostCustomTask) { | 77 TEST(TaskQueueTest, PostCustomTask) { | 
| 79   static const char kQueueName[] = "PostCustomImplementation"; | 78   static const char kQueueName[] = "PostCustomImplementation"; | 
| 80   Event event(false, false); | 79   Event event(false, false); | 
| 81   TaskQueue queue(kQueueName); | 80   TaskQueue queue(kQueueName); | 
| 82 | 81 | 
| 83   class CustomTask : public QueuedTask { | 82   class CustomTask : public QueuedTask { | 
| 84    public: | 83    public: | 
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 125       [&event, &queue]() { queue.PostTask([&event]() { event.Set(); }); }); | 124       [&event, &queue]() { queue.PostTask([&event]() { event.Set(); }); }); | 
| 126   EXPECT_TRUE(event.Wait(1000)); | 125   EXPECT_TRUE(event.Wait(1000)); | 
| 127 } | 126 } | 
| 128 | 127 | 
| 129 TEST(TaskQueueTest, PostDelayed) { | 128 TEST(TaskQueueTest, PostDelayed) { | 
| 130   static const char kQueueName[] = "PostDelayed"; | 129   static const char kQueueName[] = "PostDelayed"; | 
| 131   Event event(false, false); | 130   Event event(false, false); | 
| 132   TaskQueue queue(kQueueName, TaskQueue::Priority::HIGH); | 131   TaskQueue queue(kQueueName, TaskQueue::Priority::HIGH); | 
| 133 | 132 | 
| 134   uint32_t start = Time(); | 133   uint32_t start = Time(); | 
| 135   queue.PostDelayedTask(Bind(&CheckCurrent, kQueueName, &event, &queue), 100); | 134   queue.PostDelayedTask(Bind(&CheckCurrent, &event, &queue), 100); | 
| 136   EXPECT_TRUE(event.Wait(1000)); | 135   EXPECT_TRUE(event.Wait(1000)); | 
| 137   uint32_t end = Time(); | 136   uint32_t end = Time(); | 
| 138   // These tests are a little relaxed due to how "powerful" our test bots can | 137   // These tests are a little relaxed due to how "powerful" our test bots can | 
| 139   // be.  Most recently we've seen windows bots fire the callback after 94-99ms, | 138   // be.  Most recently we've seen windows bots fire the callback after 94-99ms, | 
| 140   // which is why we have a little bit of leeway backwards as well. | 139   // which is why we have a little bit of leeway backwards as well. | 
| 141   EXPECT_GE(end - start, 90u); | 140   EXPECT_GE(end - start, 90u); | 
| 142   EXPECT_NEAR(end - start, 190u, 100u);  // Accept 90-290. | 141   EXPECT_NEAR(end - start, 190u, 100u);  // Accept 90-290. | 
| 143 } | 142 } | 
| 144 | 143 | 
| 145 // This task needs to be run manually due to the slowness of some of our bots. | 144 // This task needs to be run manually due to the slowness of some of our bots. | 
| 146 // TODO(tommi): Can we run this on the perf bots? | 145 // TODO(tommi): Can we run this on the perf bots? | 
| 147 TEST(TaskQueueTest, DISABLED_PostDelayedHighRes) { | 146 TEST(TaskQueueTest, DISABLED_PostDelayedHighRes) { | 
| 148   EnableHighResTimers high_res_scope; | 147   EnableHighResTimers high_res_scope; | 
| 149 | 148 | 
| 150   static const char kQueueName[] = "PostDelayedHighRes"; | 149   static const char kQueueName[] = "PostDelayedHighRes"; | 
| 151   Event event(false, false); | 150   Event event(false, false); | 
| 152   TaskQueue queue(kQueueName, TaskQueue::Priority::HIGH); | 151   TaskQueue queue(kQueueName, TaskQueue::Priority::HIGH); | 
| 153 | 152 | 
| 154   uint32_t start = Time(); | 153   uint32_t start = Time(); | 
| 155   queue.PostDelayedTask(Bind(&CheckCurrent, kQueueName, &event, &queue), 3); | 154   queue.PostDelayedTask(Bind(&CheckCurrent, &event, &queue), 3); | 
| 156   EXPECT_TRUE(event.Wait(1000)); | 155   EXPECT_TRUE(event.Wait(1000)); | 
| 157   uint32_t end = TimeMillis(); | 156   uint32_t end = TimeMillis(); | 
| 158   // These tests are a little relaxed due to how "powerful" our test bots can | 157   // These tests are a little relaxed due to how "powerful" our test bots can | 
| 159   // be.  Most recently we've seen windows bots fire the callback after 94-99ms, | 158   // be.  Most recently we've seen windows bots fire the callback after 94-99ms, | 
| 160   // which is why we have a little bit of leeway backwards as well. | 159   // which is why we have a little bit of leeway backwards as well. | 
| 161   EXPECT_GE(end - start, 3u); | 160   EXPECT_GE(end - start, 3u); | 
| 162   EXPECT_NEAR(end - start, 3, 3u); | 161   EXPECT_NEAR(end - start, 3, 3u); | 
| 163 } | 162 } | 
| 164 | 163 | 
| 165 TEST(TaskQueueTest, PostMultipleDelayed) { | 164 TEST(TaskQueueTest, PostMultipleDelayed) { | 
| 166   static const char kQueueName[] = "PostMultipleDelayed"; | 165   static const char kQueueName[] = "PostMultipleDelayed"; | 
| 167   TaskQueue queue(kQueueName); | 166   TaskQueue queue(kQueueName); | 
| 168 | 167 | 
| 169   std::vector<std::unique_ptr<Event>> events; | 168   std::vector<std::unique_ptr<Event>> events; | 
| 170   for (int i = 0; i < 100; ++i) { | 169   for (int i = 0; i < 100; ++i) { | 
| 171     events.push_back(std::unique_ptr<Event>(new Event(false, false))); | 170     events.push_back(std::unique_ptr<Event>(new Event(false, false))); | 
| 172     queue.PostDelayedTask( | 171     queue.PostDelayedTask( | 
| 173         Bind(&CheckCurrent, kQueueName, events.back().get(), &queue), i); | 172         Bind(&CheckCurrent, events.back().get(), &queue), i); | 
| 174   } | 173   } | 
| 175 | 174 | 
| 176   for (const auto& e : events) | 175   for (const auto& e : events) | 
| 177     EXPECT_TRUE(e->Wait(1000)); | 176     EXPECT_TRUE(e->Wait(1000)); | 
| 178 } | 177 } | 
| 179 | 178 | 
| 180 TEST(TaskQueueTest, PostDelayedAfterDestruct) { | 179 TEST(TaskQueueTest, PostDelayedAfterDestruct) { | 
| 181   static const char kQueueName[] = "PostDelayedAfterDestruct"; | 180   static const char kQueueName[] = "PostDelayedAfterDestruct"; | 
| 182   Event event(false, false); | 181   Event event(false, false); | 
| 183   { | 182   { | 
| 184     TaskQueue queue(kQueueName); | 183     TaskQueue queue(kQueueName); | 
| 185     queue.PostDelayedTask(Bind(&CheckCurrent, kQueueName, &event, &queue), 100); | 184     queue.PostDelayedTask(Bind(&CheckCurrent, &event, &queue), 100); | 
| 186   } | 185   } | 
| 187   EXPECT_FALSE(event.Wait(200));  // Task should not run. | 186   EXPECT_FALSE(event.Wait(200));  // Task should not run. | 
| 188 } | 187 } | 
| 189 | 188 | 
| 190 TEST(TaskQueueTest, PostAndReply) { | 189 TEST(TaskQueueTest, PostAndReply) { | 
| 191   static const char kPostQueue[] = "PostQueue"; | 190   static const char kPostQueue[] = "PostQueue"; | 
| 192   static const char kReplyQueue[] = "ReplyQueue"; | 191   static const char kReplyQueue[] = "ReplyQueue"; | 
| 193   Event event(false, false); | 192   Event event(false, false); | 
| 194   TaskQueue post_queue(kPostQueue); | 193   TaskQueue post_queue(kPostQueue); | 
| 195   TaskQueue reply_queue(kReplyQueue); | 194   TaskQueue reply_queue(kReplyQueue); | 
| 196 | 195 | 
| 197   post_queue.PostTaskAndReply( | 196   post_queue.PostTaskAndReply( | 
| 198       Bind(&CheckCurrent, kPostQueue, nullptr, &post_queue), | 197       Bind(&CheckCurrent, nullptr, &post_queue), | 
| 199       Bind(&CheckCurrent, kReplyQueue, &event, &reply_queue), &reply_queue); | 198       Bind(&CheckCurrent, &event, &reply_queue), &reply_queue); | 
| 200   EXPECT_TRUE(event.Wait(1000)); | 199   EXPECT_TRUE(event.Wait(1000)); | 
| 201 } | 200 } | 
| 202 | 201 | 
| 203 TEST(TaskQueueTest, PostAndReuse) { | 202 TEST(TaskQueueTest, PostAndReuse) { | 
| 204   static const char kPostQueue[] = "PostQueue"; | 203   static const char kPostQueue[] = "PostQueue"; | 
| 205   static const char kReplyQueue[] = "ReplyQueue"; | 204   static const char kReplyQueue[] = "ReplyQueue"; | 
| 206   Event event(false, false); | 205   Event event(false, false); | 
| 207   TaskQueue post_queue(kPostQueue); | 206   TaskQueue post_queue(kPostQueue); | 
| 208   TaskQueue reply_queue(kReplyQueue); | 207   TaskQueue reply_queue(kReplyQueue); | 
| 209 | 208 | 
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 270   Event event(false, false); | 269   Event event(false, false); | 
| 271   TaskQueue post_queue("PostQueue"); | 270   TaskQueue post_queue("PostQueue"); | 
| 272   TaskQueue reply_queue("ReplyQueue"); | 271   TaskQueue reply_queue("ReplyQueue"); | 
| 273 | 272 | 
| 274   post_queue.PostTaskAndReply([&event]() { event.Set(); }, []() {}, | 273   post_queue.PostTaskAndReply([&event]() { event.Set(); }, []() {}, | 
| 275                               &reply_queue); | 274                               &reply_queue); | 
| 276   EXPECT_TRUE(event.Wait(1000)); | 275   EXPECT_TRUE(event.Wait(1000)); | 
| 277 } | 276 } | 
| 278 | 277 | 
| 279 void TestPostTaskAndReply(TaskQueue* work_queue, | 278 void TestPostTaskAndReply(TaskQueue* work_queue, | 
| 280                           const char* work_queue_name, |  | 
| 281                           Event* event) { | 279                           Event* event) { | 
| 282   ASSERT_FALSE(work_queue->IsCurrent()); | 280   ASSERT_FALSE(work_queue->IsCurrent()); | 
| 283   work_queue->PostTaskAndReply( | 281   work_queue->PostTaskAndReply( | 
| 284       Bind(&CheckCurrent, work_queue_name, nullptr, work_queue), | 282       Bind(&CheckCurrent, nullptr, work_queue), | 
| 285       NewClosure([event]() { event->Set(); })); | 283       NewClosure([event]() { event->Set(); })); | 
| 286 } | 284 } | 
| 287 | 285 | 
| 288 // Does a PostTaskAndReply from within a task to post and reply to the current | 286 // Does a PostTaskAndReply from within a task to post and reply to the current | 
| 289 // queue.  All in all there will be 3 tasks posted and run. | 287 // queue.  All in all there will be 3 tasks posted and run. | 
| 290 TEST(TaskQueueTest, PostAndReply2) { | 288 TEST(TaskQueueTest, PostAndReply2) { | 
| 291   static const char kQueueName[] = "PostAndReply2"; | 289   static const char kQueueName[] = "PostAndReply2"; | 
| 292   static const char kWorkQueueName[] = "PostAndReply2_Worker"; | 290   static const char kWorkQueueName[] = "PostAndReply2_Worker"; | 
| 293   Event event(false, false); | 291   Event event(false, false); | 
| 294   TaskQueue queue(kQueueName); | 292   TaskQueue queue(kQueueName); | 
| 295   TaskQueue work_queue(kWorkQueueName); | 293   TaskQueue work_queue(kWorkQueueName); | 
| 296 | 294 | 
| 297   queue.PostTask( | 295   queue.PostTask( | 
| 298       Bind(&TestPostTaskAndReply, &work_queue, kWorkQueueName, &event)); | 296       Bind(&TestPostTaskAndReply, &work_queue, &event)); | 
| 299   EXPECT_TRUE(event.Wait(1000)); | 297   EXPECT_TRUE(event.Wait(1000)); | 
| 300 } | 298 } | 
| 301 | 299 | 
| 302 // Tests posting more messages than a queue can queue up. | 300 // Tests posting more messages than a queue can queue up. | 
| 303 // In situations like that, tasks will get dropped. | 301 // In situations like that, tasks will get dropped. | 
| 304 TEST(TaskQueueTest, PostALot) { | 302 TEST(TaskQueueTest, PostALot) { | 
| 305   // To destruct the event after the queue has gone out of scope. | 303   // To destruct the event after the queue has gone out of scope. | 
| 306   Event event(false, false); | 304   Event event(false, false); | 
| 307 | 305 | 
| 308   int tasks_executed = 0; | 306   int tasks_executed = 0; | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
| 322       queue.PostTask(NewClosure([&tasks_executed]() { ++tasks_executed; }, | 320       queue.PostTask(NewClosure([&tasks_executed]() { ++tasks_executed; }, | 
| 323                                 [&tasks_cleaned_up]() { ++tasks_cleaned_up; })); | 321                                 [&tasks_cleaned_up]() { ++tasks_cleaned_up; })); | 
| 324     event.Set();  // Unblock the first task. | 322     event.Set();  // Unblock the first task. | 
| 325   } | 323   } | 
| 326 | 324 | 
| 327   EXPECT_GE(tasks_cleaned_up, tasks_executed); | 325   EXPECT_GE(tasks_cleaned_up, tasks_executed); | 
| 328   EXPECT_EQ(kTaskCount, tasks_cleaned_up); | 326   EXPECT_EQ(kTaskCount, tasks_cleaned_up); | 
| 329 } | 327 } | 
| 330 | 328 | 
| 331 }  // namespace rtc | 329 }  // namespace rtc | 
| OLD | NEW | 
|---|