xref: /aosp_15_r20/system/chre/test/simulation/settings_test.cc (revision 84e339476a462649f82315436d70fd732297a399)
1*84e33947SAndroid Build Coastguard Worker /*
2*84e33947SAndroid Build Coastguard Worker  * Copyright (C) 2021 The Android Open Source Project
3*84e33947SAndroid Build Coastguard Worker  *
4*84e33947SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*84e33947SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*84e33947SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*84e33947SAndroid Build Coastguard Worker  *
8*84e33947SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*84e33947SAndroid Build Coastguard Worker  *
10*84e33947SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*84e33947SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*84e33947SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*84e33947SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*84e33947SAndroid Build Coastguard Worker  * limitations under the License.
15*84e33947SAndroid Build Coastguard Worker  */
16*84e33947SAndroid Build Coastguard Worker 
17*84e33947SAndroid Build Coastguard Worker #include "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