1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file. 4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <deque> 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/bind.h" 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/bind_helpers.h" 9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/test/test_pending_task.h" 10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/test/test_simple_task_runner.h" 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "cc/base/delayed_unique_notifier.h" 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace cc { 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace { 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class TestNotifier : public DelayedUniqueNotifier { 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public: 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TestNotifier(base::SequencedTaskRunner* task_runner, 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::Closure& closure, 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::TimeDelta& delay) 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : DelayedUniqueNotifier(task_runner, closure, delay) {} 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual ~TestNotifier() {} 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Overridden from DelayedUniqueNotifier: 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual base::TimeTicks Now() const OVERRIDE { return now_; } 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void SetNow(base::TimeTicks now) { now_ = now; } 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private: 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeTicks now_; 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class DelayedUniqueNotifierTest : public testing::Test { 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public: 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DelayedUniqueNotifierTest() : notification_count_(0) {} 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void SetUp() OVERRIDE { 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) notification_count_ = 0; 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) task_runner_ = make_scoped_refptr(new base::TestSimpleTaskRunner); 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void Notify() { ++notification_count_; } 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int NotificationCount() const { return notification_count_; } 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::deque<base::TestPendingTask> TakePendingTasks() { 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::deque<base::TestPendingTask> tasks = task_runner_->GetPendingTasks(); 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) task_runner_->ClearPendingTasks(); 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return tasks; 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) protected: 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int notification_count_; 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<base::TestSimpleTaskRunner> task_runner_; 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(DelayedUniqueNotifierTest, ZeroDelay) { 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeDelta delay = base::TimeDelta::FromInternalValue(0); 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TestNotifier notifier( 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) task_runner_, 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(&DelayedUniqueNotifierTest::Notify, base::Unretained(this)), 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) delay); 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0, NotificationCount()); 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Basic schedule for |delay| from now. 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeTicks schedule_time = 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeTicks() + base::TimeDelta::FromInternalValue(10); 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) notifier.SetNow(schedule_time); 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) notifier.Schedule(); 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::deque<base::TestPendingTask> tasks = TakePendingTasks(); 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_EQ(1u, tasks.size()); 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(base::TimeTicks() + delay, tasks[0].GetTimeToRun()); 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) tasks[0].task.Run(); 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1, NotificationCount()); 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // 5 schedules should result in only one run. 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (int i = 0; i < 5; ++i) 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) notifier.Schedule(); 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) tasks = TakePendingTasks(); 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_EQ(1u, tasks.size()); 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(base::TimeTicks() + delay, tasks[0].GetTimeToRun()); 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) tasks[0].task.Run(); 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(2, NotificationCount()); 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(DelayedUniqueNotifierTest, SmallDelay) { 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeDelta delay = base::TimeDelta::FromInternalValue(20); 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TestNotifier notifier( 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) task_runner_, 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(&DelayedUniqueNotifierTest::Notify, base::Unretained(this)), 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) delay); 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0, NotificationCount()); 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Basic schedule for |delay| from now (now: 30, run time: 50). 103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeTicks schedule_time = 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeTicks() + base::TimeDelta::FromInternalValue(30); 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) notifier.SetNow(schedule_time); 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) notifier.Schedule(); 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::deque<base::TestPendingTask> tasks = TakePendingTasks(); 110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_EQ(1u, tasks.size()); 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(base::TimeTicks() + delay, tasks[0].GetTimeToRun()); 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // It's not yet time to run, so we expect no notifications. 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) tasks[0].task.Run(); 116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0, NotificationCount()); 117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) tasks = TakePendingTasks(); 119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_EQ(1u, tasks.size()); 121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Now the time should be delay minus whatever the value of now happens to be 122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // (now: 30, run time: 50). 123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeTicks scheduled_run_time = notifier.Now() + delay; 124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeTicks scheduled_delay = 125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeTicks() + (scheduled_run_time - notifier.Now()); 126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(scheduled_delay, tasks[0].GetTimeToRun()); 127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Move closer to the run time (time: 49, run time: 50). 129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) notifier.SetNow(notifier.Now() + base::TimeDelta::FromInternalValue(19)); 130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // It's not yet time to run, so we expect no notifications. 132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) tasks[0].task.Run(); 133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0, NotificationCount()); 134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) tasks = TakePendingTasks(); 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_EQ(1u, tasks.size()); 137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Now the time should be delay minus whatever the value of now happens to be. 139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scheduled_delay = base::TimeTicks() + (scheduled_run_time - notifier.Now()); 140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(scheduled_delay, tasks[0].GetTimeToRun()); 141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Move to exactly the run time (time: 50, run time: 50). 143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) notifier.SetNow(notifier.Now() + base::TimeDelta::FromInternalValue(1)); 144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // It's time to run! 146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) tasks[0].task.Run(); 147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1, NotificationCount()); 148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) tasks = TakePendingTasks(); 150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0u, tasks.size()); 151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(DelayedUniqueNotifierTest, RescheduleDelay) { 154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeDelta delay = base::TimeDelta::FromInternalValue(20); 155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TestNotifier notifier( 156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) task_runner_, 157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(&DelayedUniqueNotifierTest::Notify, base::Unretained(this)), 158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) delay); 159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeTicks schedule_time; 161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Move time 19 units forward and reschedule, expecting that we still need to 162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // run in |delay| time and we don't get a notification. 163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (int i = 0; i < 10; ++i) { 164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0, NotificationCount()); 165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Move time forward 19 units. 167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) schedule_time = notifier.Now() + base::TimeDelta::FromInternalValue(19); 168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) notifier.SetNow(schedule_time); 169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) notifier.Schedule(); 170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::deque<base::TestPendingTask> tasks = TakePendingTasks(); 172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_EQ(1u, tasks.size()); 174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(base::TimeTicks() + delay, tasks[0].GetTimeToRun()); 175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // It's not yet time to run, so we expect no notifications. 177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) tasks[0].task.Run(); 178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0, NotificationCount()); 179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Move time forward 20 units, expecting a notification. 182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) schedule_time = notifier.Now() + base::TimeDelta::FromInternalValue(20); 183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) notifier.SetNow(schedule_time); 184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::deque<base::TestPendingTask> tasks = TakePendingTasks(); 186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_EQ(1u, tasks.size()); 188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(base::TimeTicks() + delay, tasks[0].GetTimeToRun()); 189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Time to run! 191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) tasks[0].task.Run(); 192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1, NotificationCount()); 193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(DelayedUniqueNotifierTest, CancelAndHasPendingNotification) { 196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeDelta delay = base::TimeDelta::FromInternalValue(20); 197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TestNotifier notifier( 198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) task_runner_, 199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(&DelayedUniqueNotifierTest::Notify, base::Unretained(this)), 200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) delay); 201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0, NotificationCount()); 203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Schedule for |delay| seconds from now. 205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeTicks schedule_time = 206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) notifier.Now() + base::TimeDelta::FromInternalValue(10); 207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) notifier.SetNow(schedule_time); 208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) notifier.Schedule(); 209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(notifier.HasPendingNotification()); 210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Cancel the run. 212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) notifier.Cancel(); 213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(notifier.HasPendingNotification()); 214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::deque<base::TestPendingTask> tasks = TakePendingTasks(); 216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_EQ(1u, tasks.size()); 218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(base::TimeTicks() + delay, tasks[0].GetTimeToRun()); 219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Time to run, but a canceled task! 221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) tasks[0].task.Run(); 222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0, NotificationCount()); 223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(notifier.HasPendingNotification()); 224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) tasks = TakePendingTasks(); 226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0u, tasks.size()); 227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) notifier.Schedule(); 229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(notifier.HasPendingNotification()); 230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) tasks = TakePendingTasks(); 231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_EQ(1u, tasks.size()); 233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(base::TimeTicks() + delay, tasks[0].GetTimeToRun()); 234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Advance the time. 236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) notifier.SetNow(notifier.Now() + delay); 237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // This should run since it wasn't canceled. 239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) tasks[0].task.Run(); 240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1, NotificationCount()); 241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(notifier.HasPendingNotification()); 242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (int i = 0; i < 10; ++i) { 244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) notifier.Schedule(); 245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(notifier.HasPendingNotification()); 246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) notifier.Cancel(); 247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(notifier.HasPendingNotification()); 248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) tasks = TakePendingTasks(); 251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_EQ(1u, tasks.size()); 253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(base::TimeTicks() + delay, tasks[0].GetTimeToRun()); 254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Time to run, but a canceled task! 256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) notifier.SetNow(notifier.Now() + delay); 257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) tasks[0].task.Run(); 258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1, NotificationCount()); 259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) tasks = TakePendingTasks(); 261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0u, tasks.size()); 262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(notifier.HasPendingNotification()); 263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace 266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace cc 267