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