blob: efa9eef09995ae416e6fb29b63a05edf9cfa014a [file] [log] [blame]
Lakshman Annadorai774ba782020-10-30 10:20:41 -07001/*
2 * Copyright 2020 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 */
16
17#include "MockIoOveruseMonitor.h"
18#include "MockWatchdogPerfService.h"
19#include "MockWatchdogProcessService.h"
Lakshman Annadorai186a6c02020-11-17 16:43:15 -080020#include "MockWatchdogServiceHelper.h"
Lakshman Annadorai774ba782020-10-30 10:20:41 -070021#include "WatchdogBinderMediator.h"
22#include "WatchdogInternalHandler.h"
Lakshman Annadoraie4054622020-11-10 14:09:42 -080023#include "WatchdogServiceHelper.h"
Lakshman Annadorai774ba782020-10-30 10:20:41 -070024
25#include <android-base/result.h>
26#include <android/automotive/watchdog/internal/BootPhase.h>
Lakshman Annadorai8a67df12021-06-29 19:33:37 -070027#include <android/automotive/watchdog/internal/GarageMode.h>
Lakshman Annadorai774ba782020-10-30 10:20:41 -070028#include <android/automotive/watchdog/internal/PowerCycle.h>
29#include <android/automotive/watchdog/internal/UserState.h>
30#include <binder/IBinder.h>
31#include <binder/IPCThreadState.h>
32#include <gmock/gmock.h>
33#include <gtest/gtest.h>
Lakshman Annadorai774ba782020-10-30 10:20:41 -070034#include <private/android_filesystem_config.h>
35#include <utils/RefBase.h>
36
37#include <errno.h>
38
39namespace android {
40namespace automotive {
41namespace watchdog {
42
Lakshman Annadoraieae4dbe2021-02-02 13:09:17 -080043namespace aawi = ::android::automotive::watchdog::internal;
Lakshman Annadorai774ba782020-10-30 10:20:41 -070044
Lakshman Annadorai8a67df12021-06-29 19:33:37 -070045using aawi::GarageMode;
Lakshman Annadoraieae4dbe2021-02-02 13:09:17 -080046using aawi::ICarWatchdogServiceForSystem;
47using aawi::ICarWatchdogServiceForSystemDefault;
Lakshman Annadorai9ed47322021-03-11 16:09:28 -080048using aawi::PackageResourceOveruseAction;
Lakshman Annadorai0a0a7872021-06-08 14:55:26 -070049using aawi::PowerCycle;
Lakshman Annadoraid1426502021-04-06 20:06:58 -070050using aawi::ResourceOveruseConfiguration;
Lakshman Annadoraieae4dbe2021-02-02 13:09:17 -080051using ::android::sp;
Lakshman Annadorai8fae85c2021-04-16 14:42:19 -070052using ::android::String16;
Lakshman Annadoraieae4dbe2021-02-02 13:09:17 -080053using ::android::base::Result;
54using ::android::binder::Status;
Lakshman Annadorai774ba782020-10-30 10:20:41 -070055using ::testing::_;
Lakshman Annadoraibc0afd02021-04-06 20:23:39 -070056using ::testing::Pointer;
Lakshman Annadorai774ba782020-10-30 10:20:41 -070057using ::testing::Return;
58
59namespace {
60
61class MockWatchdogBinderMediator : public WatchdogBinderMediator {
62public:
Lakshman Annadoraiec4d08a2021-04-30 08:29:10 -070063 MockWatchdogBinderMediator(const android::sp<WatchdogProcessService>& watchdogProcessService,
Lakshman Annadorai0a0a7872021-06-08 14:55:26 -070064 const android::sp<WatchdogPerfServiceInterface>& watchdogPerfService,
Lakshman Annadoraiec4d08a2021-04-30 08:29:10 -070065 const android::sp<IWatchdogServiceHelper>& watchdogServiceHelper) :
Lakshman Annadoraid50d6e92021-02-04 15:29:40 -080066 WatchdogBinderMediator(watchdogProcessService, watchdogPerfService, watchdogServiceHelper,
Lakshman Annadorai186a6c02020-11-17 16:43:15 -080067 [](const char*, const android::sp<android::IBinder>&)
68 -> Result<void> { return Result<void>{}; }) {}
Lakshman Annadorai774ba782020-10-30 10:20:41 -070069 ~MockWatchdogBinderMediator() {}
70
Lakshman Annadorai8fae85c2021-04-16 14:42:19 -070071 MOCK_METHOD(status_t, dump, (int fd, const Vector<android::String16>& args), (override));
Lakshman Annadorai774ba782020-10-30 10:20:41 -070072};
73
Lakshman Annadorai774ba782020-10-30 10:20:41 -070074class ScopedChangeCallingUid : public RefBase {
75public:
76 explicit ScopedChangeCallingUid(uid_t uid) {
77 mCallingUid = IPCThreadState::self()->getCallingUid();
78 mCallingPid = IPCThreadState::self()->getCallingPid();
79 if (mCallingUid == uid) {
80 return;
81 }
82 mChangedUid = uid;
83 int64_t token = ((int64_t)mChangedUid << 32) | mCallingPid;
84 IPCThreadState::self()->restoreCallingIdentity(token);
85 }
86 ~ScopedChangeCallingUid() {
87 if (mCallingUid == mChangedUid) {
88 return;
89 }
90 int64_t token = ((int64_t)mCallingUid << 32) | mCallingPid;
91 IPCThreadState::self()->restoreCallingIdentity(token);
92 }
93
94private:
95 uid_t mCallingUid;
96 uid_t mChangedUid;
97 pid_t mCallingPid;
98};
99
100} // namespace
101
102class WatchdogInternalHandlerTest : public ::testing::Test {
103protected:
104 virtual void SetUp() {
Lakshman Annadorai0a0a7872021-06-08 14:55:26 -0700105 mMockWatchdogProcessService = sp<MockWatchdogProcessService>::make();
106 mMockWatchdogPerfService = sp<MockWatchdogPerfService>::make();
107 mMockWatchdogServiceHelper = sp<MockWatchdogServiceHelper>::make();
108 mMockIoOveruseMonitor = sp<MockIoOveruseMonitor>::make();
109 mMockWatchdogBinderMediator =
110 sp<MockWatchdogBinderMediator>::make(mMockWatchdogProcessService,
111 mMockWatchdogPerfService,
112 mMockWatchdogServiceHelper);
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700113 mWatchdogInternalHandler =
Lakshman Annadorai0a0a7872021-06-08 14:55:26 -0700114 sp<WatchdogInternalHandler>::make(mMockWatchdogBinderMediator,
115 mMockWatchdogServiceHelper,
116 mMockWatchdogProcessService,
117 mMockWatchdogPerfService, mMockIoOveruseMonitor);
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700118 }
119 virtual void TearDown() {
Lakshman Annadoraie4054622020-11-10 14:09:42 -0800120 mMockWatchdogBinderMediator.clear();
121 mMockWatchdogServiceHelper.clear();
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700122 mMockWatchdogProcessService.clear();
123 mMockWatchdogPerfService.clear();
124 mMockIoOveruseMonitor.clear();
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700125 mWatchdogInternalHandler.clear();
126 mScopedChangeCallingUid.clear();
127 }
Lakshman Annadoraie4054622020-11-10 14:09:42 -0800128
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700129 // Sets calling UID to imitate System's process.
Lakshman Annadorai0a0a7872021-06-08 14:55:26 -0700130 void setSystemCallingUid() {
131 mScopedChangeCallingUid = sp<ScopedChangeCallingUid>::make(AID_SYSTEM);
132 }
Lakshman Annadoraie4054622020-11-10 14:09:42 -0800133
134 sp<MockWatchdogBinderMediator> mMockWatchdogBinderMediator;
135 sp<MockWatchdogServiceHelper> mMockWatchdogServiceHelper;
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700136 sp<MockWatchdogProcessService> mMockWatchdogProcessService;
137 sp<MockWatchdogPerfService> mMockWatchdogPerfService;
138 sp<MockIoOveruseMonitor> mMockIoOveruseMonitor;
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700139 sp<WatchdogInternalHandler> mWatchdogInternalHandler;
140 sp<ScopedChangeCallingUid> mScopedChangeCallingUid;
141};
142
Lakshman Annadorai186a6c02020-11-17 16:43:15 -0800143TEST_F(WatchdogInternalHandlerTest, TestTerminate) {
144 ASSERT_NE(mWatchdogInternalHandler->mBinderMediator, nullptr);
145 ASSERT_NE(mWatchdogInternalHandler->mWatchdogServiceHelper, nullptr);
146 ASSERT_NE(mWatchdogInternalHandler->mWatchdogProcessService, nullptr);
147 ASSERT_NE(mWatchdogInternalHandler->mWatchdogPerfService, nullptr);
148 ASSERT_NE(mWatchdogInternalHandler->mIoOveruseMonitor, nullptr);
149
150 mWatchdogInternalHandler->terminate();
151
152 ASSERT_EQ(mWatchdogInternalHandler->mBinderMediator, nullptr);
153 ASSERT_EQ(mWatchdogInternalHandler->mWatchdogServiceHelper, nullptr);
154 ASSERT_EQ(mWatchdogInternalHandler->mWatchdogProcessService, nullptr);
155 ASSERT_EQ(mWatchdogInternalHandler->mWatchdogPerfService, nullptr);
156 ASSERT_EQ(mWatchdogInternalHandler->mIoOveruseMonitor, nullptr);
157}
158
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700159TEST_F(WatchdogInternalHandlerTest, TestDump) {
160 EXPECT_CALL(*mMockWatchdogBinderMediator, dump(-1, _)).WillOnce(Return(OK));
161 ASSERT_EQ(mWatchdogInternalHandler->dump(-1, Vector<String16>()), OK);
162}
163
Lakshman Annadoraie4054622020-11-10 14:09:42 -0800164TEST_F(WatchdogInternalHandlerTest, TestRegisterCarWatchdogService) {
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700165 setSystemCallingUid();
Lakshman Annadorai0a0a7872021-06-08 14:55:26 -0700166 sp<ICarWatchdogServiceForSystem> service = sp<ICarWatchdogServiceForSystemDefault>::make();
Lakshman Annadoraie4054622020-11-10 14:09:42 -0800167 EXPECT_CALL(*mMockWatchdogServiceHelper, registerService(service))
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700168 .WillOnce(Return(Status::ok()));
Lakshman Annadorai8dfeeaf2020-12-15 14:10:53 -0800169 EXPECT_CALL(*mMockWatchdogServiceHelper, registerService(service))
170 .WillOnce(Return(Status::ok()));
171
Lakshman Annadoraie4054622020-11-10 14:09:42 -0800172 Status status = mWatchdogInternalHandler->registerCarWatchdogService(service);
Lakshman Annadorai8dfeeaf2020-12-15 14:10:53 -0800173
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700174 ASSERT_TRUE(status.isOk()) << status;
175}
176
Lakshman Annadoraie4054622020-11-10 14:09:42 -0800177TEST_F(WatchdogInternalHandlerTest, TestErrorOnRegisterCarWatchdogServiceWithNonSystemCallingUid) {
Lakshman Annadorai0a0a7872021-06-08 14:55:26 -0700178 sp<ICarWatchdogServiceForSystem> service = sp<ICarWatchdogServiceForSystemDefault>::make();
Lakshman Annadorai8dfeeaf2020-12-15 14:10:53 -0800179 EXPECT_CALL(*mMockWatchdogServiceHelper, registerService(_)).Times(0);
180
Lakshman Annadoraie4054622020-11-10 14:09:42 -0800181 Status status = mWatchdogInternalHandler->registerCarWatchdogService(service);
Lakshman Annadorai8dfeeaf2020-12-15 14:10:53 -0800182
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700183 ASSERT_FALSE(status.isOk()) << status;
184}
185
Lakshman Annadoraie4054622020-11-10 14:09:42 -0800186TEST_F(WatchdogInternalHandlerTest,
187 TestErrorOnRegisterCarWatchdogServiceWithWatchdogServiceHelperError) {
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700188 setSystemCallingUid();
Lakshman Annadorai0a0a7872021-06-08 14:55:26 -0700189 sp<ICarWatchdogServiceForSystem> service = sp<ICarWatchdogServiceForSystemDefault>::make();
Lakshman Annadoraie4054622020-11-10 14:09:42 -0800190 EXPECT_CALL(*mMockWatchdogServiceHelper, registerService(service))
191 .WillOnce(Return(Status::fromExceptionCode(Status::EX_ILLEGAL_STATE, "Illegal state")));
Lakshman Annadorai8dfeeaf2020-12-15 14:10:53 -0800192
Lakshman Annadoraie4054622020-11-10 14:09:42 -0800193 Status status = mWatchdogInternalHandler->registerCarWatchdogService(service);
Lakshman Annadorai8dfeeaf2020-12-15 14:10:53 -0800194
Lakshman Annadoraie4054622020-11-10 14:09:42 -0800195 ASSERT_FALSE(status.isOk()) << status;
196}
197
198TEST_F(WatchdogInternalHandlerTest, TestUnregisterCarWatchdogService) {
199 setSystemCallingUid();
Lakshman Annadorai0a0a7872021-06-08 14:55:26 -0700200 sp<ICarWatchdogServiceForSystem> service = sp<ICarWatchdogServiceForSystemDefault>::make();
Lakshman Annadoraie4054622020-11-10 14:09:42 -0800201 EXPECT_CALL(*mMockWatchdogServiceHelper, unregisterService(service))
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700202 .WillOnce(Return(Status::ok()));
Lakshman Annadoraie4054622020-11-10 14:09:42 -0800203 Status status = mWatchdogInternalHandler->unregisterCarWatchdogService(service);
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700204 ASSERT_TRUE(status.isOk()) << status;
205}
206
Lakshman Annadoraie4054622020-11-10 14:09:42 -0800207TEST_F(WatchdogInternalHandlerTest,
208 TestErrorOnUnregisterCarWatchdogServiceWithNonSystemCallingUid) {
Lakshman Annadorai0a0a7872021-06-08 14:55:26 -0700209 sp<ICarWatchdogServiceForSystem> service = sp<ICarWatchdogServiceForSystemDefault>::make();
Lakshman Annadoraie4054622020-11-10 14:09:42 -0800210 EXPECT_CALL(*mMockWatchdogServiceHelper, unregisterService(service)).Times(0);
Lakshman Annadoraie4054622020-11-10 14:09:42 -0800211 Status status = mWatchdogInternalHandler->unregisterCarWatchdogService(service);
212 ASSERT_FALSE(status.isOk()) << status;
213}
214TEST_F(WatchdogInternalHandlerTest,
215 TestErrorOnUnregisterCarWatchdogServiceWithWatchdogServiceHelperError) {
216 setSystemCallingUid();
Lakshman Annadorai0a0a7872021-06-08 14:55:26 -0700217 sp<ICarWatchdogServiceForSystem> service = sp<ICarWatchdogServiceForSystemDefault>::make();
Lakshman Annadoraie4054622020-11-10 14:09:42 -0800218 EXPECT_CALL(*mMockWatchdogServiceHelper, unregisterService(service))
219 .WillOnce(Return(
220 Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT, "Illegal argument")));
Lakshman Annadoraie4054622020-11-10 14:09:42 -0800221 Status status = mWatchdogInternalHandler->unregisterCarWatchdogService(service);
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700222 ASSERT_FALSE(status.isOk()) << status;
223}
224
225TEST_F(WatchdogInternalHandlerTest, TestRegisterMonitor) {
226 setSystemCallingUid();
Lakshman Annadorai0a0a7872021-06-08 14:55:26 -0700227 sp<aawi::ICarWatchdogMonitor> monitor = sp<aawi::ICarWatchdogMonitorDefault>::make();
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700228 EXPECT_CALL(*mMockWatchdogProcessService, registerMonitor(monitor))
229 .WillOnce(Return(Status::ok()));
230 Status status = mWatchdogInternalHandler->registerMonitor(monitor);
231 ASSERT_TRUE(status.isOk()) << status;
232}
233
234TEST_F(WatchdogInternalHandlerTest, TestErrorOnRegisterMonitorWithNonSystemCallingUid) {
Lakshman Annadorai0a0a7872021-06-08 14:55:26 -0700235 sp<aawi::ICarWatchdogMonitor> monitor = sp<aawi::ICarWatchdogMonitorDefault>::make();
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700236 EXPECT_CALL(*mMockWatchdogProcessService, registerMonitor(monitor)).Times(0);
237 Status status = mWatchdogInternalHandler->registerMonitor(monitor);
238 ASSERT_FALSE(status.isOk()) << status;
239}
240
241TEST_F(WatchdogInternalHandlerTest, TestUnregisterMonitor) {
242 setSystemCallingUid();
Lakshman Annadorai0a0a7872021-06-08 14:55:26 -0700243 sp<aawi::ICarWatchdogMonitor> monitor = sp<aawi::ICarWatchdogMonitorDefault>::make();
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700244 EXPECT_CALL(*mMockWatchdogProcessService, unregisterMonitor(monitor))
245 .WillOnce(Return(Status::ok()));
246 Status status = mWatchdogInternalHandler->unregisterMonitor(monitor);
247 ASSERT_TRUE(status.isOk()) << status;
248}
249
250TEST_F(WatchdogInternalHandlerTest, TestErrorOnUnregisterMonitorWithNonSystemCallingUid) {
Lakshman Annadorai0a0a7872021-06-08 14:55:26 -0700251 sp<aawi::ICarWatchdogMonitor> monitor = sp<aawi::ICarWatchdogMonitorDefault>::make();
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700252 EXPECT_CALL(*mMockWatchdogProcessService, unregisterMonitor(monitor)).Times(0);
253 Status status = mWatchdogInternalHandler->unregisterMonitor(monitor);
254 ASSERT_FALSE(status.isOk()) << status;
255}
256
Lakshman Annadoraie4054622020-11-10 14:09:42 -0800257TEST_F(WatchdogInternalHandlerTest, TestCarWatchdogServiceAlive) {
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700258 setSystemCallingUid();
Lakshman Annadorai0a0a7872021-06-08 14:55:26 -0700259 sp<ICarWatchdogServiceForSystem> service = sp<ICarWatchdogServiceForSystemDefault>::make();
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700260 std::vector clientsNotResponding = {123};
261 EXPECT_CALL(*mMockWatchdogProcessService,
Lakshman Annadoraie4054622020-11-10 14:09:42 -0800262 tellCarWatchdogServiceAlive(service, clientsNotResponding, 456))
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700263 .WillOnce(Return(Status::ok()));
264 Status status =
Lakshman Annadoraie4054622020-11-10 14:09:42 -0800265 mWatchdogInternalHandler->tellCarWatchdogServiceAlive(service, clientsNotResponding,
266 456);
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700267 ASSERT_TRUE(status.isOk()) << status;
268}
269
Lakshman Annadoraie4054622020-11-10 14:09:42 -0800270TEST_F(WatchdogInternalHandlerTest, TestErrorOnCarWatchdogServiceWithNonSystemCallingUid) {
Lakshman Annadorai0a0a7872021-06-08 14:55:26 -0700271 sp<ICarWatchdogServiceForSystem> service = sp<ICarWatchdogServiceForSystemDefault>::make();
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700272 std::vector clientsNotResponding = {123};
Lakshman Annadoraie4054622020-11-10 14:09:42 -0800273 EXPECT_CALL(*mMockWatchdogProcessService, tellCarWatchdogServiceAlive(_, _, _)).Times(0);
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700274 Status status =
Lakshman Annadoraie4054622020-11-10 14:09:42 -0800275 mWatchdogInternalHandler->tellCarWatchdogServiceAlive(service, clientsNotResponding,
276 456);
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700277 ASSERT_FALSE(status.isOk()) << status;
278}
279
280TEST_F(WatchdogInternalHandlerTest, TestTellDumpFinished) {
281 setSystemCallingUid();
Lakshman Annadorai0a0a7872021-06-08 14:55:26 -0700282 sp<aawi::ICarWatchdogMonitor> monitor = sp<aawi::ICarWatchdogMonitorDefault>::make();
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700283 EXPECT_CALL(*mMockWatchdogProcessService, tellDumpFinished(monitor, 456))
284 .WillOnce(Return(Status::ok()));
285 Status status = mWatchdogInternalHandler->tellDumpFinished(monitor, 456);
286 ASSERT_TRUE(status.isOk()) << status;
287}
288
289TEST_F(WatchdogInternalHandlerTest, TestErrorOnTellDumpFinishedWithNonSystemCallingUid) {
Lakshman Annadorai0a0a7872021-06-08 14:55:26 -0700290 sp<aawi::ICarWatchdogMonitor> monitor = sp<aawi::ICarWatchdogMonitorDefault>::make();
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700291 EXPECT_CALL(*mMockWatchdogProcessService, tellDumpFinished(_, _)).Times(0);
292 Status status = mWatchdogInternalHandler->tellDumpFinished(monitor, 456);
293 ASSERT_FALSE(status.isOk()) << status;
294}
295
Lakshman Annadorai8a67df12021-06-29 19:33:37 -0700296TEST_F(WatchdogInternalHandlerTest, TestNotifyPowerCycleChangeToShutdownPrepare) {
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700297 setSystemCallingUid();
Lakshman Annadorai0a0a7872021-06-08 14:55:26 -0700298 EXPECT_CALL(*mMockWatchdogProcessService, setEnabled(/*isEnabled=*/false)).Times(1);
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700299 Status status =
300 mWatchdogInternalHandler
Lakshman Annadorai0a0a7872021-06-08 14:55:26 -0700301 ->notifySystemStateChange(aawi::StateType::POWER_CYCLE,
Lakshman Annadorai8a67df12021-06-29 19:33:37 -0700302 static_cast<int32_t>(
303 PowerCycle::POWER_CYCLE_SHUTDOWN_PREPARE),
Lakshman Annadorai0a0a7872021-06-08 14:55:26 -0700304 -1);
305 ASSERT_TRUE(status.isOk()) << status;
306}
307
Lakshman Annadorai8a67df12021-06-29 19:33:37 -0700308TEST_F(WatchdogInternalHandlerTest, TestNotifyPowerCycleChangeToShutdownEnter) {
Lakshman Annadorai0a0a7872021-06-08 14:55:26 -0700309 setSystemCallingUid();
310 EXPECT_CALL(*mMockWatchdogProcessService, setEnabled(/*isEnabled=*/false)).Times(1);
Lakshman Annadorai8a67df12021-06-29 19:33:37 -0700311 Status status =
312 mWatchdogInternalHandler
313 ->notifySystemStateChange(aawi::StateType::POWER_CYCLE,
314 static_cast<int32_t>(
315 PowerCycle::POWER_CYCLE_SHUTDOWN_ENTER),
316 -1);
Lakshman Annadorai0a0a7872021-06-08 14:55:26 -0700317 ASSERT_TRUE(status.isOk()) << status;
318}
319
320TEST_F(WatchdogInternalHandlerTest, TestNotifyPowerCycleChangeToResume) {
321 setSystemCallingUid();
322 EXPECT_CALL(*mMockWatchdogProcessService, setEnabled(/*isEnabled=*/true)).Times(1);
323 EXPECT_CALL(*mMockWatchdogPerfService, setSystemState(SystemState::NORMAL_MODE)).Times(1);
324 Status status =
325 mWatchdogInternalHandler
326 ->notifySystemStateChange(aawi::StateType::POWER_CYCLE,
327 static_cast<int32_t>(PowerCycle::POWER_CYCLE_RESUME),
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700328 -1);
329 ASSERT_TRUE(status.isOk()) << status;
330}
331
332TEST_F(WatchdogInternalHandlerTest, TestErrorOnNotifyPowerCycleChangeWithInvalidArgs) {
Lakshman Annadorai0a0a7872021-06-08 14:55:26 -0700333 EXPECT_CALL(*mMockWatchdogProcessService, setEnabled(_)).Times(0);
334 EXPECT_CALL(*mMockWatchdogPerfService, setSystemState(_)).Times(0);
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700335 aawi::StateType type = aawi::StateType::POWER_CYCLE;
336
337 Status status = mWatchdogInternalHandler->notifySystemStateChange(type, -1, -1);
338 ASSERT_FALSE(status.isOk()) << status;
339
340 status = mWatchdogInternalHandler->notifySystemStateChange(type, 3000, -1);
341 ASSERT_FALSE(status.isOk()) << status;
342}
343
Lakshman Annadorai8a67df12021-06-29 19:33:37 -0700344TEST_F(WatchdogInternalHandlerTest, TestNotifyGarageModeOn) {
345 setSystemCallingUid();
346 EXPECT_CALL(*mMockWatchdogPerfService, setSystemState(SystemState::GARAGE_MODE)).Times(1);
347 Status status =
348 mWatchdogInternalHandler->notifySystemStateChange(aawi::StateType::GARAGE_MODE,
349 static_cast<int32_t>(
350 GarageMode::GARAGE_MODE_ON),
351 -1);
352 ASSERT_TRUE(status.isOk()) << status;
353}
354
355TEST_F(WatchdogInternalHandlerTest, TestNotifyGarageModeOff) {
356 setSystemCallingUid();
357 EXPECT_CALL(*mMockWatchdogPerfService, setSystemState(SystemState::NORMAL_MODE)).Times(1);
358 Status status =
359 mWatchdogInternalHandler->notifySystemStateChange(aawi::StateType::GARAGE_MODE,
360 static_cast<int32_t>(
361 GarageMode::GARAGE_MODE_OFF),
362 -1);
363 ASSERT_TRUE(status.isOk()) << status;
364}
365
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700366TEST_F(WatchdogInternalHandlerTest, TestNotifyUserStateChange) {
367 setSystemCallingUid();
368 aawi::StateType type = aawi::StateType::USER_STATE;
369 EXPECT_CALL(*mMockWatchdogProcessService,
370 notifyUserStateChange(234567, aawi::UserState::USER_STATE_STOPPED))
371 .WillOnce(Return(Status::ok()));
372 Status status = mWatchdogInternalHandler
373 ->notifySystemStateChange(type, 234567,
374 static_cast<int32_t>(
375 aawi::UserState::USER_STATE_STOPPED));
376 ASSERT_TRUE(status.isOk()) << status;
377}
378
379TEST_F(WatchdogInternalHandlerTest, TestErrorOnNotifyUserStateChangeWithInvalidArgs) {
380 EXPECT_CALL(*mMockWatchdogProcessService, notifyUserStateChange(_, _)).Times(0);
381 aawi::StateType type = aawi::StateType::USER_STATE;
382
383 Status status = mWatchdogInternalHandler->notifySystemStateChange(type, 234567, -1);
384 ASSERT_FALSE(status.isOk()) << status;
385
386 status = mWatchdogInternalHandler->notifySystemStateChange(type, 234567, 3000);
387 ASSERT_FALSE(status.isOk()) << status;
388}
389
390TEST_F(WatchdogInternalHandlerTest, TestNotifyBootPhaseChange) {
391 setSystemCallingUid();
392 aawi::StateType type = aawi::StateType::BOOT_PHASE;
393 EXPECT_CALL(*mMockWatchdogPerfService, onBootFinished()).WillOnce(Return(Result<void>()));
394 Status status =
395 mWatchdogInternalHandler
396 ->notifySystemStateChange(type,
397 static_cast<int32_t>(aawi::BootPhase::BOOT_COMPLETED),
398 -1);
399 ASSERT_TRUE(status.isOk()) << status;
400}
401
402TEST_F(WatchdogInternalHandlerTest, TestNotifyBootPhaseChangeWithNonBootCompletedPhase) {
403 setSystemCallingUid();
404 aawi::StateType type = aawi::StateType::BOOT_PHASE;
405 EXPECT_CALL(*mMockWatchdogPerfService, onBootFinished()).Times(0);
406 Status status = mWatchdogInternalHandler->notifySystemStateChange(type, 0, -1);
407 ASSERT_TRUE(status.isOk()) << status;
408}
409
410TEST_F(WatchdogInternalHandlerTest, TestErrorOnNotifySystemStateChangeWithNonSystemCallingUid) {
411 aawi::StateType type = aawi::StateType::POWER_CYCLE;
Lakshman Annadorai0a0a7872021-06-08 14:55:26 -0700412 EXPECT_CALL(*mMockWatchdogProcessService, setEnabled(_)).Times(0);
413 EXPECT_CALL(*mMockWatchdogPerfService, setSystemState(_)).Times(0);
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700414 Status status =
415 mWatchdogInternalHandler
416 ->notifySystemStateChange(type,
Lakshman Annadorai8a67df12021-06-29 19:33:37 -0700417 static_cast<int32_t>(
418 PowerCycle::POWER_CYCLE_SHUTDOWN_PREPARE),
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700419 -1);
420 ASSERT_FALSE(status.isOk()) << status;
421}
422
Lakshman Annadoraid1426502021-04-06 20:06:58 -0700423TEST_F(WatchdogInternalHandlerTest, TestUpdateResourceOveruseConfigurations) {
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700424 setSystemCallingUid();
Lakshman Annadoraid1426502021-04-06 20:06:58 -0700425 EXPECT_CALL(*mMockIoOveruseMonitor, updateResourceOveruseConfigurations(_))
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700426 .WillOnce(Return(Result<void>()));
Lakshman Annadoraid1426502021-04-06 20:06:58 -0700427 Status status = mWatchdogInternalHandler->updateResourceOveruseConfigurations(
428 std::vector<ResourceOveruseConfiguration>{});
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700429 ASSERT_TRUE(status.isOk()) << status;
430}
431
432TEST_F(WatchdogInternalHandlerTest,
Lakshman Annadoraid1426502021-04-06 20:06:58 -0700433 TestErrorOnUpdateResourceOveruseConfigurationsWithNonSystemCallingUid) {
434 EXPECT_CALL(*mMockIoOveruseMonitor, updateResourceOveruseConfigurations(_)).Times(0);
435 Status status = mWatchdogInternalHandler->updateResourceOveruseConfigurations(
436 std::vector<ResourceOveruseConfiguration>{});
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700437 ASSERT_FALSE(status.isOk()) << status;
438}
439
Lakshman Annadoraibc0afd02021-04-06 20:23:39 -0700440TEST_F(WatchdogInternalHandlerTest, TestGetResourceOveruseConfigurations) {
441 setSystemCallingUid();
442 std::vector<ResourceOveruseConfiguration> configs;
443 EXPECT_CALL(*mMockIoOveruseMonitor, getResourceOveruseConfigurations(Pointer(&configs)))
444 .WillOnce(Return(Result<void>()));
445 Status status = mWatchdogInternalHandler->getResourceOveruseConfigurations(&configs);
446 ASSERT_TRUE(status.isOk()) << status;
447}
448
449TEST_F(WatchdogInternalHandlerTest,
450 TestErrorOnGetResourceOveruseConfigurationsWithNonSystemCallingUid) {
451 EXPECT_CALL(*mMockIoOveruseMonitor, getResourceOveruseConfigurations(_)).Times(0);
452 std::vector<ResourceOveruseConfiguration> configs;
453 Status status = mWatchdogInternalHandler->getResourceOveruseConfigurations(&configs);
454 ASSERT_FALSE(status.isOk()) << status;
455}
456
Lakshman Annadorai9ed47322021-03-11 16:09:28 -0800457TEST_F(WatchdogInternalHandlerTest, TestActionTakenOnResourceOveruse) {
458 setSystemCallingUid();
459 EXPECT_CALL(*mMockIoOveruseMonitor, actionTakenOnIoOveruse(_)).WillOnce(Return(Result<void>()));
460 Status status = mWatchdogInternalHandler->actionTakenOnResourceOveruse(
461 std::vector<PackageResourceOveruseAction>{});
462 ASSERT_TRUE(status.isOk()) << status;
463}
464
465TEST_F(WatchdogInternalHandlerTest,
466 TestErrorOnActionTakenOnResourceOveruseWithNonSystemCallingUid) {
467 EXPECT_CALL(*mMockIoOveruseMonitor, actionTakenOnIoOveruse(_)).Times(0);
468 Status status = mWatchdogInternalHandler->actionTakenOnResourceOveruse(
469 std::vector<PackageResourceOveruseAction>{});
470 ASSERT_FALSE(status.isOk()) << status;
471}
472
Lakshman Annadorai774ba782020-10-30 10:20:41 -0700473} // namespace watchdog
474} // namespace automotive
475} // namespace android