• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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