xref: /aosp_15_r20/system/chre/test/simulation/ble_test.cc (revision 84e339476a462649f82315436d70fd732297a399)
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 #include "chre/common.h"
18*84e33947SAndroid Build Coastguard Worker #include "inc/test_util.h"
19*84e33947SAndroid Build Coastguard Worker #include "test_base.h"
20*84e33947SAndroid Build Coastguard Worker 
21*84e33947SAndroid Build Coastguard Worker #include <gtest/gtest.h>
22*84e33947SAndroid Build Coastguard Worker #include <cstdint>
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/settings.h"
26*84e33947SAndroid Build Coastguard Worker #include "chre/platform/fatal_error.h"
27*84e33947SAndroid Build Coastguard Worker #include "chre/platform/linux/pal_ble.h"
28*84e33947SAndroid Build Coastguard Worker #include "chre/util/dynamic_vector.h"
29*84e33947SAndroid Build Coastguard Worker #include "chre_api/chre/ble.h"
30*84e33947SAndroid Build Coastguard Worker #include "chre_api/chre/user_settings.h"
31*84e33947SAndroid Build Coastguard Worker #include "test_util.h"
32*84e33947SAndroid Build Coastguard Worker 
33*84e33947SAndroid Build Coastguard Worker namespace chre {
34*84e33947SAndroid Build Coastguard Worker 
35*84e33947SAndroid Build Coastguard Worker namespace {
36*84e33947SAndroid Build Coastguard Worker 
37*84e33947SAndroid Build Coastguard Worker /**
38*84e33947SAndroid Build Coastguard Worker  * This test verifies that a nanoapp can query for BLE capabilities and filter
39*84e33947SAndroid Build Coastguard Worker  * capabilities. Note that a nanoapp does not require BLE permissions to use
40*84e33947SAndroid Build Coastguard Worker  * these APIs.
41*84e33947SAndroid Build Coastguard Worker  */
TEST_F(TestBase,BleCapabilitiesTest)42*84e33947SAndroid Build Coastguard Worker TEST_F(TestBase, BleCapabilitiesTest) {
43*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(GET_CAPABILITIES, 0);
44*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(GET_FILTER_CAPABILITIES, 1);
45*84e33947SAndroid Build Coastguard Worker 
46*84e33947SAndroid Build Coastguard Worker   class App : public TestNanoapp {
47*84e33947SAndroid Build Coastguard Worker    public:
48*84e33947SAndroid Build Coastguard Worker     App()
49*84e33947SAndroid Build Coastguard Worker         : TestNanoapp(
50*84e33947SAndroid Build Coastguard Worker               TestNanoappInfo{.perms = NanoappPermissions::CHRE_PERMS_WIFI}) {}
51*84e33947SAndroid Build Coastguard Worker 
52*84e33947SAndroid Build Coastguard Worker     void handleEvent(uint32_t, uint16_t eventType,
53*84e33947SAndroid Build Coastguard Worker                      const void *eventData) override {
54*84e33947SAndroid Build Coastguard Worker       switch (eventType) {
55*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_TEST_EVENT: {
56*84e33947SAndroid Build Coastguard Worker           auto event = static_cast<const TestEvent *>(eventData);
57*84e33947SAndroid Build Coastguard Worker           switch (event->type) {
58*84e33947SAndroid Build Coastguard Worker             case GET_CAPABILITIES: {
59*84e33947SAndroid Build Coastguard Worker               TestEventQueueSingleton::get()->pushEvent(
60*84e33947SAndroid Build Coastguard Worker                   GET_CAPABILITIES, chreBleGetCapabilities());
61*84e33947SAndroid Build Coastguard Worker               break;
62*84e33947SAndroid Build Coastguard Worker             }
63*84e33947SAndroid Build Coastguard Worker 
64*84e33947SAndroid Build Coastguard Worker             case GET_FILTER_CAPABILITIES: {
65*84e33947SAndroid Build Coastguard Worker               TestEventQueueSingleton::get()->pushEvent(
66*84e33947SAndroid Build Coastguard Worker                   GET_FILTER_CAPABILITIES, chreBleGetFilterCapabilities());
67*84e33947SAndroid Build Coastguard Worker               break;
68*84e33947SAndroid Build Coastguard Worker             }
69*84e33947SAndroid Build Coastguard Worker           }
70*84e33947SAndroid Build Coastguard Worker         }
71*84e33947SAndroid Build Coastguard Worker       }
72*84e33947SAndroid Build Coastguard Worker     }
73*84e33947SAndroid Build Coastguard Worker   };
74*84e33947SAndroid Build Coastguard Worker 
75*84e33947SAndroid Build Coastguard Worker   uint64_t appId = loadNanoapp(MakeUnique<App>());
76*84e33947SAndroid Build Coastguard Worker 
77*84e33947SAndroid Build Coastguard Worker   uint32_t capabilities;
78*84e33947SAndroid Build Coastguard Worker   sendEventToNanoapp(appId, GET_CAPABILITIES);
79*84e33947SAndroid Build Coastguard Worker   waitForEvent(GET_CAPABILITIES, &capabilities);
80*84e33947SAndroid Build Coastguard Worker   ASSERT_EQ(capabilities, CHRE_BLE_CAPABILITIES_SCAN |
81*84e33947SAndroid Build Coastguard Worker                               CHRE_BLE_CAPABILITIES_SCAN_RESULT_BATCHING |
82*84e33947SAndroid Build Coastguard Worker                               CHRE_BLE_CAPABILITIES_SCAN_FILTER_BEST_EFFORT);
83*84e33947SAndroid Build Coastguard Worker 
84*84e33947SAndroid Build Coastguard Worker   sendEventToNanoapp(appId, GET_FILTER_CAPABILITIES);
85*84e33947SAndroid Build Coastguard Worker   waitForEvent(GET_FILTER_CAPABILITIES, &capabilities);
86*84e33947SAndroid Build Coastguard Worker   ASSERT_EQ(capabilities, CHRE_BLE_FILTER_CAPABILITIES_RSSI |
87*84e33947SAndroid Build Coastguard Worker                               CHRE_BLE_FILTER_CAPABILITIES_SERVICE_DATA);
88*84e33947SAndroid Build Coastguard Worker }
89*84e33947SAndroid Build Coastguard Worker 
90*84e33947SAndroid Build Coastguard Worker class BleTestNanoapp : public TestNanoapp {
91*84e33947SAndroid Build Coastguard Worker  public:
BleTestNanoapp()92*84e33947SAndroid Build Coastguard Worker   BleTestNanoapp()
93*84e33947SAndroid Build Coastguard Worker       : TestNanoapp(
94*84e33947SAndroid Build Coastguard Worker             TestNanoappInfo{.perms = NanoappPermissions::CHRE_PERMS_BLE}) {}
95*84e33947SAndroid Build Coastguard Worker 
start()96*84e33947SAndroid Build Coastguard Worker   bool start() override {
97*84e33947SAndroid Build Coastguard Worker     chreUserSettingConfigureEvents(CHRE_USER_SETTING_BLE_AVAILABLE,
98*84e33947SAndroid Build Coastguard Worker                                    true /* enable */);
99*84e33947SAndroid Build Coastguard Worker     return true;
100*84e33947SAndroid Build Coastguard Worker   }
101*84e33947SAndroid Build Coastguard Worker 
end()102*84e33947SAndroid Build Coastguard Worker   void end() override {
103*84e33947SAndroid Build Coastguard Worker     chreUserSettingConfigureEvents(CHRE_USER_SETTING_BLE_AVAILABLE,
104*84e33947SAndroid Build Coastguard Worker                                    false /* enable */);
105*84e33947SAndroid Build Coastguard Worker   }
106*84e33947SAndroid Build Coastguard Worker };
107*84e33947SAndroid Build Coastguard Worker 
108*84e33947SAndroid Build Coastguard Worker /**
109*84e33947SAndroid Build Coastguard Worker  * This test validates the case in which a nanoapp starts a scan, receives
110*84e33947SAndroid Build Coastguard Worker  * at least one advertisement event, and stops a scan.
111*84e33947SAndroid Build Coastguard Worker  */
TEST_F(TestBase,BleSimpleScanTest)112*84e33947SAndroid Build Coastguard Worker TEST_F(TestBase, BleSimpleScanTest) {
113*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(START_SCAN, 0);
114*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(SCAN_STARTED, 1);
115*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(STOP_SCAN, 2);
116*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(SCAN_STOPPED, 3);
117*84e33947SAndroid Build Coastguard Worker 
118*84e33947SAndroid Build Coastguard Worker   class App : public BleTestNanoapp {
119*84e33947SAndroid Build Coastguard Worker    public:
120*84e33947SAndroid Build Coastguard Worker     void handleEvent(uint32_t, uint16_t eventType,
121*84e33947SAndroid Build Coastguard Worker                      const void *eventData) override {
122*84e33947SAndroid Build Coastguard Worker       switch (eventType) {
123*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_BLE_ASYNC_RESULT: {
124*84e33947SAndroid Build Coastguard Worker           auto *event = static_cast<const struct chreAsyncResult *>(eventData);
125*84e33947SAndroid Build Coastguard Worker           if (event->errorCode == CHRE_ERROR_NONE) {
126*84e33947SAndroid Build Coastguard Worker             uint16_t type =
127*84e33947SAndroid Build Coastguard Worker                 (event->requestType == CHRE_BLE_REQUEST_TYPE_START_SCAN)
128*84e33947SAndroid Build Coastguard Worker                     ? SCAN_STARTED
129*84e33947SAndroid Build Coastguard Worker                     : SCAN_STOPPED;
130*84e33947SAndroid Build Coastguard Worker             TestEventQueueSingleton::get()->pushEvent(type);
131*84e33947SAndroid Build Coastguard Worker           }
132*84e33947SAndroid Build Coastguard Worker           break;
133*84e33947SAndroid Build Coastguard Worker         }
134*84e33947SAndroid Build Coastguard Worker 
135*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_BLE_ADVERTISEMENT: {
136*84e33947SAndroid Build Coastguard Worker           TestEventQueueSingleton::get()->pushEvent(
137*84e33947SAndroid Build Coastguard Worker               CHRE_EVENT_BLE_ADVERTISEMENT);
138*84e33947SAndroid Build Coastguard Worker           break;
139*84e33947SAndroid Build Coastguard Worker         }
140*84e33947SAndroid Build Coastguard Worker 
141*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_TEST_EVENT: {
142*84e33947SAndroid Build Coastguard Worker           auto event = static_cast<const TestEvent *>(eventData);
143*84e33947SAndroid Build Coastguard Worker           switch (event->type) {
144*84e33947SAndroid Build Coastguard Worker             case START_SCAN: {
145*84e33947SAndroid Build Coastguard Worker               const bool success = chreBleStartScanAsync(
146*84e33947SAndroid Build Coastguard Worker                   CHRE_BLE_SCAN_MODE_AGGRESSIVE, 0, nullptr);
147*84e33947SAndroid Build Coastguard Worker               TestEventQueueSingleton::get()->pushEvent(START_SCAN, success);
148*84e33947SAndroid Build Coastguard Worker               break;
149*84e33947SAndroid Build Coastguard Worker             }
150*84e33947SAndroid Build Coastguard Worker 
151*84e33947SAndroid Build Coastguard Worker             case STOP_SCAN: {
152*84e33947SAndroid Build Coastguard Worker               const bool success = chreBleStopScanAsync();
153*84e33947SAndroid Build Coastguard Worker               TestEventQueueSingleton::get()->pushEvent(STOP_SCAN, success);
154*84e33947SAndroid Build Coastguard Worker               break;
155*84e33947SAndroid Build Coastguard Worker             }
156*84e33947SAndroid Build Coastguard Worker           }
157*84e33947SAndroid Build Coastguard Worker           break;
158*84e33947SAndroid Build Coastguard Worker         }
159*84e33947SAndroid Build Coastguard Worker       }
160*84e33947SAndroid Build Coastguard Worker     }
161*84e33947SAndroid Build Coastguard Worker   };
162*84e33947SAndroid Build Coastguard Worker 
163*84e33947SAndroid Build Coastguard Worker   uint64_t appId = loadNanoapp(MakeUnique<App>());
164*84e33947SAndroid Build Coastguard Worker 
165*84e33947SAndroid Build Coastguard Worker   bool success;
166*84e33947SAndroid Build Coastguard Worker   sendEventToNanoapp(appId, START_SCAN);
167*84e33947SAndroid Build Coastguard Worker   waitForEvent(START_SCAN, &success);
168*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(success);
169*84e33947SAndroid Build Coastguard Worker   waitForEvent(SCAN_STARTED);
170*84e33947SAndroid Build Coastguard Worker   ASSERT_TRUE(chrePalIsBleEnabled());
171*84e33947SAndroid Build Coastguard Worker   waitForEvent(CHRE_EVENT_BLE_ADVERTISEMENT);
172*84e33947SAndroid Build Coastguard Worker 
173*84e33947SAndroid Build Coastguard Worker   sendEventToNanoapp(appId, STOP_SCAN);
174*84e33947SAndroid Build Coastguard Worker   waitForEvent(STOP_SCAN, &success);
175*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(success);
176*84e33947SAndroid Build Coastguard Worker   waitForEvent(SCAN_STOPPED);
177*84e33947SAndroid Build Coastguard Worker   ASSERT_FALSE(chrePalIsBleEnabled());
178*84e33947SAndroid Build Coastguard Worker }
179*84e33947SAndroid Build Coastguard Worker 
TEST_F(TestBase,BleStopScanOnUnload)180*84e33947SAndroid Build Coastguard Worker TEST_F(TestBase, BleStopScanOnUnload) {
181*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(START_SCAN, 0);
182*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(SCAN_STARTED, 1);
183*84e33947SAndroid Build Coastguard Worker 
184*84e33947SAndroid Build Coastguard Worker   class App : public BleTestNanoapp {
185*84e33947SAndroid Build Coastguard Worker    public:
186*84e33947SAndroid Build Coastguard Worker     void handleEvent(uint32_t, uint16_t eventType,
187*84e33947SAndroid Build Coastguard Worker                      const void *eventData) override {
188*84e33947SAndroid Build Coastguard Worker       switch (eventType) {
189*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_BLE_ASYNC_RESULT: {
190*84e33947SAndroid Build Coastguard Worker           auto *event = static_cast<const struct chreAsyncResult *>(eventData);
191*84e33947SAndroid Build Coastguard Worker           if (event->requestType == CHRE_BLE_REQUEST_TYPE_START_SCAN &&
192*84e33947SAndroid Build Coastguard Worker               event->errorCode == CHRE_ERROR_NONE) {
193*84e33947SAndroid Build Coastguard Worker             TestEventQueueSingleton::get()->pushEvent(SCAN_STARTED);
194*84e33947SAndroid Build Coastguard Worker           }
195*84e33947SAndroid Build Coastguard Worker           break;
196*84e33947SAndroid Build Coastguard Worker         }
197*84e33947SAndroid Build Coastguard Worker 
198*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_TEST_EVENT: {
199*84e33947SAndroid Build Coastguard Worker           auto event = static_cast<const TestEvent *>(eventData);
200*84e33947SAndroid Build Coastguard Worker           switch (event->type) {
201*84e33947SAndroid Build Coastguard Worker             case START_SCAN: {
202*84e33947SAndroid Build Coastguard Worker               const bool success = chreBleStartScanAsync(
203*84e33947SAndroid Build Coastguard Worker                   CHRE_BLE_SCAN_MODE_AGGRESSIVE, 0, nullptr);
204*84e33947SAndroid Build Coastguard Worker               TestEventQueueSingleton::get()->pushEvent(START_SCAN, success);
205*84e33947SAndroid Build Coastguard Worker               break;
206*84e33947SAndroid Build Coastguard Worker             }
207*84e33947SAndroid Build Coastguard Worker           }
208*84e33947SAndroid Build Coastguard Worker           break;
209*84e33947SAndroid Build Coastguard Worker         }
210*84e33947SAndroid Build Coastguard Worker       }
211*84e33947SAndroid Build Coastguard Worker     }
212*84e33947SAndroid Build Coastguard Worker   };
213*84e33947SAndroid Build Coastguard Worker 
214*84e33947SAndroid Build Coastguard Worker   uint64_t appId = loadNanoapp(MakeUnique<App>());
215*84e33947SAndroid Build Coastguard Worker 
216*84e33947SAndroid Build Coastguard Worker   bool success;
217*84e33947SAndroid Build Coastguard Worker   sendEventToNanoapp(appId, START_SCAN);
218*84e33947SAndroid Build Coastguard Worker   waitForEvent(START_SCAN, &success);
219*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(success);
220*84e33947SAndroid Build Coastguard Worker   waitForEvent(SCAN_STARTED);
221*84e33947SAndroid Build Coastguard Worker   ASSERT_TRUE(chrePalIsBleEnabled());
222*84e33947SAndroid Build Coastguard Worker 
223*84e33947SAndroid Build Coastguard Worker   unloadNanoapp(appId);
224*84e33947SAndroid Build Coastguard Worker   ASSERT_FALSE(chrePalIsBleEnabled());
225*84e33947SAndroid Build Coastguard Worker }
226*84e33947SAndroid Build Coastguard Worker 
227*84e33947SAndroid Build Coastguard Worker /**
228*84e33947SAndroid Build Coastguard Worker  * This test validates that a nanoapp can start a scan twice and the platform
229*84e33947SAndroid Build Coastguard Worker  * will be enabled.
230*84e33947SAndroid Build Coastguard Worker  */
TEST_F(TestBase,BleStartTwiceScanTest)231*84e33947SAndroid Build Coastguard Worker TEST_F(TestBase, BleStartTwiceScanTest) {
232*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(START_SCAN, 0);
233*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(SCAN_STARTED, 1);
234*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(STOP_SCAN, 2);
235*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(SCAN_STOPPED, 3);
236*84e33947SAndroid Build Coastguard Worker 
237*84e33947SAndroid Build Coastguard Worker   class App : public BleTestNanoapp {
238*84e33947SAndroid Build Coastguard Worker    public:
239*84e33947SAndroid Build Coastguard Worker     void handleEvent(uint32_t, uint16_t eventType, const void *eventData) {
240*84e33947SAndroid Build Coastguard Worker       switch (eventType) {
241*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_BLE_ASYNC_RESULT: {
242*84e33947SAndroid Build Coastguard Worker           auto *event = static_cast<const struct chreAsyncResult *>(eventData);
243*84e33947SAndroid Build Coastguard Worker           if (event->errorCode == CHRE_ERROR_NONE) {
244*84e33947SAndroid Build Coastguard Worker             uint16_t type =
245*84e33947SAndroid Build Coastguard Worker                 (event->requestType == CHRE_BLE_REQUEST_TYPE_START_SCAN)
246*84e33947SAndroid Build Coastguard Worker                     ? SCAN_STARTED
247*84e33947SAndroid Build Coastguard Worker                     : SCAN_STOPPED;
248*84e33947SAndroid Build Coastguard Worker             TestEventQueueSingleton::get()->pushEvent(type);
249*84e33947SAndroid Build Coastguard Worker           }
250*84e33947SAndroid Build Coastguard Worker           break;
251*84e33947SAndroid Build Coastguard Worker         }
252*84e33947SAndroid Build Coastguard Worker 
253*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_BLE_ADVERTISEMENT: {
254*84e33947SAndroid Build Coastguard Worker           TestEventQueueSingleton::get()->pushEvent(
255*84e33947SAndroid Build Coastguard Worker               CHRE_EVENT_BLE_ADVERTISEMENT);
256*84e33947SAndroid Build Coastguard Worker           break;
257*84e33947SAndroid Build Coastguard Worker         }
258*84e33947SAndroid Build Coastguard Worker 
259*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_TEST_EVENT: {
260*84e33947SAndroid Build Coastguard Worker           auto event = static_cast<const TestEvent *>(eventData);
261*84e33947SAndroid Build Coastguard Worker           switch (event->type) {
262*84e33947SAndroid Build Coastguard Worker             case START_SCAN: {
263*84e33947SAndroid Build Coastguard Worker               const bool success = chreBleStartScanAsync(
264*84e33947SAndroid Build Coastguard Worker                   CHRE_BLE_SCAN_MODE_AGGRESSIVE, 0, nullptr);
265*84e33947SAndroid Build Coastguard Worker               TestEventQueueSingleton::get()->pushEvent(START_SCAN, success);
266*84e33947SAndroid Build Coastguard Worker               break;
267*84e33947SAndroid Build Coastguard Worker             }
268*84e33947SAndroid Build Coastguard Worker 
269*84e33947SAndroid Build Coastguard Worker             case STOP_SCAN: {
270*84e33947SAndroid Build Coastguard Worker               const bool success = chreBleStopScanAsync();
271*84e33947SAndroid Build Coastguard Worker               TestEventQueueSingleton::get()->pushEvent(STOP_SCAN, success);
272*84e33947SAndroid Build Coastguard Worker               break;
273*84e33947SAndroid Build Coastguard Worker             }
274*84e33947SAndroid Build Coastguard Worker           }
275*84e33947SAndroid Build Coastguard Worker         }
276*84e33947SAndroid Build Coastguard Worker       }
277*84e33947SAndroid Build Coastguard Worker     }
278*84e33947SAndroid Build Coastguard Worker   };
279*84e33947SAndroid Build Coastguard Worker 
280*84e33947SAndroid Build Coastguard Worker   uint64_t appId = loadNanoapp(MakeUnique<App>());
281*84e33947SAndroid Build Coastguard Worker   bool success;
282*84e33947SAndroid Build Coastguard Worker 
283*84e33947SAndroid Build Coastguard Worker   sendEventToNanoapp(appId, START_SCAN);
284*84e33947SAndroid Build Coastguard Worker   waitForEvent(START_SCAN, &success);
285*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(success);
286*84e33947SAndroid Build Coastguard Worker   waitForEvent(SCAN_STARTED);
287*84e33947SAndroid Build Coastguard Worker 
288*84e33947SAndroid Build Coastguard Worker   sendEventToNanoapp(appId, START_SCAN);
289*84e33947SAndroid Build Coastguard Worker   waitForEvent(START_SCAN, &success);
290*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(success);
291*84e33947SAndroid Build Coastguard Worker   waitForEvent(SCAN_STARTED);
292*84e33947SAndroid Build Coastguard Worker   waitForEvent(CHRE_EVENT_BLE_ADVERTISEMENT);
293*84e33947SAndroid Build Coastguard Worker 
294*84e33947SAndroid Build Coastguard Worker   sendEventToNanoapp(appId, STOP_SCAN);
295*84e33947SAndroid Build Coastguard Worker   waitForEvent(STOP_SCAN, &success);
296*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(success);
297*84e33947SAndroid Build Coastguard Worker   waitForEvent(SCAN_STOPPED);
298*84e33947SAndroid Build Coastguard Worker }
299*84e33947SAndroid Build Coastguard Worker 
300*84e33947SAndroid Build Coastguard Worker /**
301*84e33947SAndroid Build Coastguard Worker  * This test validates that a nanoapp can request to stop a scan twice without
302*84e33947SAndroid Build Coastguard Worker  * any ongoing scan existing. It asserts that the nanoapp did not receive any
303*84e33947SAndroid Build Coastguard Worker  * advertisment events because a scan was never started.
304*84e33947SAndroid Build Coastguard Worker  */
TEST_F(TestBase,BleStopTwiceScanTest)305*84e33947SAndroid Build Coastguard Worker TEST_F(TestBase, BleStopTwiceScanTest) {
306*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(SCAN_STARTED, 1);
307*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(STOP_SCAN, 2);
308*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(SCAN_STOPPED, 3);
309*84e33947SAndroid Build Coastguard Worker 
310*84e33947SAndroid Build Coastguard Worker   class App : public BleTestNanoapp {
311*84e33947SAndroid Build Coastguard Worker    public:
312*84e33947SAndroid Build Coastguard Worker     void handleEvent(uint32_t, uint16_t eventType,
313*84e33947SAndroid Build Coastguard Worker                      const void *eventData) override {
314*84e33947SAndroid Build Coastguard Worker       switch (eventType) {
315*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_BLE_ASYNC_RESULT: {
316*84e33947SAndroid Build Coastguard Worker           auto *event = static_cast<const struct chreAsyncResult *>(eventData);
317*84e33947SAndroid Build Coastguard Worker           if (event->errorCode == CHRE_ERROR_NONE) {
318*84e33947SAndroid Build Coastguard Worker             uint16_t type =
319*84e33947SAndroid Build Coastguard Worker                 (event->requestType == CHRE_BLE_REQUEST_TYPE_START_SCAN)
320*84e33947SAndroid Build Coastguard Worker                     ? SCAN_STARTED
321*84e33947SAndroid Build Coastguard Worker                     : SCAN_STOPPED;
322*84e33947SAndroid Build Coastguard Worker             TestEventQueueSingleton::get()->pushEvent(type);
323*84e33947SAndroid Build Coastguard Worker           }
324*84e33947SAndroid Build Coastguard Worker           break;
325*84e33947SAndroid Build Coastguard Worker         }
326*84e33947SAndroid Build Coastguard Worker 
327*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_BLE_ADVERTISEMENT: {
328*84e33947SAndroid Build Coastguard Worker           FATAL_ERROR("No advertisement expected");
329*84e33947SAndroid Build Coastguard Worker           break;
330*84e33947SAndroid Build Coastguard Worker         }
331*84e33947SAndroid Build Coastguard Worker 
332*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_TEST_EVENT: {
333*84e33947SAndroid Build Coastguard Worker           auto event = static_cast<const TestEvent *>(eventData);
334*84e33947SAndroid Build Coastguard Worker           switch (event->type) {
335*84e33947SAndroid Build Coastguard Worker             case STOP_SCAN: {
336*84e33947SAndroid Build Coastguard Worker               const bool success = chreBleStopScanAsync();
337*84e33947SAndroid Build Coastguard Worker               TestEventQueueSingleton::get()->pushEvent(STOP_SCAN, success);
338*84e33947SAndroid Build Coastguard Worker               break;
339*84e33947SAndroid Build Coastguard Worker             }
340*84e33947SAndroid Build Coastguard Worker           }
341*84e33947SAndroid Build Coastguard Worker         }
342*84e33947SAndroid Build Coastguard Worker       }
343*84e33947SAndroid Build Coastguard Worker     }
344*84e33947SAndroid Build Coastguard Worker   };
345*84e33947SAndroid Build Coastguard Worker 
346*84e33947SAndroid Build Coastguard Worker   uint64_t appId = loadNanoapp(MakeUnique<App>());
347*84e33947SAndroid Build Coastguard Worker 
348*84e33947SAndroid Build Coastguard Worker   bool success;
349*84e33947SAndroid Build Coastguard Worker   sendEventToNanoapp(appId, STOP_SCAN);
350*84e33947SAndroid Build Coastguard Worker   waitForEvent(STOP_SCAN, &success);
351*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(success);
352*84e33947SAndroid Build Coastguard Worker   waitForEvent(SCAN_STOPPED);
353*84e33947SAndroid Build Coastguard Worker 
354*84e33947SAndroid Build Coastguard Worker   sendEventToNanoapp(appId, STOP_SCAN);
355*84e33947SAndroid Build Coastguard Worker   waitForEvent(STOP_SCAN, &success);
356*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(success);
357*84e33947SAndroid Build Coastguard Worker 
358*84e33947SAndroid Build Coastguard Worker   waitForEvent(SCAN_STOPPED);
359*84e33947SAndroid Build Coastguard Worker   unloadNanoapp(appId);
360*84e33947SAndroid Build Coastguard Worker }
361*84e33947SAndroid Build Coastguard Worker 
362*84e33947SAndroid Build Coastguard Worker /**
363*84e33947SAndroid Build Coastguard Worker  * This test verifies the following BLE settings behavior:
364*84e33947SAndroid Build Coastguard Worker  * 1) Nanoapp makes BLE scan request
365*84e33947SAndroid Build Coastguard Worker  * 2) Toggle BLE setting -> disabled
366*84e33947SAndroid Build Coastguard Worker  * 3) Toggle BLE setting -> enabled.
367*84e33947SAndroid Build Coastguard Worker  * 4) Verify things resume.
368*84e33947SAndroid Build Coastguard Worker  */
TEST_F(TestBase,BleSettingChangeTest)369*84e33947SAndroid Build Coastguard Worker TEST_F(TestBase, BleSettingChangeTest) {
370*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(START_SCAN, 0);
371*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(SCAN_STARTED, 1);
372*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(SCAN_STOPPED, 3);
373*84e33947SAndroid Build Coastguard Worker 
374*84e33947SAndroid Build Coastguard Worker   class App : public BleTestNanoapp {
375*84e33947SAndroid Build Coastguard Worker    public:
376*84e33947SAndroid Build Coastguard Worker     void handleEvent(uint32_t, uint16_t eventType,
377*84e33947SAndroid Build Coastguard Worker                      const void *eventData) override {
378*84e33947SAndroid Build Coastguard Worker       switch (eventType) {
379*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_BLE_ASYNC_RESULT: {
380*84e33947SAndroid Build Coastguard Worker           auto *event = static_cast<const struct chreAsyncResult *>(eventData);
381*84e33947SAndroid Build Coastguard Worker           if (event->errorCode == CHRE_ERROR_NONE) {
382*84e33947SAndroid Build Coastguard Worker             uint16_t type =
383*84e33947SAndroid Build Coastguard Worker                 (event->requestType == CHRE_BLE_REQUEST_TYPE_START_SCAN)
384*84e33947SAndroid Build Coastguard Worker                     ? SCAN_STARTED
385*84e33947SAndroid Build Coastguard Worker                     : SCAN_STOPPED;
386*84e33947SAndroid Build Coastguard Worker             TestEventQueueSingleton::get()->pushEvent(type);
387*84e33947SAndroid Build Coastguard Worker           }
388*84e33947SAndroid Build Coastguard Worker           break;
389*84e33947SAndroid Build Coastguard Worker         }
390*84e33947SAndroid Build Coastguard Worker 
391*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_BLE_ADVERTISEMENT: {
392*84e33947SAndroid Build Coastguard Worker           TestEventQueueSingleton::get()->pushEvent(
393*84e33947SAndroid Build Coastguard Worker               CHRE_EVENT_BLE_ADVERTISEMENT);
394*84e33947SAndroid Build Coastguard Worker           break;
395*84e33947SAndroid Build Coastguard Worker         }
396*84e33947SAndroid Build Coastguard Worker 
397*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_SETTING_CHANGED_BLE_AVAILABLE: {
398*84e33947SAndroid Build Coastguard Worker           auto *event =
399*84e33947SAndroid Build Coastguard Worker               static_cast<const chreUserSettingChangedEvent *>(eventData);
400*84e33947SAndroid Build Coastguard Worker           bool enabled =
401*84e33947SAndroid Build Coastguard Worker               (event->settingState == CHRE_USER_SETTING_STATE_ENABLED);
402*84e33947SAndroid Build Coastguard Worker           TestEventQueueSingleton::get()->pushEvent(
403*84e33947SAndroid Build Coastguard Worker               CHRE_EVENT_SETTING_CHANGED_BLE_AVAILABLE, enabled);
404*84e33947SAndroid Build Coastguard Worker           break;
405*84e33947SAndroid Build Coastguard Worker         }
406*84e33947SAndroid Build Coastguard Worker 
407*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_TEST_EVENT: {
408*84e33947SAndroid Build Coastguard Worker           auto event = static_cast<const TestEvent *>(eventData);
409*84e33947SAndroid Build Coastguard Worker           switch (event->type) {
410*84e33947SAndroid Build Coastguard Worker             case START_SCAN: {
411*84e33947SAndroid Build Coastguard Worker               const bool success = chreBleStartScanAsync(
412*84e33947SAndroid Build Coastguard Worker                   CHRE_BLE_SCAN_MODE_AGGRESSIVE, 0, nullptr);
413*84e33947SAndroid Build Coastguard Worker               TestEventQueueSingleton::get()->pushEvent(START_SCAN, success);
414*84e33947SAndroid Build Coastguard Worker               break;
415*84e33947SAndroid Build Coastguard Worker             }
416*84e33947SAndroid Build Coastguard Worker           }
417*84e33947SAndroid Build Coastguard Worker         }
418*84e33947SAndroid Build Coastguard Worker       }
419*84e33947SAndroid Build Coastguard Worker     }
420*84e33947SAndroid Build Coastguard Worker   };
421*84e33947SAndroid Build Coastguard Worker 
422*84e33947SAndroid Build Coastguard Worker   uint64_t appId = loadNanoapp(MakeUnique<App>());
423*84e33947SAndroid Build Coastguard Worker 
424*84e33947SAndroid Build Coastguard Worker   bool success;
425*84e33947SAndroid Build Coastguard Worker   sendEventToNanoapp(appId, START_SCAN);
426*84e33947SAndroid Build Coastguard Worker   waitForEvent(START_SCAN, &success);
427*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(success);
428*84e33947SAndroid Build Coastguard Worker 
429*84e33947SAndroid Build Coastguard Worker   waitForEvent(SCAN_STARTED);
430*84e33947SAndroid Build Coastguard Worker   waitForEvent(CHRE_EVENT_BLE_ADVERTISEMENT);
431*84e33947SAndroid Build Coastguard Worker 
432*84e33947SAndroid Build Coastguard Worker   EventLoopManagerSingleton::get()->getSettingManager().postSettingChange(
433*84e33947SAndroid Build Coastguard Worker       Setting::BLE_AVAILABLE, false /* enabled */);
434*84e33947SAndroid Build Coastguard Worker   bool enabled;
435*84e33947SAndroid Build Coastguard Worker   waitForEvent(CHRE_EVENT_SETTING_CHANGED_BLE_AVAILABLE, &enabled);
436*84e33947SAndroid Build Coastguard Worker   EXPECT_FALSE(enabled);
437*84e33947SAndroid Build Coastguard Worker   EXPECT_FALSE(
438*84e33947SAndroid Build Coastguard Worker       EventLoopManagerSingleton::get()->getSettingManager().getSettingEnabled(
439*84e33947SAndroid Build Coastguard Worker           Setting::BLE_AVAILABLE));
440*84e33947SAndroid Build Coastguard Worker   std::this_thread::sleep_for(std::chrono::milliseconds(100));
441*84e33947SAndroid Build Coastguard Worker   EXPECT_FALSE(chrePalIsBleEnabled());
442*84e33947SAndroid Build Coastguard Worker 
443*84e33947SAndroid Build Coastguard Worker   EventLoopManagerSingleton::get()->getSettingManager().postSettingChange(
444*84e33947SAndroid Build Coastguard Worker       Setting::BLE_AVAILABLE, true /* enabled */);
445*84e33947SAndroid Build Coastguard Worker   waitForEvent(CHRE_EVENT_SETTING_CHANGED_BLE_AVAILABLE, &enabled);
446*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(enabled);
447*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(
448*84e33947SAndroid Build Coastguard Worker       EventLoopManagerSingleton::get()->getSettingManager().getSettingEnabled(
449*84e33947SAndroid Build Coastguard Worker           Setting::BLE_AVAILABLE));
450*84e33947SAndroid Build Coastguard Worker   waitForEvent(CHRE_EVENT_BLE_ADVERTISEMENT);
451*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(chrePalIsBleEnabled());
452*84e33947SAndroid Build Coastguard Worker }
453*84e33947SAndroid Build Coastguard Worker 
454*84e33947SAndroid Build Coastguard Worker /**
455*84e33947SAndroid Build Coastguard Worker  * Test that a nanoapp receives a function disabled error if it attempts to
456*84e33947SAndroid Build Coastguard Worker  * start a scan when the BLE setting is disabled.
457*84e33947SAndroid Build Coastguard Worker  */
TEST_F(TestBase,BleSettingDisabledStartScanTest)458*84e33947SAndroid Build Coastguard Worker TEST_F(TestBase, BleSettingDisabledStartScanTest) {
459*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(START_SCAN, 0);
460*84e33947SAndroid Build Coastguard Worker 
461*84e33947SAndroid Build Coastguard Worker   class App : public BleTestNanoapp {
462*84e33947SAndroid Build Coastguard Worker    public:
463*84e33947SAndroid Build Coastguard Worker     void handleEvent(uint32_t, uint16_t eventType,
464*84e33947SAndroid Build Coastguard Worker                      const void *eventData) override {
465*84e33947SAndroid Build Coastguard Worker       switch (eventType) {
466*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_BLE_ASYNC_RESULT: {
467*84e33947SAndroid Build Coastguard Worker           auto *event = static_cast<const struct chreAsyncResult *>(eventData);
468*84e33947SAndroid Build Coastguard Worker           if (event->errorCode == CHRE_ERROR_FUNCTION_DISABLED) {
469*84e33947SAndroid Build Coastguard Worker             TestEventQueueSingleton::get()->pushEvent(
470*84e33947SAndroid Build Coastguard Worker                 CHRE_EVENT_BLE_ASYNC_RESULT);
471*84e33947SAndroid Build Coastguard Worker           }
472*84e33947SAndroid Build Coastguard Worker           break;
473*84e33947SAndroid Build Coastguard Worker         }
474*84e33947SAndroid Build Coastguard Worker 
475*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_SETTING_CHANGED_BLE_AVAILABLE: {
476*84e33947SAndroid Build Coastguard Worker           auto *event =
477*84e33947SAndroid Build Coastguard Worker               static_cast<const chreUserSettingChangedEvent *>(eventData);
478*84e33947SAndroid Build Coastguard Worker           bool enabled =
479*84e33947SAndroid Build Coastguard Worker               (event->settingState == CHRE_USER_SETTING_STATE_ENABLED);
480*84e33947SAndroid Build Coastguard Worker           TestEventQueueSingleton::get()->pushEvent(
481*84e33947SAndroid Build Coastguard Worker               CHRE_EVENT_SETTING_CHANGED_BLE_AVAILABLE, enabled);
482*84e33947SAndroid Build Coastguard Worker           break;
483*84e33947SAndroid Build Coastguard Worker         }
484*84e33947SAndroid Build Coastguard Worker 
485*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_TEST_EVENT: {
486*84e33947SAndroid Build Coastguard Worker           auto event = static_cast<const TestEvent *>(eventData);
487*84e33947SAndroid Build Coastguard Worker           switch (event->type) {
488*84e33947SAndroid Build Coastguard Worker             case START_SCAN: {
489*84e33947SAndroid Build Coastguard Worker               const bool success = chreBleStartScanAsync(
490*84e33947SAndroid Build Coastguard Worker                   CHRE_BLE_SCAN_MODE_AGGRESSIVE, 0, nullptr);
491*84e33947SAndroid Build Coastguard Worker               TestEventQueueSingleton::get()->pushEvent(START_SCAN, success);
492*84e33947SAndroid Build Coastguard Worker               break;
493*84e33947SAndroid Build Coastguard Worker             }
494*84e33947SAndroid Build Coastguard Worker           }
495*84e33947SAndroid Build Coastguard Worker         }
496*84e33947SAndroid Build Coastguard Worker       }
497*84e33947SAndroid Build Coastguard Worker     }
498*84e33947SAndroid Build Coastguard Worker   };
499*84e33947SAndroid Build Coastguard Worker 
500*84e33947SAndroid Build Coastguard Worker   uint64_t appId = loadNanoapp(MakeUnique<App>());
501*84e33947SAndroid Build Coastguard Worker 
502*84e33947SAndroid Build Coastguard Worker   EventLoopManagerSingleton::get()->getSettingManager().postSettingChange(
503*84e33947SAndroid Build Coastguard Worker       Setting::BLE_AVAILABLE, false /* enable */);
504*84e33947SAndroid Build Coastguard Worker 
505*84e33947SAndroid Build Coastguard Worker   bool enabled;
506*84e33947SAndroid Build Coastguard Worker   waitForEvent(CHRE_EVENT_SETTING_CHANGED_BLE_AVAILABLE, &enabled);
507*84e33947SAndroid Build Coastguard Worker   EXPECT_FALSE(enabled);
508*84e33947SAndroid Build Coastguard Worker 
509*84e33947SAndroid Build Coastguard Worker   bool success;
510*84e33947SAndroid Build Coastguard Worker   sendEventToNanoapp(appId, START_SCAN);
511*84e33947SAndroid Build Coastguard Worker   waitForEvent(START_SCAN, &success);
512*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(success);
513*84e33947SAndroid Build Coastguard Worker   waitForEvent(CHRE_EVENT_BLE_ASYNC_RESULT);
514*84e33947SAndroid Build Coastguard Worker }
515*84e33947SAndroid Build Coastguard Worker 
516*84e33947SAndroid Build Coastguard Worker /**
517*84e33947SAndroid Build Coastguard Worker  * Test that a nanoapp receives a success response when it attempts to stop a
518*84e33947SAndroid Build Coastguard Worker  * BLE scan while the BLE setting is disabled.
519*84e33947SAndroid Build Coastguard Worker  */
TEST_F(TestBase,BleSettingDisabledStopScanTest)520*84e33947SAndroid Build Coastguard Worker TEST_F(TestBase, BleSettingDisabledStopScanTest) {
521*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(SCAN_STARTED, 1);
522*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(STOP_SCAN, 2);
523*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(SCAN_STOPPED, 3);
524*84e33947SAndroid Build Coastguard Worker 
525*84e33947SAndroid Build Coastguard Worker   class App : public BleTestNanoapp {
526*84e33947SAndroid Build Coastguard Worker    public:
527*84e33947SAndroid Build Coastguard Worker     void handleEvent(uint32_t, uint16_t eventType,
528*84e33947SAndroid Build Coastguard Worker                      const void *eventData) override {
529*84e33947SAndroid Build Coastguard Worker       switch (eventType) {
530*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_BLE_ASYNC_RESULT: {
531*84e33947SAndroid Build Coastguard Worker           auto *event = static_cast<const struct chreAsyncResult *>(eventData);
532*84e33947SAndroid Build Coastguard Worker           if (event->errorCode == CHRE_ERROR_NONE) {
533*84e33947SAndroid Build Coastguard Worker             uint16_t type =
534*84e33947SAndroid Build Coastguard Worker                 (event->requestType == CHRE_BLE_REQUEST_TYPE_START_SCAN)
535*84e33947SAndroid Build Coastguard Worker                     ? SCAN_STARTED
536*84e33947SAndroid Build Coastguard Worker                     : SCAN_STOPPED;
537*84e33947SAndroid Build Coastguard Worker             TestEventQueueSingleton::get()->pushEvent(type);
538*84e33947SAndroid Build Coastguard Worker           }
539*84e33947SAndroid Build Coastguard Worker           break;
540*84e33947SAndroid Build Coastguard Worker         }
541*84e33947SAndroid Build Coastguard Worker 
542*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_SETTING_CHANGED_BLE_AVAILABLE: {
543*84e33947SAndroid Build Coastguard Worker           auto *event =
544*84e33947SAndroid Build Coastguard Worker               static_cast<const chreUserSettingChangedEvent *>(eventData);
545*84e33947SAndroid Build Coastguard Worker           bool enabled =
546*84e33947SAndroid Build Coastguard Worker               (event->settingState == CHRE_USER_SETTING_STATE_ENABLED);
547*84e33947SAndroid Build Coastguard Worker           TestEventQueueSingleton::get()->pushEvent(
548*84e33947SAndroid Build Coastguard Worker               CHRE_EVENT_SETTING_CHANGED_BLE_AVAILABLE, enabled);
549*84e33947SAndroid Build Coastguard Worker           break;
550*84e33947SAndroid Build Coastguard Worker         }
551*84e33947SAndroid Build Coastguard Worker 
552*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_TEST_EVENT: {
553*84e33947SAndroid Build Coastguard Worker           auto event = static_cast<const TestEvent *>(eventData);
554*84e33947SAndroid Build Coastguard Worker           switch (event->type) {
555*84e33947SAndroid Build Coastguard Worker             case STOP_SCAN: {
556*84e33947SAndroid Build Coastguard Worker               const bool success = chreBleStopScanAsync();
557*84e33947SAndroid Build Coastguard Worker               TestEventQueueSingleton::get()->pushEvent(STOP_SCAN, success);
558*84e33947SAndroid Build Coastguard Worker               break;
559*84e33947SAndroid Build Coastguard Worker             }
560*84e33947SAndroid Build Coastguard Worker           }
561*84e33947SAndroid Build Coastguard Worker         }
562*84e33947SAndroid Build Coastguard Worker       }
563*84e33947SAndroid Build Coastguard Worker     }
564*84e33947SAndroid Build Coastguard Worker   };
565*84e33947SAndroid Build Coastguard Worker 
566*84e33947SAndroid Build Coastguard Worker   uint64_t appId = loadNanoapp(MakeUnique<App>());
567*84e33947SAndroid Build Coastguard Worker 
568*84e33947SAndroid Build Coastguard Worker   EventLoopManagerSingleton::get()->getSettingManager().postSettingChange(
569*84e33947SAndroid Build Coastguard Worker       Setting::BLE_AVAILABLE, false /* enable */);
570*84e33947SAndroid Build Coastguard Worker 
571*84e33947SAndroid Build Coastguard Worker   bool enabled;
572*84e33947SAndroid Build Coastguard Worker   waitForEvent(CHRE_EVENT_SETTING_CHANGED_BLE_AVAILABLE, &enabled);
573*84e33947SAndroid Build Coastguard Worker   EXPECT_FALSE(enabled);
574*84e33947SAndroid Build Coastguard Worker 
575*84e33947SAndroid Build Coastguard Worker   bool success;
576*84e33947SAndroid Build Coastguard Worker   sendEventToNanoapp(appId, STOP_SCAN);
577*84e33947SAndroid Build Coastguard Worker   waitForEvent(STOP_SCAN, &success);
578*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(success);
579*84e33947SAndroid Build Coastguard Worker   waitForEvent(SCAN_STOPPED);
580*84e33947SAndroid Build Coastguard Worker }
581*84e33947SAndroid Build Coastguard Worker 
582*84e33947SAndroid Build Coastguard Worker /**
583*84e33947SAndroid Build Coastguard Worker  * Test that a nanoapp can read RSSI successfully.
584*84e33947SAndroid Build Coastguard Worker  */
TEST_F(TestBase,BleReadRssi)585*84e33947SAndroid Build Coastguard Worker TEST_F(TestBase, BleReadRssi) {
586*84e33947SAndroid Build Coastguard Worker   constexpr uint16_t kConnectionHandle = 6;
587*84e33947SAndroid Build Coastguard Worker   constexpr uint32_t kCookie = 123;
588*84e33947SAndroid Build Coastguard Worker 
589*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(RSSI_REQUEST, 1);
590*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(RSSI_REQUEST_SENT, 2);
591*84e33947SAndroid Build Coastguard Worker 
592*84e33947SAndroid Build Coastguard Worker   class App : public BleTestNanoapp {
593*84e33947SAndroid Build Coastguard Worker     void handleEvent(uint32_t, uint16_t eventType, const void *eventData) {
594*84e33947SAndroid Build Coastguard Worker       switch (eventType) {
595*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_BLE_RSSI_READ: {
596*84e33947SAndroid Build Coastguard Worker           auto *event =
597*84e33947SAndroid Build Coastguard Worker               static_cast<const struct chreBleReadRssiEvent *>(eventData);
598*84e33947SAndroid Build Coastguard Worker           if (event->result.errorCode == CHRE_ERROR_NONE) {
599*84e33947SAndroid Build Coastguard Worker             TestEventQueueSingleton::get()->pushEvent(CHRE_EVENT_BLE_RSSI_READ);
600*84e33947SAndroid Build Coastguard Worker           }
601*84e33947SAndroid Build Coastguard Worker           break;
602*84e33947SAndroid Build Coastguard Worker         }
603*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_SETTING_CHANGED_BLE_AVAILABLE: {
604*84e33947SAndroid Build Coastguard Worker           auto *event =
605*84e33947SAndroid Build Coastguard Worker               static_cast<const chreUserSettingChangedEvent *>(eventData);
606*84e33947SAndroid Build Coastguard Worker           bool enabled =
607*84e33947SAndroid Build Coastguard Worker               (event->settingState == CHRE_USER_SETTING_STATE_ENABLED);
608*84e33947SAndroid Build Coastguard Worker           TestEventQueueSingleton::get()->pushEvent(
609*84e33947SAndroid Build Coastguard Worker               CHRE_EVENT_SETTING_CHANGED_BLE_AVAILABLE, enabled);
610*84e33947SAndroid Build Coastguard Worker           break;
611*84e33947SAndroid Build Coastguard Worker         }
612*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_TEST_EVENT: {
613*84e33947SAndroid Build Coastguard Worker           auto event = static_cast<const TestEvent *>(eventData);
614*84e33947SAndroid Build Coastguard Worker           switch (event->type) {
615*84e33947SAndroid Build Coastguard Worker             case RSSI_REQUEST: {
616*84e33947SAndroid Build Coastguard Worker               const bool success =
617*84e33947SAndroid Build Coastguard Worker                   chreBleReadRssiAsync(kConnectionHandle, (void *)kCookie);
618*84e33947SAndroid Build Coastguard Worker               TestEventQueueSingleton::get()->pushEvent(RSSI_REQUEST_SENT,
619*84e33947SAndroid Build Coastguard Worker                                                         success);
620*84e33947SAndroid Build Coastguard Worker               break;
621*84e33947SAndroid Build Coastguard Worker             }
622*84e33947SAndroid Build Coastguard Worker           }
623*84e33947SAndroid Build Coastguard Worker         }
624*84e33947SAndroid Build Coastguard Worker       }
625*84e33947SAndroid Build Coastguard Worker     }
626*84e33947SAndroid Build Coastguard Worker   };
627*84e33947SAndroid Build Coastguard Worker 
628*84e33947SAndroid Build Coastguard Worker   uint64_t appId = loadNanoapp(MakeUnique<App>());
629*84e33947SAndroid Build Coastguard Worker 
630*84e33947SAndroid Build Coastguard Worker   EventLoopManagerSingleton::get()->getSettingManager().postSettingChange(
631*84e33947SAndroid Build Coastguard Worker       Setting::BLE_AVAILABLE, true /* enabled */);
632*84e33947SAndroid Build Coastguard Worker   bool enabled;
633*84e33947SAndroid Build Coastguard Worker   waitForEvent(CHRE_EVENT_SETTING_CHANGED_BLE_AVAILABLE, &enabled);
634*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(enabled);
635*84e33947SAndroid Build Coastguard Worker 
636*84e33947SAndroid Build Coastguard Worker   bool success;
637*84e33947SAndroid Build Coastguard Worker   sendEventToNanoapp(appId, RSSI_REQUEST);
638*84e33947SAndroid Build Coastguard Worker   waitForEvent(RSSI_REQUEST_SENT, &success);
639*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(success);
640*84e33947SAndroid Build Coastguard Worker   waitForEvent(CHRE_EVENT_BLE_RSSI_READ);
641*84e33947SAndroid Build Coastguard Worker }
642*84e33947SAndroid Build Coastguard Worker 
643*84e33947SAndroid Build Coastguard Worker /**
644*84e33947SAndroid Build Coastguard Worker  * This test validates that a nanoapp can start call start scan twice before
645*84e33947SAndroid Build Coastguard Worker  * receiving an async response. It should invalidate its original request by
646*84e33947SAndroid Build Coastguard Worker  * calling start scan a second time.
647*84e33947SAndroid Build Coastguard Worker  */
TEST_F(TestBase,BleStartScanTwiceBeforeAsyncResponseTest)648*84e33947SAndroid Build Coastguard Worker TEST_F(TestBase, BleStartScanTwiceBeforeAsyncResponseTest) {
649*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(START_SCAN, 0);
650*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(SCAN_STARTED, 1);
651*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(STOP_SCAN, 2);
652*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(SCAN_STOPPED, 3);
653*84e33947SAndroid Build Coastguard Worker 
654*84e33947SAndroid Build Coastguard Worker   struct testData {
655*84e33947SAndroid Build Coastguard Worker     void *cookie;
656*84e33947SAndroid Build Coastguard Worker   };
657*84e33947SAndroid Build Coastguard Worker 
658*84e33947SAndroid Build Coastguard Worker   class App : public BleTestNanoapp {
659*84e33947SAndroid Build Coastguard Worker     void handleEvent(uint32_t, uint16_t eventType, const void *eventData) {
660*84e33947SAndroid Build Coastguard Worker       switch (eventType) {
661*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_BLE_ASYNC_RESULT: {
662*84e33947SAndroid Build Coastguard Worker           auto *event = static_cast<const struct chreAsyncResult *>(eventData);
663*84e33947SAndroid Build Coastguard Worker           uint16_t type =
664*84e33947SAndroid Build Coastguard Worker               (event->requestType == CHRE_BLE_REQUEST_TYPE_START_SCAN)
665*84e33947SAndroid Build Coastguard Worker                   ? SCAN_STARTED
666*84e33947SAndroid Build Coastguard Worker                   : SCAN_STOPPED;
667*84e33947SAndroid Build Coastguard Worker           TestEventQueueSingleton::get()->pushEvent(type, *event);
668*84e33947SAndroid Build Coastguard Worker           break;
669*84e33947SAndroid Build Coastguard Worker         }
670*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_TEST_EVENT: {
671*84e33947SAndroid Build Coastguard Worker           auto event = static_cast<const TestEvent *>(eventData);
672*84e33947SAndroid Build Coastguard Worker           switch (event->type) {
673*84e33947SAndroid Build Coastguard Worker             case START_SCAN: {
674*84e33947SAndroid Build Coastguard Worker               auto data = static_cast<testData *>(event->data);
675*84e33947SAndroid Build Coastguard Worker               const bool success = chreBleStartScanAsyncV1_9(
676*84e33947SAndroid Build Coastguard Worker                   CHRE_BLE_SCAN_MODE_AGGRESSIVE, 0, nullptr, data->cookie);
677*84e33947SAndroid Build Coastguard Worker               TestEventQueueSingleton::get()->pushEvent(START_SCAN, success);
678*84e33947SAndroid Build Coastguard Worker               break;
679*84e33947SAndroid Build Coastguard Worker             }
680*84e33947SAndroid Build Coastguard Worker 
681*84e33947SAndroid Build Coastguard Worker             case STOP_SCAN: {
682*84e33947SAndroid Build Coastguard Worker               auto data = static_cast<testData *>(event->data);
683*84e33947SAndroid Build Coastguard Worker               const bool success = chreBleStopScanAsyncV1_9(data->cookie);
684*84e33947SAndroid Build Coastguard Worker               TestEventQueueSingleton::get()->pushEvent(STOP_SCAN, success);
685*84e33947SAndroid Build Coastguard Worker               break;
686*84e33947SAndroid Build Coastguard Worker             }
687*84e33947SAndroid Build Coastguard Worker           }
688*84e33947SAndroid Build Coastguard Worker         }
689*84e33947SAndroid Build Coastguard Worker       }
690*84e33947SAndroid Build Coastguard Worker     }
691*84e33947SAndroid Build Coastguard Worker   };
692*84e33947SAndroid Build Coastguard Worker 
693*84e33947SAndroid Build Coastguard Worker   uint64_t appId = loadNanoapp(MakeUnique<App>());
694*84e33947SAndroid Build Coastguard Worker   bool success;
695*84e33947SAndroid Build Coastguard Worker 
696*84e33947SAndroid Build Coastguard Worker   delayBleScanStart(true /* delay */);
697*84e33947SAndroid Build Coastguard Worker 
698*84e33947SAndroid Build Coastguard Worker   testData data;
699*84e33947SAndroid Build Coastguard Worker   uint32_t cookieOne = 1;
700*84e33947SAndroid Build Coastguard Worker   data.cookie = &cookieOne;
701*84e33947SAndroid Build Coastguard Worker   sendEventToNanoapp(appId, START_SCAN, data);
702*84e33947SAndroid Build Coastguard Worker   waitForEvent(START_SCAN, &success);
703*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(success);
704*84e33947SAndroid Build Coastguard Worker 
705*84e33947SAndroid Build Coastguard Worker   uint32_t cookieTwo = 2;
706*84e33947SAndroid Build Coastguard Worker   data.cookie = &cookieTwo;
707*84e33947SAndroid Build Coastguard Worker   sendEventToNanoapp(appId, START_SCAN, data);
708*84e33947SAndroid Build Coastguard Worker   waitForEvent(START_SCAN, &success);
709*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(success);
710*84e33947SAndroid Build Coastguard Worker 
711*84e33947SAndroid Build Coastguard Worker   chreAsyncResult result;
712*84e33947SAndroid Build Coastguard Worker   waitForEvent(SCAN_STARTED, &result);
713*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(result.errorCode, CHRE_ERROR_OBSOLETE_REQUEST);
714*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(result.cookie, &cookieOne);
715*84e33947SAndroid Build Coastguard Worker 
716*84e33947SAndroid Build Coastguard Worker   // Respond to the first scan request. CHRE will then attempt the next scan
717*84e33947SAndroid Build Coastguard Worker   // request at which point the PAL should no longer delay the response.
718*84e33947SAndroid Build Coastguard Worker   delayBleScanStart(false /* delay */);
719*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(startBleScan());
720*84e33947SAndroid Build Coastguard Worker 
721*84e33947SAndroid Build Coastguard Worker   waitForEvent(SCAN_STARTED, &result);
722*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(result.errorCode, CHRE_ERROR_NONE);
723*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(result.cookie, &cookieTwo);
724*84e33947SAndroid Build Coastguard Worker 
725*84e33947SAndroid Build Coastguard Worker   sendEventToNanoapp(appId, STOP_SCAN, data);
726*84e33947SAndroid Build Coastguard Worker   waitForEvent(STOP_SCAN, &success);
727*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(success);
728*84e33947SAndroid Build Coastguard Worker   waitForEvent(SCAN_STOPPED);
729*84e33947SAndroid Build Coastguard Worker }
730*84e33947SAndroid Build Coastguard Worker 
731*84e33947SAndroid Build Coastguard Worker /**
732*84e33947SAndroid Build Coastguard Worker  * This test validates that a nanoapp can call flush only when an existing scan
733*84e33947SAndroid Build Coastguard Worker  * is enabled for the nanoapp. This test validates that batching will hold the
734*84e33947SAndroid Build Coastguard Worker  * data and flush will send the batched data and then a flush complete event.
735*84e33947SAndroid Build Coastguard Worker  */
TEST_F(TestBase,BleFlush)736*84e33947SAndroid Build Coastguard Worker TEST_F(TestBase, BleFlush) {
737*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(START_SCAN, 0);
738*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(SCAN_STARTED, 1);
739*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(STOP_SCAN, 2);
740*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(SCAN_STOPPED, 3);
741*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(CALL_FLUSH, 4);
742*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(SAW_BLE_AD_AND_FLUSH_COMPLETE, 5);
743*84e33947SAndroid Build Coastguard Worker 
744*84e33947SAndroid Build Coastguard Worker   class App : public BleTestNanoapp {
745*84e33947SAndroid Build Coastguard Worker    public:
746*84e33947SAndroid Build Coastguard Worker     void handleEvent(uint32_t, uint16_t eventType,
747*84e33947SAndroid Build Coastguard Worker                      const void *eventData) override {
748*84e33947SAndroid Build Coastguard Worker       switch (eventType) {
749*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_BLE_ASYNC_RESULT: {
750*84e33947SAndroid Build Coastguard Worker           auto *event = static_cast<const struct chreAsyncResult *>(eventData);
751*84e33947SAndroid Build Coastguard Worker           if (event->errorCode == CHRE_ERROR_NONE) {
752*84e33947SAndroid Build Coastguard Worker             uint16_t type =
753*84e33947SAndroid Build Coastguard Worker                 (event->requestType == CHRE_BLE_REQUEST_TYPE_START_SCAN)
754*84e33947SAndroid Build Coastguard Worker                     ? SCAN_STARTED
755*84e33947SAndroid Build Coastguard Worker                     : SCAN_STOPPED;
756*84e33947SAndroid Build Coastguard Worker             TestEventQueueSingleton::get()->pushEvent(type);
757*84e33947SAndroid Build Coastguard Worker           }
758*84e33947SAndroid Build Coastguard Worker           break;
759*84e33947SAndroid Build Coastguard Worker         }
760*84e33947SAndroid Build Coastguard Worker 
761*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_BLE_ADVERTISEMENT: {
762*84e33947SAndroid Build Coastguard Worker           mSawBleAdvertisementEvent = true;
763*84e33947SAndroid Build Coastguard Worker           break;
764*84e33947SAndroid Build Coastguard Worker         }
765*84e33947SAndroid Build Coastguard Worker 
766*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_BLE_FLUSH_COMPLETE: {
767*84e33947SAndroid Build Coastguard Worker           auto *event = static_cast<const struct chreAsyncResult *>(eventData);
768*84e33947SAndroid Build Coastguard Worker           mSawFlushCompleteEvent = event->success && event->cookie == &mCookie;
769*84e33947SAndroid Build Coastguard Worker           break;
770*84e33947SAndroid Build Coastguard Worker         }
771*84e33947SAndroid Build Coastguard Worker 
772*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_TEST_EVENT: {
773*84e33947SAndroid Build Coastguard Worker           auto event = static_cast<const TestEvent *>(eventData);
774*84e33947SAndroid Build Coastguard Worker           switch (event->type) {
775*84e33947SAndroid Build Coastguard Worker             case START_SCAN: {
776*84e33947SAndroid Build Coastguard Worker               const bool success = chreBleStartScanAsync(
777*84e33947SAndroid Build Coastguard Worker                   CHRE_BLE_SCAN_MODE_AGGRESSIVE, 60000, nullptr);
778*84e33947SAndroid Build Coastguard Worker               TestEventQueueSingleton::get()->pushEvent(START_SCAN, success);
779*84e33947SAndroid Build Coastguard Worker               break;
780*84e33947SAndroid Build Coastguard Worker             }
781*84e33947SAndroid Build Coastguard Worker 
782*84e33947SAndroid Build Coastguard Worker             case STOP_SCAN: {
783*84e33947SAndroid Build Coastguard Worker               const bool success = chreBleStopScanAsync();
784*84e33947SAndroid Build Coastguard Worker               TestEventQueueSingleton::get()->pushEvent(STOP_SCAN, success);
785*84e33947SAndroid Build Coastguard Worker               break;
786*84e33947SAndroid Build Coastguard Worker             }
787*84e33947SAndroid Build Coastguard Worker 
788*84e33947SAndroid Build Coastguard Worker             case CALL_FLUSH: {
789*84e33947SAndroid Build Coastguard Worker               const bool success = chreBleFlushAsync(&mCookie);
790*84e33947SAndroid Build Coastguard Worker               TestEventQueueSingleton::get()->pushEvent(CALL_FLUSH, success);
791*84e33947SAndroid Build Coastguard Worker               break;
792*84e33947SAndroid Build Coastguard Worker             }
793*84e33947SAndroid Build Coastguard Worker           }
794*84e33947SAndroid Build Coastguard Worker           break;
795*84e33947SAndroid Build Coastguard Worker         }
796*84e33947SAndroid Build Coastguard Worker       }
797*84e33947SAndroid Build Coastguard Worker 
798*84e33947SAndroid Build Coastguard Worker       if (mSawBleAdvertisementEvent && mSawFlushCompleteEvent) {
799*84e33947SAndroid Build Coastguard Worker         TestEventQueueSingleton::get()->pushEvent(
800*84e33947SAndroid Build Coastguard Worker             SAW_BLE_AD_AND_FLUSH_COMPLETE);
801*84e33947SAndroid Build Coastguard Worker         mSawBleAdvertisementEvent = false;
802*84e33947SAndroid Build Coastguard Worker         mSawFlushCompleteEvent = false;
803*84e33947SAndroid Build Coastguard Worker       }
804*84e33947SAndroid Build Coastguard Worker     }
805*84e33947SAndroid Build Coastguard Worker 
806*84e33947SAndroid Build Coastguard Worker    private:
807*84e33947SAndroid Build Coastguard Worker     uint32_t mCookie;
808*84e33947SAndroid Build Coastguard Worker     bool mSawBleAdvertisementEvent = false;
809*84e33947SAndroid Build Coastguard Worker     bool mSawFlushCompleteEvent = false;
810*84e33947SAndroid Build Coastguard Worker   };
811*84e33947SAndroid Build Coastguard Worker 
812*84e33947SAndroid Build Coastguard Worker   uint64_t appId = loadNanoapp(MakeUnique<App>());
813*84e33947SAndroid Build Coastguard Worker 
814*84e33947SAndroid Build Coastguard Worker   // Flushing before a scan should fail.
815*84e33947SAndroid Build Coastguard Worker   bool success;
816*84e33947SAndroid Build Coastguard Worker   sendEventToNanoapp(appId, CALL_FLUSH);
817*84e33947SAndroid Build Coastguard Worker   waitForEvent(CALL_FLUSH, &success);
818*84e33947SAndroid Build Coastguard Worker   ASSERT_FALSE(success);
819*84e33947SAndroid Build Coastguard Worker 
820*84e33947SAndroid Build Coastguard Worker   // Start a scan with batching.
821*84e33947SAndroid Build Coastguard Worker   sendEventToNanoapp(appId, START_SCAN);
822*84e33947SAndroid Build Coastguard Worker   waitForEvent(START_SCAN, &success);
823*84e33947SAndroid Build Coastguard Worker   ASSERT_TRUE(success);
824*84e33947SAndroid Build Coastguard Worker   waitForEvent(SCAN_STARTED);
825*84e33947SAndroid Build Coastguard Worker   ASSERT_TRUE(chrePalIsBleEnabled());
826*84e33947SAndroid Build Coastguard Worker 
827*84e33947SAndroid Build Coastguard Worker   // Call flush again multiple times and get the complete event.
828*84e33947SAndroid Build Coastguard Worker   // We should only receive data when flush is called as the batch
829*84e33947SAndroid Build Coastguard Worker   // delay is extremely large.
830*84e33947SAndroid Build Coastguard Worker   constexpr uint32_t kNumFlushCalls = 3;
831*84e33947SAndroid Build Coastguard Worker   for (uint32_t i = 0; i < kNumFlushCalls; ++i) {
832*84e33947SAndroid Build Coastguard Worker     std::this_thread::sleep_for(std::chrono::milliseconds(250));
833*84e33947SAndroid Build Coastguard Worker 
834*84e33947SAndroid Build Coastguard Worker     sendEventToNanoapp(appId, CALL_FLUSH);
835*84e33947SAndroid Build Coastguard Worker     waitForEvent(CALL_FLUSH, &success);
836*84e33947SAndroid Build Coastguard Worker     ASSERT_TRUE(success);
837*84e33947SAndroid Build Coastguard Worker 
838*84e33947SAndroid Build Coastguard Worker     // Wait for some data and a flush complete.
839*84e33947SAndroid Build Coastguard Worker     // This ensures we receive both advertisement events
840*84e33947SAndroid Build Coastguard Worker     // and a flush complete event. We are not guaranteed
841*84e33947SAndroid Build Coastguard Worker     // that the advertisement events will come after
842*84e33947SAndroid Build Coastguard Worker     // the CALL_FLUSH event or before. If they come
843*84e33947SAndroid Build Coastguard Worker     // before, then they will be ignored. This
844*84e33947SAndroid Build Coastguard Worker     // change allows the advertisement events to come
845*84e33947SAndroid Build Coastguard Worker     // after during the normal expiration of the
846*84e33947SAndroid Build Coastguard Worker     // batch timer, which is valid (call flush, get
847*84e33947SAndroid Build Coastguard Worker     // any advertisement events, flush complete event
848*84e33947SAndroid Build Coastguard Worker     // might get some advertisement events afterwards).
849*84e33947SAndroid Build Coastguard Worker     waitForEvent(SAW_BLE_AD_AND_FLUSH_COMPLETE);
850*84e33947SAndroid Build Coastguard Worker   }
851*84e33947SAndroid Build Coastguard Worker 
852*84e33947SAndroid Build Coastguard Worker   // Stop a scan.
853*84e33947SAndroid Build Coastguard Worker   sendEventToNanoapp(appId, STOP_SCAN);
854*84e33947SAndroid Build Coastguard Worker   waitForEvent(STOP_SCAN, &success);
855*84e33947SAndroid Build Coastguard Worker   ASSERT_TRUE(success);
856*84e33947SAndroid Build Coastguard Worker   waitForEvent(SCAN_STOPPED);
857*84e33947SAndroid Build Coastguard Worker   ASSERT_FALSE(chrePalIsBleEnabled());
858*84e33947SAndroid Build Coastguard Worker 
859*84e33947SAndroid Build Coastguard Worker   // Flushing after a scan should fail.
860*84e33947SAndroid Build Coastguard Worker   sendEventToNanoapp(appId, CALL_FLUSH);
861*84e33947SAndroid Build Coastguard Worker   waitForEvent(CALL_FLUSH, &success);
862*84e33947SAndroid Build Coastguard Worker   ASSERT_FALSE(success);
863*84e33947SAndroid Build Coastguard Worker }
864*84e33947SAndroid Build Coastguard Worker 
865*84e33947SAndroid Build Coastguard Worker }  // namespace
866*84e33947SAndroid Build Coastguard Worker }  // namespace chre
867