xref: /aosp_15_r20/system/chre/test/simulation/wifi_nan_test.cc (revision 84e339476a462649f82315436d70fd732297a399)
1*84e33947SAndroid Build Coastguard Worker /*
2*84e33947SAndroid Build Coastguard Worker  * Copyright (C) 2022 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 <cstdint>
18*84e33947SAndroid Build Coastguard Worker #include "chre/common.h"
19*84e33947SAndroid Build Coastguard Worker #include "chre/core/event_loop_manager.h"
20*84e33947SAndroid Build Coastguard Worker #include "chre/core/settings.h"
21*84e33947SAndroid Build Coastguard Worker #include "chre/platform/linux/pal_nan.h"
22*84e33947SAndroid Build Coastguard Worker #include "chre/platform/log.h"
23*84e33947SAndroid Build Coastguard Worker #include "chre/util/system/napp_permissions.h"
24*84e33947SAndroid Build Coastguard Worker #include "chre_api/chre/event.h"
25*84e33947SAndroid Build Coastguard Worker #include "chre_api/chre/wifi.h"
26*84e33947SAndroid Build Coastguard Worker 
27*84e33947SAndroid Build Coastguard Worker #include "gtest/gtest.h"
28*84e33947SAndroid Build Coastguard Worker #include "test_base.h"
29*84e33947SAndroid Build Coastguard Worker #include "test_event_queue.h"
30*84e33947SAndroid Build Coastguard Worker #include "test_util.h"
31*84e33947SAndroid Build Coastguard Worker 
32*84e33947SAndroid Build Coastguard Worker /**
33*84e33947SAndroid Build Coastguard Worker  * Simulation to test WiFi NAN functionality in CHRE.
34*84e33947SAndroid Build Coastguard Worker  *
35*84e33947SAndroid Build Coastguard Worker  * The test works as follows:
36*84e33947SAndroid Build Coastguard Worker  * - A test nanoapp starts by requesting NAN subscriptions, with random
37*84e33947SAndroid Build Coastguard Worker  *   service specific information. It also requests NAN ranging measurements
38*84e33947SAndroid Build Coastguard Worker  *   if the test desires it. The Linux WiFi PAL has hooks and flags that
39*84e33947SAndroid Build Coastguard Worker  *   instruct it to cover various test cases (fail subscribe, terminate
40*84e33947SAndroid Build Coastguard Worker  *   service, etc.), to enable testing of all NAN events that CHRE is
41*84e33947SAndroid Build Coastguard Worker  *   expected to propagate. These flags should be set before startTestNanoapping
42*84e33947SAndroid Build Coastguard Worker  * the test nanoapp.
43*84e33947SAndroid Build Coastguard Worker  *
44*84e33947SAndroid Build Coastguard Worker  * - The test fails (times out) if any of the events are not sent by CHRE.
45*84e33947SAndroid Build Coastguard Worker  */
46*84e33947SAndroid Build Coastguard Worker 
47*84e33947SAndroid Build Coastguard Worker namespace chre {
48*84e33947SAndroid Build Coastguard Worker namespace {
49*84e33947SAndroid Build Coastguard Worker 
50*84e33947SAndroid Build Coastguard Worker /**
51*84e33947SAndroid Build Coastguard Worker  * Common settings for test nanoapps.
52*84e33947SAndroid Build Coastguard Worker  *
53*84e33947SAndroid Build Coastguard Worker  * - Grant WiFi permissions,
54*84e33947SAndroid Build Coastguard Worker  * - Initialize the WiFi state in start.
55*84e33947SAndroid Build Coastguard Worker  */
56*84e33947SAndroid Build Coastguard Worker class NanTestNanoapp : public TestNanoapp {
57*84e33947SAndroid Build Coastguard Worker  public:
NanTestNanoapp()58*84e33947SAndroid Build Coastguard Worker   NanTestNanoapp()
59*84e33947SAndroid Build Coastguard Worker       : TestNanoapp(
60*84e33947SAndroid Build Coastguard Worker             TestNanoappInfo{.perms = NanoappPermissions::CHRE_PERMS_WIFI}) {}
61*84e33947SAndroid Build Coastguard Worker 
start()62*84e33947SAndroid Build Coastguard Worker   bool start() override {
63*84e33947SAndroid Build Coastguard Worker     EventLoopManagerSingleton::get()->getSettingManager().postSettingChange(
64*84e33947SAndroid Build Coastguard Worker         Setting::WIFI_AVAILABLE, true /* enabled */);
65*84e33947SAndroid Build Coastguard Worker     PalNanEngineSingleton::get()->setFlags(PalNanEngine::Flags::NONE);
66*84e33947SAndroid Build Coastguard Worker     return true;
67*84e33947SAndroid Build Coastguard Worker   }
68*84e33947SAndroid Build Coastguard Worker };
69*84e33947SAndroid Build Coastguard Worker 
70*84e33947SAndroid Build Coastguard Worker /**
71*84e33947SAndroid Build Coastguard Worker  * Test that an async error is received if NAN operations are attempted when
72*84e33947SAndroid Build Coastguard Worker  * the WiFi setting is disabled.
73*84e33947SAndroid Build Coastguard Worker  */
TEST_F(TestBase,WifiNanDisabledViaSettings)74*84e33947SAndroid Build Coastguard Worker TEST_F(TestBase, WifiNanDisabledViaSettings) {
75*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(NAN_SUBSCRIBE, 0);
76*84e33947SAndroid Build Coastguard Worker 
77*84e33947SAndroid Build Coastguard Worker   class App : public NanTestNanoapp {
78*84e33947SAndroid Build Coastguard Worker    public:
79*84e33947SAndroid Build Coastguard Worker     void handleEvent(uint32_t, uint16_t eventType,
80*84e33947SAndroid Build Coastguard Worker                      const void *eventData) override {
81*84e33947SAndroid Build Coastguard Worker       constexpr uint32_t kSubscribeCookie = 0x10aded;
82*84e33947SAndroid Build Coastguard Worker 
83*84e33947SAndroid Build Coastguard Worker       switch (eventType) {
84*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_WIFI_ASYNC_RESULT: {
85*84e33947SAndroid Build Coastguard Worker           auto *event = static_cast<const chreAsyncResult *>(eventData);
86*84e33947SAndroid Build Coastguard Worker           if (event->requestType == CHRE_WIFI_REQUEST_TYPE_NAN_SUBSCRIBE) {
87*84e33947SAndroid Build Coastguard Worker             ASSERT_EQ(event->errorCode, CHRE_ERROR_FUNCTION_DISABLED);
88*84e33947SAndroid Build Coastguard Worker             TestEventQueueSingleton::get()->pushEvent(
89*84e33947SAndroid Build Coastguard Worker                 CHRE_EVENT_WIFI_ASYNC_RESULT);
90*84e33947SAndroid Build Coastguard Worker           }
91*84e33947SAndroid Build Coastguard Worker           break;
92*84e33947SAndroid Build Coastguard Worker         }
93*84e33947SAndroid Build Coastguard Worker 
94*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_TEST_EVENT: {
95*84e33947SAndroid Build Coastguard Worker           auto event = static_cast<const TestEvent *>(eventData);
96*84e33947SAndroid Build Coastguard Worker           switch (event->type) {
97*84e33947SAndroid Build Coastguard Worker             case NAN_SUBSCRIBE: {
98*84e33947SAndroid Build Coastguard Worker               auto config = (chreWifiNanSubscribeConfig *)(event->data);
99*84e33947SAndroid Build Coastguard Worker               chreWifiNanSubscribe(config, &kSubscribeCookie);
100*84e33947SAndroid Build Coastguard Worker               break;
101*84e33947SAndroid Build Coastguard Worker             }
102*84e33947SAndroid Build Coastguard Worker           }
103*84e33947SAndroid Build Coastguard Worker         }
104*84e33947SAndroid Build Coastguard Worker       }
105*84e33947SAndroid Build Coastguard Worker     }
106*84e33947SAndroid Build Coastguard Worker   };
107*84e33947SAndroid Build Coastguard Worker 
108*84e33947SAndroid Build Coastguard Worker   uint64_t appId = loadNanoapp(MakeUnique<App>());
109*84e33947SAndroid Build Coastguard Worker 
110*84e33947SAndroid Build Coastguard Worker   EventLoopManagerSingleton::get()->getSettingManager().postSettingChange(
111*84e33947SAndroid Build Coastguard Worker       Setting::WIFI_AVAILABLE, false /* enabled */);
112*84e33947SAndroid Build Coastguard Worker 
113*84e33947SAndroid Build Coastguard Worker   chreWifiNanSubscribeConfig config = {
114*84e33947SAndroid Build Coastguard Worker       .subscribeType = CHRE_WIFI_NAN_SUBSCRIBE_TYPE_PASSIVE,
115*84e33947SAndroid Build Coastguard Worker       .service = "SomeServiceName",
116*84e33947SAndroid Build Coastguard Worker   };
117*84e33947SAndroid Build Coastguard Worker   sendEventToNanoapp(appId, NAN_SUBSCRIBE, config);
118*84e33947SAndroid Build Coastguard Worker   waitForEvent(CHRE_EVENT_WIFI_ASYNC_RESULT);
119*84e33947SAndroid Build Coastguard Worker }
120*84e33947SAndroid Build Coastguard Worker 
121*84e33947SAndroid Build Coastguard Worker /**
122*84e33947SAndroid Build Coastguard Worker  * Test that a subscription request succeeds, and an identifier event is
123*84e33947SAndroid Build Coastguard Worker  * received with a matching cookie. Also test that a discovery event is later
124*84e33947SAndroid Build Coastguard Worker  * received, marking the completion of the subscription process.
125*84e33947SAndroid Build Coastguard Worker  */
TEST_F(TestBase,WifiNanSuccessfulSubscribe)126*84e33947SAndroid Build Coastguard Worker TEST_F(TestBase, WifiNanSuccessfulSubscribe) {
127*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(NAN_SUBSCRIBE, 0);
128*84e33947SAndroid Build Coastguard Worker 
129*84e33947SAndroid Build Coastguard Worker   class App : public NanTestNanoapp {
130*84e33947SAndroid Build Coastguard Worker    public:
131*84e33947SAndroid Build Coastguard Worker     void handleEvent(uint32_t, uint16_t eventType,
132*84e33947SAndroid Build Coastguard Worker                      const void *eventData) override {
133*84e33947SAndroid Build Coastguard Worker       const uint32_t kSubscribeCookie = 0x10aded;
134*84e33947SAndroid Build Coastguard Worker 
135*84e33947SAndroid Build Coastguard Worker       switch (eventType) {
136*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_WIFI_NAN_IDENTIFIER_RESULT: {
137*84e33947SAndroid Build Coastguard Worker           auto event =
138*84e33947SAndroid Build Coastguard Worker               static_cast<const chreWifiNanIdentifierEvent *>(eventData);
139*84e33947SAndroid Build Coastguard Worker           if (event->result.errorCode == CHRE_ERROR_NONE) {
140*84e33947SAndroid Build Coastguard Worker             TestEventQueueSingleton::get()->pushEvent(
141*84e33947SAndroid Build Coastguard Worker                 CHRE_EVENT_WIFI_NAN_IDENTIFIER_RESULT, event->id);
142*84e33947SAndroid Build Coastguard Worker           }
143*84e33947SAndroid Build Coastguard Worker           break;
144*84e33947SAndroid Build Coastguard Worker         }
145*84e33947SAndroid Build Coastguard Worker 
146*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_WIFI_NAN_DISCOVERY_RESULT: {
147*84e33947SAndroid Build Coastguard Worker           auto event =
148*84e33947SAndroid Build Coastguard Worker               static_cast<const chreWifiNanDiscoveryEvent *>(eventData);
149*84e33947SAndroid Build Coastguard Worker           TestEventQueueSingleton::get()->pushEvent(
150*84e33947SAndroid Build Coastguard Worker               CHRE_EVENT_WIFI_NAN_DISCOVERY_RESULT, event->subscribeId);
151*84e33947SAndroid Build Coastguard Worker           break;
152*84e33947SAndroid Build Coastguard Worker         }
153*84e33947SAndroid Build Coastguard Worker 
154*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_TEST_EVENT: {
155*84e33947SAndroid Build Coastguard Worker           auto event = static_cast<const TestEvent *>(eventData);
156*84e33947SAndroid Build Coastguard Worker           switch (event->type) {
157*84e33947SAndroid Build Coastguard Worker             case NAN_SUBSCRIBE: {
158*84e33947SAndroid Build Coastguard Worker               auto config = (chreWifiNanSubscribeConfig *)(event->data);
159*84e33947SAndroid Build Coastguard Worker               const bool success =
160*84e33947SAndroid Build Coastguard Worker                   chreWifiNanSubscribe(config, &kSubscribeCookie);
161*84e33947SAndroid Build Coastguard Worker               TestEventQueueSingleton::get()->pushEvent(NAN_SUBSCRIBE, success);
162*84e33947SAndroid Build Coastguard Worker               break;
163*84e33947SAndroid Build Coastguard Worker             }
164*84e33947SAndroid Build Coastguard Worker           }
165*84e33947SAndroid Build Coastguard Worker         }
166*84e33947SAndroid Build Coastguard Worker       }
167*84e33947SAndroid Build Coastguard Worker     }
168*84e33947SAndroid Build Coastguard Worker   };
169*84e33947SAndroid Build Coastguard Worker 
170*84e33947SAndroid Build Coastguard Worker   uint64_t appId = loadNanoapp(MakeUnique<App>());
171*84e33947SAndroid Build Coastguard Worker 
172*84e33947SAndroid Build Coastguard Worker   chreWifiNanSubscribeConfig config = {
173*84e33947SAndroid Build Coastguard Worker       .subscribeType = CHRE_WIFI_NAN_SUBSCRIBE_TYPE_PASSIVE,
174*84e33947SAndroid Build Coastguard Worker       .service = "SomeServiceName",
175*84e33947SAndroid Build Coastguard Worker   };
176*84e33947SAndroid Build Coastguard Worker   sendEventToNanoapp(appId, NAN_SUBSCRIBE, config);
177*84e33947SAndroid Build Coastguard Worker   bool success;
178*84e33947SAndroid Build Coastguard Worker   waitForEvent(NAN_SUBSCRIBE, &success);
179*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(success);
180*84e33947SAndroid Build Coastguard Worker 
181*84e33947SAndroid Build Coastguard Worker   uint32_t id;
182*84e33947SAndroid Build Coastguard Worker   waitForEvent(CHRE_EVENT_WIFI_NAN_IDENTIFIER_RESULT, &id);
183*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(PalNanEngineSingleton::get()->isSubscriptionActive(id));
184*84e33947SAndroid Build Coastguard Worker 
185*84e33947SAndroid Build Coastguard Worker   PalNanEngineSingleton::get()->sendDiscoveryEvent(id);
186*84e33947SAndroid Build Coastguard Worker   uint32_t subscribeId;
187*84e33947SAndroid Build Coastguard Worker   waitForEvent(CHRE_EVENT_WIFI_NAN_DISCOVERY_RESULT, &subscribeId);
188*84e33947SAndroid Build Coastguard Worker 
189*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(id, subscribeId);
190*84e33947SAndroid Build Coastguard Worker }
191*84e33947SAndroid Build Coastguard Worker 
TEST_F(TestBase,WifiNanUnsSubscribeOnNanoappUnload)192*84e33947SAndroid Build Coastguard Worker TEST_F(TestBase, WifiNanUnsSubscribeOnNanoappUnload) {
193*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(NAN_SUBSCRIBE, 0);
194*84e33947SAndroid Build Coastguard Worker 
195*84e33947SAndroid Build Coastguard Worker   class App : public NanTestNanoapp {
196*84e33947SAndroid Build Coastguard Worker    public:
197*84e33947SAndroid Build Coastguard Worker     void handleEvent(uint32_t, uint16_t eventType,
198*84e33947SAndroid Build Coastguard Worker                      const void *eventData) override {
199*84e33947SAndroid Build Coastguard Worker       const uint32_t kSubscribeCookie = 0x10aded;
200*84e33947SAndroid Build Coastguard Worker 
201*84e33947SAndroid Build Coastguard Worker       switch (eventType) {
202*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_WIFI_NAN_IDENTIFIER_RESULT: {
203*84e33947SAndroid Build Coastguard Worker           auto event =
204*84e33947SAndroid Build Coastguard Worker               static_cast<const chreWifiNanIdentifierEvent *>(eventData);
205*84e33947SAndroid Build Coastguard Worker           if (event->result.errorCode == CHRE_ERROR_NONE) {
206*84e33947SAndroid Build Coastguard Worker             TestEventQueueSingleton::get()->pushEvent(
207*84e33947SAndroid Build Coastguard Worker                 CHRE_EVENT_WIFI_NAN_IDENTIFIER_RESULT, event->id);
208*84e33947SAndroid Build Coastguard Worker           }
209*84e33947SAndroid Build Coastguard Worker           break;
210*84e33947SAndroid Build Coastguard Worker         }
211*84e33947SAndroid Build Coastguard Worker 
212*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_TEST_EVENT: {
213*84e33947SAndroid Build Coastguard Worker           auto event = static_cast<const TestEvent *>(eventData);
214*84e33947SAndroid Build Coastguard Worker           switch (event->type) {
215*84e33947SAndroid Build Coastguard Worker             case NAN_SUBSCRIBE: {
216*84e33947SAndroid Build Coastguard Worker               auto config = (chreWifiNanSubscribeConfig *)(event->data);
217*84e33947SAndroid Build Coastguard Worker               const bool success =
218*84e33947SAndroid Build Coastguard Worker                   chreWifiNanSubscribe(config, &kSubscribeCookie);
219*84e33947SAndroid Build Coastguard Worker               TestEventQueueSingleton::get()->pushEvent(NAN_SUBSCRIBE, success);
220*84e33947SAndroid Build Coastguard Worker               break;
221*84e33947SAndroid Build Coastguard Worker             }
222*84e33947SAndroid Build Coastguard Worker           }
223*84e33947SAndroid Build Coastguard Worker         }
224*84e33947SAndroid Build Coastguard Worker       }
225*84e33947SAndroid Build Coastguard Worker     }
226*84e33947SAndroid Build Coastguard Worker   };
227*84e33947SAndroid Build Coastguard Worker 
228*84e33947SAndroid Build Coastguard Worker   uint64_t appId = loadNanoapp(MakeUnique<App>());
229*84e33947SAndroid Build Coastguard Worker 
230*84e33947SAndroid Build Coastguard Worker   chreWifiNanSubscribeConfig config = {
231*84e33947SAndroid Build Coastguard Worker       .subscribeType = CHRE_WIFI_NAN_SUBSCRIBE_TYPE_PASSIVE,
232*84e33947SAndroid Build Coastguard Worker       .service = "SomeServiceName",
233*84e33947SAndroid Build Coastguard Worker   };
234*84e33947SAndroid Build Coastguard Worker   sendEventToNanoapp(appId, NAN_SUBSCRIBE, config);
235*84e33947SAndroid Build Coastguard Worker   bool success;
236*84e33947SAndroid Build Coastguard Worker   waitForEvent(NAN_SUBSCRIBE, &success);
237*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(success);
238*84e33947SAndroid Build Coastguard Worker 
239*84e33947SAndroid Build Coastguard Worker   uint32_t id;
240*84e33947SAndroid Build Coastguard Worker   waitForEvent(CHRE_EVENT_WIFI_NAN_IDENTIFIER_RESULT, &id);
241*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(PalNanEngineSingleton::get()->isSubscriptionActive(id));
242*84e33947SAndroid Build Coastguard Worker 
243*84e33947SAndroid Build Coastguard Worker   unloadNanoapp(appId);
244*84e33947SAndroid Build Coastguard Worker   EXPECT_FALSE(PalNanEngineSingleton::get()->isSubscriptionActive(id));
245*84e33947SAndroid Build Coastguard Worker }
246*84e33947SAndroid Build Coastguard Worker 
247*84e33947SAndroid Build Coastguard Worker /**
248*84e33947SAndroid Build Coastguard Worker  * Test that a subscription request fails, and an identifier event is received
249*84e33947SAndroid Build Coastguard Worker  * with a matching cookie, indicating the reason for the error (Note that the
250*84e33947SAndroid Build Coastguard Worker  * fake PAL engine always returns the generic CHRE_ERROR as the error code,
251*84e33947SAndroid Build Coastguard Worker  * but this may vary in unsimulated scenarios).
252*84e33947SAndroid Build Coastguard Worker  */
TEST_F(TestBase,WifiNanUnuccessfulSubscribeTest)253*84e33947SAndroid Build Coastguard Worker TEST_F(TestBase, WifiNanUnuccessfulSubscribeTest) {
254*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(NAN_SUBSCRIBE, 0);
255*84e33947SAndroid Build Coastguard Worker 
256*84e33947SAndroid Build Coastguard Worker   class App : public NanTestNanoapp {
257*84e33947SAndroid Build Coastguard Worker    public:
258*84e33947SAndroid Build Coastguard Worker     void handleEvent(uint32_t, uint16_t eventType,
259*84e33947SAndroid Build Coastguard Worker                      const void *eventData) override {
260*84e33947SAndroid Build Coastguard Worker       const uint32_t kSubscribeCookie = 0x10aded;
261*84e33947SAndroid Build Coastguard Worker 
262*84e33947SAndroid Build Coastguard Worker       switch (eventType) {
263*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_WIFI_NAN_IDENTIFIER_RESULT: {
264*84e33947SAndroid Build Coastguard Worker           auto event =
265*84e33947SAndroid Build Coastguard Worker               static_cast<const chreWifiNanIdentifierEvent *>(eventData);
266*84e33947SAndroid Build Coastguard Worker           if (event->result.errorCode != CHRE_ERROR_NONE) {
267*84e33947SAndroid Build Coastguard Worker             TestEventQueueSingleton::get()->pushEvent(
268*84e33947SAndroid Build Coastguard Worker                 CHRE_EVENT_WIFI_NAN_IDENTIFIER_RESULT);
269*84e33947SAndroid Build Coastguard Worker           }
270*84e33947SAndroid Build Coastguard Worker           break;
271*84e33947SAndroid Build Coastguard Worker         }
272*84e33947SAndroid Build Coastguard Worker 
273*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_TEST_EVENT: {
274*84e33947SAndroid Build Coastguard Worker           auto event = static_cast<const TestEvent *>(eventData);
275*84e33947SAndroid Build Coastguard Worker           switch (event->type) {
276*84e33947SAndroid Build Coastguard Worker             case NAN_SUBSCRIBE: {
277*84e33947SAndroid Build Coastguard Worker               auto config = (chreWifiNanSubscribeConfig *)(event->data);
278*84e33947SAndroid Build Coastguard Worker               const bool success =
279*84e33947SAndroid Build Coastguard Worker                   chreWifiNanSubscribe(config, &kSubscribeCookie);
280*84e33947SAndroid Build Coastguard Worker               TestEventQueueSingleton::get()->pushEvent(NAN_SUBSCRIBE, success);
281*84e33947SAndroid Build Coastguard Worker               break;
282*84e33947SAndroid Build Coastguard Worker             }
283*84e33947SAndroid Build Coastguard Worker           }
284*84e33947SAndroid Build Coastguard Worker         }
285*84e33947SAndroid Build Coastguard Worker       }
286*84e33947SAndroid Build Coastguard Worker     }
287*84e33947SAndroid Build Coastguard Worker   };
288*84e33947SAndroid Build Coastguard Worker 
289*84e33947SAndroid Build Coastguard Worker   uint64_t appId = loadNanoapp(MakeUnique<App>());
290*84e33947SAndroid Build Coastguard Worker 
291*84e33947SAndroid Build Coastguard Worker   PalNanEngineSingleton::get()->setFlags(PalNanEngine::Flags::FAIL_SUBSCRIBE);
292*84e33947SAndroid Build Coastguard Worker 
293*84e33947SAndroid Build Coastguard Worker   chreWifiNanSubscribeConfig config = {
294*84e33947SAndroid Build Coastguard Worker       .subscribeType = CHRE_WIFI_NAN_SUBSCRIBE_TYPE_PASSIVE,
295*84e33947SAndroid Build Coastguard Worker       .service = "SomeServiceName",
296*84e33947SAndroid Build Coastguard Worker   };
297*84e33947SAndroid Build Coastguard Worker   sendEventToNanoapp(appId, NAN_SUBSCRIBE, config);
298*84e33947SAndroid Build Coastguard Worker   bool success;
299*84e33947SAndroid Build Coastguard Worker   waitForEvent(NAN_SUBSCRIBE, &success);
300*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(success);
301*84e33947SAndroid Build Coastguard Worker 
302*84e33947SAndroid Build Coastguard Worker   waitForEvent(CHRE_EVENT_WIFI_NAN_IDENTIFIER_RESULT);
303*84e33947SAndroid Build Coastguard Worker }
304*84e33947SAndroid Build Coastguard Worker 
305*84e33947SAndroid Build Coastguard Worker /**
306*84e33947SAndroid Build Coastguard Worker  * Test that a terminated event is received upon the Pal NAN engine
307*84e33947SAndroid Build Coastguard Worker  * terminating a discovered service.
308*84e33947SAndroid Build Coastguard Worker  */
TEST_F(TestBase,WifiNanServiceTerminatedTest)309*84e33947SAndroid Build Coastguard Worker TEST_F(TestBase, WifiNanServiceTerminatedTest) {
310*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(NAN_SUBSCRIBE, 0);
311*84e33947SAndroid Build Coastguard Worker 
312*84e33947SAndroid Build Coastguard Worker   class App : public NanTestNanoapp {
313*84e33947SAndroid Build Coastguard Worker    public:
314*84e33947SAndroid Build Coastguard Worker     void handleEvent(uint32_t, uint16_t eventType,
315*84e33947SAndroid Build Coastguard Worker                      const void *eventData) override {
316*84e33947SAndroid Build Coastguard Worker       const uint32_t kSubscribeCookie = 0x10aded;
317*84e33947SAndroid Build Coastguard Worker 
318*84e33947SAndroid Build Coastguard Worker       switch (eventType) {
319*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_WIFI_NAN_IDENTIFIER_RESULT: {
320*84e33947SAndroid Build Coastguard Worker           auto event =
321*84e33947SAndroid Build Coastguard Worker               static_cast<const chreWifiNanIdentifierEvent *>(eventData);
322*84e33947SAndroid Build Coastguard Worker           if (event->result.errorCode == CHRE_ERROR_NONE) {
323*84e33947SAndroid Build Coastguard Worker             TestEventQueueSingleton::get()->pushEvent(
324*84e33947SAndroid Build Coastguard Worker                 CHRE_EVENT_WIFI_NAN_IDENTIFIER_RESULT, event->id);
325*84e33947SAndroid Build Coastguard Worker           }
326*84e33947SAndroid Build Coastguard Worker           break;
327*84e33947SAndroid Build Coastguard Worker         }
328*84e33947SAndroid Build Coastguard Worker 
329*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_WIFI_NAN_DISCOVERY_RESULT: {
330*84e33947SAndroid Build Coastguard Worker           auto event =
331*84e33947SAndroid Build Coastguard Worker               static_cast<const chreWifiNanDiscoveryEvent *>(eventData);
332*84e33947SAndroid Build Coastguard Worker           TestEventQueueSingleton::get()->pushEvent(
333*84e33947SAndroid Build Coastguard Worker               CHRE_EVENT_WIFI_NAN_DISCOVERY_RESULT, event->subscribeId);
334*84e33947SAndroid Build Coastguard Worker           break;
335*84e33947SAndroid Build Coastguard Worker         }
336*84e33947SAndroid Build Coastguard Worker 
337*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_WIFI_NAN_SESSION_TERMINATED: {
338*84e33947SAndroid Build Coastguard Worker           auto event =
339*84e33947SAndroid Build Coastguard Worker               static_cast<const chreWifiNanSessionTerminatedEvent *>(eventData);
340*84e33947SAndroid Build Coastguard Worker           TestEventQueueSingleton::get()->pushEvent(
341*84e33947SAndroid Build Coastguard Worker               CHRE_EVENT_WIFI_NAN_SESSION_TERMINATED, event->id);
342*84e33947SAndroid Build Coastguard Worker           break;
343*84e33947SAndroid Build Coastguard Worker         }
344*84e33947SAndroid Build Coastguard Worker 
345*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_TEST_EVENT: {
346*84e33947SAndroid Build Coastguard Worker           auto event = static_cast<const TestEvent *>(eventData);
347*84e33947SAndroid Build Coastguard Worker           switch (event->type) {
348*84e33947SAndroid Build Coastguard Worker             case NAN_SUBSCRIBE: {
349*84e33947SAndroid Build Coastguard Worker               auto config = (chreWifiNanSubscribeConfig *)(event->data);
350*84e33947SAndroid Build Coastguard Worker               const bool success =
351*84e33947SAndroid Build Coastguard Worker                   chreWifiNanSubscribe(config, &kSubscribeCookie);
352*84e33947SAndroid Build Coastguard Worker               TestEventQueueSingleton::get()->pushEvent(NAN_SUBSCRIBE, success);
353*84e33947SAndroid Build Coastguard Worker               break;
354*84e33947SAndroid Build Coastguard Worker             }
355*84e33947SAndroid Build Coastguard Worker           }
356*84e33947SAndroid Build Coastguard Worker         }
357*84e33947SAndroid Build Coastguard Worker       }
358*84e33947SAndroid Build Coastguard Worker     }
359*84e33947SAndroid Build Coastguard Worker   };
360*84e33947SAndroid Build Coastguard Worker 
361*84e33947SAndroid Build Coastguard Worker   uint64_t appId = loadNanoapp(MakeUnique<App>());
362*84e33947SAndroid Build Coastguard Worker 
363*84e33947SAndroid Build Coastguard Worker   chreWifiNanSubscribeConfig config = {
364*84e33947SAndroid Build Coastguard Worker       .subscribeType = CHRE_WIFI_NAN_SUBSCRIBE_TYPE_PASSIVE,
365*84e33947SAndroid Build Coastguard Worker       .service = "SomeServiceName",
366*84e33947SAndroid Build Coastguard Worker   };
367*84e33947SAndroid Build Coastguard Worker   sendEventToNanoapp(appId, NAN_SUBSCRIBE, config);
368*84e33947SAndroid Build Coastguard Worker   bool success;
369*84e33947SAndroid Build Coastguard Worker   waitForEvent(NAN_SUBSCRIBE, &success);
370*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(success);
371*84e33947SAndroid Build Coastguard Worker 
372*84e33947SAndroid Build Coastguard Worker   uint32_t id;
373*84e33947SAndroid Build Coastguard Worker   waitForEvent(CHRE_EVENT_WIFI_NAN_IDENTIFIER_RESULT, &id);
374*84e33947SAndroid Build Coastguard Worker 
375*84e33947SAndroid Build Coastguard Worker   PalNanEngineSingleton::get()->sendDiscoveryEvent(id);
376*84e33947SAndroid Build Coastguard Worker   uint32_t subscribeId;
377*84e33947SAndroid Build Coastguard Worker   waitForEvent(CHRE_EVENT_WIFI_NAN_DISCOVERY_RESULT, &subscribeId);
378*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(subscribeId, id);
379*84e33947SAndroid Build Coastguard Worker 
380*84e33947SAndroid Build Coastguard Worker   PalNanEngineSingleton::get()->onServiceTerminated(id);
381*84e33947SAndroid Build Coastguard Worker   uint32_t terminatedId;
382*84e33947SAndroid Build Coastguard Worker   waitForEvent(CHRE_EVENT_WIFI_NAN_SESSION_TERMINATED, &terminatedId);
383*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(terminatedId, id);
384*84e33947SAndroid Build Coastguard Worker }
385*84e33947SAndroid Build Coastguard Worker 
386*84e33947SAndroid Build Coastguard Worker /**
387*84e33947SAndroid Build Coastguard Worker  * Test that a service lost event is received upon the Pal NAN engine 'losing'
388*84e33947SAndroid Build Coastguard Worker  * a discovered service.
389*84e33947SAndroid Build Coastguard Worker  */
TEST_F(TestBase,WifiNanServiceLostTest)390*84e33947SAndroid Build Coastguard Worker TEST_F(TestBase, WifiNanServiceLostTest) {
391*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(NAN_SUBSCRIBE, 0);
392*84e33947SAndroid Build Coastguard Worker 
393*84e33947SAndroid Build Coastguard Worker   struct Ids {
394*84e33947SAndroid Build Coastguard Worker     uint32_t subscribe;
395*84e33947SAndroid Build Coastguard Worker     uint32_t publish;
396*84e33947SAndroid Build Coastguard Worker   };
397*84e33947SAndroid Build Coastguard Worker 
398*84e33947SAndroid Build Coastguard Worker   class App : public NanTestNanoapp {
399*84e33947SAndroid Build Coastguard Worker    public:
400*84e33947SAndroid Build Coastguard Worker     void handleEvent(uint32_t, uint16_t eventType,
401*84e33947SAndroid Build Coastguard Worker                      const void *eventData) override {
402*84e33947SAndroid Build Coastguard Worker       const uint32_t kSubscribeCookie = 0x10aded;
403*84e33947SAndroid Build Coastguard Worker 
404*84e33947SAndroid Build Coastguard Worker       switch (eventType) {
405*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_WIFI_NAN_IDENTIFIER_RESULT: {
406*84e33947SAndroid Build Coastguard Worker           auto event =
407*84e33947SAndroid Build Coastguard Worker               static_cast<const chreWifiNanIdentifierEvent *>(eventData);
408*84e33947SAndroid Build Coastguard Worker           if (event->result.errorCode == CHRE_ERROR_NONE) {
409*84e33947SAndroid Build Coastguard Worker             TestEventQueueSingleton::get()->pushEvent(
410*84e33947SAndroid Build Coastguard Worker                 CHRE_EVENT_WIFI_NAN_IDENTIFIER_RESULT, event->id);
411*84e33947SAndroid Build Coastguard Worker           }
412*84e33947SAndroid Build Coastguard Worker           break;
413*84e33947SAndroid Build Coastguard Worker         }
414*84e33947SAndroid Build Coastguard Worker 
415*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_WIFI_NAN_DISCOVERY_RESULT: {
416*84e33947SAndroid Build Coastguard Worker           auto event =
417*84e33947SAndroid Build Coastguard Worker               static_cast<const chreWifiNanDiscoveryEvent *>(eventData);
418*84e33947SAndroid Build Coastguard Worker           TestEventQueueSingleton::get()->pushEvent(
419*84e33947SAndroid Build Coastguard Worker               CHRE_EVENT_WIFI_NAN_DISCOVERY_RESULT, event->subscribeId);
420*84e33947SAndroid Build Coastguard Worker           break;
421*84e33947SAndroid Build Coastguard Worker         }
422*84e33947SAndroid Build Coastguard Worker 
423*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_WIFI_NAN_SESSION_LOST: {
424*84e33947SAndroid Build Coastguard Worker           auto event =
425*84e33947SAndroid Build Coastguard Worker               static_cast<const chreWifiNanSessionLostEvent *>(eventData);
426*84e33947SAndroid Build Coastguard Worker           Ids ids = {.subscribe = event->id, .publish = event->peerId};
427*84e33947SAndroid Build Coastguard Worker           TestEventQueueSingleton::get()->pushEvent(
428*84e33947SAndroid Build Coastguard Worker               CHRE_EVENT_WIFI_NAN_SESSION_LOST, ids);
429*84e33947SAndroid Build Coastguard Worker           break;
430*84e33947SAndroid Build Coastguard Worker         }
431*84e33947SAndroid Build Coastguard Worker 
432*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_TEST_EVENT: {
433*84e33947SAndroid Build Coastguard Worker           auto event = static_cast<const TestEvent *>(eventData);
434*84e33947SAndroid Build Coastguard Worker           switch (event->type) {
435*84e33947SAndroid Build Coastguard Worker             case NAN_SUBSCRIBE: {
436*84e33947SAndroid Build Coastguard Worker               auto config = (chreWifiNanSubscribeConfig *)(event->data);
437*84e33947SAndroid Build Coastguard Worker               const bool success =
438*84e33947SAndroid Build Coastguard Worker                   chreWifiNanSubscribe(config, &kSubscribeCookie);
439*84e33947SAndroid Build Coastguard Worker               TestEventQueueSingleton::get()->pushEvent(NAN_SUBSCRIBE, success);
440*84e33947SAndroid Build Coastguard Worker               break;
441*84e33947SAndroid Build Coastguard Worker             }
442*84e33947SAndroid Build Coastguard Worker           }
443*84e33947SAndroid Build Coastguard Worker         }
444*84e33947SAndroid Build Coastguard Worker       }
445*84e33947SAndroid Build Coastguard Worker     }
446*84e33947SAndroid Build Coastguard Worker   };
447*84e33947SAndroid Build Coastguard Worker 
448*84e33947SAndroid Build Coastguard Worker   uint64_t appId = loadNanoapp(MakeUnique<App>());
449*84e33947SAndroid Build Coastguard Worker 
450*84e33947SAndroid Build Coastguard Worker   chreWifiNanSubscribeConfig config = {
451*84e33947SAndroid Build Coastguard Worker       .subscribeType = CHRE_WIFI_NAN_SUBSCRIBE_TYPE_PASSIVE,
452*84e33947SAndroid Build Coastguard Worker       .service = "SomeServiceName",
453*84e33947SAndroid Build Coastguard Worker   };
454*84e33947SAndroid Build Coastguard Worker   sendEventToNanoapp(appId, NAN_SUBSCRIBE, config);
455*84e33947SAndroid Build Coastguard Worker   bool success;
456*84e33947SAndroid Build Coastguard Worker   waitForEvent(NAN_SUBSCRIBE, &success);
457*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(success);
458*84e33947SAndroid Build Coastguard Worker 
459*84e33947SAndroid Build Coastguard Worker   uint32_t id;
460*84e33947SAndroid Build Coastguard Worker   waitForEvent(CHRE_EVENT_WIFI_NAN_IDENTIFIER_RESULT, &id);
461*84e33947SAndroid Build Coastguard Worker 
462*84e33947SAndroid Build Coastguard Worker   PalNanEngineSingleton::get()->sendDiscoveryEvent(id);
463*84e33947SAndroid Build Coastguard Worker   uint32_t subscribeId;
464*84e33947SAndroid Build Coastguard Worker   waitForEvent(CHRE_EVENT_WIFI_NAN_DISCOVERY_RESULT, &subscribeId);
465*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(subscribeId, id);
466*84e33947SAndroid Build Coastguard Worker 
467*84e33947SAndroid Build Coastguard Worker   PalNanEngineSingleton::get()->onServiceLost(subscribeId, id);
468*84e33947SAndroid Build Coastguard Worker   Ids ids;
469*84e33947SAndroid Build Coastguard Worker   waitForEvent(CHRE_EVENT_WIFI_NAN_SESSION_LOST, &ids);
470*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(ids.subscribe, id);
471*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(ids.publish, id);
472*84e33947SAndroid Build Coastguard Worker }
473*84e33947SAndroid Build Coastguard Worker 
474*84e33947SAndroid Build Coastguard Worker /**
475*84e33947SAndroid Build Coastguard Worker  * Test that a ranging event is received upon requesting NAN range
476*84e33947SAndroid Build Coastguard Worker  * measurements.
477*84e33947SAndroid Build Coastguard Worker  */
TEST_F(TestBase,WifiNanRangingTest)478*84e33947SAndroid Build Coastguard Worker TEST_F(TestBase, WifiNanRangingTest) {
479*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(NAN_SUBSCRIBE, 0);
480*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(REQUEST_RANGING, 1);
481*84e33947SAndroid Build Coastguard Worker 
482*84e33947SAndroid Build Coastguard Worker   class App : public NanTestNanoapp {
483*84e33947SAndroid Build Coastguard Worker    public:
484*84e33947SAndroid Build Coastguard Worker     void handleEvent(uint32_t, uint16_t eventType,
485*84e33947SAndroid Build Coastguard Worker                      const void *eventData) override {
486*84e33947SAndroid Build Coastguard Worker       const uint32_t kRangingCookie = 0xfa11;
487*84e33947SAndroid Build Coastguard Worker       const uint32_t kSubscribeCookie = 0x10aded;
488*84e33947SAndroid Build Coastguard Worker 
489*84e33947SAndroid Build Coastguard Worker       switch (eventType) {
490*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_WIFI_ASYNC_RESULT: {
491*84e33947SAndroid Build Coastguard Worker           auto *event = static_cast<const chreAsyncResult *>(eventData);
492*84e33947SAndroid Build Coastguard Worker           if (event->requestType == CHRE_WIFI_REQUEST_TYPE_RANGING) {
493*84e33947SAndroid Build Coastguard Worker             TestEventQueueSingleton::get()->pushEvent(
494*84e33947SAndroid Build Coastguard Worker                 CHRE_EVENT_WIFI_ASYNC_RESULT);
495*84e33947SAndroid Build Coastguard Worker           }
496*84e33947SAndroid Build Coastguard Worker           break;
497*84e33947SAndroid Build Coastguard Worker         }
498*84e33947SAndroid Build Coastguard Worker 
499*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_WIFI_RANGING_RESULT: {
500*84e33947SAndroid Build Coastguard Worker           TestEventQueueSingleton::get()->pushEvent(
501*84e33947SAndroid Build Coastguard Worker               CHRE_EVENT_WIFI_RANGING_RESULT);
502*84e33947SAndroid Build Coastguard Worker           break;
503*84e33947SAndroid Build Coastguard Worker         }
504*84e33947SAndroid Build Coastguard Worker 
505*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_TEST_EVENT: {
506*84e33947SAndroid Build Coastguard Worker           auto event = static_cast<const TestEvent *>(eventData);
507*84e33947SAndroid Build Coastguard Worker           switch (event->type) {
508*84e33947SAndroid Build Coastguard Worker             case NAN_SUBSCRIBE: {
509*84e33947SAndroid Build Coastguard Worker               auto config = (chreWifiNanSubscribeConfig *)(event->data);
510*84e33947SAndroid Build Coastguard Worker               const bool success =
511*84e33947SAndroid Build Coastguard Worker                   chreWifiNanSubscribe(config, &kSubscribeCookie);
512*84e33947SAndroid Build Coastguard Worker               TestEventQueueSingleton::get()->pushEvent(NAN_SUBSCRIBE, success);
513*84e33947SAndroid Build Coastguard Worker               break;
514*84e33947SAndroid Build Coastguard Worker             }
515*84e33947SAndroid Build Coastguard Worker 
516*84e33947SAndroid Build Coastguard Worker             case REQUEST_RANGING: {
517*84e33947SAndroid Build Coastguard Worker               uint8_t fakeMacAddress[CHRE_WIFI_BSSID_LEN] = {0x1, 0x2, 0x3,
518*84e33947SAndroid Build Coastguard Worker                                                              0x4, 0x5, 0x6};
519*84e33947SAndroid Build Coastguard Worker               struct chreWifiNanRangingParams fakeRangingParams;
520*84e33947SAndroid Build Coastguard Worker               std::memcpy(fakeRangingParams.macAddress, fakeMacAddress,
521*84e33947SAndroid Build Coastguard Worker                           CHRE_WIFI_BSSID_LEN);
522*84e33947SAndroid Build Coastguard Worker               const bool success = chreWifiNanRequestRangingAsync(
523*84e33947SAndroid Build Coastguard Worker                   &fakeRangingParams, &kRangingCookie);
524*84e33947SAndroid Build Coastguard Worker               TestEventQueueSingleton::get()->pushEvent(REQUEST_RANGING,
525*84e33947SAndroid Build Coastguard Worker                                                         success);
526*84e33947SAndroid Build Coastguard Worker               break;
527*84e33947SAndroid Build Coastguard Worker             }
528*84e33947SAndroid Build Coastguard Worker           }
529*84e33947SAndroid Build Coastguard Worker         }
530*84e33947SAndroid Build Coastguard Worker       }
531*84e33947SAndroid Build Coastguard Worker     }
532*84e33947SAndroid Build Coastguard Worker   };
533*84e33947SAndroid Build Coastguard Worker 
534*84e33947SAndroid Build Coastguard Worker   uint64_t appId = loadNanoapp(MakeUnique<App>());
535*84e33947SAndroid Build Coastguard Worker 
536*84e33947SAndroid Build Coastguard Worker   bool success;
537*84e33947SAndroid Build Coastguard Worker 
538*84e33947SAndroid Build Coastguard Worker   chreWifiNanSubscribeConfig config = {
539*84e33947SAndroid Build Coastguard Worker       .subscribeType = CHRE_WIFI_NAN_SUBSCRIBE_TYPE_PASSIVE,
540*84e33947SAndroid Build Coastguard Worker       .service = "SomeServiceName",
541*84e33947SAndroid Build Coastguard Worker   };
542*84e33947SAndroid Build Coastguard Worker   sendEventToNanoapp(appId, NAN_SUBSCRIBE, config);
543*84e33947SAndroid Build Coastguard Worker   waitForEvent(NAN_SUBSCRIBE, &success);
544*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(success);
545*84e33947SAndroid Build Coastguard Worker 
546*84e33947SAndroid Build Coastguard Worker   sendEventToNanoapp(appId, REQUEST_RANGING, config);
547*84e33947SAndroid Build Coastguard Worker   waitForEvent(REQUEST_RANGING, &success);
548*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(success);
549*84e33947SAndroid Build Coastguard Worker   waitForEvent(CHRE_EVENT_WIFI_ASYNC_RESULT);
550*84e33947SAndroid Build Coastguard Worker   waitForEvent(CHRE_EVENT_WIFI_RANGING_RESULT);
551*84e33947SAndroid Build Coastguard Worker }
552*84e33947SAndroid Build Coastguard Worker 
TEST_F(TestBase,WifiNanSubscribeCancelTest)553*84e33947SAndroid Build Coastguard Worker TEST_F(TestBase, WifiNanSubscribeCancelTest) {
554*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(NAN_SUBSCRIBE, 0);
555*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(NAN_SUBSCRIBE_DONE, 1);
556*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(NAN_UNSUBSCRIBE, 2);
557*84e33947SAndroid Build Coastguard Worker   CREATE_CHRE_TEST_EVENT(NAN_UNSUBSCRIBE_DONE, 3);
558*84e33947SAndroid Build Coastguard Worker 
559*84e33947SAndroid Build Coastguard Worker   class App : public NanTestNanoapp {
560*84e33947SAndroid Build Coastguard Worker    public:
561*84e33947SAndroid Build Coastguard Worker     void handleEvent(uint32_t, uint16_t eventType,
562*84e33947SAndroid Build Coastguard Worker                      const void *eventData) override {
563*84e33947SAndroid Build Coastguard Worker       const uint32_t kSubscribeCookie = 0x10aded;
564*84e33947SAndroid Build Coastguard Worker 
565*84e33947SAndroid Build Coastguard Worker       switch (eventType) {
566*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_WIFI_NAN_IDENTIFIER_RESULT: {
567*84e33947SAndroid Build Coastguard Worker           auto event =
568*84e33947SAndroid Build Coastguard Worker               static_cast<const chreWifiNanIdentifierEvent *>(eventData);
569*84e33947SAndroid Build Coastguard Worker           if (event->result.errorCode == CHRE_ERROR_NONE) {
570*84e33947SAndroid Build Coastguard Worker             TestEventQueueSingleton::get()->pushEvent(
571*84e33947SAndroid Build Coastguard Worker                 CHRE_EVENT_WIFI_NAN_IDENTIFIER_RESULT, event->id);
572*84e33947SAndroid Build Coastguard Worker           }
573*84e33947SAndroid Build Coastguard Worker           break;
574*84e33947SAndroid Build Coastguard Worker         }
575*84e33947SAndroid Build Coastguard Worker 
576*84e33947SAndroid Build Coastguard Worker         case CHRE_EVENT_TEST_EVENT: {
577*84e33947SAndroid Build Coastguard Worker           auto event = static_cast<const TestEvent *>(eventData);
578*84e33947SAndroid Build Coastguard Worker           switch (event->type) {
579*84e33947SAndroid Build Coastguard Worker             case NAN_SUBSCRIBE: {
580*84e33947SAndroid Build Coastguard Worker               auto config = (chreWifiNanSubscribeConfig *)(event->data);
581*84e33947SAndroid Build Coastguard Worker               bool success = chreWifiNanSubscribe(config, &kSubscribeCookie);
582*84e33947SAndroid Build Coastguard Worker               TestEventQueueSingleton::get()->pushEvent(NAN_SUBSCRIBE_DONE,
583*84e33947SAndroid Build Coastguard Worker                                                         success);
584*84e33947SAndroid Build Coastguard Worker               break;
585*84e33947SAndroid Build Coastguard Worker             }
586*84e33947SAndroid Build Coastguard Worker             case NAN_UNSUBSCRIBE: {
587*84e33947SAndroid Build Coastguard Worker               auto *id = static_cast<uint32_t *>(event->data);
588*84e33947SAndroid Build Coastguard Worker               bool success = chreWifiNanSubscribeCancel(*id);
589*84e33947SAndroid Build Coastguard Worker               // Note that since we're 'simulating' NAN functionality here,
590*84e33947SAndroid Build Coastguard Worker               // the async subscribe cancel event will be handled before
591*84e33947SAndroid Build Coastguard Worker               // the return event below is posted. For a real on-device (or
592*84e33947SAndroid Build Coastguard Worker               // non-simulated) test, this won't be the case, and care must
593*84e33947SAndroid Build Coastguard Worker               // be taken to handle the asynchronicity appropriately.
594*84e33947SAndroid Build Coastguard Worker               TestEventQueueSingleton::get()->pushEvent(NAN_UNSUBSCRIBE_DONE,
595*84e33947SAndroid Build Coastguard Worker                                                         success);
596*84e33947SAndroid Build Coastguard Worker               break;
597*84e33947SAndroid Build Coastguard Worker             }
598*84e33947SAndroid Build Coastguard Worker           }
599*84e33947SAndroid Build Coastguard Worker         }
600*84e33947SAndroid Build Coastguard Worker       }
601*84e33947SAndroid Build Coastguard Worker     }
602*84e33947SAndroid Build Coastguard Worker   };
603*84e33947SAndroid Build Coastguard Worker 
604*84e33947SAndroid Build Coastguard Worker   uint64_t appId = loadNanoapp(MakeUnique<App>());
605*84e33947SAndroid Build Coastguard Worker 
606*84e33947SAndroid Build Coastguard Worker   chreWifiNanSubscribeConfig config = {
607*84e33947SAndroid Build Coastguard Worker       .subscribeType = CHRE_WIFI_NAN_SUBSCRIBE_TYPE_PASSIVE,
608*84e33947SAndroid Build Coastguard Worker       .service = "SomeServiceName",
609*84e33947SAndroid Build Coastguard Worker   };
610*84e33947SAndroid Build Coastguard Worker 
611*84e33947SAndroid Build Coastguard Worker   bool success = false;
612*84e33947SAndroid Build Coastguard Worker   sendEventToNanoapp(appId, NAN_SUBSCRIBE, config);
613*84e33947SAndroid Build Coastguard Worker   waitForEvent(NAN_SUBSCRIBE_DONE, &success);
614*84e33947SAndroid Build Coastguard Worker   ASSERT_TRUE(success);
615*84e33947SAndroid Build Coastguard Worker 
616*84e33947SAndroid Build Coastguard Worker   uint32_t id;
617*84e33947SAndroid Build Coastguard Worker   waitForEvent(CHRE_EVENT_WIFI_NAN_IDENTIFIER_RESULT, &id);
618*84e33947SAndroid Build Coastguard Worker 
619*84e33947SAndroid Build Coastguard Worker   auto &wifiRequestManager =
620*84e33947SAndroid Build Coastguard Worker       EventLoopManagerSingleton::get()->getWifiRequestManager();
621*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(wifiRequestManager.getNumNanSubscriptions(), 1);
622*84e33947SAndroid Build Coastguard Worker 
623*84e33947SAndroid Build Coastguard Worker   success = false;
624*84e33947SAndroid Build Coastguard Worker   sendEventToNanoapp(appId, NAN_UNSUBSCRIBE, id);
625*84e33947SAndroid Build Coastguard Worker   waitForEvent(NAN_UNSUBSCRIBE_DONE, &success);
626*84e33947SAndroid Build Coastguard Worker   ASSERT_TRUE(success);
627*84e33947SAndroid Build Coastguard Worker   // TODO(b/272351526): consider adding an async result event to catch when the
628*84e33947SAndroid Build Coastguard Worker   //                     unsubscribe has finished
629*84e33947SAndroid Build Coastguard Worker   // EXPECT_EQ(wifiRequestManager.getNumNanSubscriptions(), 0);
630*84e33947SAndroid Build Coastguard Worker }
631*84e33947SAndroid Build Coastguard Worker 
632*84e33947SAndroid Build Coastguard Worker }  // anonymous namespace
633*84e33947SAndroid Build Coastguard Worker }  // namespace chre
634