1 /*
2 * Copyright (C) 2022 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 "host/hal_generic/aidl/event_logger.h"
18
19 #include "aidl/android/hardware/contexthub/NanoappBinary.h"
20 #include "chre_host/generated/host_messages_generated.h"
21 #include "gmock/gmock.h"
22 #include "gtest/gtest.h"
23
24 namespace aidl::android::hardware::contexthub {
25 namespace {
26
27 using ::testing::IsEmpty;
28 using ::testing::Not;
29
30 // Exposes protected members for testing.
31 class TestEventLogger : public EventLogger {
32 public:
setNowMs(int64_t ms)33 void setNowMs(int64_t ms) {
34 mNowMs = ms;
35 }
36
37 using EventLogger::NanoappLoad;
38
nanoappLoads()39 const auto &nanoappLoads() {
40 return mNanoappLoads;
41 }
42
nanoappUnloads()43 const auto &nanoappUnloads() {
44 return mNanoappUnloads;
45 }
46
contextHubRestarts()47 const auto &contextHubRestarts() {
48 return mContextHubRestarts;
49 }
50
messagesToNanoapp()51 const auto &messagesToNanoapp() {
52 return mMsgToNanoapp;
53 }
54
messagesFromNanoapp()55 const auto &messagesFromNanoapp() {
56 return mMsgFromNanoapp;
57 }
58 };
59
TEST(EventLogger,keepTheMostRecentNanoappLoads)60 TEST(EventLogger, keepTheMostRecentNanoappLoads) {
61 TestEventLogger log;
62 for (int i = 0; i < EventLogger::kMaxNanoappEvents + 10; ++i) {
63 log.logNanoappLoad(/* appId= */ i, /* appSize= */ 0, /* appVersion= */ 0,
64 /* success= */ true);
65 }
66
67 EXPECT_EQ(log.nanoappLoads().size(), EventLogger::kMaxNanoappEvents);
68
69 for (int i = 0; i < EventLogger::kMaxNanoappEvents; ++i) {
70 EXPECT_EQ(log.nanoappLoads()[i].id, i + 10);
71 }
72 }
73
TEST(EventLogger,keepTheMostRecentNanoappUnloads)74 TEST(EventLogger, keepTheMostRecentNanoappUnloads) {
75 TestEventLogger log;
76 for (int i = 0; i < EventLogger::kMaxNanoappEvents + 10; ++i) {
77 log.logNanoappUnload(i, true);
78 }
79
80 EXPECT_EQ(log.nanoappUnloads().size(), EventLogger::kMaxNanoappEvents);
81
82 for (int i = 0; i < EventLogger::kMaxNanoappEvents; ++i) {
83 EXPECT_EQ(log.nanoappUnloads()[i].id, i + 10);
84 }
85 }
86
TEST(EventLogger,keepTheMostRecentContextHubRestarts)87 TEST(EventLogger, keepTheMostRecentContextHubRestarts) {
88 TestEventLogger log;
89 for (int i = 0; i < EventLogger::kMaxRestartEvents + 10; ++i) {
90 log.setNowMs(i);
91 log.logContextHubRestart();
92 }
93
94 EXPECT_EQ(log.contextHubRestarts().size(), EventLogger::kMaxRestartEvents);
95
96 for (int i = 0; i < EventLogger::kMaxRestartEvents; ++i) {
97 EXPECT_EQ(log.contextHubRestarts()[i], i + 10);
98 }
99 }
100
TEST(EventLogger,keepTheMostRecentMessagesToNanoapp)101 TEST(EventLogger, keepTheMostRecentMessagesToNanoapp) {
102 TestEventLogger log;
103 for (int i = 0; i < EventLogger::kMaxMessageEvents + 10; ++i) {
104 ContextHubMessage msg;
105 msg.nanoappId = i;
106 log.logMessageToNanoapp(msg, true);
107 }
108
109 EXPECT_EQ(log.messagesToNanoapp().size(), EventLogger::kMaxMessageEvents);
110
111 for (int i = 0; i < EventLogger::kMaxMessageEvents; ++i) {
112 EXPECT_EQ(log.messagesToNanoapp()[i].id, i + 10);
113 }
114 }
115
TEST(EventLogger,keepTheMostRecentMessagesFromNanoapp)116 TEST(EventLogger, keepTheMostRecentMessagesFromNanoapp) {
117 TestEventLogger log;
118 for (int i = 0; i < EventLogger::kMaxMessageEvents + 10; ++i) {
119 chre::fbs::NanoappMessageT msg;
120 msg.app_id = i;
121 log.logMessageFromNanoapp(msg);
122 }
123
124 EXPECT_EQ(log.messagesFromNanoapp().size(), EventLogger::kMaxMessageEvents);
125
126 for (int i = 0; i < EventLogger::kMaxMessageEvents; ++i) {
127 EXPECT_EQ(log.messagesFromNanoapp()[i].id, i + 10);
128 }
129 }
130
TEST(EventLogger,dumpTheEventsAsString)131 TEST(EventLogger, dumpTheEventsAsString) {
132 TestEventLogger log;
133
134 log.setNowMs(10);
135 log.logNanoappLoad(/* appId= */ 1, /* appSize= */ 2, /* appVersion= */ 3,
136 /* success= */ true);
137
138 log.setNowMs(20);
139 log.logNanoappUnload(2, true);
140
141 log.setNowMs(30);
142 log.logContextHubRestart();
143
144 log.setNowMs(40);
145 ContextHubMessage toMsg;
146 toMsg.nanoappId = 4;
147 toMsg.messageBody = {1, 2, 3};
148 log.logMessageToNanoapp(toMsg, true);
149
150 log.setNowMs(50);
151 chre::fbs::NanoappMessageT fromMsg;
152 fromMsg.app_id = 5;
153 fromMsg.message = {1, 2, 3};
154 log.logMessageFromNanoapp(fromMsg);
155
156 EXPECT_THAT(log.dump(), Not(IsEmpty()));
157 }
158
159 } // namespace
160 } // namespace aidl::android::hardware::contexthub
161