blob: a1f0588fc789a80fd857a68478361feb645a8533 [file] [log] [blame]
Ana Krulecfb772822018-11-30 10:44:07 +01001/*
2 * Copyright 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Ana Krulecfb772822018-11-30 10:44:07 +010016#undef LOG_TAG
17#define LOG_TAG "SchedulerUnittests"
18
19#include <gmock/gmock.h>
20#include <gtest/gtest.h>
21#include <utils/Log.h>
Ady Abraham018ff0b2021-04-19 23:39:36 -070022#include <utils/Timers.h>
Ana Krulecfb772822018-11-30 10:44:07 +010023
24#include "AsyncCallRecorder.h"
Ana Krulecf2c006d2019-06-21 15:37:07 -070025#include "Scheduler/OneShotTimer.h"
Ana Krulecfb772822018-11-30 10:44:07 +010026
27using namespace std::chrono_literals;
28
29namespace android {
30namespace scheduler {
31
Ady Abraham018ff0b2021-04-19 23:39:36 -070032class FakeClock : public OneShotTimer::Clock {
33public:
34 virtual ~FakeClock() = default;
35 std::chrono::steady_clock::time_point now() const override { return mNow; }
36
37 void advanceTime(std::chrono::nanoseconds delta) { mNow += delta; }
38
39private:
40 std::chrono::steady_clock::time_point mNow;
41};
42
Ana Krulecf2c006d2019-06-21 15:37:07 -070043class OneShotTimerTest : public testing::Test {
Ana Krulecfb772822018-11-30 10:44:07 +010044protected:
Ana Krulecf2c006d2019-06-21 15:37:07 -070045 OneShotTimerTest() = default;
46 ~OneShotTimerTest() override = default;
Ana Krulecfb772822018-11-30 10:44:07 +010047
Ady Abrahama1a49af2019-02-07 14:36:55 -080048 AsyncCallRecorder<void (*)()> mResetTimerCallback;
Ana Krulecfb772822018-11-30 10:44:07 +010049 AsyncCallRecorder<void (*)()> mExpiredTimerCallback;
50
Ana Krulecf2c006d2019-06-21 15:37:07 -070051 std::unique_ptr<OneShotTimer> mIdleTimer;
Lloyd Pique1f9f1a42019-01-31 13:04:00 -080052
53 void clearPendingCallbacks() {
54 while (mExpiredTimerCallback.waitForCall(0us).has_value()) {
55 }
56 }
Ana Krulecfb772822018-11-30 10:44:07 +010057};
58
59namespace {
Ana Krulecf2c006d2019-06-21 15:37:07 -070060TEST_F(OneShotTimerTest, createAndDestroyTest) {
Ady Abraham018ff0b2021-04-19 23:39:36 -070061 FakeClock* clock = new FakeClock();
Ana Krulecf2c006d2019-06-21 15:37:07 -070062 mIdleTimer = std::make_unique<scheduler::OneShotTimer>(
Ady Abraham018ff0b2021-04-19 23:39:36 -070063 "TestTimer", 3ms, [] {}, [] {}, std::unique_ptr<FakeClock>(clock));
Ana Krulecfb772822018-11-30 10:44:07 +010064}
65
Ana Krulecf2c006d2019-06-21 15:37:07 -070066TEST_F(OneShotTimerTest, startStopTest) {
Ady Abraham018ff0b2021-04-19 23:39:36 -070067 FakeClock* clock = new FakeClock();
68 mIdleTimer = std::make_unique<scheduler::OneShotTimer>("TestTimer", 1ms,
Ady Abrahamdb3dfee2020-11-17 17:07:12 -080069 mResetTimerCallback.getInvocable(),
Ady Abraham018ff0b2021-04-19 23:39:36 -070070 mExpiredTimerCallback.getInvocable(),
71 std::unique_ptr<FakeClock>(clock));
Ana Krulecfb772822018-11-30 10:44:07 +010072 mIdleTimer->start();
Ady Abrahama1a49af2019-02-07 14:36:55 -080073 EXPECT_TRUE(mResetTimerCallback.waitForCall().has_value());
Ady Abraham018ff0b2021-04-19 23:39:36 -070074 EXPECT_FALSE(mExpiredTimerCallback.waitForUnexpectedCall().has_value());
Ady Abrahama1a49af2019-02-07 14:36:55 -080075
Ady Abraham018ff0b2021-04-19 23:39:36 -070076 clock->advanceTime(2ms);
77 EXPECT_TRUE(mExpiredTimerCallback.waitForCall().has_value());
78
79 clock->advanceTime(2ms);
80 EXPECT_FALSE(mExpiredTimerCallback.waitForUnexpectedCall().has_value());
81 EXPECT_FALSE(mResetTimerCallback.waitForUnexpectedCall().has_value());
Ana Krulecfb772822018-11-30 10:44:07 +010082 mIdleTimer->stop();
83}
84
Ana Krulecf2c006d2019-06-21 15:37:07 -070085TEST_F(OneShotTimerTest, resetTest) {
Ady Abraham018ff0b2021-04-19 23:39:36 -070086 FakeClock* clock = new FakeClock();
87 mIdleTimer = std::make_unique<scheduler::OneShotTimer>("TestTimer", 1ms,
Ady Abrahamdb3dfee2020-11-17 17:07:12 -080088 mResetTimerCallback.getInvocable(),
Ady Abraham018ff0b2021-04-19 23:39:36 -070089 mExpiredTimerCallback.getInvocable(),
90 std::unique_ptr<FakeClock>(clock));
91
Ana Krulecfb772822018-11-30 10:44:07 +010092 mIdleTimer->start();
Ady Abrahama1a49af2019-02-07 14:36:55 -080093 EXPECT_TRUE(mResetTimerCallback.waitForCall().has_value());
Ady Abraham018ff0b2021-04-19 23:39:36 -070094 EXPECT_FALSE(mExpiredTimerCallback.waitForUnexpectedCall().has_value());
95 clock->advanceTime(2ms);
96 EXPECT_TRUE(mExpiredTimerCallback.waitForCall().has_value());
Ana Krulecfb772822018-11-30 10:44:07 +010097 mIdleTimer->reset();
Ady Abrahama1a49af2019-02-07 14:36:55 -080098 EXPECT_TRUE(mResetTimerCallback.waitForCall().has_value());
Ady Abraham018ff0b2021-04-19 23:39:36 -070099 clock->advanceTime(2ms);
100 EXPECT_TRUE(mExpiredTimerCallback.waitForCall().has_value());
101
102 clock->advanceTime(2ms);
103 EXPECT_FALSE(mExpiredTimerCallback.waitForUnexpectedCall().has_value());
104 EXPECT_FALSE(mResetTimerCallback.waitForUnexpectedCall().has_value());
Ana Krulecfb772822018-11-30 10:44:07 +0100105}
106
Ana Krulecf2c006d2019-06-21 15:37:07 -0700107TEST_F(OneShotTimerTest, resetBackToBackTest) {
Ady Abraham018ff0b2021-04-19 23:39:36 -0700108 FakeClock* clock = new FakeClock();
109 mIdleTimer = std::make_unique<scheduler::OneShotTimer>("TestTimer", 1ms,
Ady Abrahamdb3dfee2020-11-17 17:07:12 -0800110 mResetTimerCallback.getInvocable(),
Ady Abraham018ff0b2021-04-19 23:39:36 -0700111 mExpiredTimerCallback.getInvocable(),
112 std::unique_ptr<FakeClock>(clock));
Ady Abrahama1a49af2019-02-07 14:36:55 -0800113 mIdleTimer->start();
114 EXPECT_TRUE(mResetTimerCallback.waitForCall().has_value());
115
116 mIdleTimer->reset();
Ady Abraham018ff0b2021-04-19 23:39:36 -0700117 EXPECT_FALSE(mResetTimerCallback.waitForUnexpectedCall().has_value());
118 EXPECT_FALSE(mExpiredTimerCallback.waitForUnexpectedCall().has_value());
Ady Abrahama1a49af2019-02-07 14:36:55 -0800119
120 mIdleTimer->reset();
Ady Abraham018ff0b2021-04-19 23:39:36 -0700121 EXPECT_FALSE(mResetTimerCallback.waitForUnexpectedCall().has_value());
122 EXPECT_FALSE(mExpiredTimerCallback.waitForUnexpectedCall().has_value());
Ady Abrahama1a49af2019-02-07 14:36:55 -0800123
124 mIdleTimer->reset();
Ady Abraham018ff0b2021-04-19 23:39:36 -0700125 EXPECT_FALSE(mResetTimerCallback.waitForUnexpectedCall().has_value());
126 EXPECT_FALSE(mExpiredTimerCallback.waitForUnexpectedCall().has_value());
Ady Abrahama1a49af2019-02-07 14:36:55 -0800127
128 mIdleTimer->reset();
Ady Abraham018ff0b2021-04-19 23:39:36 -0700129 EXPECT_FALSE(mResetTimerCallback.waitForUnexpectedCall().has_value());
Ady Abrahama1a49af2019-02-07 14:36:55 -0800130
Ady Abraham018ff0b2021-04-19 23:39:36 -0700131 clock->advanceTime(2ms);
132 EXPECT_TRUE(mExpiredTimerCallback.waitForCall().has_value());
133
Ana Krulecfb772822018-11-30 10:44:07 +0100134 mIdleTimer->stop();
Ady Abraham018ff0b2021-04-19 23:39:36 -0700135 clock->advanceTime(2ms);
Lloyd Pique1f9f1a42019-01-31 13:04:00 -0800136 // Final quick check that no more callback were observed.
Ady Abraham018ff0b2021-04-19 23:39:36 -0700137 EXPECT_FALSE(mExpiredTimerCallback.waitForUnexpectedCall().has_value());
138 EXPECT_FALSE(mResetTimerCallback.waitForUnexpectedCall().has_value());
Ady Abrahama1a49af2019-02-07 14:36:55 -0800139}
140
Ana Krulecf2c006d2019-06-21 15:37:07 -0700141TEST_F(OneShotTimerTest, startNotCalledTest) {
Ady Abraham018ff0b2021-04-19 23:39:36 -0700142 FakeClock* clock = new FakeClock();
143 mIdleTimer = std::make_unique<scheduler::OneShotTimer>("TestTimer", 1ms,
Ady Abrahamdb3dfee2020-11-17 17:07:12 -0800144 mResetTimerCallback.getInvocable(),
Ady Abraham018ff0b2021-04-19 23:39:36 -0700145 mExpiredTimerCallback.getInvocable(),
146 std::unique_ptr<FakeClock>(clock));
Ady Abrahama1a49af2019-02-07 14:36:55 -0800147 // The start hasn't happened, so the callback does not happen.
Ady Abraham018ff0b2021-04-19 23:39:36 -0700148 EXPECT_FALSE(mExpiredTimerCallback.waitForUnexpectedCall().has_value());
149 EXPECT_FALSE(mResetTimerCallback.waitForUnexpectedCall().has_value());
Ady Abrahama1a49af2019-02-07 14:36:55 -0800150 mIdleTimer->stop();
Ady Abraham018ff0b2021-04-19 23:39:36 -0700151 clock->advanceTime(2ms);
Ady Abrahama1a49af2019-02-07 14:36:55 -0800152 // Final quick check that no more callback were observed.
Ady Abraham018ff0b2021-04-19 23:39:36 -0700153 EXPECT_FALSE(mExpiredTimerCallback.waitForUnexpectedCall().has_value());
154 EXPECT_FALSE(mResetTimerCallback.waitForUnexpectedCall().has_value());
Ana Krulecfb772822018-11-30 10:44:07 +0100155}
156
Ana Krulecf2c006d2019-06-21 15:37:07 -0700157TEST_F(OneShotTimerTest, idleTimerIdlesTest) {
Ady Abraham018ff0b2021-04-19 23:39:36 -0700158 FakeClock* clock = new FakeClock();
159 mIdleTimer = std::make_unique<scheduler::OneShotTimer>("TestTimer", 1ms,
Ady Abrahamdb3dfee2020-11-17 17:07:12 -0800160 mResetTimerCallback.getInvocable(),
Ady Abraham018ff0b2021-04-19 23:39:36 -0700161 mExpiredTimerCallback.getInvocable(),
162 std::unique_ptr<FakeClock>(clock));
Ana Krulecfb772822018-11-30 10:44:07 +0100163 mIdleTimer->start();
Ady Abrahama1a49af2019-02-07 14:36:55 -0800164 EXPECT_TRUE(mResetTimerCallback.waitForCall().has_value());
Ady Abraham018ff0b2021-04-19 23:39:36 -0700165 clock->advanceTime(2ms);
166 EXPECT_TRUE(mExpiredTimerCallback.waitForCall().has_value());
Ady Abrahama1a49af2019-02-07 14:36:55 -0800167
Ady Abraham018ff0b2021-04-19 23:39:36 -0700168 EXPECT_FALSE(mExpiredTimerCallback.waitForUnexpectedCall().has_value());
169 EXPECT_FALSE(mResetTimerCallback.waitForUnexpectedCall().has_value());
170
Ana Krulecfb772822018-11-30 10:44:07 +0100171 mIdleTimer->reset();
Ady Abraham51988ef2019-02-25 17:25:57 -0800172 EXPECT_TRUE(mResetTimerCallback.waitForCall().has_value());
Ady Abraham018ff0b2021-04-19 23:39:36 -0700173 clock->advanceTime(2ms);
174 EXPECT_TRUE(mExpiredTimerCallback.waitForCall().has_value());
Ana Krulecfb772822018-11-30 10:44:07 +0100175 mIdleTimer->stop();
Ady Abraham018ff0b2021-04-19 23:39:36 -0700176 clock->advanceTime(2ms);
Lloyd Pique1f9f1a42019-01-31 13:04:00 -0800177 // Final quick check that no more callback were observed.
Ady Abraham018ff0b2021-04-19 23:39:36 -0700178 EXPECT_FALSE(mExpiredTimerCallback.waitForUnexpectedCall().has_value());
179 EXPECT_FALSE(mResetTimerCallback.waitForUnexpectedCall().has_value());
Ana Krulecfb772822018-11-30 10:44:07 +0100180}
181
Ana Krulecf2c006d2019-06-21 15:37:07 -0700182TEST_F(OneShotTimerTest, timeoutCallbackExecutionTest) {
Ady Abraham018ff0b2021-04-19 23:39:36 -0700183 FakeClock* clock = new FakeClock();
184 mIdleTimer = std::make_unique<scheduler::OneShotTimer>("TestTimer", 1ms,
Ady Abrahamdb3dfee2020-11-17 17:07:12 -0800185 mResetTimerCallback.getInvocable(),
Ady Abraham018ff0b2021-04-19 23:39:36 -0700186 mExpiredTimerCallback.getInvocable(),
187 std::unique_ptr<FakeClock>(clock));
Ana Krulecfb772822018-11-30 10:44:07 +0100188 mIdleTimer->start();
Ady Abraham51988ef2019-02-25 17:25:57 -0800189 EXPECT_TRUE(mResetTimerCallback.waitForCall().has_value());
Ady Abraham018ff0b2021-04-19 23:39:36 -0700190
191 clock->advanceTime(2ms);
192 EXPECT_TRUE(mExpiredTimerCallback.waitForCall().has_value());
Ana Krulecfb772822018-11-30 10:44:07 +0100193 mIdleTimer->stop();
Ady Abraham018ff0b2021-04-19 23:39:36 -0700194 clock->advanceTime(2ms);
195 EXPECT_FALSE(mExpiredTimerCallback.waitForUnexpectedCall().has_value());
196 EXPECT_FALSE(mResetTimerCallback.waitForUnexpectedCall().has_value());
Ana Krulecfb772822018-11-30 10:44:07 +0100197}
198
Ana Krulecf2c006d2019-06-21 15:37:07 -0700199TEST_F(OneShotTimerTest, noCallbacksAfterStopAndResetTest) {
Ady Abraham018ff0b2021-04-19 23:39:36 -0700200 FakeClock* clock = new FakeClock();
201 mIdleTimer = std::make_unique<scheduler::OneShotTimer>("TestTimer", 1ms,
Ady Abrahamdb3dfee2020-11-17 17:07:12 -0800202 mResetTimerCallback.getInvocable(),
Ady Abraham018ff0b2021-04-19 23:39:36 -0700203 mExpiredTimerCallback.getInvocable(),
204 std::unique_ptr<FakeClock>(clock));
Ana Krulecfb772822018-11-30 10:44:07 +0100205 mIdleTimer->start();
Ady Abraham51988ef2019-02-25 17:25:57 -0800206 EXPECT_TRUE(mResetTimerCallback.waitForCall().has_value());
Ady Abraham018ff0b2021-04-19 23:39:36 -0700207 clock->advanceTime(2ms);
208 EXPECT_TRUE(mExpiredTimerCallback.waitForCall().has_value());
Ady Abrahama1a49af2019-02-07 14:36:55 -0800209
Ana Krulecfb772822018-11-30 10:44:07 +0100210 mIdleTimer->stop();
211 mIdleTimer->reset();
Ady Abraham018ff0b2021-04-19 23:39:36 -0700212 clock->advanceTime(2ms);
213 EXPECT_FALSE(mExpiredTimerCallback.waitForUnexpectedCall().has_value());
214 EXPECT_FALSE(mResetTimerCallback.waitForUnexpectedCall().has_value());
Ana Krulecfb772822018-11-30 10:44:07 +0100215}
216
Ana Krulecf2c006d2019-06-21 15:37:07 -0700217TEST_F(OneShotTimerTest, noCallbacksAfterStopTest) {
Ady Abraham018ff0b2021-04-19 23:39:36 -0700218 FakeClock* clock = new FakeClock();
219 mIdleTimer = std::make_unique<scheduler::OneShotTimer>("TestTimer", 1ms,
Ady Abrahamdb3dfee2020-11-17 17:07:12 -0800220 mResetTimerCallback.getInvocable(),
Ady Abraham018ff0b2021-04-19 23:39:36 -0700221 mExpiredTimerCallback.getInvocable(),
222 std::unique_ptr<FakeClock>(clock));
Ana Krulecfb772822018-11-30 10:44:07 +0100223 mIdleTimer->start();
Ady Abraham51988ef2019-02-25 17:25:57 -0800224 EXPECT_TRUE(mResetTimerCallback.waitForCall().has_value());
Ady Abraham018ff0b2021-04-19 23:39:36 -0700225 EXPECT_FALSE(mExpiredTimerCallback.waitForUnexpectedCall().has_value());
Ady Abrahama1a49af2019-02-07 14:36:55 -0800226
Ana Krulecfb772822018-11-30 10:44:07 +0100227 mIdleTimer->stop();
Lloyd Pique1f9f1a42019-01-31 13:04:00 -0800228 mIdleTimer->reset();
Ady Abrahama1a49af2019-02-07 14:36:55 -0800229
Ady Abraham018ff0b2021-04-19 23:39:36 -0700230 clock->advanceTime(2ms);
Lloyd Pique1f9f1a42019-01-31 13:04:00 -0800231 // No more idle events should be observed
Ady Abraham018ff0b2021-04-19 23:39:36 -0700232 EXPECT_FALSE(mExpiredTimerCallback.waitForUnexpectedCall().has_value());
233 EXPECT_FALSE(mResetTimerCallback.waitForUnexpectedCall().has_value());
Ana Krulecfb772822018-11-30 10:44:07 +0100234}
235
236} // namespace
237} // namespace scheduler
Ady Abrahama1a49af2019-02-07 14:36:55 -0800238} // namespace android