1*84e33947SAndroid Build Coastguard Worker /* 2*84e33947SAndroid Build Coastguard Worker * Copyright (C) 2021 The Android Open Source Project 3*84e33947SAndroid Build Coastguard Worker * 4*84e33947SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*84e33947SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*84e33947SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*84e33947SAndroid Build Coastguard Worker * 8*84e33947SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*84e33947SAndroid Build Coastguard Worker * 10*84e33947SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*84e33947SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*84e33947SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*84e33947SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*84e33947SAndroid Build Coastguard Worker * limitations under the License. 15*84e33947SAndroid Build Coastguard Worker */ 16*84e33947SAndroid Build Coastguard Worker 17*84e33947SAndroid Build Coastguard Worker #ifndef CHRE_SIMULATION_TEST_BASE_H_ 18*84e33947SAndroid Build Coastguard Worker #define CHRE_SIMULATION_TEST_BASE_H_ 19*84e33947SAndroid Build Coastguard Worker 20*84e33947SAndroid Build Coastguard Worker #include <gtest/gtest.h> 21*84e33947SAndroid Build Coastguard Worker #include <cstdint> 22*84e33947SAndroid Build Coastguard Worker #include <thread> 23*84e33947SAndroid Build Coastguard Worker 24*84e33947SAndroid Build Coastguard Worker #include "chre/core/event_loop_manager.h" 25*84e33947SAndroid Build Coastguard Worker #include "chre/core/nanoapp.h" 26*84e33947SAndroid Build Coastguard Worker #include "chre/platform/system_time.h" 27*84e33947SAndroid Build Coastguard Worker #include "chre/platform/system_timer.h" 28*84e33947SAndroid Build Coastguard Worker #include "chre/util/system/message_router.h" 29*84e33947SAndroid Build Coastguard Worker #include "chre/util/time.h" 30*84e33947SAndroid Build Coastguard Worker #include "test_event_queue.h" 31*84e33947SAndroid Build Coastguard Worker 32*84e33947SAndroid Build Coastguard Worker namespace chre { 33*84e33947SAndroid Build Coastguard Worker 34*84e33947SAndroid Build Coastguard Worker // TODO(b/346903946): remove these extra debug logs once issue resolved 35*84e33947SAndroid Build Coastguard Worker #define CHRE_TEST_DEBUG(fmt, ...) \ 36*84e33947SAndroid Build Coastguard Worker do { \ 37*84e33947SAndroid Build Coastguard Worker fprintf(stderr, "%" PRIu64 "ns %s: " fmt "\n", \ 38*84e33947SAndroid Build Coastguard Worker SystemTime::getMonotonicTime().toRawNanoseconds(), __func__, \ 39*84e33947SAndroid Build Coastguard Worker ##__VA_ARGS__); \ 40*84e33947SAndroid Build Coastguard Worker fprintf(stdout, "%" PRIu64 "ns %s: " fmt "\n", \ 41*84e33947SAndroid Build Coastguard Worker SystemTime::getMonotonicTime().toRawNanoseconds(), __func__, \ 42*84e33947SAndroid Build Coastguard Worker ##__VA_ARGS__); \ 43*84e33947SAndroid Build Coastguard Worker } while (0) 44*84e33947SAndroid Build Coastguard Worker 45*84e33947SAndroid Build Coastguard Worker /* 46*84e33947SAndroid Build Coastguard Worker * A base class for all CHRE simulated tests. 47*84e33947SAndroid Build Coastguard Worker */ 48*84e33947SAndroid Build Coastguard Worker class TestBase : public testing::Test { 49*84e33947SAndroid Build Coastguard Worker protected: TestBase()50*84e33947SAndroid Build Coastguard Worker TestBase() { 51*84e33947SAndroid Build Coastguard Worker CHRE_TEST_DEBUG("Constructed %p", this); 52*84e33947SAndroid Build Coastguard Worker } ~TestBase()53*84e33947SAndroid Build Coastguard Worker ~TestBase() { 54*84e33947SAndroid Build Coastguard Worker CHRE_TEST_DEBUG("Destroying %p", this); 55*84e33947SAndroid Build Coastguard Worker } 56*84e33947SAndroid Build Coastguard Worker 57*84e33947SAndroid Build Coastguard Worker void SetUp() override; 58*84e33947SAndroid Build Coastguard Worker void TearDown() override; 59*84e33947SAndroid Build Coastguard Worker 60*84e33947SAndroid Build Coastguard Worker /** 61*84e33947SAndroid Build Coastguard Worker * This method can be overridden in a derived class if desired. 62*84e33947SAndroid Build Coastguard Worker * 63*84e33947SAndroid Build Coastguard Worker * @return The total runtime allowed for the entire test. 64*84e33947SAndroid Build Coastguard Worker */ getTimeoutNs()65*84e33947SAndroid Build Coastguard Worker virtual uint64_t getTimeoutNs() const { 66*84e33947SAndroid Build Coastguard Worker return 5 * kOneSecondInNanoseconds; 67*84e33947SAndroid Build Coastguard Worker } 68*84e33947SAndroid Build Coastguard Worker 69*84e33947SAndroid Build Coastguard Worker /** 70*84e33947SAndroid Build Coastguard Worker * A convenience method to invoke waitForEvent() for the TestEventQueue 71*84e33947SAndroid Build Coastguard Worker * singleton. 72*84e33947SAndroid Build Coastguard Worker * 73*84e33947SAndroid Build Coastguard Worker * Note: Events that are intended to be delivered to a nanoapp as a result of 74*84e33947SAndroid Build Coastguard Worker * asynchronous APIs invoked in a nanoappEnd() functions may not be delivered 75*84e33947SAndroid Build Coastguard Worker * to the nanoapp through nanoappHandleEvent() (since they are already 76*84e33947SAndroid Build Coastguard Worker * unloaded by the time it receives the event), so users of the TestEventQueue 77*84e33947SAndroid Build Coastguard Worker * should not wait for such events in their test flow. 78*84e33947SAndroid Build Coastguard Worker * 79*84e33947SAndroid Build Coastguard Worker * @param eventType The event type to wait for. 80*84e33947SAndroid Build Coastguard Worker */ waitForEvent(uint16_t eventType)81*84e33947SAndroid Build Coastguard Worker void waitForEvent(uint16_t eventType) { 82*84e33947SAndroid Build Coastguard Worker TestEventQueueSingleton::get()->waitForEvent(eventType); 83*84e33947SAndroid Build Coastguard Worker } 84*84e33947SAndroid Build Coastguard Worker 85*84e33947SAndroid Build Coastguard Worker /** 86*84e33947SAndroid Build Coastguard Worker * A convenience method to invoke waitForEvent() for the TestEventQueue 87*84e33947SAndroid Build Coastguard Worker * singleton. 88*84e33947SAndroid Build Coastguard Worker * 89*84e33947SAndroid Build Coastguard Worker * @see waitForEvent(eventType) 90*84e33947SAndroid Build Coastguard Worker * 91*84e33947SAndroid Build Coastguard Worker * @param eventType The event type to wait for. 92*84e33947SAndroid Build Coastguard Worker * @param eventData Populated with the data attached to the event. 93*84e33947SAndroid Build Coastguard Worker */ 94*84e33947SAndroid Build Coastguard Worker template <class T> waitForEvent(uint16_t eventType,T * eventData)95*84e33947SAndroid Build Coastguard Worker void waitForEvent(uint16_t eventType, T *eventData) { 96*84e33947SAndroid Build Coastguard Worker TestEventQueueSingleton::get()->waitForEvent(eventType, eventData); 97*84e33947SAndroid Build Coastguard Worker } 98*84e33947SAndroid Build Coastguard Worker 99*84e33947SAndroid Build Coastguard Worker /** 100*84e33947SAndroid Build Coastguard Worker * Retrieves the Nanoapp instance from its ID. 101*84e33947SAndroid Build Coastguard Worker * 102*84e33947SAndroid Build Coastguard Worker * @param id Nanoapp ID 103*84e33947SAndroid Build Coastguard Worker * @return A pointer to the Nanoapp instance or nullptr if not found. 104*84e33947SAndroid Build Coastguard Worker */ getNanoappByAppId(uint64_t id)105*84e33947SAndroid Build Coastguard Worker Nanoapp *getNanoappByAppId(uint64_t id) { 106*84e33947SAndroid Build Coastguard Worker uint16_t instanceId; 107*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(EventLoopManagerSingleton::get() 108*84e33947SAndroid Build Coastguard Worker ->getEventLoop() 109*84e33947SAndroid Build Coastguard Worker .findNanoappInstanceIdByAppId(id, &instanceId)); 110*84e33947SAndroid Build Coastguard Worker Nanoapp *nanoapp = EventLoopManagerSingleton::get() 111*84e33947SAndroid Build Coastguard Worker ->getEventLoop() 112*84e33947SAndroid Build Coastguard Worker .findNanoappByInstanceId(instanceId); 113*84e33947SAndroid Build Coastguard Worker EXPECT_NE(nanoapp, nullptr); 114*84e33947SAndroid Build Coastguard Worker return nanoapp; 115*84e33947SAndroid Build Coastguard Worker } 116*84e33947SAndroid Build Coastguard Worker 117*84e33947SAndroid Build Coastguard Worker class MemberInitLogger { 118*84e33947SAndroid Build Coastguard Worker public: MemberInitLogger()119*84e33947SAndroid Build Coastguard Worker MemberInitLogger() { 120*84e33947SAndroid Build Coastguard Worker CHRE_TEST_DEBUG("Construction start"); 121*84e33947SAndroid Build Coastguard Worker } ~MemberInitLogger()122*84e33947SAndroid Build Coastguard Worker ~MemberInitLogger() { 123*84e33947SAndroid Build Coastguard Worker CHRE_TEST_DEBUG("Destruction finished"); 124*84e33947SAndroid Build Coastguard Worker } 125*84e33947SAndroid Build Coastguard Worker }; 126*84e33947SAndroid Build Coastguard Worker 127*84e33947SAndroid Build Coastguard Worker MemberInitLogger mInitLogger; 128*84e33947SAndroid Build Coastguard Worker std::thread mChreThread; 129*84e33947SAndroid Build Coastguard Worker SystemTimer mSystemTimer; 130*84e33947SAndroid Build Coastguard Worker message::MessageRouter::MessageHub mChreMessageHub; 131*84e33947SAndroid Build Coastguard Worker }; 132*84e33947SAndroid Build Coastguard Worker 133*84e33947SAndroid Build Coastguard Worker } // namespace chre 134*84e33947SAndroid Build Coastguard Worker 135*84e33947SAndroid Build Coastguard Worker #endif // CHRE_SIMULATION_TEST_BASE_H_ 136