blob: 691676420c43c55ea91e6c15e2da841fcc07480f [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"
Alec Mouri07b27ce2021-04-26 16:31:44 -070026#include "fake/FakeClock.h"
Ana Krulecfb772822018-11-30 10:44:07 +010027
28using namespace std::chrono_literals;
29
30namespace android {
31namespace scheduler {
32
Ana Krulecf2c006d2019-06-21 15:37:07 -070033class OneShotTimerTest : public testing::Test {
Ana Krulecfb772822018-11-30 10:44:07 +010034protected:
Ana Krulecf2c006d2019-06-21 15:37:07 -070035 OneShotTimerTest() = default;
36 ~OneShotTimerTest() override = default;
Ana Krulecfb772822018-11-30 10:44:07 +010037
Ady Abrahama1a49af2019-02-07 14:36:55 -080038 AsyncCallRecorder<void (*)()> mResetTimerCallback;
Ana Krulecfb772822018-11-30 10:44:07 +010039 AsyncCallRecorder<void (*)()> mExpiredTimerCallback;
40
Ana Krulecf2c006d2019-06-21 15:37:07 -070041 std::unique_ptr<OneShotTimer> mIdleTimer;
Lloyd Pique1f9f1a42019-01-31 13:04:00 -080042
43 void clearPendingCallbacks() {
44 while (mExpiredTimerCallback.waitForCall(0us).has_value()) {
45 }
46 }
Ana Krulecfb772822018-11-30 10:44:07 +010047};
48
49namespace {
Ana Krulecf2c006d2019-06-21 15:37:07 -070050TEST_F(OneShotTimerTest, createAndDestroyTest) {
Alec Mouri07b27ce2021-04-26 16:31:44 -070051 fake::FakeClock* clock = new fake::FakeClock();
Ana Krulecf2c006d2019-06-21 15:37:07 -070052 mIdleTimer = std::make_unique<scheduler::OneShotTimer>(
Alec Mouri07b27ce2021-04-26 16:31:44 -070053 "TestTimer", 3ms, [] {}, [] {}, std::unique_ptr<fake::FakeClock>(clock));
Ana Krulecfb772822018-11-30 10:44:07 +010054}
55
Ana Krulecf2c006d2019-06-21 15:37:07 -070056TEST_F(OneShotTimerTest, startStopTest) {
Alec Mouri07b27ce2021-04-26 16:31:44 -070057 fake::FakeClock* clock = new fake::FakeClock();
Ady Abraham018ff0b2021-04-19 23:39:36 -070058 mIdleTimer = std::make_unique<scheduler::OneShotTimer>("TestTimer", 1ms,
Ady Abrahamdb3dfee2020-11-17 17:07:12 -080059 mResetTimerCallback.getInvocable(),
Ady Abraham018ff0b2021-04-19 23:39:36 -070060 mExpiredTimerCallback.getInvocable(),
Alec Mouri07b27ce2021-04-26 16:31:44 -070061 std::unique_ptr<fake::FakeClock>(clock));
Ana Krulecfb772822018-11-30 10:44:07 +010062 mIdleTimer->start();
Ady Abrahama1a49af2019-02-07 14:36:55 -080063 EXPECT_TRUE(mResetTimerCallback.waitForCall().has_value());
Ady Abraham018ff0b2021-04-19 23:39:36 -070064 EXPECT_FALSE(mExpiredTimerCallback.waitForUnexpectedCall().has_value());
Ady Abrahama1a49af2019-02-07 14:36:55 -080065
Ady Abraham018ff0b2021-04-19 23:39:36 -070066 clock->advanceTime(2ms);
67 EXPECT_TRUE(mExpiredTimerCallback.waitForCall().has_value());
68
69 clock->advanceTime(2ms);
70 EXPECT_FALSE(mExpiredTimerCallback.waitForUnexpectedCall().has_value());
71 EXPECT_FALSE(mResetTimerCallback.waitForUnexpectedCall().has_value());
Ana Krulecfb772822018-11-30 10:44:07 +010072 mIdleTimer->stop();
73}
74
Ana Krulecf2c006d2019-06-21 15:37:07 -070075TEST_F(OneShotTimerTest, resetTest) {
Alec Mouri07b27ce2021-04-26 16:31:44 -070076 fake::FakeClock* clock = new fake::FakeClock();
Ady Abraham018ff0b2021-04-19 23:39:36 -070077 mIdleTimer = std::make_unique<scheduler::OneShotTimer>("TestTimer", 1ms,
Ady Abrahamdb3dfee2020-11-17 17:07:12 -080078 mResetTimerCallback.getInvocable(),
Ady Abraham018ff0b2021-04-19 23:39:36 -070079 mExpiredTimerCallback.getInvocable(),
Alec Mouri07b27ce2021-04-26 16:31:44 -070080 std::unique_ptr<fake::FakeClock>(clock));
Ady Abraham018ff0b2021-04-19 23:39:36 -070081
Ana Krulecfb772822018-11-30 10:44:07 +010082 mIdleTimer->start();
Ady Abrahama1a49af2019-02-07 14:36:55 -080083 EXPECT_TRUE(mResetTimerCallback.waitForCall().has_value());
Ady Abraham018ff0b2021-04-19 23:39:36 -070084 EXPECT_FALSE(mExpiredTimerCallback.waitForUnexpectedCall().has_value());
85 clock->advanceTime(2ms);
86 EXPECT_TRUE(mExpiredTimerCallback.waitForCall().has_value());
Ana Krulecfb772822018-11-30 10:44:07 +010087 mIdleTimer->reset();
Ady Abrahama1a49af2019-02-07 14:36:55 -080088 EXPECT_TRUE(mResetTimerCallback.waitForCall().has_value());
Ady Abraham018ff0b2021-04-19 23:39:36 -070089 clock->advanceTime(2ms);
90 EXPECT_TRUE(mExpiredTimerCallback.waitForCall().has_value());
91
92 clock->advanceTime(2ms);
93 EXPECT_FALSE(mExpiredTimerCallback.waitForUnexpectedCall().has_value());
94 EXPECT_FALSE(mResetTimerCallback.waitForUnexpectedCall().has_value());
Ana Krulecfb772822018-11-30 10:44:07 +010095}
96
Ana Krulecf2c006d2019-06-21 15:37:07 -070097TEST_F(OneShotTimerTest, resetBackToBackTest) {
Alec Mouri07b27ce2021-04-26 16:31:44 -070098 fake::FakeClock* clock = new fake::FakeClock();
Ady Abraham018ff0b2021-04-19 23:39:36 -070099 mIdleTimer = std::make_unique<scheduler::OneShotTimer>("TestTimer", 1ms,
Ady Abrahamdb3dfee2020-11-17 17:07:12 -0800100 mResetTimerCallback.getInvocable(),
Ady Abraham018ff0b2021-04-19 23:39:36 -0700101 mExpiredTimerCallback.getInvocable(),
Alec Mouri07b27ce2021-04-26 16:31:44 -0700102 std::unique_ptr<fake::FakeClock>(clock));
Ady Abrahama1a49af2019-02-07 14:36:55 -0800103 mIdleTimer->start();
104 EXPECT_TRUE(mResetTimerCallback.waitForCall().has_value());
105
106 mIdleTimer->reset();
Ady Abraham018ff0b2021-04-19 23:39:36 -0700107 EXPECT_FALSE(mResetTimerCallback.waitForUnexpectedCall().has_value());
108 EXPECT_FALSE(mExpiredTimerCallback.waitForUnexpectedCall().has_value());
Ady Abrahama1a49af2019-02-07 14:36:55 -0800109
110 mIdleTimer->reset();
Ady Abraham018ff0b2021-04-19 23:39:36 -0700111 EXPECT_FALSE(mResetTimerCallback.waitForUnexpectedCall().has_value());
112 EXPECT_FALSE(mExpiredTimerCallback.waitForUnexpectedCall().has_value());
Ady Abrahama1a49af2019-02-07 14:36:55 -0800113
114 mIdleTimer->reset();
Ady Abraham018ff0b2021-04-19 23:39:36 -0700115 EXPECT_FALSE(mResetTimerCallback.waitForUnexpectedCall().has_value());
116 EXPECT_FALSE(mExpiredTimerCallback.waitForUnexpectedCall().has_value());
Ady Abrahama1a49af2019-02-07 14:36:55 -0800117
118 mIdleTimer->reset();
Ady Abraham018ff0b2021-04-19 23:39:36 -0700119 EXPECT_FALSE(mResetTimerCallback.waitForUnexpectedCall().has_value());
Ady Abrahama1a49af2019-02-07 14:36:55 -0800120
Ady Abraham018ff0b2021-04-19 23:39:36 -0700121 clock->advanceTime(2ms);
122 EXPECT_TRUE(mExpiredTimerCallback.waitForCall().has_value());
123
Ana Krulecfb772822018-11-30 10:44:07 +0100124 mIdleTimer->stop();
Ady Abraham018ff0b2021-04-19 23:39:36 -0700125 clock->advanceTime(2ms);
Lloyd Pique1f9f1a42019-01-31 13:04:00 -0800126 // Final quick check that no more callback were observed.
Ady Abraham018ff0b2021-04-19 23:39:36 -0700127 EXPECT_FALSE(mExpiredTimerCallback.waitForUnexpectedCall().has_value());
128 EXPECT_FALSE(mResetTimerCallback.waitForUnexpectedCall().has_value());
Ady Abrahama1a49af2019-02-07 14:36:55 -0800129}
130
Ana Krulecf2c006d2019-06-21 15:37:07 -0700131TEST_F(OneShotTimerTest, startNotCalledTest) {
Alec Mouri07b27ce2021-04-26 16:31:44 -0700132 fake::FakeClock* clock = new fake::FakeClock();
Ady Abraham018ff0b2021-04-19 23:39:36 -0700133 mIdleTimer = std::make_unique<scheduler::OneShotTimer>("TestTimer", 1ms,
Ady Abrahamdb3dfee2020-11-17 17:07:12 -0800134 mResetTimerCallback.getInvocable(),
Ady Abraham018ff0b2021-04-19 23:39:36 -0700135 mExpiredTimerCallback.getInvocable(),
Alec Mouri07b27ce2021-04-26 16:31:44 -0700136 std::unique_ptr<fake::FakeClock>(clock));
Ady Abrahama1a49af2019-02-07 14:36:55 -0800137 // The start hasn't happened, so the callback does not happen.
Ady Abraham018ff0b2021-04-19 23:39:36 -0700138 EXPECT_FALSE(mExpiredTimerCallback.waitForUnexpectedCall().has_value());
139 EXPECT_FALSE(mResetTimerCallback.waitForUnexpectedCall().has_value());
Ady Abrahama1a49af2019-02-07 14:36:55 -0800140 mIdleTimer->stop();
Ady Abraham018ff0b2021-04-19 23:39:36 -0700141 clock->advanceTime(2ms);
Ady Abrahama1a49af2019-02-07 14:36:55 -0800142 // Final quick check that no more callback were observed.
Ady Abraham018ff0b2021-04-19 23:39:36 -0700143 EXPECT_FALSE(mExpiredTimerCallback.waitForUnexpectedCall().has_value());
144 EXPECT_FALSE(mResetTimerCallback.waitForUnexpectedCall().has_value());
Ana Krulecfb772822018-11-30 10:44:07 +0100145}
146
Ana Krulecf2c006d2019-06-21 15:37:07 -0700147TEST_F(OneShotTimerTest, idleTimerIdlesTest) {
Alec Mouri07b27ce2021-04-26 16:31:44 -0700148 fake::FakeClock* clock = new fake::FakeClock();
Ady Abraham018ff0b2021-04-19 23:39:36 -0700149 mIdleTimer = std::make_unique<scheduler::OneShotTimer>("TestTimer", 1ms,
Ady Abrahamdb3dfee2020-11-17 17:07:12 -0800150 mResetTimerCallback.getInvocable(),
Ady Abraham018ff0b2021-04-19 23:39:36 -0700151 mExpiredTimerCallback.getInvocable(),
Alec Mouri07b27ce2021-04-26 16:31:44 -0700152 std::unique_ptr<fake::FakeClock>(clock));
Ana Krulecfb772822018-11-30 10:44:07 +0100153 mIdleTimer->start();
Ady Abrahama1a49af2019-02-07 14:36:55 -0800154 EXPECT_TRUE(mResetTimerCallback.waitForCall().has_value());
Ady Abraham018ff0b2021-04-19 23:39:36 -0700155 clock->advanceTime(2ms);
156 EXPECT_TRUE(mExpiredTimerCallback.waitForCall().has_value());
Ady Abrahama1a49af2019-02-07 14:36:55 -0800157
Ady Abraham018ff0b2021-04-19 23:39:36 -0700158 EXPECT_FALSE(mExpiredTimerCallback.waitForUnexpectedCall().has_value());
159 EXPECT_FALSE(mResetTimerCallback.waitForUnexpectedCall().has_value());
160
Ana Krulecfb772822018-11-30 10:44:07 +0100161 mIdleTimer->reset();
Ady Abraham51988ef2019-02-25 17:25:57 -0800162 EXPECT_TRUE(mResetTimerCallback.waitForCall().has_value());
Ady Abraham018ff0b2021-04-19 23:39:36 -0700163 clock->advanceTime(2ms);
164 EXPECT_TRUE(mExpiredTimerCallback.waitForCall().has_value());
Ana Krulecfb772822018-11-30 10:44:07 +0100165 mIdleTimer->stop();
Ady Abraham018ff0b2021-04-19 23:39:36 -0700166 clock->advanceTime(2ms);
Lloyd Pique1f9f1a42019-01-31 13:04:00 -0800167 // Final quick check that no more callback were observed.
Ady Abraham018ff0b2021-04-19 23:39:36 -0700168 EXPECT_FALSE(mExpiredTimerCallback.waitForUnexpectedCall().has_value());
169 EXPECT_FALSE(mResetTimerCallback.waitForUnexpectedCall().has_value());
Ana Krulecfb772822018-11-30 10:44:07 +0100170}
171
Ana Krulecf2c006d2019-06-21 15:37:07 -0700172TEST_F(OneShotTimerTest, timeoutCallbackExecutionTest) {
Alec Mouri07b27ce2021-04-26 16:31:44 -0700173 fake::FakeClock* clock = new fake::FakeClock();
Ady Abraham018ff0b2021-04-19 23:39:36 -0700174 mIdleTimer = std::make_unique<scheduler::OneShotTimer>("TestTimer", 1ms,
Ady Abrahamdb3dfee2020-11-17 17:07:12 -0800175 mResetTimerCallback.getInvocable(),
Ady Abraham018ff0b2021-04-19 23:39:36 -0700176 mExpiredTimerCallback.getInvocable(),
Alec Mouri07b27ce2021-04-26 16:31:44 -0700177 std::unique_ptr<fake::FakeClock>(clock));
Ana Krulecfb772822018-11-30 10:44:07 +0100178 mIdleTimer->start();
Ady Abraham51988ef2019-02-25 17:25:57 -0800179 EXPECT_TRUE(mResetTimerCallback.waitForCall().has_value());
Ady Abraham018ff0b2021-04-19 23:39:36 -0700180
181 clock->advanceTime(2ms);
182 EXPECT_TRUE(mExpiredTimerCallback.waitForCall().has_value());
Ana Krulecfb772822018-11-30 10:44:07 +0100183 mIdleTimer->stop();
Ady Abraham018ff0b2021-04-19 23:39:36 -0700184 clock->advanceTime(2ms);
185 EXPECT_FALSE(mExpiredTimerCallback.waitForUnexpectedCall().has_value());
186 EXPECT_FALSE(mResetTimerCallback.waitForUnexpectedCall().has_value());
Ana Krulecfb772822018-11-30 10:44:07 +0100187}
188
Ana Krulecf2c006d2019-06-21 15:37:07 -0700189TEST_F(OneShotTimerTest, noCallbacksAfterStopAndResetTest) {
Alec Mouri07b27ce2021-04-26 16:31:44 -0700190 fake::FakeClock* clock = new fake::FakeClock();
Ady Abraham018ff0b2021-04-19 23:39:36 -0700191 mIdleTimer = std::make_unique<scheduler::OneShotTimer>("TestTimer", 1ms,
Ady Abrahamdb3dfee2020-11-17 17:07:12 -0800192 mResetTimerCallback.getInvocable(),
Ady Abraham018ff0b2021-04-19 23:39:36 -0700193 mExpiredTimerCallback.getInvocable(),
Alec Mouri07b27ce2021-04-26 16:31:44 -0700194 std::unique_ptr<fake::FakeClock>(clock));
Ana Krulecfb772822018-11-30 10:44:07 +0100195 mIdleTimer->start();
Ady Abraham51988ef2019-02-25 17:25:57 -0800196 EXPECT_TRUE(mResetTimerCallback.waitForCall().has_value());
Ady Abraham018ff0b2021-04-19 23:39:36 -0700197 clock->advanceTime(2ms);
198 EXPECT_TRUE(mExpiredTimerCallback.waitForCall().has_value());
Ady Abrahama1a49af2019-02-07 14:36:55 -0800199
Ana Krulecfb772822018-11-30 10:44:07 +0100200 mIdleTimer->stop();
201 mIdleTimer->reset();
Ady Abraham018ff0b2021-04-19 23:39:36 -0700202 clock->advanceTime(2ms);
203 EXPECT_FALSE(mExpiredTimerCallback.waitForUnexpectedCall().has_value());
204 EXPECT_FALSE(mResetTimerCallback.waitForUnexpectedCall().has_value());
Ana Krulecfb772822018-11-30 10:44:07 +0100205}
206
Ana Krulecf2c006d2019-06-21 15:37:07 -0700207TEST_F(OneShotTimerTest, noCallbacksAfterStopTest) {
Alec Mouri07b27ce2021-04-26 16:31:44 -0700208 fake::FakeClock* clock = new fake::FakeClock();
Ady Abraham018ff0b2021-04-19 23:39:36 -0700209 mIdleTimer = std::make_unique<scheduler::OneShotTimer>("TestTimer", 1ms,
Ady Abrahamdb3dfee2020-11-17 17:07:12 -0800210 mResetTimerCallback.getInvocable(),
Ady Abraham018ff0b2021-04-19 23:39:36 -0700211 mExpiredTimerCallback.getInvocable(),
Alec Mouri07b27ce2021-04-26 16:31:44 -0700212 std::unique_ptr<fake::FakeClock>(clock));
Ana Krulecfb772822018-11-30 10:44:07 +0100213 mIdleTimer->start();
Ady Abraham51988ef2019-02-25 17:25:57 -0800214 EXPECT_TRUE(mResetTimerCallback.waitForCall().has_value());
Ady Abraham018ff0b2021-04-19 23:39:36 -0700215 EXPECT_FALSE(mExpiredTimerCallback.waitForUnexpectedCall().has_value());
Ady Abrahama1a49af2019-02-07 14:36:55 -0800216
Ana Krulecfb772822018-11-30 10:44:07 +0100217 mIdleTimer->stop();
Lloyd Pique1f9f1a42019-01-31 13:04:00 -0800218 mIdleTimer->reset();
Ady Abrahama1a49af2019-02-07 14:36:55 -0800219
Ady Abraham018ff0b2021-04-19 23:39:36 -0700220 clock->advanceTime(2ms);
Lloyd Pique1f9f1a42019-01-31 13:04:00 -0800221 // No more idle events should be observed
Ady Abraham018ff0b2021-04-19 23:39:36 -0700222 EXPECT_FALSE(mExpiredTimerCallback.waitForUnexpectedCall().has_value());
223 EXPECT_FALSE(mResetTimerCallback.waitForUnexpectedCall().has_value());
Ana Krulecfb772822018-11-30 10:44:07 +0100224}
225
226} // namespace
227} // namespace scheduler
Ady Abrahama1a49af2019-02-07 14:36:55 -0800228} // namespace android