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 "test_base.h"
18*84e33947SAndroid Build Coastguard Worker
19*84e33947SAndroid Build Coastguard Worker #include <gtest/gtest.h>
20*84e33947SAndroid Build Coastguard Worker
21*84e33947SAndroid Build Coastguard Worker #include <thread>
22*84e33947SAndroid Build Coastguard Worker
23*84e33947SAndroid Build Coastguard Worker #include "chre/core/event_loop_manager.h"
24*84e33947SAndroid Build Coastguard Worker #include "chre/core/settings.h"
25*84e33947SAndroid Build Coastguard Worker #include "chre/platform/linux/pal_gnss.h"
26*84e33947SAndroid Build Coastguard Worker #include "chre/platform/log.h"
27*84e33947SAndroid Build Coastguard Worker #include "chre/util/system/napp_permissions.h"
28*84e33947SAndroid Build Coastguard Worker #include "chre_api/chre/gnss.h"
29*84e33947SAndroid Build Coastguard Worker #include "chre_api/chre/user_settings.h"
30*84e33947SAndroid Build Coastguard Worker #include "chre_api/chre/wifi.h"
31*84e33947SAndroid Build Coastguard Worker #include "test_event_queue.h"
32*84e33947SAndroid Build Coastguard Worker #include "test_util.h"
33*84e33947SAndroid Build Coastguard Worker
34*84e33947SAndroid Build Coastguard Worker namespace chre {
35*84e33947SAndroid Build Coastguard Worker
36*84e33947SAndroid Build Coastguard Worker namespace {
37*84e33947SAndroid Build Coastguard Worker
38*84e33947SAndroid Build Coastguard Worker int8_t gExpectedLocationSettingState;
39*84e33947SAndroid Build Coastguard Worker int8_t gExpectedWifiSettingState;
40*84e33947SAndroid Build Coastguard Worker
start()41*84e33947SAndroid Build Coastguard Worker bool start() {
42*84e33947SAndroid Build Coastguard Worker bool success = chreGnssLocationSessionStartAsync(50, 50, nullptr);
43*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(success);
44*84e33947SAndroid Build Coastguard Worker chreUserSettingConfigureEvents(CHRE_USER_SETTING_LOCATION, true /* enable */);
45*84e33947SAndroid Build Coastguard Worker chreUserSettingConfigureEvents(CHRE_USER_SETTING_WIFI_AVAILABLE,
46*84e33947SAndroid Build Coastguard Worker true /* enable */);
47*84e33947SAndroid Build Coastguard Worker
48*84e33947SAndroid Build Coastguard Worker chreWifiNanSubscribeConfig config = {
49*84e33947SAndroid Build Coastguard Worker .subscribeType = CHRE_WIFI_NAN_SUBSCRIBE_TYPE_PASSIVE,
50*84e33947SAndroid Build Coastguard Worker .service = "SomeService",
51*84e33947SAndroid Build Coastguard Worker };
52*84e33947SAndroid Build Coastguard Worker success = chreWifiNanSubscribe(&config, nullptr /* cookie */);
53*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(success);
54*84e33947SAndroid Build Coastguard Worker
55*84e33947SAndroid Build Coastguard Worker TestEventQueueSingleton::get()->pushEvent(
56*84e33947SAndroid Build Coastguard Worker CHRE_EVENT_SIMULATION_TEST_NANOAPP_LOADED);
57*84e33947SAndroid Build Coastguard Worker return true;
58*84e33947SAndroid Build Coastguard Worker }
59*84e33947SAndroid Build Coastguard Worker
handleEvent(uint32_t,uint16_t eventType,const void * eventData)60*84e33947SAndroid Build Coastguard Worker void handleEvent(uint32_t /* senderInstanceId */, uint16_t eventType,
61*84e33947SAndroid Build Coastguard Worker const void *eventData) {
62*84e33947SAndroid Build Coastguard Worker switch (eventType) {
63*84e33947SAndroid Build Coastguard Worker case CHRE_EVENT_SETTING_CHANGED_LOCATION: {
64*84e33947SAndroid Build Coastguard Worker auto *event = static_cast<const chreUserSettingChangedEvent *>(eventData);
65*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(gExpectedLocationSettingState, event->settingState);
66*84e33947SAndroid Build Coastguard Worker TestEventQueueSingleton::get()->pushEvent(
67*84e33947SAndroid Build Coastguard Worker CHRE_EVENT_SETTING_CHANGED_LOCATION);
68*84e33947SAndroid Build Coastguard Worker break;
69*84e33947SAndroid Build Coastguard Worker }
70*84e33947SAndroid Build Coastguard Worker
71*84e33947SAndroid Build Coastguard Worker case CHRE_EVENT_SETTING_CHANGED_WIFI_AVAILABLE: {
72*84e33947SAndroid Build Coastguard Worker auto *event = static_cast<const chreUserSettingChangedEvent *>(eventData);
73*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(gExpectedWifiSettingState, event->settingState);
74*84e33947SAndroid Build Coastguard Worker TestEventQueueSingleton::get()->pushEvent(
75*84e33947SAndroid Build Coastguard Worker CHRE_EVENT_SETTING_CHANGED_WIFI_AVAILABLE);
76*84e33947SAndroid Build Coastguard Worker break;
77*84e33947SAndroid Build Coastguard Worker }
78*84e33947SAndroid Build Coastguard Worker
79*84e33947SAndroid Build Coastguard Worker case CHRE_EVENT_GNSS_LOCATION: {
80*84e33947SAndroid Build Coastguard Worker TestEventQueueSingleton::get()->pushEvent(CHRE_EVENT_GNSS_LOCATION);
81*84e33947SAndroid Build Coastguard Worker break;
82*84e33947SAndroid Build Coastguard Worker }
83*84e33947SAndroid Build Coastguard Worker
84*84e33947SAndroid Build Coastguard Worker case CHRE_EVENT_GNSS_ASYNC_RESULT: {
85*84e33947SAndroid Build Coastguard Worker TestEventQueueSingleton::get()->pushEvent(CHRE_EVENT_GNSS_ASYNC_RESULT);
86*84e33947SAndroid Build Coastguard Worker break;
87*84e33947SAndroid Build Coastguard Worker }
88*84e33947SAndroid Build Coastguard Worker
89*84e33947SAndroid Build Coastguard Worker case CHRE_EVENT_WIFI_NAN_IDENTIFIER_RESULT: {
90*84e33947SAndroid Build Coastguard Worker TestEventQueueSingleton::get()->pushEvent(
91*84e33947SAndroid Build Coastguard Worker CHRE_EVENT_WIFI_NAN_IDENTIFIER_RESULT);
92*84e33947SAndroid Build Coastguard Worker break;
93*84e33947SAndroid Build Coastguard Worker }
94*84e33947SAndroid Build Coastguard Worker
95*84e33947SAndroid Build Coastguard Worker case CHRE_EVENT_WIFI_NAN_SESSION_TERMINATED: {
96*84e33947SAndroid Build Coastguard Worker TestEventQueueSingleton::get()->pushEvent(
97*84e33947SAndroid Build Coastguard Worker CHRE_EVENT_WIFI_NAN_SESSION_TERMINATED);
98*84e33947SAndroid Build Coastguard Worker break;
99*84e33947SAndroid Build Coastguard Worker }
100*84e33947SAndroid Build Coastguard Worker
101*84e33947SAndroid Build Coastguard Worker default: {
102*84e33947SAndroid Build Coastguard Worker LOGE("Invalid event received type: %u (0x%x)", eventType, eventType);
103*84e33947SAndroid Build Coastguard Worker FAIL();
104*84e33947SAndroid Build Coastguard Worker }
105*84e33947SAndroid Build Coastguard Worker }
106*84e33947SAndroid Build Coastguard Worker
107*84e33947SAndroid Build Coastguard Worker TestEventQueueSingleton::get()->pushEvent(eventType);
108*84e33947SAndroid Build Coastguard Worker }
109*84e33947SAndroid Build Coastguard Worker
end()110*84e33947SAndroid Build Coastguard Worker void end() {
111*84e33947SAndroid Build Coastguard Worker chreUserSettingConfigureEvents(CHRE_USER_SETTING_LOCATION,
112*84e33947SAndroid Build Coastguard Worker false /* enable */);
113*84e33947SAndroid Build Coastguard Worker chreUserSettingConfigureEvents(CHRE_USER_SETTING_WIFI_AVAILABLE,
114*84e33947SAndroid Build Coastguard Worker false /* enable */);
115*84e33947SAndroid Build Coastguard Worker }
116*84e33947SAndroid Build Coastguard Worker
startTestNanoapp()117*84e33947SAndroid Build Coastguard Worker void startTestNanoapp() {
118*84e33947SAndroid Build Coastguard Worker constexpr uint64_t kAppId = 0x0123456789abcdef;
119*84e33947SAndroid Build Coastguard Worker constexpr uint32_t kAppVersion = 0;
120*84e33947SAndroid Build Coastguard Worker constexpr uint32_t kAppPerms =
121*84e33947SAndroid Build Coastguard Worker NanoappPermissions::CHRE_PERMS_GNSS | NanoappPermissions::CHRE_PERMS_WIFI;
122*84e33947SAndroid Build Coastguard Worker
123*84e33947SAndroid Build Coastguard Worker gExpectedLocationSettingState = CHRE_USER_SETTING_STATE_DISABLED;
124*84e33947SAndroid Build Coastguard Worker gExpectedWifiSettingState = CHRE_USER_SETTING_STATE_DISABLED;
125*84e33947SAndroid Build Coastguard Worker
126*84e33947SAndroid Build Coastguard Worker UniquePtr<Nanoapp> nanoapp = createStaticNanoapp(
127*84e33947SAndroid Build Coastguard Worker "Test nanoapp", kAppId, kAppVersion, kAppPerms, start, handleEvent, end);
128*84e33947SAndroid Build Coastguard Worker EventLoopManagerSingleton::get()->deferCallback(
129*84e33947SAndroid Build Coastguard Worker SystemCallbackType::FinishLoadingNanoapp, std::move(nanoapp),
130*84e33947SAndroid Build Coastguard Worker testFinishLoadingNanoappCallback);
131*84e33947SAndroid Build Coastguard Worker }
132*84e33947SAndroid Build Coastguard Worker
133*84e33947SAndroid Build Coastguard Worker } // anonymous namespace
134*84e33947SAndroid Build Coastguard Worker
135*84e33947SAndroid Build Coastguard Worker /**
136*84e33947SAndroid Build Coastguard Worker * This test verifies the following GNSS settings behavior:
137*84e33947SAndroid Build Coastguard Worker * 1) Nanoapp makes GNSS request
138*84e33947SAndroid Build Coastguard Worker * 2) Toggle location setting -> disabled
139*84e33947SAndroid Build Coastguard Worker * 3) Toggle location setting -> enabled.
140*84e33947SAndroid Build Coastguard Worker * 4) Verify things resume.
141*84e33947SAndroid Build Coastguard Worker */
TEST_F(TestBase,LocationSettingsTest)142*84e33947SAndroid Build Coastguard Worker TEST_F(TestBase, LocationSettingsTest) {
143*84e33947SAndroid Build Coastguard Worker startTestNanoapp();
144*84e33947SAndroid Build Coastguard Worker
145*84e33947SAndroid Build Coastguard Worker waitForEvent(CHRE_EVENT_SIMULATION_TEST_NANOAPP_LOADED);
146*84e33947SAndroid Build Coastguard Worker
147*84e33947SAndroid Build Coastguard Worker waitForEvent(CHRE_EVENT_GNSS_ASYNC_RESULT);
148*84e33947SAndroid Build Coastguard Worker ASSERT_TRUE(chrePalGnssIsLocationEnabled());
149*84e33947SAndroid Build Coastguard Worker waitForEvent(CHRE_EVENT_GNSS_LOCATION);
150*84e33947SAndroid Build Coastguard Worker
151*84e33947SAndroid Build Coastguard Worker gExpectedLocationSettingState = CHRE_USER_SETTING_STATE_DISABLED;
152*84e33947SAndroid Build Coastguard Worker EventLoopManagerSingleton::get()->getSettingManager().postSettingChange(
153*84e33947SAndroid Build Coastguard Worker Setting::LOCATION, false /* enabled */);
154*84e33947SAndroid Build Coastguard Worker waitForEvent(CHRE_EVENT_SETTING_CHANGED_LOCATION);
155*84e33947SAndroid Build Coastguard Worker ASSERT_EQ(
156*84e33947SAndroid Build Coastguard Worker EventLoopManagerSingleton::get()->getSettingManager().getSettingEnabled(
157*84e33947SAndroid Build Coastguard Worker Setting::LOCATION),
158*84e33947SAndroid Build Coastguard Worker false);
159*84e33947SAndroid Build Coastguard Worker std::this_thread::sleep_for(std::chrono::milliseconds(100));
160*84e33947SAndroid Build Coastguard Worker ASSERT_FALSE(chrePalGnssIsLocationEnabled());
161*84e33947SAndroid Build Coastguard Worker
162*84e33947SAndroid Build Coastguard Worker gExpectedLocationSettingState = CHRE_USER_SETTING_STATE_ENABLED;
163*84e33947SAndroid Build Coastguard Worker EventLoopManagerSingleton::get()->getSettingManager().postSettingChange(
164*84e33947SAndroid Build Coastguard Worker Setting::LOCATION, true /* enabled */);
165*84e33947SAndroid Build Coastguard Worker waitForEvent(CHRE_EVENT_SETTING_CHANGED_LOCATION);
166*84e33947SAndroid Build Coastguard Worker std::this_thread::sleep_for(std::chrono::milliseconds(100));
167*84e33947SAndroid Build Coastguard Worker ASSERT_TRUE(
168*84e33947SAndroid Build Coastguard Worker EventLoopManagerSingleton::get()->getSettingManager().getSettingEnabled(
169*84e33947SAndroid Build Coastguard Worker Setting::LOCATION));
170*84e33947SAndroid Build Coastguard Worker
171*84e33947SAndroid Build Coastguard Worker waitForEvent(CHRE_EVENT_GNSS_LOCATION);
172*84e33947SAndroid Build Coastguard Worker ASSERT_TRUE(chrePalGnssIsLocationEnabled());
173*84e33947SAndroid Build Coastguard Worker }
174*84e33947SAndroid Build Coastguard Worker
TEST_F(TestBase,DefaultSettingsAreSet)175*84e33947SAndroid Build Coastguard Worker TEST_F(TestBase, DefaultSettingsAreSet) {
176*84e33947SAndroid Build Coastguard Worker for (uint8_t setting = CHRE_USER_SETTING_LOCATION;
177*84e33947SAndroid Build Coastguard Worker setting <= CHRE_USER_SETTING_BLE_AVAILABLE; ++setting) {
178*84e33947SAndroid Build Coastguard Worker int8_t expectedSettingState = (setting == CHRE_USER_SETTING_AIRPLANE_MODE)
179*84e33947SAndroid Build Coastguard Worker ? CHRE_USER_SETTING_STATE_DISABLED
180*84e33947SAndroid Build Coastguard Worker : CHRE_USER_SETTING_STATE_ENABLED;
181*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(expectedSettingState, chreUserSettingGetState(setting));
182*84e33947SAndroid Build Coastguard Worker }
183*84e33947SAndroid Build Coastguard Worker }
184*84e33947SAndroid Build Coastguard Worker
TEST_F(TestBase,WifiSettingsTest)185*84e33947SAndroid Build Coastguard Worker TEST_F(TestBase, WifiSettingsTest) {
186*84e33947SAndroid Build Coastguard Worker startTestNanoapp();
187*84e33947SAndroid Build Coastguard Worker
188*84e33947SAndroid Build Coastguard Worker waitForEvent(CHRE_EVENT_WIFI_NAN_IDENTIFIER_RESULT);
189*84e33947SAndroid Build Coastguard Worker
190*84e33947SAndroid Build Coastguard Worker EventLoopManagerSingleton::get()->getSettingManager().postSettingChange(
191*84e33947SAndroid Build Coastguard Worker Setting::WIFI_AVAILABLE, false /* enabled */);
192*84e33947SAndroid Build Coastguard Worker waitForEvent(CHRE_EVENT_WIFI_NAN_SESSION_TERMINATED);
193*84e33947SAndroid Build Coastguard Worker waitForEvent(CHRE_EVENT_SETTING_CHANGED_WIFI_AVAILABLE);
194*84e33947SAndroid Build Coastguard Worker
195*84e33947SAndroid Build Coastguard Worker gExpectedWifiSettingState = CHRE_USER_SETTING_STATE_ENABLED;
196*84e33947SAndroid Build Coastguard Worker EventLoopManagerSingleton::get()->getSettingManager().postSettingChange(
197*84e33947SAndroid Build Coastguard Worker Setting::WIFI_AVAILABLE, true /* enabled */);
198*84e33947SAndroid Build Coastguard Worker waitForEvent(CHRE_EVENT_SETTING_CHANGED_WIFI_AVAILABLE);
199*84e33947SAndroid Build Coastguard Worker std::this_thread::sleep_for(std::chrono::milliseconds(100));
200*84e33947SAndroid Build Coastguard Worker ASSERT_TRUE(
201*84e33947SAndroid Build Coastguard Worker EventLoopManagerSingleton::get()->getSettingManager().getSettingEnabled(
202*84e33947SAndroid Build Coastguard Worker Setting::WIFI_AVAILABLE));
203*84e33947SAndroid Build Coastguard Worker }
204*84e33947SAndroid Build Coastguard Worker
205*84e33947SAndroid Build Coastguard Worker } // namespace chre
206