xref: /aosp_15_r20/system/chre/host/test/hal_generic/aidl/event_logger_test.cc (revision 84e339476a462649f82315436d70fd732297a399)
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