| /* |
| * Copyright (C) 2022 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 "host/hal_generic/aidl/event_logger.h" |
| |
| #include "aidl/android/hardware/contexthub/NanoappBinary.h" |
| #include "chre_host/generated/host_messages_generated.h" |
| #include "gmock/gmock.h" |
| #include "gtest/gtest.h" |
| |
| namespace aidl::android::hardware::contexthub { |
| namespace { |
| |
| using ::testing::IsEmpty; |
| using ::testing::Not; |
| |
| // Exposes protected members for testing. |
| class TestEventLogger : public EventLogger { |
| public: |
| void setNowMs(int64_t ms) { |
| mNowMs = ms; |
| } |
| |
| using EventLogger::NanoappLoad; |
| |
| const auto &nanoappLoads() { |
| return mNanoappLoads; |
| } |
| |
| const auto &nanoappUnloads() { |
| return mNanoappUnloads; |
| } |
| |
| const auto &contextHubRestarts() { |
| return mContextHubRestarts; |
| } |
| |
| const auto &messagesToNanoapp() { |
| return mMsgToNanoapp; |
| } |
| |
| const auto &messagesFromNanoapp() { |
| return mMsgFromNanoapp; |
| } |
| }; |
| |
| TEST(EventLogger, keepTheMostRecentNanoappLoads) { |
| TestEventLogger log; |
| for (int i = 0; i < EventLogger::kMaxNanoappEvents + 10; ++i) { |
| NanoappBinary app; |
| app.nanoappId = i; |
| log.logNanoappLoad(app, true); |
| } |
| |
| EXPECT_EQ(log.nanoappLoads().size(), EventLogger::kMaxNanoappEvents); |
| |
| for (int i = 0; i < EventLogger::kMaxNanoappEvents; ++i) { |
| EXPECT_EQ(log.nanoappLoads()[i].id, i + 10); |
| } |
| } |
| |
| TEST(EventLogger, keepTheMostRecentNanoappUnloads) { |
| TestEventLogger log; |
| for (int i = 0; i < EventLogger::kMaxNanoappEvents + 10; ++i) { |
| log.logNanoappUnload(i, true); |
| } |
| |
| EXPECT_EQ(log.nanoappUnloads().size(), EventLogger::kMaxNanoappEvents); |
| |
| for (int i = 0; i < EventLogger::kMaxNanoappEvents; ++i) { |
| EXPECT_EQ(log.nanoappUnloads()[i].id, i + 10); |
| } |
| } |
| |
| TEST(EventLogger, keepTheMostRecentContextHubRestarts) { |
| TestEventLogger log; |
| for (int i = 0; i < EventLogger::kMaxRestartEvents + 10; ++i) { |
| log.setNowMs(i); |
| log.logContextHubRestart(); |
| } |
| |
| EXPECT_EQ(log.contextHubRestarts().size(), EventLogger::kMaxRestartEvents); |
| |
| for (int i = 0; i < EventLogger::kMaxRestartEvents; ++i) { |
| EXPECT_EQ(log.contextHubRestarts()[i], i + 10); |
| } |
| } |
| |
| TEST(EventLogger, keepTheMostRecentMessagesToNanoapp) { |
| TestEventLogger log; |
| for (int i = 0; i < EventLogger::kMaxMessageEvents + 10; ++i) { |
| ContextHubMessage msg; |
| msg.nanoappId = i; |
| log.logMessageToNanoapp(msg, true); |
| } |
| |
| EXPECT_EQ(log.messagesToNanoapp().size(), EventLogger::kMaxMessageEvents); |
| |
| for (int i = 0; i < EventLogger::kMaxMessageEvents; ++i) { |
| EXPECT_EQ(log.messagesToNanoapp()[i].id, i + 10); |
| } |
| } |
| |
| TEST(EventLogger, keepTheMostRecentMessagesFromNanoapp) { |
| TestEventLogger log; |
| for (int i = 0; i < EventLogger::kMaxMessageEvents + 10; ++i) { |
| chre::fbs::NanoappMessageT msg; |
| msg.app_id = i; |
| log.logMessageFromNanoapp(msg); |
| } |
| |
| EXPECT_EQ(log.messagesFromNanoapp().size(), EventLogger::kMaxMessageEvents); |
| |
| for (int i = 0; i < EventLogger::kMaxMessageEvents; ++i) { |
| EXPECT_EQ(log.messagesFromNanoapp()[i].id, i + 10); |
| } |
| } |
| |
| TEST(EventLogger, dumpTheEventsAsString) { |
| TestEventLogger log; |
| |
| log.setNowMs(10); |
| NanoappBinary app; |
| app.nanoappId = 1; |
| app.nanoappVersion = 2; |
| app.customBinary = {1, 2, 3}; |
| log.logNanoappLoad(app, true); |
| |
| log.setNowMs(20); |
| log.logNanoappUnload(2, true); |
| |
| log.setNowMs(30); |
| log.logContextHubRestart(); |
| |
| log.setNowMs(40); |
| ContextHubMessage toMsg; |
| toMsg.nanoappId = 4; |
| toMsg.messageBody = {1, 2, 3}; |
| log.logMessageToNanoapp(toMsg, true); |
| |
| log.setNowMs(50); |
| chre::fbs::NanoappMessageT fromMsg; |
| fromMsg.app_id = 5; |
| fromMsg.message = {1, 2, 3}; |
| log.logMessageFromNanoapp(fromMsg); |
| |
| EXPECT_THAT(log.dump(), Not(IsEmpty())); |
| } |
| |
| } // namespace |
| } // namespace aidl::android::hardware::contexthub |