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 NanoappBinary app;
64 app.nanoappId = i;
65 log.logNanoappLoad(app, true);
66 }
67
68 EXPECT_EQ(log.nanoappLoads().size(), EventLogger::kMaxNanoappEvents);
69
70 for (int i = 0; i < EventLogger::kMaxNanoappEvents; ++i) {
71 EXPECT_EQ(log.nanoappLoads()[i].id, i + 10);
72 }
73 }
74
TEST(EventLogger,keepTheMostRecentNanoappUnloads)75 TEST(EventLogger, keepTheMostRecentNanoappUnloads) {
76 TestEventLogger log;
77 for (int i = 0; i < EventLogger::kMaxNanoappEvents + 10; ++i) {
78 log.logNanoappUnload(i, true);
79 }
80
81 EXPECT_EQ(log.nanoappUnloads().size(), EventLogger::kMaxNanoappEvents);
82
83 for (int i = 0; i < EventLogger::kMaxNanoappEvents; ++i) {
84 EXPECT_EQ(log.nanoappUnloads()[i].id, i + 10);
85 }
86 }
87
TEST(EventLogger,keepTheMostRecentContextHubRestarts)88 TEST(EventLogger, keepTheMostRecentContextHubRestarts) {
89 TestEventLogger log;
90 for (int i = 0; i < EventLogger::kMaxRestartEvents + 10; ++i) {
91 log.setNowMs(i);
92 log.logContextHubRestart();
93 }
94
95 EXPECT_EQ(log.contextHubRestarts().size(), EventLogger::kMaxRestartEvents);
96
97 for (int i = 0; i < EventLogger::kMaxRestartEvents; ++i) {
98 EXPECT_EQ(log.contextHubRestarts()[i], i + 10);
99 }
100 }
101
TEST(EventLogger,keepTheMostRecentMessagesToNanoapp)102 TEST(EventLogger, keepTheMostRecentMessagesToNanoapp) {
103 TestEventLogger log;
104 for (int i = 0; i < EventLogger::kMaxMessageEvents + 10; ++i) {
105 ContextHubMessage msg;
106 msg.nanoappId = i;
107 log.logMessageToNanoapp(msg, true);
108 }
109
110 EXPECT_EQ(log.messagesToNanoapp().size(), EventLogger::kMaxMessageEvents);
111
112 for (int i = 0; i < EventLogger::kMaxMessageEvents; ++i) {
113 EXPECT_EQ(log.messagesToNanoapp()[i].id, i + 10);
114 }
115 }
116
TEST(EventLogger,keepTheMostRecentMessagesFromNanoapp)117 TEST(EventLogger, keepTheMostRecentMessagesFromNanoapp) {
118 TestEventLogger log;
119 for (int i = 0; i < EventLogger::kMaxMessageEvents + 10; ++i) {
120 chre::fbs::NanoappMessageT msg;
121 msg.app_id = i;
122 log.logMessageFromNanoapp(msg);
123 }
124
125 EXPECT_EQ(log.messagesFromNanoapp().size(), EventLogger::kMaxMessageEvents);
126
127 for (int i = 0; i < EventLogger::kMaxMessageEvents; ++i) {
128 EXPECT_EQ(log.messagesFromNanoapp()[i].id, i + 10);
129 }
130 }
131
TEST(EventLogger,dumpTheEventsAsString)132 TEST(EventLogger, dumpTheEventsAsString) {
133 TestEventLogger log;
134
135 log.setNowMs(10);
136 NanoappBinary app;
137 app.nanoappId = 1;
138 app.nanoappVersion = 2;
139 app.customBinary = {1, 2, 3};
140 log.logNanoappLoad(app, true);
141
142 log.setNowMs(20);
143 log.logNanoappUnload(2, true);
144
145 log.setNowMs(30);
146 log.logContextHubRestart();
147
148 log.setNowMs(40);
149 ContextHubMessage toMsg;
150 toMsg.nanoappId = 4;
151 toMsg.messageBody = {1, 2, 3};
152 log.logMessageToNanoapp(toMsg, true);
153
154 log.setNowMs(50);
155 chre::fbs::NanoappMessageT fromMsg;
156 fromMsg.app_id = 5;
157 fromMsg.message = {1, 2, 3};
158 log.logMessageFromNanoapp(fromMsg);
159
160 EXPECT_THAT(log.dump(), Not(IsEmpty()));
161 }
162
163 } // namespace
164 } // namespace aidl::android::hardware::contexthub