1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/renderer/chromeos_delayed_callback_group.h"
#include "base/task/sequenced_task_runner.h"
#include "base/task/task_traits.h"
#include "base/test/bind.h"
#include "base/test/task_environment.h"
#include "base/test/test_future.h"
#include "base/threading/platform_thread.h"
#include "base/time/time.h"
#include "testing/gtest/include/gtest/gtest.h"
TEST(DelayedCallbackGroup, RunEmpty) {
base::test::TaskEnvironment task_environment;
auto callback_group = base::MakeRefCounted<DelayedCallbackGroup>(
base::Seconds(1), base::SequencedTaskRunner::GetCurrentDefault());
callback_group->RunAll();
}
TEST(DelayedCallbackGroup, RunSimple) {
const base::TimeDelta kTimeout = base::Seconds(1);
base::test::TaskEnvironment task_environment;
auto callback_group = base::MakeRefCounted<DelayedCallbackGroup>(
kTimeout, base::SequencedTaskRunner::GetCurrentDefault());
base::Time time_before_add = base::Time::Now();
base::test::TestFuture<DelayedCallbackGroup::RunReason> future;
callback_group->Add(future.GetCallback());
callback_group->RunAll();
DelayedCallbackGroup::RunReason reason = future.Get();
base::TimeDelta delta = base::Time::Now() - time_before_add;
EXPECT_LT(delta, kTimeout);
EXPECT_EQ(DelayedCallbackGroup::RunReason::NORMAL, reason);
}
TEST(DelayedCallbackGroup, TimeoutSimple) {
const base::TimeDelta kTimeout = base::Seconds(1);
base::test::TaskEnvironment task_environment{
base::test::TaskEnvironment::TimeSource::MOCK_TIME};
auto callback_group = base::MakeRefCounted<DelayedCallbackGroup>(
kTimeout, base::SequencedTaskRunner::GetCurrentDefault());
base::test::TestFuture<DelayedCallbackGroup::RunReason> future;
callback_group->Add(future.GetCallback());
task_environment.FastForwardBy(kTimeout);
EXPECT_TRUE(future.IsReady());
DelayedCallbackGroup::RunReason reason = future.Get();
EXPECT_EQ(DelayedCallbackGroup::RunReason::TIMEOUT, reason);
}
// Failing on CrOS ASAN: crbug.com/1290874
TEST(DelayedCallbackGroup, DISABLED_TimeoutAndRun) {
const base::TimeDelta kTimeout = base::Seconds(1);
base::test::TaskEnvironment task_environment{
base::test::TaskEnvironment::TimeSource::MOCK_TIME};
auto callback_group = base::MakeRefCounted<DelayedCallbackGroup>(
kTimeout, base::SequencedTaskRunner::GetCurrentDefault());
base::test::TestFuture<DelayedCallbackGroup::RunReason> future1;
callback_group->Add(future1.GetCallback());
task_environment.FastForwardBy(kTimeout + base::Milliseconds(100));
EXPECT_TRUE(future1.IsReady());
base::test::TestFuture<DelayedCallbackGroup::RunReason> future2;
callback_group->Add(future2.GetCallback());
DelayedCallbackGroup::RunReason reason1 = future1.Get();
EXPECT_EQ(DelayedCallbackGroup::RunReason::TIMEOUT, reason1);
EXPECT_FALSE(future2.IsReady());
callback_group->RunAll();
DelayedCallbackGroup::RunReason reason2 = future2.Get();
EXPECT_EQ(DelayedCallbackGroup::RunReason::NORMAL, reason2);
}
TEST(DelayedCallbackGroup, DoubleExpiration) {
const base::TimeDelta kTimeout = base::Seconds(1);
const base::TimeDelta kTimeDiff = base::Milliseconds(100);
base::test::TaskEnvironment task_environment{
base::test::TaskEnvironment::TimeSource::MOCK_TIME};
auto callback_group = base::MakeRefCounted<DelayedCallbackGroup>(
kTimeout, base::SequencedTaskRunner::GetCurrentDefault());
base::test::TestFuture<DelayedCallbackGroup::RunReason> future1;
callback_group->Add(future1.GetCallback());
task_environment.FastForwardBy(kTimeDiff);
base::test::TestFuture<DelayedCallbackGroup::RunReason> future2;
callback_group->Add(future2.GetCallback());
task_environment.FastForwardBy(kTimeout - kTimeDiff);
EXPECT_TRUE(future1.IsReady());
EXPECT_FALSE(future2.IsReady());
DelayedCallbackGroup::RunReason reason1 = future1.Get();
EXPECT_EQ(DelayedCallbackGroup::RunReason::TIMEOUT, reason1);
task_environment.FastForwardBy(kTimeDiff);
EXPECT_TRUE(future2.IsReady());
DelayedCallbackGroup::RunReason reason2 = future2.Get();
EXPECT_EQ(DelayedCallbackGroup::RunReason::TIMEOUT, reason2);
}
|