xref: /aosp_15_r20/external/pigweed/third_party/chre/integration_test.cc (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker // Copyright 2023 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker //
3*61c4878aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker // use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker // the License at
6*61c4878aSAndroid Build Coastguard Worker //
7*61c4878aSAndroid Build Coastguard Worker //     https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker //
9*61c4878aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker // License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker // the License.
14*61c4878aSAndroid Build Coastguard Worker 
15*61c4878aSAndroid Build Coastguard Worker #include <chrono>
16*61c4878aSAndroid Build Coastguard Worker #include <functional>
17*61c4878aSAndroid Build Coastguard Worker #include <thread>
18*61c4878aSAndroid Build Coastguard Worker 
19*61c4878aSAndroid Build Coastguard Worker #include "chre/core/event_loop_manager.h"
20*61c4878aSAndroid Build Coastguard Worker #include "chre/core/init.h"
21*61c4878aSAndroid Build Coastguard Worker #include "chre/platform/memory.h"
22*61c4878aSAndroid Build Coastguard Worker #include "chre/platform/system_timer.h"
23*61c4878aSAndroid Build Coastguard Worker #include "chre/util/fixed_size_blocking_queue.h"
24*61c4878aSAndroid Build Coastguard Worker #include "chre/util/memory.h"
25*61c4878aSAndroid Build Coastguard Worker #include "chre/util/non_copyable.h"
26*61c4878aSAndroid Build Coastguard Worker #include "chre/util/singleton.h"
27*61c4878aSAndroid Build Coastguard Worker #include "chre/util/time.h"
28*61c4878aSAndroid Build Coastguard Worker #include "chre_api/chre/version.h"
29*61c4878aSAndroid Build Coastguard Worker #include "gtest/gtest.h"
30*61c4878aSAndroid Build Coastguard Worker #include "test_base.h"
31*61c4878aSAndroid Build Coastguard Worker #include "test_util.h"
32*61c4878aSAndroid Build Coastguard Worker 
33*61c4878aSAndroid Build Coastguard Worker namespace chre {
34*61c4878aSAndroid Build Coastguard Worker 
SetUp()35*61c4878aSAndroid Build Coastguard Worker void TestBase::SetUp() {
36*61c4878aSAndroid Build Coastguard Worker   TestEventQueueSingleton::init();
37*61c4878aSAndroid Build Coastguard Worker   chre::init();
38*61c4878aSAndroid Build Coastguard Worker   EventLoopManagerSingleton::get()->lateInit();
39*61c4878aSAndroid Build Coastguard Worker 
40*61c4878aSAndroid Build Coastguard Worker   mChreThread = std::thread(
41*61c4878aSAndroid Build Coastguard Worker       []() { EventLoopManagerSingleton::get()->getEventLoop().run(); });
42*61c4878aSAndroid Build Coastguard Worker 
43*61c4878aSAndroid Build Coastguard Worker   auto callback = [](void*) {
44*61c4878aSAndroid Build Coastguard Worker     LOGE("Test timed out ...");
45*61c4878aSAndroid Build Coastguard Worker     TestEventQueueSingleton::get()->pushEvent(
46*61c4878aSAndroid Build Coastguard Worker         CHRE_EVENT_SIMULATION_TEST_TIMEOUT);
47*61c4878aSAndroid Build Coastguard Worker   };
48*61c4878aSAndroid Build Coastguard Worker 
49*61c4878aSAndroid Build Coastguard Worker   ASSERT_TRUE(mSystemTimer.init());
50*61c4878aSAndroid Build Coastguard Worker   ASSERT_TRUE(mSystemTimer.set(
51*61c4878aSAndroid Build Coastguard Worker       callback, nullptr /*data*/, Nanoseconds(getTimeoutNs())));
52*61c4878aSAndroid Build Coastguard Worker }
53*61c4878aSAndroid Build Coastguard Worker 
TearDown()54*61c4878aSAndroid Build Coastguard Worker void TestBase::TearDown() {
55*61c4878aSAndroid Build Coastguard Worker   mSystemTimer.cancel();
56*61c4878aSAndroid Build Coastguard Worker   TestEventQueueSingleton::get()->flush();
57*61c4878aSAndroid Build Coastguard Worker   EventLoopManagerSingleton::get()->getEventLoop().stop();
58*61c4878aSAndroid Build Coastguard Worker   mChreThread.join();
59*61c4878aSAndroid Build Coastguard Worker   chre::deinit();
60*61c4878aSAndroid Build Coastguard Worker   TestEventQueueSingleton::deinit();
61*61c4878aSAndroid Build Coastguard Worker   deleteNanoappInfos();
62*61c4878aSAndroid Build Coastguard Worker   unregisterAllTestNanoapps();
63*61c4878aSAndroid Build Coastguard Worker }
64*61c4878aSAndroid Build Coastguard Worker 
65*61c4878aSAndroid Build Coastguard Worker template class Singleton<TestEventQueue>;
66*61c4878aSAndroid Build Coastguard Worker 
TEST_F(TestBase,CanLoadAndStartSingleNanoapp)67*61c4878aSAndroid Build Coastguard Worker TEST_F(TestBase, CanLoadAndStartSingleNanoapp) {
68*61c4878aSAndroid Build Coastguard Worker   constexpr uint64_t kAppId = 0x0123456789abcdef;
69*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kAppVersion = 0;
70*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kAppPerms = 0;
71*61c4878aSAndroid Build Coastguard Worker 
72*61c4878aSAndroid Build Coastguard Worker   UniquePtr<Nanoapp> nanoapp = createStaticNanoapp("Test nanoapp",
73*61c4878aSAndroid Build Coastguard Worker                                                    kAppId,
74*61c4878aSAndroid Build Coastguard Worker                                                    kAppVersion,
75*61c4878aSAndroid Build Coastguard Worker                                                    kAppPerms,
76*61c4878aSAndroid Build Coastguard Worker                                                    defaultNanoappStart,
77*61c4878aSAndroid Build Coastguard Worker                                                    defaultNanoappHandleEvent,
78*61c4878aSAndroid Build Coastguard Worker                                                    defaultNanoappEnd);
79*61c4878aSAndroid Build Coastguard Worker 
80*61c4878aSAndroid Build Coastguard Worker   EventLoopManagerSingleton::get()->deferCallback(
81*61c4878aSAndroid Build Coastguard Worker       SystemCallbackType::FinishLoadingNanoapp,
82*61c4878aSAndroid Build Coastguard Worker       std::move(nanoapp),
83*61c4878aSAndroid Build Coastguard Worker       testFinishLoadingNanoappCallback);
84*61c4878aSAndroid Build Coastguard Worker   waitForEvent(CHRE_EVENT_SIMULATION_TEST_NANOAPP_LOADED);
85*61c4878aSAndroid Build Coastguard Worker }
86*61c4878aSAndroid Build Coastguard Worker 
TEST_F(TestBase,CanLoadAndStartMultipleNanoapps)87*61c4878aSAndroid Build Coastguard Worker TEST_F(TestBase, CanLoadAndStartMultipleNanoapps) {
88*61c4878aSAndroid Build Coastguard Worker   constexpr uint64_t kAppId1 = 0x123;
89*61c4878aSAndroid Build Coastguard Worker   constexpr uint64_t kAppId2 = 0x456;
90*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kAppVersion = 0;
91*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kAppPerms = 0;
92*61c4878aSAndroid Build Coastguard Worker   loadNanoapp("Test nanoapp",
93*61c4878aSAndroid Build Coastguard Worker               kAppId1,
94*61c4878aSAndroid Build Coastguard Worker               kAppVersion,
95*61c4878aSAndroid Build Coastguard Worker               kAppPerms,
96*61c4878aSAndroid Build Coastguard Worker               defaultNanoappStart,
97*61c4878aSAndroid Build Coastguard Worker               defaultNanoappHandleEvent,
98*61c4878aSAndroid Build Coastguard Worker               defaultNanoappEnd);
99*61c4878aSAndroid Build Coastguard Worker 
100*61c4878aSAndroid Build Coastguard Worker   loadNanoapp("Test nanoapp",
101*61c4878aSAndroid Build Coastguard Worker               kAppId2,
102*61c4878aSAndroid Build Coastguard Worker               kAppVersion,
103*61c4878aSAndroid Build Coastguard Worker               kAppPerms,
104*61c4878aSAndroid Build Coastguard Worker               defaultNanoappStart,
105*61c4878aSAndroid Build Coastguard Worker               defaultNanoappHandleEvent,
106*61c4878aSAndroid Build Coastguard Worker               defaultNanoappEnd);
107*61c4878aSAndroid Build Coastguard Worker 
108*61c4878aSAndroid Build Coastguard Worker   uint16_t id1;
109*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(EventLoopManagerSingleton::get()
110*61c4878aSAndroid Build Coastguard Worker                   ->getEventLoop()
111*61c4878aSAndroid Build Coastguard Worker                   .findNanoappInstanceIdByAppId(kAppId1, &id1));
112*61c4878aSAndroid Build Coastguard Worker   uint16_t id2;
113*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(EventLoopManagerSingleton::get()
114*61c4878aSAndroid Build Coastguard Worker                   ->getEventLoop()
115*61c4878aSAndroid Build Coastguard Worker                   .findNanoappInstanceIdByAppId(kAppId2, &id2));
116*61c4878aSAndroid Build Coastguard Worker 
117*61c4878aSAndroid Build Coastguard Worker   EXPECT_NE(id1, id2);
118*61c4878aSAndroid Build Coastguard Worker }
119*61c4878aSAndroid Build Coastguard Worker }  // namespace chre
120