Home | History | Annotate | Download | only in sequence_manager
      1 // Copyright 2015 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/task/sequence_manager/work_queue.h"
      6 
      7 #include <stddef.h>
      8 #include <memory>
      9 
     10 #include "base/bind.h"
     11 #include "base/task/sequence_manager/real_time_domain.h"
     12 #include "base/task/sequence_manager/task_queue_impl.h"
     13 #include "base/task/sequence_manager/work_queue_sets.h"
     14 #include "testing/gmock/include/gmock/gmock.h"
     15 
     16 namespace base {
     17 namespace sequence_manager {
     18 namespace internal {
     19 
     20 namespace {
     21 
     22 void NopTask() {}
     23 
     24 struct Cancelable {
     25   Cancelable() : weak_ptr_factory(this) {}
     26 
     27   void NopTask() {}
     28 
     29   WeakPtrFactory<Cancelable> weak_ptr_factory;
     30 };
     31 
     32 }  // namespace
     33 
     34 class WorkQueueTest : public testing::Test {
     35  public:
     36   void SetUp() override {
     37     time_domain_.reset(new RealTimeDomain());
     38     task_queue_ = std::make_unique<TaskQueueImpl>(nullptr, time_domain_.get(),
     39                                                   TaskQueue::Spec("test"));
     40 
     41     work_queue_.reset(new WorkQueue(task_queue_.get(), "test",
     42                                     WorkQueue::QueueType::kImmediate));
     43     work_queue_sets_.reset(new WorkQueueSets(1, "test"));
     44     work_queue_sets_->AddQueue(work_queue_.get(), 0);
     45   }
     46 
     47   void TearDown() override { work_queue_sets_->RemoveQueue(work_queue_.get()); }
     48 
     49  protected:
     50   TaskQueueImpl::Task FakeCancelableTaskWithEnqueueOrder(
     51       int enqueue_order,
     52       WeakPtr<Cancelable> weak_ptr) {
     53     TaskQueueImpl::Task fake_task(
     54         TaskQueue::PostedTask(BindOnce(&Cancelable::NopTask, weak_ptr),
     55                               FROM_HERE),
     56         TimeTicks(), EnqueueOrder(),
     57         EnqueueOrder::FromIntForTesting(enqueue_order));
     58     return fake_task;
     59   }
     60 
     61   TaskQueueImpl::Task FakeTaskWithEnqueueOrder(int enqueue_order) {
     62     TaskQueueImpl::Task fake_task(
     63         TaskQueue::PostedTask(BindOnce(&NopTask), FROM_HERE), TimeTicks(),
     64         EnqueueOrder(), EnqueueOrder::FromIntForTesting(enqueue_order));
     65     return fake_task;
     66   }
     67 
     68   TaskQueueImpl::Task FakeNonNestableTaskWithEnqueueOrder(int enqueue_order) {
     69     TaskQueueImpl::Task fake_task(
     70         TaskQueue::PostedTask(BindOnce(&NopTask), FROM_HERE), TimeTicks(),
     71         EnqueueOrder(), EnqueueOrder::FromIntForTesting(enqueue_order));
     72     fake_task.nestable = Nestable::kNonNestable;
     73     return fake_task;
     74   }
     75 
     76   std::unique_ptr<RealTimeDomain> time_domain_;
     77   std::unique_ptr<TaskQueueImpl> task_queue_;
     78   std::unique_ptr<WorkQueue> work_queue_;
     79   std::unique_ptr<WorkQueueSets> work_queue_sets_;
     80   std::unique_ptr<TaskQueueImpl::TaskDeque> incoming_queue_;
     81 };
     82 
     83 TEST_F(WorkQueueTest, Empty) {
     84   EXPECT_TRUE(work_queue_->Empty());
     85   work_queue_->Push(FakeTaskWithEnqueueOrder(1));
     86   EXPECT_FALSE(work_queue_->Empty());
     87 }
     88 
     89 TEST_F(WorkQueueTest, Empty_IgnoresFences) {
     90   work_queue_->Push(FakeTaskWithEnqueueOrder(1));
     91   work_queue_->InsertFence(EnqueueOrder::blocking_fence());
     92   EXPECT_FALSE(work_queue_->Empty());
     93 }
     94 
     95 TEST_F(WorkQueueTest, GetFrontTaskEnqueueOrderQueueEmpty) {
     96   EnqueueOrder enqueue_order;
     97   EXPECT_FALSE(work_queue_->GetFrontTaskEnqueueOrder(&enqueue_order));
     98 }
     99 
    100 TEST_F(WorkQueueTest, GetFrontTaskEnqueueOrder) {
    101   work_queue_->Push(FakeTaskWithEnqueueOrder(2));
    102   work_queue_->Push(FakeTaskWithEnqueueOrder(3));
    103   work_queue_->Push(FakeTaskWithEnqueueOrder(4));
    104 
    105   EnqueueOrder enqueue_order;
    106   EXPECT_TRUE(work_queue_->GetFrontTaskEnqueueOrder(&enqueue_order));
    107   EXPECT_EQ(2ull, enqueue_order);
    108 }
    109 
    110 TEST_F(WorkQueueTest, GetFrontTaskQueueEmpty) {
    111   EXPECT_EQ(nullptr, work_queue_->GetFrontTask());
    112 }
    113 
    114 TEST_F(WorkQueueTest, GetFrontTask) {
    115   work_queue_->Push(FakeTaskWithEnqueueOrder(2));
    116   work_queue_->Push(FakeTaskWithEnqueueOrder(3));
    117   work_queue_->Push(FakeTaskWithEnqueueOrder(4));
    118 
    119   ASSERT_NE(nullptr, work_queue_->GetFrontTask());
    120   EXPECT_EQ(2ull, work_queue_->GetFrontTask()->enqueue_order());
    121 }
    122 
    123 TEST_F(WorkQueueTest, GetBackTask_Empty) {
    124   EXPECT_EQ(nullptr, work_queue_->GetBackTask());
    125 }
    126 
    127 TEST_F(WorkQueueTest, GetBackTask) {
    128   work_queue_->Push(FakeTaskWithEnqueueOrder(2));
    129   work_queue_->Push(FakeTaskWithEnqueueOrder(3));
    130   work_queue_->Push(FakeTaskWithEnqueueOrder(4));
    131 
    132   ASSERT_NE(nullptr, work_queue_->GetBackTask());
    133   EXPECT_EQ(4ull, work_queue_->GetBackTask()->enqueue_order());
    134 }
    135 
    136 TEST_F(WorkQueueTest, Push) {
    137   WorkQueue* work_queue;
    138   EXPECT_FALSE(work_queue_sets_->GetOldestQueueInSet(0, &work_queue));
    139 
    140   work_queue_->Push(FakeTaskWithEnqueueOrder(2));
    141   EXPECT_TRUE(work_queue_sets_->GetOldestQueueInSet(0, &work_queue));
    142   EXPECT_EQ(work_queue_.get(), work_queue);
    143 }
    144 
    145 TEST_F(WorkQueueTest, PushAfterFenceHit) {
    146   work_queue_->InsertFence(EnqueueOrder::blocking_fence());
    147   WorkQueue* work_queue;
    148   EXPECT_FALSE(work_queue_sets_->GetOldestQueueInSet(0, &work_queue));
    149 
    150   work_queue_->Push(FakeTaskWithEnqueueOrder(2));
    151   EXPECT_FALSE(work_queue_sets_->GetOldestQueueInSet(0, &work_queue));
    152 }
    153 
    154 TEST_F(WorkQueueTest, PushNonNestableTaskToFront) {
    155   WorkQueue* work_queue;
    156   EXPECT_FALSE(work_queue_sets_->GetOldestQueueInSet(0, &work_queue));
    157 
    158   work_queue_->PushNonNestableTaskToFront(
    159       FakeNonNestableTaskWithEnqueueOrder(3));
    160   EXPECT_TRUE(work_queue_sets_->GetOldestQueueInSet(0, &work_queue));
    161   EXPECT_EQ(work_queue_.get(), work_queue);
    162 
    163   work_queue_->PushNonNestableTaskToFront(
    164       FakeNonNestableTaskWithEnqueueOrder(2));
    165 
    166   EXPECT_EQ(2ull, work_queue_->GetFrontTask()->enqueue_order());
    167   EXPECT_EQ(3ull, work_queue_->GetBackTask()->enqueue_order());
    168 }
    169 
    170 TEST_F(WorkQueueTest, PushNonNestableTaskToFrontAfterFenceHit) {
    171   work_queue_->InsertFence(EnqueueOrder::blocking_fence());
    172   WorkQueue* work_queue;
    173   EXPECT_FALSE(work_queue_sets_->GetOldestQueueInSet(0, &work_queue));
    174 
    175   work_queue_->PushNonNestableTaskToFront(
    176       FakeNonNestableTaskWithEnqueueOrder(2));
    177   EXPECT_FALSE(work_queue_sets_->GetOldestQueueInSet(0, &work_queue));
    178 }
    179 
    180 TEST_F(WorkQueueTest, PushNonNestableTaskToFrontBeforeFenceHit) {
    181   work_queue_->InsertFence(EnqueueOrder::FromIntForTesting(3));
    182   WorkQueue* work_queue;
    183   EXPECT_FALSE(work_queue_sets_->GetOldestQueueInSet(0, &work_queue));
    184 
    185   work_queue_->PushNonNestableTaskToFront(
    186       FakeNonNestableTaskWithEnqueueOrder(2));
    187   EXPECT_TRUE(work_queue_sets_->GetOldestQueueInSet(0, &work_queue));
    188 }
    189 
    190 TEST_F(WorkQueueTest, ReloadEmptyImmediateQueue) {
    191   task_queue_->PushImmediateIncomingTaskForTest(FakeTaskWithEnqueueOrder(2));
    192   task_queue_->PushImmediateIncomingTaskForTest(FakeTaskWithEnqueueOrder(3));
    193   task_queue_->PushImmediateIncomingTaskForTest(FakeTaskWithEnqueueOrder(4));
    194 
    195   WorkQueue* work_queue;
    196   EXPECT_FALSE(work_queue_sets_->GetOldestQueueInSet(0, &work_queue));
    197   EXPECT_TRUE(work_queue_->Empty());
    198   work_queue_->ReloadEmptyImmediateQueue();
    199 
    200   EXPECT_TRUE(work_queue_sets_->GetOldestQueueInSet(0, &work_queue));
    201   EXPECT_FALSE(work_queue_->Empty());
    202 
    203   ASSERT_NE(nullptr, work_queue_->GetFrontTask());
    204   EXPECT_EQ(2ull, work_queue_->GetFrontTask()->enqueue_order());
    205 
    206   ASSERT_NE(nullptr, work_queue_->GetBackTask());
    207   EXPECT_EQ(4ull, work_queue_->GetBackTask()->enqueue_order());
    208 }
    209 
    210 TEST_F(WorkQueueTest, ReloadEmptyImmediateQueueAfterFenceHit) {
    211   work_queue_->InsertFence(EnqueueOrder::blocking_fence());
    212   task_queue_->PushImmediateIncomingTaskForTest(FakeTaskWithEnqueueOrder(2));
    213   task_queue_->PushImmediateIncomingTaskForTest(FakeTaskWithEnqueueOrder(3));
    214   task_queue_->PushImmediateIncomingTaskForTest(FakeTaskWithEnqueueOrder(4));
    215 
    216   WorkQueue* work_queue;
    217   EXPECT_FALSE(work_queue_sets_->GetOldestQueueInSet(0, &work_queue));
    218   EXPECT_TRUE(work_queue_->Empty());
    219   work_queue_->ReloadEmptyImmediateQueue();
    220 
    221   EXPECT_FALSE(work_queue_sets_->GetOldestQueueInSet(0, &work_queue));
    222   EXPECT_FALSE(work_queue_->Empty());
    223 
    224   ASSERT_NE(nullptr, work_queue_->GetFrontTask());
    225   EXPECT_EQ(2ull, work_queue_->GetFrontTask()->enqueue_order());
    226 
    227   ASSERT_NE(nullptr, work_queue_->GetBackTask());
    228   EXPECT_EQ(4ull, work_queue_->GetBackTask()->enqueue_order());
    229 }
    230 
    231 TEST_F(WorkQueueTest, TakeTaskFromWorkQueue) {
    232   work_queue_->Push(FakeTaskWithEnqueueOrder(2));
    233   work_queue_->Push(FakeTaskWithEnqueueOrder(3));
    234   work_queue_->Push(FakeTaskWithEnqueueOrder(4));
    235 
    236   WorkQueue* work_queue;
    237   EXPECT_TRUE(work_queue_sets_->GetOldestQueueInSet(0, &work_queue));
    238   EXPECT_FALSE(work_queue_->Empty());
    239 
    240   EXPECT_EQ(2ull, work_queue_->TakeTaskFromWorkQueue().enqueue_order());
    241   EXPECT_EQ(3ull, work_queue_->TakeTaskFromWorkQueue().enqueue_order());
    242   EXPECT_EQ(4ull, work_queue_->TakeTaskFromWorkQueue().enqueue_order());
    243 
    244   EXPECT_FALSE(work_queue_sets_->GetOldestQueueInSet(0, &work_queue));
    245   EXPECT_TRUE(work_queue_->Empty());
    246 }
    247 
    248 TEST_F(WorkQueueTest, TakeTaskFromWorkQueue_HitFence) {
    249   work_queue_->InsertFence(EnqueueOrder::FromIntForTesting(3));
    250   work_queue_->Push(FakeTaskWithEnqueueOrder(2));
    251   work_queue_->Push(FakeTaskWithEnqueueOrder(4));
    252   EXPECT_FALSE(work_queue_->BlockedByFence());
    253 
    254   WorkQueue* work_queue;
    255   EXPECT_TRUE(work_queue_sets_->GetOldestQueueInSet(0, &work_queue));
    256   EXPECT_FALSE(work_queue_->Empty());
    257   EXPECT_FALSE(work_queue_->BlockedByFence());
    258 
    259   EXPECT_EQ(2ull, work_queue_->TakeTaskFromWorkQueue().enqueue_order());
    260   EXPECT_FALSE(work_queue_sets_->GetOldestQueueInSet(0, &work_queue));
    261   EXPECT_FALSE(work_queue_->Empty());
    262   EXPECT_TRUE(work_queue_->BlockedByFence());
    263 }
    264 
    265 TEST_F(WorkQueueTest, InsertFenceBeforeEnqueueing) {
    266   EXPECT_FALSE(work_queue_->InsertFence(EnqueueOrder::blocking_fence()));
    267   EXPECT_TRUE(work_queue_->BlockedByFence());
    268 
    269   work_queue_->Push(FakeTaskWithEnqueueOrder(2));
    270   work_queue_->Push(FakeTaskWithEnqueueOrder(3));
    271   work_queue_->Push(FakeTaskWithEnqueueOrder(4));
    272 
    273   EnqueueOrder enqueue_order;
    274   EXPECT_FALSE(work_queue_->GetFrontTaskEnqueueOrder(&enqueue_order));
    275 }
    276 
    277 TEST_F(WorkQueueTest, InsertFenceAfterEnqueueingNonBlocking) {
    278   work_queue_->Push(FakeTaskWithEnqueueOrder(2));
    279   work_queue_->Push(FakeTaskWithEnqueueOrder(3));
    280   work_queue_->Push(FakeTaskWithEnqueueOrder(4));
    281 
    282   EXPECT_FALSE(work_queue_->InsertFence(EnqueueOrder::FromIntForTesting(5)));
    283   EXPECT_FALSE(work_queue_->BlockedByFence());
    284 
    285   EnqueueOrder enqueue_order;
    286   EXPECT_TRUE(work_queue_->GetFrontTaskEnqueueOrder(&enqueue_order));
    287   EXPECT_EQ(2ull, work_queue_->TakeTaskFromWorkQueue().enqueue_order());
    288 }
    289 
    290 TEST_F(WorkQueueTest, InsertFenceAfterEnqueueing) {
    291   work_queue_->Push(FakeTaskWithEnqueueOrder(2));
    292   work_queue_->Push(FakeTaskWithEnqueueOrder(3));
    293   work_queue_->Push(FakeTaskWithEnqueueOrder(4));
    294 
    295   // NB in reality a fence will always be greater than any currently enqueued
    296   // tasks.
    297   EXPECT_FALSE(work_queue_->InsertFence(EnqueueOrder::blocking_fence()));
    298   EXPECT_TRUE(work_queue_->BlockedByFence());
    299 
    300   EnqueueOrder enqueue_order;
    301   EXPECT_FALSE(work_queue_->GetFrontTaskEnqueueOrder(&enqueue_order));
    302 }
    303 
    304 TEST_F(WorkQueueTest, InsertNewFence) {
    305   work_queue_->Push(FakeTaskWithEnqueueOrder(2));
    306   work_queue_->Push(FakeTaskWithEnqueueOrder(4));
    307   work_queue_->Push(FakeTaskWithEnqueueOrder(5));
    308 
    309   EXPECT_FALSE(work_queue_->InsertFence(EnqueueOrder::FromIntForTesting(3)));
    310   EXPECT_FALSE(work_queue_->BlockedByFence());
    311 
    312   // Note until TakeTaskFromWorkQueue() is called we don't hit the fence.
    313   EnqueueOrder enqueue_order;
    314   EXPECT_TRUE(work_queue_->GetFrontTaskEnqueueOrder(&enqueue_order));
    315   EXPECT_EQ(2ull, enqueue_order);
    316 
    317   EXPECT_EQ(2ull, work_queue_->TakeTaskFromWorkQueue().enqueue_order());
    318   EXPECT_FALSE(work_queue_->GetFrontTaskEnqueueOrder(&enqueue_order));
    319   EXPECT_TRUE(work_queue_->BlockedByFence());
    320 
    321   // Inserting the new fence should temporarily unblock the queue until the new
    322   // one is hit.
    323   EXPECT_TRUE(work_queue_->InsertFence(EnqueueOrder::FromIntForTesting(6)));
    324   EXPECT_FALSE(work_queue_->BlockedByFence());
    325 
    326   EXPECT_TRUE(work_queue_->GetFrontTaskEnqueueOrder(&enqueue_order));
    327   EXPECT_EQ(4ull, enqueue_order);
    328   EXPECT_EQ(4ull, work_queue_->TakeTaskFromWorkQueue().enqueue_order());
    329   EXPECT_TRUE(work_queue_->GetFrontTaskEnqueueOrder(&enqueue_order));
    330   EXPECT_FALSE(work_queue_->BlockedByFence());
    331 }
    332 
    333 TEST_F(WorkQueueTest, PushWithNonEmptyQueueDoesNotHitFence) {
    334   work_queue_->Push(FakeTaskWithEnqueueOrder(1));
    335   EXPECT_FALSE(work_queue_->InsertFence(EnqueueOrder::FromIntForTesting(2)));
    336   work_queue_->Push(FakeTaskWithEnqueueOrder(3));
    337   EXPECT_FALSE(work_queue_->BlockedByFence());
    338 }
    339 
    340 TEST_F(WorkQueueTest, RemoveFence) {
    341   work_queue_->Push(FakeTaskWithEnqueueOrder(2));
    342   work_queue_->Push(FakeTaskWithEnqueueOrder(4));
    343   work_queue_->Push(FakeTaskWithEnqueueOrder(5));
    344   work_queue_->InsertFence(EnqueueOrder::FromIntForTesting(3));
    345 
    346   WorkQueue* work_queue;
    347   EXPECT_TRUE(work_queue_sets_->GetOldestQueueInSet(0, &work_queue));
    348   EXPECT_FALSE(work_queue_->Empty());
    349 
    350   EXPECT_EQ(2ull, work_queue_->TakeTaskFromWorkQueue().enqueue_order());
    351   EXPECT_FALSE(work_queue_sets_->GetOldestQueueInSet(0, &work_queue));
    352   EXPECT_FALSE(work_queue_->Empty());
    353   EXPECT_TRUE(work_queue_->BlockedByFence());
    354 
    355   EXPECT_TRUE(work_queue_->RemoveFence());
    356   EXPECT_EQ(4ull, work_queue_->TakeTaskFromWorkQueue().enqueue_order());
    357   EXPECT_TRUE(work_queue_sets_->GetOldestQueueInSet(0, &work_queue));
    358   EXPECT_FALSE(work_queue_->BlockedByFence());
    359 }
    360 
    361 TEST_F(WorkQueueTest, RemoveFenceButNoFence) {
    362   EXPECT_FALSE(work_queue_->RemoveFence());
    363 }
    364 
    365 TEST_F(WorkQueueTest, RemoveFenceNothingUnblocked) {
    366   EXPECT_FALSE(work_queue_->InsertFence(EnqueueOrder::blocking_fence()));
    367   EXPECT_TRUE(work_queue_->BlockedByFence());
    368 
    369   EXPECT_FALSE(work_queue_->RemoveFence());
    370   EXPECT_FALSE(work_queue_->BlockedByFence());
    371 }
    372 
    373 TEST_F(WorkQueueTest, BlockedByFence) {
    374   EXPECT_FALSE(work_queue_->BlockedByFence());
    375   EXPECT_FALSE(work_queue_->InsertFence(EnqueueOrder::blocking_fence()));
    376   EXPECT_TRUE(work_queue_->BlockedByFence());
    377 }
    378 
    379 TEST_F(WorkQueueTest, BlockedByFencePopBecomesEmpty) {
    380   work_queue_->Push(FakeTaskWithEnqueueOrder(1));
    381   EXPECT_FALSE(work_queue_->InsertFence(EnqueueOrder::FromIntForTesting(2)));
    382   EXPECT_FALSE(work_queue_->BlockedByFence());
    383 
    384   EXPECT_EQ(1ull, work_queue_->TakeTaskFromWorkQueue().enqueue_order());
    385   EXPECT_TRUE(work_queue_->BlockedByFence());
    386 }
    387 
    388 TEST_F(WorkQueueTest, BlockedByFencePop) {
    389   work_queue_->Push(FakeTaskWithEnqueueOrder(1));
    390   EXPECT_FALSE(work_queue_->InsertFence(EnqueueOrder::FromIntForTesting(2)));
    391   EXPECT_FALSE(work_queue_->BlockedByFence());
    392 
    393   work_queue_->Push(FakeTaskWithEnqueueOrder(3));
    394   EXPECT_FALSE(work_queue_->BlockedByFence());
    395 
    396   EXPECT_EQ(1ull, work_queue_->TakeTaskFromWorkQueue().enqueue_order());
    397   EXPECT_TRUE(work_queue_->BlockedByFence());
    398 }
    399 
    400 TEST_F(WorkQueueTest, InitiallyEmptyBlockedByFenceNewFenceUnblocks) {
    401   EXPECT_FALSE(work_queue_->InsertFence(EnqueueOrder::blocking_fence()));
    402   EXPECT_TRUE(work_queue_->BlockedByFence());
    403 
    404   work_queue_->Push(FakeTaskWithEnqueueOrder(2));
    405   EXPECT_TRUE(work_queue_->InsertFence(EnqueueOrder::FromIntForTesting(3)));
    406   EXPECT_FALSE(work_queue_->BlockedByFence());
    407 }
    408 
    409 TEST_F(WorkQueueTest, BlockedByFenceNewFenceUnblocks) {
    410   work_queue_->Push(FakeTaskWithEnqueueOrder(1));
    411   EXPECT_FALSE(work_queue_->InsertFence(EnqueueOrder::FromIntForTesting(2)));
    412   EXPECT_FALSE(work_queue_->BlockedByFence());
    413 
    414   work_queue_->Push(FakeTaskWithEnqueueOrder(3));
    415   EXPECT_FALSE(work_queue_->BlockedByFence());
    416 
    417   EXPECT_EQ(1ull, work_queue_->TakeTaskFromWorkQueue().enqueue_order());
    418   EXPECT_TRUE(work_queue_->BlockedByFence());
    419 
    420   EXPECT_TRUE(work_queue_->InsertFence(EnqueueOrder::FromIntForTesting(4)));
    421   EXPECT_FALSE(work_queue_->BlockedByFence());
    422 }
    423 
    424 TEST_F(WorkQueueTest, InsertFenceAfterEnqueuing) {
    425   work_queue_->Push(FakeTaskWithEnqueueOrder(2));
    426   work_queue_->Push(FakeTaskWithEnqueueOrder(3));
    427   work_queue_->Push(FakeTaskWithEnqueueOrder(4));
    428   EXPECT_FALSE(work_queue_->BlockedByFence());
    429 
    430   EXPECT_FALSE(work_queue_->InsertFence(EnqueueOrder::blocking_fence()));
    431   EXPECT_TRUE(work_queue_->BlockedByFence());
    432 
    433   EnqueueOrder enqueue_order;
    434   EXPECT_FALSE(work_queue_->GetFrontTaskEnqueueOrder(&enqueue_order));
    435 }
    436 
    437 TEST_F(WorkQueueTest, RemoveAllCanceledTasksFromFront) {
    438   {
    439     Cancelable cancelable;
    440     work_queue_->Push(FakeCancelableTaskWithEnqueueOrder(
    441         2, cancelable.weak_ptr_factory.GetWeakPtr()));
    442     work_queue_->Push(FakeCancelableTaskWithEnqueueOrder(
    443         3, cancelable.weak_ptr_factory.GetWeakPtr()));
    444     work_queue_->Push(FakeCancelableTaskWithEnqueueOrder(
    445         4, cancelable.weak_ptr_factory.GetWeakPtr()));
    446     work_queue_->Push(FakeTaskWithEnqueueOrder(5));
    447   }
    448   EXPECT_TRUE(work_queue_->RemoveAllCanceledTasksFromFront());
    449 
    450   EnqueueOrder enqueue_order;
    451   EXPECT_TRUE(work_queue_->GetFrontTaskEnqueueOrder(&enqueue_order));
    452   EXPECT_EQ(5ull, enqueue_order);
    453 }
    454 
    455 TEST_F(WorkQueueTest, RemoveAllCanceledTasksFromFrontTasksNotCanceled) {
    456   {
    457     Cancelable cancelable;
    458     work_queue_->Push(FakeCancelableTaskWithEnqueueOrder(
    459         2, cancelable.weak_ptr_factory.GetWeakPtr()));
    460     work_queue_->Push(FakeCancelableTaskWithEnqueueOrder(
    461         3, cancelable.weak_ptr_factory.GetWeakPtr()));
    462     work_queue_->Push(FakeCancelableTaskWithEnqueueOrder(
    463         4, cancelable.weak_ptr_factory.GetWeakPtr()));
    464     work_queue_->Push(FakeTaskWithEnqueueOrder(5));
    465     EXPECT_FALSE(work_queue_->RemoveAllCanceledTasksFromFront());
    466 
    467     EnqueueOrder enqueue_order;
    468     EXPECT_TRUE(work_queue_->GetFrontTaskEnqueueOrder(&enqueue_order));
    469     EXPECT_EQ(2ull, enqueue_order);
    470   }
    471 }
    472 
    473 }  // namespace internal
    474 }  // namespace sequence_manager
    475 }  // namespace base
    476