123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// found in the LICENSE file.
423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "components/domain_reliability/util.h"
623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/bind.h"
823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "components/domain_reliability/test_util.h"
923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
1023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace domain_reliability {
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace {
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)using base::TimeDelta;
1523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)using base::TimeTicks;
1623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class DomainReliabilityMockTimeTest : public testing::Test {
1823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) protected:
1923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  MockTime time_;
2023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)};
2123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
220de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)TEST_F(DomainReliabilityMockTimeTest, Create) {
2323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
2423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
2523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST_F(DomainReliabilityMockTimeTest, NowAndAdvance) {
2623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  const TimeDelta delta = TimeDelta::FromSeconds(1);
2723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
28a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  TimeTicks initial = time_.NowTicks();
2923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  time_.Advance(delta);
30a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  TimeTicks final = time_.NowTicks();
3123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_EQ(delta, final - initial);
3223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
3323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
3423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST_F(DomainReliabilityMockTimeTest, AddTask) {
3523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  const TimeDelta delta = TimeDelta::FromSeconds(1);
3623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  TestCallback callback;
3723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
3823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  time_.AddTask(2 * delta, callback.callback());
3923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  time_.Advance(delta);
4023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_FALSE(callback.called());
4123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  time_.Advance(delta);
4223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_TRUE(callback.called());
4323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
4423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
4523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST_F(DomainReliabilityMockTimeTest, TimerCreate) {
4623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<MockTime::Timer> timer(time_.CreateTimer());
4723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
4823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
4923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST_F(DomainReliabilityMockTimeTest, TimerIsRunning) {
5023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  const TimeDelta delta = TimeDelta::FromSeconds(1);
5123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  TestCallback callback;
5223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
5323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<MockTime::Timer> timer(time_.CreateTimer());
5423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_FALSE(timer->IsRunning());
5523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  timer->Start(FROM_HERE, delta, callback.callback());
5623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_TRUE(timer->IsRunning());
5723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  timer->Stop();
5823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_FALSE(timer->IsRunning());
5923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
6023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
6123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST_F(DomainReliabilityMockTimeTest, TimerGoesOff) {
6223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  const TimeDelta delta = TimeDelta::FromSeconds(1);
6323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  TestCallback callback;
6423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
6523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<MockTime::Timer> timer(time_.CreateTimer());
6623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
6723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  timer->Start(FROM_HERE, 2 * delta, callback.callback());
6823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  time_.Advance(delta);
6923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_FALSE(callback.called());
7023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  time_.Advance(delta);
7123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_TRUE(callback.called());
7223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
7323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
7423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST_F(DomainReliabilityMockTimeTest, TimerStopped) {
7523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  const TimeDelta delta = TimeDelta::FromSeconds(1);
7623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  TestCallback callback;
7723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
7823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<MockTime::Timer> timer(time_.CreateTimer());
7923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
8023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  timer->Start(FROM_HERE, 2 * delta, callback.callback());
8123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  time_.Advance(delta);
8223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  timer->Stop();
8323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  time_.Advance(delta);
8423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_FALSE(callback.called());
8523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
8623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
8723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST_F(DomainReliabilityMockTimeTest, TimerRestarted) {
8823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  const TimeDelta delta = TimeDelta::FromSeconds(1);
8923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  TestCallback callback;
9023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
9123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<MockTime::Timer> timer(time_.CreateTimer());
9223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
9323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  timer->Start(FROM_HERE, 2 * delta, callback.callback());
9423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  time_.Advance(delta);
9523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  timer->Start(FROM_HERE, 2 * delta, callback.callback());
9623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  time_.Advance(delta);
9723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_FALSE(callback.called());
9823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  time_.Advance(delta);
9923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_TRUE(callback.called());
10023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
10123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
10223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST_F(DomainReliabilityMockTimeTest, TimerReentrantStart) {
10323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  const TimeDelta delta = TimeDelta::FromSeconds(1);
10423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<MockTime::Timer> timer(time_.CreateTimer());
10523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  TestCallback callback;
10623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
10723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  timer->Start(
10823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      FROM_HERE,
10923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      delta,
11023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      base::Bind(
11123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)          &MockTime::Timer::Start,
11223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)          base::Unretained(timer.get()),
11323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)          FROM_HERE,
11423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)          delta,
11523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)          callback.callback()));
11623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  time_.Advance(delta);
11723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_FALSE(callback.called());
11823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_TRUE(timer->IsRunning());
11923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  time_.Advance(delta);
12023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_TRUE(callback.called());
12123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_FALSE(timer->IsRunning());
12223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
12323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace
12523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}  // namespace domain_reliability
126