/* * Copyright 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "MockIoOveruseMonitor.h" #include "MockWatchdogPerfService.h" #include "MockWatchdogProcessService.h" #include "MockWatchdogServiceHelper.h" #include "ThreadPriorityController.h" #include "WatchdogBinderMediator.h" #include "WatchdogInternalHandler.h" #include "WatchdogServiceHelper.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace android { namespace automotive { namespace watchdog { using ::aidl::android::automotive::watchdog::internal::BootPhase; using ::aidl::android::automotive::watchdog::internal::GarageMode; using ::aidl::android::automotive::watchdog::internal::ICarWatchdogMonitor; using ::aidl::android::automotive::watchdog::internal::ICarWatchdogMonitorDefault; using ::aidl::android::automotive::watchdog::internal::ICarWatchdogServiceForSystem; using ::aidl::android::automotive::watchdog::internal::ICarWatchdogServiceForSystemDefault; using ::aidl::android::automotive::watchdog::internal::PowerCycle; using ::aidl::android::automotive::watchdog::internal::ProcessIdentifier; using ::aidl::android::automotive::watchdog::internal::ResourceOveruseConfiguration; using ::aidl::android::automotive::watchdog::internal::StateType; using ::aidl::android::automotive::watchdog::internal::ThreadPolicyWithPriority; using ::aidl::android::automotive::watchdog::internal::UserPackageIoUsageStats; using ::aidl::android::automotive::watchdog::internal::UserState; using ::android::sp; using ::android::String16; using ::android::base::Result; using ::ndk::ScopedAStatus; using ::ndk::SharedRefBase; using ::ndk::SpAIBinder; using ::testing::_; using ::testing::ByMove; using ::testing::DoAll; using ::testing::Eq; using ::testing::Pointer; using ::testing::Return; using ::testing::SaveArg; namespace { constexpr const char kFailOnNonSystemCallingUidMessage[] = "should fail with non-system calling uid"; constexpr const char kFailOnWatchdogServiceHelperErrMessage[] = "should fail on watchdog service helper error"; class ScopedChangeCallingUid final : public RefBase { public: explicit ScopedChangeCallingUid(uid_t uid) { mCallingUid = IPCThreadState::self()->getCallingUid(); mCallingPid = IPCThreadState::self()->getCallingPid(); if (mCallingUid == uid) { return; } mChangedUid = uid; int64_t token = ((int64_t)mChangedUid << 32) | mCallingPid; IPCThreadState::self()->restoreCallingIdentity(token); } ~ScopedChangeCallingUid() { if (mCallingUid == mChangedUid) { return; } int64_t token = ((int64_t)mCallingUid << 32) | mCallingPid; IPCThreadState::self()->restoreCallingIdentity(token); } private: uid_t mCallingUid; uid_t mChangedUid; pid_t mCallingPid; }; MATCHER_P(PriorityEq, priority, "") { return (arg->sched_priority) == priority; } class MockThreadPriorityController : public ThreadPriorityControllerInterface { public: MOCK_METHOD(Result, setThreadPriority, (int pid, int tid, int uid, int policy, int priority), (override)); MOCK_METHOD(Result, getThreadPriority, (int pid, int tid, int uid, ThreadPolicyWithPriority* result), (override)); }; } // namespace namespace internal { class WatchdogInternalHandlerPeer final { public: explicit WatchdogInternalHandlerPeer(WatchdogInternalHandler* handler) : mHandler(handler) {} void setThreadPriorityController( std::unique_ptr controller) { mHandler->setThreadPriorityController(std::move(controller)); } private: WatchdogInternalHandler* mHandler; }; } // namespace internal class WatchdogInternalHandlerTest : public ::testing::Test { protected: virtual void SetUp() { mMockWatchdogProcessService = sp::make(); mMockWatchdogPerfService = sp::make(); mMockWatchdogServiceHelper = sp::make(); mMockIoOveruseMonitor = sp::make(); mWatchdogInternalHandler = SharedRefBase::make(mMockWatchdogServiceHelper, mMockWatchdogProcessService, mMockWatchdogPerfService, mMockIoOveruseMonitor); internal::WatchdogInternalHandlerPeer peer(mWatchdogInternalHandler.get()); std::unique_ptr threadPriorityController = std::make_unique(); mThreadPriorityController = threadPriorityController.get(); peer.setThreadPriorityController(std::move(threadPriorityController)); } virtual void TearDown() { mMockWatchdogServiceHelper.clear(); mMockWatchdogProcessService.clear(); mMockWatchdogPerfService.clear(); mMockIoOveruseMonitor.clear(); mWatchdogInternalHandler.reset(); mScopedChangeCallingUid.clear(); } // Sets calling UID to imitate System's process. void setSystemCallingUid() { mScopedChangeCallingUid = sp::make(AID_SYSTEM); } sp mMockWatchdogServiceHelper; sp mMockWatchdogProcessService; sp mMockWatchdogPerfService; sp mMockIoOveruseMonitor; std::shared_ptr mWatchdogInternalHandler; sp mScopedChangeCallingUid; MockThreadPriorityController* mThreadPriorityController; }; TEST_F(WatchdogInternalHandlerTest, TestTerminate) { ASSERT_NE(mWatchdogInternalHandler->mWatchdogServiceHelper, nullptr); ASSERT_NE(mWatchdogInternalHandler->mWatchdogProcessService, nullptr); ASSERT_NE(mWatchdogInternalHandler->mWatchdogPerfService, nullptr); ASSERT_NE(mWatchdogInternalHandler->mIoOveruseMonitor, nullptr); mWatchdogInternalHandler->terminate(); ASSERT_EQ(mWatchdogInternalHandler->mWatchdogServiceHelper, nullptr); ASSERT_EQ(mWatchdogInternalHandler->mWatchdogProcessService, nullptr); ASSERT_EQ(mWatchdogInternalHandler->mWatchdogPerfService, nullptr); ASSERT_EQ(mWatchdogInternalHandler->mIoOveruseMonitor, nullptr); } TEST_F(WatchdogInternalHandlerTest, TestDump) { ASSERT_EQ(mWatchdogInternalHandler->dump(-1, /*args=*/nullptr, /*numArgs=*/0), OK); } TEST_F(WatchdogInternalHandlerTest, TestRegisterCarWatchdogService) { setSystemCallingUid(); EXPECT_CALL(*mMockIoOveruseMonitor, isInitialized()).WillOnce(Return(false)); EXPECT_CALL(*mMockWatchdogPerfService, registerDataProcessor(Eq(mMockIoOveruseMonitor))) .WillOnce(Return(Result())); EXPECT_CALL(*mMockWatchdogPerfService, onCarWatchdogServiceRegistered()).Times(1); std::shared_ptr service = SharedRefBase::make(); EXPECT_CALL(*mMockWatchdogServiceHelper, registerService(service)) .WillOnce(Return(ByMove(ScopedAStatus::ok()))); auto status = mWatchdogInternalHandler->registerCarWatchdogService(service); ASSERT_TRUE(status.isOk()) << status.getMessage(); } TEST_F(WatchdogInternalHandlerTest, TestErrorOnRegisterCarWatchdogServiceWithNonSystemCallingUid) { EXPECT_CALL(*mMockWatchdogServiceHelper, registerService(_)).Times(0); std::shared_ptr service = SharedRefBase::make(); ASSERT_FALSE(mWatchdogInternalHandler->registerCarWatchdogService(service).isOk()) << "registerCarWatchdogService " << kFailOnNonSystemCallingUidMessage; } TEST_F(WatchdogInternalHandlerTest, TestErrorOnRegisterCarWatchdogServiceWithWatchdogServiceHelperError) { setSystemCallingUid(); std::shared_ptr service = SharedRefBase::make(); EXPECT_CALL(*mMockWatchdogServiceHelper, registerService(service)) .WillOnce(Return(ByMove(ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_STATE, "Illegal state")))); ASSERT_FALSE(mWatchdogInternalHandler->registerCarWatchdogService(service).isOk()) << "registerCarWatchdogService " << kFailOnWatchdogServiceHelperErrMessage; } TEST_F(WatchdogInternalHandlerTest, TestUnregisterCarWatchdogService) { setSystemCallingUid(); std::shared_ptr service = SharedRefBase::make(); EXPECT_CALL(*mMockWatchdogServiceHelper, unregisterService(service)) .WillOnce(Return(ByMove(ScopedAStatus::ok()))); auto status = mWatchdogInternalHandler->unregisterCarWatchdogService(service); ASSERT_TRUE(status.isOk()) << status.getMessage(); } TEST_F(WatchdogInternalHandlerTest, TestErrorOnUnregisterCarWatchdogServiceWithNonSystemCallingUid) { std::shared_ptr service = SharedRefBase::make(); EXPECT_CALL(*mMockWatchdogServiceHelper, unregisterService(service)).Times(0); ASSERT_FALSE(mWatchdogInternalHandler->unregisterCarWatchdogService(service).isOk()) << "unregisterCarWatchdogService " << kFailOnNonSystemCallingUidMessage; } TEST_F(WatchdogInternalHandlerTest, TestErrorOnUnregisterCarWatchdogServiceWithWatchdogServiceHelperError) { setSystemCallingUid(); std::shared_ptr service = SharedRefBase::make(); EXPECT_CALL(*mMockWatchdogServiceHelper, unregisterService(service)) .WillOnce(Return( ByMove(ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT, "Illegal argument")))); ASSERT_FALSE(mWatchdogInternalHandler->unregisterCarWatchdogService(service).isOk()) << "unregisterCarWatchdogService " << kFailOnWatchdogServiceHelperErrMessage; } TEST_F(WatchdogInternalHandlerTest, TestRegisterMonitor) { setSystemCallingUid(); std::shared_ptr monitor = SharedRefBase::make(); EXPECT_CALL(*mMockWatchdogProcessService, registerMonitor(monitor)) .WillOnce(Return(ByMove(ScopedAStatus::ok()))); auto status = mWatchdogInternalHandler->registerMonitor(monitor); ASSERT_TRUE(status.isOk()) << status.getMessage(); } TEST_F(WatchdogInternalHandlerTest, TestErrorOnRegisterMonitorWithNonSystemCallingUid) { std::shared_ptr monitor = SharedRefBase::make(); EXPECT_CALL(*mMockWatchdogProcessService, registerMonitor(monitor)).Times(0); ASSERT_FALSE(mWatchdogInternalHandler->registerMonitor(monitor).isOk()) << "registerMonitor " << kFailOnNonSystemCallingUidMessage; } TEST_F(WatchdogInternalHandlerTest, TestUnregisterMonitor) { setSystemCallingUid(); std::shared_ptr monitor = SharedRefBase::make(); EXPECT_CALL(*mMockWatchdogProcessService, unregisterMonitor(monitor)) .WillOnce(Return(ByMove(ScopedAStatus::ok()))); auto status = mWatchdogInternalHandler->unregisterMonitor(monitor); ASSERT_TRUE(status.isOk()) << status.getMessage(); } TEST_F(WatchdogInternalHandlerTest, TestErrorOnUnregisterMonitorWithNonSystemCallingUid) { std::shared_ptr monitor = SharedRefBase::make(); EXPECT_CALL(*mMockWatchdogProcessService, unregisterMonitor(monitor)).Times(0); ASSERT_FALSE(mWatchdogInternalHandler->unregisterMonitor(monitor).isOk()) << "unregisterMonitor " << kFailOnNonSystemCallingUidMessage; } TEST_F(WatchdogInternalHandlerTest, TestCarWatchdogServiceAlive) { setSystemCallingUid(); std::shared_ptr service = SharedRefBase::make(); std::vector clientsNotResponding; ProcessIdentifier processIdentifier; processIdentifier.pid = 123; clientsNotResponding.push_back(processIdentifier); EXPECT_CALL(*mMockWatchdogProcessService, tellCarWatchdogServiceAlive(service, clientsNotResponding, 456)) .WillOnce(Return(ByMove(ScopedAStatus::ok()))); auto status = mWatchdogInternalHandler->tellCarWatchdogServiceAlive(service, clientsNotResponding, 456); ASSERT_TRUE(status.isOk()) << status.getMessage(); } TEST_F(WatchdogInternalHandlerTest, TestErrorOnCarWatchdogServiceWithNonSystemCallingUid) { EXPECT_CALL(*mMockWatchdogProcessService, tellCarWatchdogServiceAlive(_, _, _)).Times(0); std::shared_ptr service = SharedRefBase::make(); std::vector clientsNotResponding; ProcessIdentifier processIdentifier; processIdentifier.pid = 123; clientsNotResponding.push_back(processIdentifier); auto status = mWatchdogInternalHandler->tellCarWatchdogServiceAlive(service, clientsNotResponding, 456); ASSERT_FALSE(status.isOk()) << "tellCarWatchdogServiceAlive " << kFailOnNonSystemCallingUidMessage; } TEST_F(WatchdogInternalHandlerTest, TestTellDumpFinished) { setSystemCallingUid(); std::shared_ptr monitor = SharedRefBase::make(); ProcessIdentifier processIdentifier; processIdentifier.pid = 456; EXPECT_CALL(*mMockWatchdogProcessService, tellDumpFinished(monitor, processIdentifier)) .WillOnce(Return(ByMove(ScopedAStatus::ok()))); auto status = mWatchdogInternalHandler->tellDumpFinished(monitor, processIdentifier); ASSERT_TRUE(status.isOk()) << status.getMessage(); } TEST_F(WatchdogInternalHandlerTest, TestErrorOnTellDumpFinishedWithNonSystemCallingUid) { EXPECT_CALL(*mMockWatchdogProcessService, tellDumpFinished(_, _)).Times(0); ProcessIdentifier processIdentifier; processIdentifier.pid = 456; std::shared_ptr monitor = SharedRefBase::make(); ASSERT_FALSE(mWatchdogInternalHandler->tellDumpFinished(monitor, processIdentifier).isOk()) << "tellDumpFinished " << kFailOnNonSystemCallingUidMessage; } TEST_F(WatchdogInternalHandlerTest, TestNotifyPowerCycleChangeToShutdownPrepare) { setSystemCallingUid(); EXPECT_CALL(*mMockWatchdogProcessService, setEnabled(/*isEnabled=*/false)).Times(1); auto status = mWatchdogInternalHandler ->notifySystemStateChange(StateType::POWER_CYCLE, static_cast( PowerCycle::POWER_CYCLE_SHUTDOWN_PREPARE), -1); ASSERT_TRUE(status.isOk()) << status.getMessage(); } TEST_F(WatchdogInternalHandlerTest, TestNotifyPowerCycleChangeToShutdownEnter) { setSystemCallingUid(); EXPECT_CALL(*mMockWatchdogProcessService, setEnabled(/*isEnabled=*/false)).Times(1); EXPECT_CALL(*mMockWatchdogPerfService, onShutdownEnter()).Times(1); auto status = mWatchdogInternalHandler ->notifySystemStateChange(StateType::POWER_CYCLE, static_cast( PowerCycle::POWER_CYCLE_SHUTDOWN_ENTER), -1); ASSERT_TRUE(status.isOk()) << status.getMessage(); } TEST_F(WatchdogInternalHandlerTest, TestNotifyPowerCycleChangeToResume) { setSystemCallingUid(); EXPECT_CALL(*mMockWatchdogProcessService, setEnabled(/*isEnabled=*/true)).Times(1); auto status = mWatchdogInternalHandler ->notifySystemStateChange(StateType::POWER_CYCLE, static_cast(PowerCycle::POWER_CYCLE_RESUME), -1); ASSERT_TRUE(status.isOk()) << status.getMessage(); } TEST_F(WatchdogInternalHandlerTest, TestNotifyPowerCycleChangeToSuspendExit) { setSystemCallingUid(); EXPECT_CALL(*mMockWatchdogPerfService, onSuspendExit()).Times(1); auto status = mWatchdogInternalHandler ->notifySystemStateChange(StateType::POWER_CYCLE, static_cast( PowerCycle::POWER_CYCLE_SUSPEND_EXIT), -1); ASSERT_TRUE(status.isOk()) << status.getMessage(); } TEST_F(WatchdogInternalHandlerTest, TestErrorOnNotifyPowerCycleChangeWithInvalidArgs) { EXPECT_CALL(*mMockWatchdogProcessService, setEnabled(_)).Times(0); EXPECT_CALL(*mMockWatchdogPerfService, setSystemState(_)).Times(0); StateType type = StateType::POWER_CYCLE; ASSERT_FALSE(mWatchdogInternalHandler->notifySystemStateChange(type, -1, -1).isOk()) << "notifySystemStateChange should fail with negative power cycle"; ASSERT_FALSE(mWatchdogInternalHandler->notifySystemStateChange(type, 3000, -1).isOk()) << "notifySystemStateChange should fail with invalid power cycle"; } TEST_F(WatchdogInternalHandlerTest, TestNotifyGarageModeOn) { setSystemCallingUid(); EXPECT_CALL(*mMockWatchdogPerfService, setSystemState(SystemState::GARAGE_MODE)).Times(1); auto status = mWatchdogInternalHandler->notifySystemStateChange(StateType::GARAGE_MODE, static_cast( GarageMode::GARAGE_MODE_ON), -1); ASSERT_TRUE(status.isOk()) << status.getMessage(); } TEST_F(WatchdogInternalHandlerTest, TestNotifyGarageModeOff) { setSystemCallingUid(); EXPECT_CALL(*mMockWatchdogPerfService, setSystemState(SystemState::NORMAL_MODE)).Times(1); auto status = mWatchdogInternalHandler->notifySystemStateChange(StateType::GARAGE_MODE, static_cast( GarageMode::GARAGE_MODE_OFF), -1); ASSERT_TRUE(status.isOk()) << status.getMessage(); } TEST_F(WatchdogInternalHandlerTest, TestOnUserStateChangeWithStartedUser) { setSystemCallingUid(); StateType type = StateType::USER_STATE; EXPECT_CALL(*mMockWatchdogProcessService, onUserStateChange(234567, /*isStarted=*/true)); auto status = mWatchdogInternalHandler ->notifySystemStateChange(type, 234567, static_cast(UserState::USER_STATE_STARTED)); ASSERT_TRUE(status.isOk()) << status.getMessage(); } TEST_F(WatchdogInternalHandlerTest, TestOnUserStateChangeWithSwitchingUser) { setSystemCallingUid(); StateType type = StateType::USER_STATE; EXPECT_CALL(*mMockWatchdogPerfService, onUserStateChange(234567, UserState::USER_STATE_SWITCHING)); auto status = mWatchdogInternalHandler ->notifySystemStateChange(type, 234567, static_cast( UserState::USER_STATE_SWITCHING)); ASSERT_TRUE(status.isOk()) << status.getMessage(); } TEST_F(WatchdogInternalHandlerTest, TestOnUserStateChangeWithUnlockingUser) { setSystemCallingUid(); StateType type = StateType::USER_STATE; EXPECT_CALL(*mMockWatchdogPerfService, onUserStateChange(234567, UserState::USER_STATE_UNLOCKING)); auto status = mWatchdogInternalHandler ->notifySystemStateChange(type, 234567, static_cast( UserState::USER_STATE_UNLOCKING)); ASSERT_TRUE(status.isOk()) << status.getMessage(); } TEST_F(WatchdogInternalHandlerTest, TestOnUserStateChangeWithPostUnlockedUser) { setSystemCallingUid(); StateType type = StateType::USER_STATE; EXPECT_CALL(*mMockWatchdogPerfService, onUserStateChange(234567, UserState::USER_STATE_POST_UNLOCKED)); auto status = mWatchdogInternalHandler ->notifySystemStateChange(type, 234567, static_cast( UserState::USER_STATE_POST_UNLOCKED)); ASSERT_TRUE(status.isOk()) << status.getMessage(); } TEST_F(WatchdogInternalHandlerTest, TestOnUserStateChangeWithStoppedUser) { setSystemCallingUid(); StateType type = StateType::USER_STATE; EXPECT_CALL(*mMockWatchdogProcessService, onUserStateChange(234567, /*isStarted=*/false)); auto status = mWatchdogInternalHandler ->notifySystemStateChange(type, 234567, static_cast(UserState::USER_STATE_STOPPED)); ASSERT_TRUE(status.isOk()) << status.getMessage(); } TEST_F(WatchdogInternalHandlerTest, TestOnUserStateChangeWithRemovedUser) { setSystemCallingUid(); EXPECT_CALL(*mMockIoOveruseMonitor, removeStatsForUser(/*userId=*/234567)); StateType type = StateType::USER_STATE; auto status = mWatchdogInternalHandler ->notifySystemStateChange(type, 234567, static_cast(UserState::USER_STATE_REMOVED)); ASSERT_TRUE(status.isOk()) << status.getMessage(); } TEST_F(WatchdogInternalHandlerTest, TestErrorOnOnUserStateChangeWithInvalidArgs) { EXPECT_CALL(*mMockWatchdogProcessService, onUserStateChange(_, _)).Times(0); StateType type = StateType::USER_STATE; ASSERT_FALSE(mWatchdogInternalHandler->notifySystemStateChange(type, 234567, -1).isOk()) << "notifySystemStateChange should fail with negative user state"; ASSERT_FALSE(mWatchdogInternalHandler->notifySystemStateChange(type, 234567, 3000).isOk()) << "notifySystemStateChange should fail with invalid user state"; } TEST_F(WatchdogInternalHandlerTest, TestNotifyBootPhaseChange) { setSystemCallingUid(); EXPECT_CALL(*mMockWatchdogPerfService, onBootFinished()).WillOnce(Return(Result())); StateType type = StateType::BOOT_PHASE; auto status = mWatchdogInternalHandler->notifySystemStateChange(type, static_cast( BootPhase::BOOT_COMPLETED), -1); ASSERT_TRUE(status.isOk()) << status.getMessage(); } TEST_F(WatchdogInternalHandlerTest, TestNotifyBootPhaseChangeWithNonBootCompletedPhase) { setSystemCallingUid(); EXPECT_CALL(*mMockWatchdogPerfService, onBootFinished()).Times(0); StateType type = StateType::BOOT_PHASE; auto status = mWatchdogInternalHandler->notifySystemStateChange(type, 0, -1); ASSERT_TRUE(status.isOk()) << status.getMessage(); } TEST_F(WatchdogInternalHandlerTest, TestErrorOnNotifySystemStateChangeWithNonSystemCallingUid) { EXPECT_CALL(*mMockWatchdogProcessService, setEnabled(_)).Times(0); EXPECT_CALL(*mMockWatchdogPerfService, setSystemState(_)).Times(0); StateType type = StateType::POWER_CYCLE; auto status = mWatchdogInternalHandler ->notifySystemStateChange(type, static_cast( PowerCycle::POWER_CYCLE_SHUTDOWN_PREPARE), -1); ASSERT_FALSE(status.isOk()) << "notifySystemStateChange " << kFailOnNonSystemCallingUidMessage; } TEST_F(WatchdogInternalHandlerTest, TestUpdateResourceOveruseConfigurations) { setSystemCallingUid(); EXPECT_CALL(*mMockIoOveruseMonitor, updateResourceOveruseConfigurations(_)) .WillOnce(Return(Result())); auto status = mWatchdogInternalHandler->updateResourceOveruseConfigurations( std::vector{}); ASSERT_TRUE(status.isOk()) << status.getMessage(); } TEST_F(WatchdogInternalHandlerTest, TestErrorOnUpdateResourceOveruseConfigurationsWithNonSystemCallingUid) { EXPECT_CALL(*mMockIoOveruseMonitor, updateResourceOveruseConfigurations(_)).Times(0); auto status = mWatchdogInternalHandler->updateResourceOveruseConfigurations( std::vector{}); ASSERT_FALSE(status.isOk()) << "updateResourceOveruseConfigurations " << kFailOnNonSystemCallingUidMessage; } TEST_F(WatchdogInternalHandlerTest, TestGetResourceOveruseConfigurations) { setSystemCallingUid(); std::vector configs; EXPECT_CALL(*mMockIoOveruseMonitor, getResourceOveruseConfigurations(Pointer(&configs))) .WillOnce(Return(Result())); auto status = mWatchdogInternalHandler->getResourceOveruseConfigurations(&configs); ASSERT_TRUE(status.isOk()) << status.getMessage(); } TEST_F(WatchdogInternalHandlerTest, TestErrorOnGetResourceOveruseConfigurationsWithNonSystemCallingUid) { EXPECT_CALL(*mMockIoOveruseMonitor, getResourceOveruseConfigurations(_)).Times(0); std::vector configs; ASSERT_FALSE(mWatchdogInternalHandler->getResourceOveruseConfigurations(&configs).isOk()) << "getResourceOveruseConfigurations " << kFailOnNonSystemCallingUidMessage; } TEST_F(WatchdogInternalHandlerTest, TestControlProcessHealthCheck) { setSystemCallingUid(); EXPECT_CALL(*mMockWatchdogProcessService, setEnabled(/*isEnabled=*/true)).Times(1); auto status = mWatchdogInternalHandler->controlProcessHealthCheck(/*enable=*/true); ASSERT_TRUE(status.isOk()) << status.getMessage(); } TEST_F(WatchdogInternalHandlerTest, TestErrorOnControlProcessHealthCheckWithNonSystemCallingUid) { EXPECT_CALL(*mMockWatchdogProcessService, setEnabled(_)).Times(0); ASSERT_FALSE(mWatchdogInternalHandler->controlProcessHealthCheck(/*enable=*/true).isOk()) << "controlProcessHealthCheck " << kFailOnNonSystemCallingUidMessage; } TEST_F(WatchdogInternalHandlerTest, TestSetThreadPriority) { setSystemCallingUid(); int testPid = 1; int testTid = 2; int testUid = 3; int policy = SCHED_FIFO; int priority = 1; EXPECT_CALL(*mThreadPriorityController, setThreadPriority(testPid, testTid, testUid, policy, priority)) .WillOnce(Return(Result())); auto status = mWatchdogInternalHandler->setThreadPriority(testPid, testTid, testUid, policy, priority); ASSERT_TRUE(status.isOk()) << status.getMessage(); } TEST_F(WatchdogInternalHandlerTest, TestGetThreadPriority) { setSystemCallingUid(); int testPid = 1; int testTid = 2; int testUid = 3; int expectedPolicy = SCHED_FIFO; int expectedPriority = 1; EXPECT_CALL(*mThreadPriorityController, getThreadPriority(testPid, testTid, testUid, _)) .WillOnce([expectedPolicy, expectedPriority](int, int, int, ThreadPolicyWithPriority* result) { result->policy = expectedPolicy; result->priority = expectedPriority; return Result(); }); ThreadPolicyWithPriority actual; auto status = mWatchdogInternalHandler->getThreadPriority(testPid, testTid, testUid, &actual); ASSERT_TRUE(status.isOk()) << status.getMessage(); EXPECT_EQ(actual.policy, expectedPolicy); EXPECT_EQ(actual.priority, expectedPriority); } TEST_F(WatchdogInternalHandlerTest, TestOnAidlVhalPidFetched) { setSystemCallingUid(); int vhalPid = 56423; EXPECT_CALL(*mMockWatchdogProcessService, onAidlVhalPidFetched(vhalPid)).Times(1); auto status = mWatchdogInternalHandler->onAidlVhalPidFetched(vhalPid); ASSERT_TRUE(status.isOk()) << status.getMessage(); } TEST_F(WatchdogInternalHandlerTest, TestErrorOnOnAidlVhalPidFetchedWithNonSystemCallingUid) { EXPECT_CALL(*mMockWatchdogProcessService, onAidlVhalPidFetched(_)).Times(0); ASSERT_FALSE(mWatchdogInternalHandler->onAidlVhalPidFetched(56423).isOk()) << "onAidlVhalPidFetched " << kFailOnNonSystemCallingUidMessage; } TEST_F(WatchdogInternalHandlerTest, TestOnTodayIoUsageStatsFetched) { setSystemCallingUid(); std::vector userPackageIoUsageStats = {}; EXPECT_CALL(*mMockIoOveruseMonitor, onTodayIoUsageStatsFetched(userPackageIoUsageStats)) .Times(1); auto status = mWatchdogInternalHandler->onTodayIoUsageStatsFetched(userPackageIoUsageStats); ASSERT_TRUE(status.isOk()) << status.getMessage(); } TEST_F(WatchdogInternalHandlerTest, TestErrorOnOnTodayIoUsageStatsFetchedWithNonSystemCallingUid) { EXPECT_CALL(*mMockIoOveruseMonitor, onTodayIoUsageStatsFetched(_)).Times(0); ASSERT_FALSE(mWatchdogInternalHandler->onTodayIoUsageStatsFetched({}).isOk()) << "onTodayIoUsageStatsFetched " << kFailOnNonSystemCallingUidMessage; } } // namespace watchdog } // namespace automotive } // namespace android