1 /* 2 * Copyright (C) 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #define LOG_TAG "GnssHalTestCases" 18 19 #include <VtsHalHidlTargetTestBase.h> 20 #include <gnss_hal_test.h> 21 #include "Utils.h" 22 23 using android::hardware::hidl_string; 24 using android::hardware::hidl_vec; 25 26 using IGnssConfiguration_2_0 = android::hardware::gnss::V2_0::IGnssConfiguration; 27 using IAGnssRil_2_0 = android::hardware::gnss::V2_0::IAGnssRil; 28 using IGnssMeasurement_2_0 = android::hardware::gnss::V2_0::IGnssMeasurement; 29 using IGnssMeasurement_1_1 = android::hardware::gnss::V1_1::IGnssMeasurement; 30 using IGnssMeasurement_1_0 = android::hardware::gnss::V1_0::IGnssMeasurement; 31 using IAGnssRil_2_0 = android::hardware::gnss::V2_0::IAGnssRil; 32 using IAGnssRil_1_0 = android::hardware::gnss::V1_0::IAGnssRil; 33 using IAGnss_2_0 = android::hardware::gnss::V2_0::IAGnss; 34 using IAGnss_1_0 = android::hardware::gnss::V1_0::IAGnss; 35 using IAGnssCallback_2_0 = android::hardware::gnss::V2_0::IAGnssCallback; 36 using IGnssBatching_V1_0 = android::hardware::gnss::V1_0::IGnssBatching; 37 using IGnssBatching_V2_0 = android::hardware::gnss::V2_0::IGnssBatching; 38 39 using android::hardware::gnss::common::Utils; 40 using android::hardware::gnss::measurement_corrections::V1_0::IMeasurementCorrections; 41 using android::hardware::gnss::measurement_corrections::V1_0::MeasurementCorrections; 42 using android::hardware::gnss::V1_0::IGnssNi; 43 using android::hardware::gnss::V2_0::ElapsedRealtimeFlags; 44 using android::hardware::gnss::V2_0::GnssConstellationType; 45 using android::hardware::gnss::V2_0::IGnssCallback; 46 using android::hardware::gnss::visibility_control::V1_0::IGnssVisibilityControl; 47 48 /* 49 * SetupTeardownCreateCleanup: 50 * Requests the gnss HAL then calls cleanup 51 * 52 * Empty test fixture to verify basic Setup & Teardown 53 */ 54 TEST_F(GnssHalTest, SetupTeardownCreateCleanup) {} 55 56 /* 57 * TestGnssMeasurementExtension: 58 * Gets the GnssMeasurementExtension and verifies that it returns an actual extension. 59 */ 60 TEST_F(GnssHalTest, TestGnssMeasurementExtension) { 61 auto gnssMeasurement_2_0 = gnss_hal_->getExtensionGnssMeasurement_2_0(); 62 auto gnssMeasurement_1_1 = gnss_hal_->getExtensionGnssMeasurement_1_1(); 63 auto gnssMeasurement_1_0 = gnss_hal_->getExtensionGnssMeasurement(); 64 ASSERT_TRUE(gnssMeasurement_2_0.isOk() && gnssMeasurement_1_1.isOk() && 65 gnssMeasurement_1_0.isOk()); 66 sp<IGnssMeasurement_2_0> iGnssMeas_2_0 = gnssMeasurement_2_0; 67 sp<IGnssMeasurement_1_1> iGnssMeas_1_1 = gnssMeasurement_1_1; 68 sp<IGnssMeasurement_1_0> iGnssMeas_1_0 = gnssMeasurement_1_0; 69 // At least one interface is non-null. 70 int numNonNull = (int)(iGnssMeas_2_0 != nullptr) + (int)(iGnssMeas_1_1 != nullptr) + 71 (int)(iGnssMeas_1_0 != nullptr); 72 ASSERT_TRUE(numNonNull >= 1); 73 } 74 75 /* 76 * TestGnssConfigurationExtension: 77 * Gets the GnssConfigurationExtension and verifies that it returns an actual extension by 78 * calling a method. 79 * 80 * The GNSS HAL 2.0 implementation must support @2.0::IGnssConfiguration interface due to 81 * the deprecation of some methods in @1.0::IGnssConfiguration interface. 82 */ 83 TEST_F(GnssHalTest, TestGnssConfigurationExtension) { 84 auto gnssConfiguration = gnss_hal_->getExtensionGnssConfiguration_2_0(); 85 ASSERT_TRUE(gnssConfiguration.isOk()); 86 sp<IGnssConfiguration_2_0> iGnssConfiguration = gnssConfiguration; 87 ASSERT_NE(iGnssConfiguration, nullptr); 88 89 auto result = iGnssConfiguration->setEsExtensionSec(180); 90 ASSERT_TRUE(result.isOk()); 91 // Expected result can be true or false depending on whether HAL implementation supports 92 // detecting emergency sessions without involving the framework. 93 } 94 95 /* 96 * TestGnssConfiguration_setSuplEs_Deprecation: 97 * Calls setSuplEs and verifies that it returns false. 98 */ 99 TEST_F(GnssHalTest, TestGnssConfiguration_setSuplEs_Deprecation) { 100 auto gnssConfiguration = gnss_hal_->getExtensionGnssConfiguration_2_0(); 101 ASSERT_TRUE(gnssConfiguration.isOk()); 102 sp<IGnssConfiguration_2_0> iGnssConfiguration = gnssConfiguration; 103 ASSERT_NE(iGnssConfiguration, nullptr); 104 105 auto result = iGnssConfiguration->setSuplEs(false); 106 ASSERT_TRUE(result.isOk()); 107 EXPECT_FALSE(result); 108 } 109 110 /* 111 * TestGnssConfiguration_setGpsLock_Deprecation: 112 * Calls setGpsLock and verifies that it returns false. 113 */ 114 TEST_F(GnssHalTest, TestGnssConfiguration_setGpsLock_Deprecation) { 115 auto gnssConfiguration = gnss_hal_->getExtensionGnssConfiguration_2_0(); 116 ASSERT_TRUE(gnssConfiguration.isOk()); 117 sp<IGnssConfiguration_2_0> iGnssConfiguration = gnssConfiguration; 118 ASSERT_NE(iGnssConfiguration, nullptr); 119 120 auto result = iGnssConfiguration->setGpsLock(0); 121 ASSERT_TRUE(result.isOk()); 122 EXPECT_FALSE(result); 123 } 124 125 /* 126 * TestAGnssRilExtension: 127 * Gets the AGnssRilExtension and verifies that it returns an actual extension. 128 * 129 * If IAGnssRil interface is supported, then the GNSS HAL 2.0 implementation must support 130 * @2.0::IAGnssRil interface due to the deprecation of framework network API methods needed 131 * to support the @1.0::IAGnssRil interface. 132 */ 133 TEST_F(GnssHalTest, TestAGnssRilExtension) { 134 auto agnssRil_2_0 = gnss_hal_->getExtensionAGnssRil_2_0(); 135 ASSERT_TRUE(agnssRil_2_0.isOk()); 136 sp<IAGnssRil_2_0> iAGnssRil_2_0 = agnssRil_2_0; 137 if (iAGnssRil_2_0 == nullptr) { 138 // Verify IAGnssRil 1.0 is not supported. 139 auto agnssRil_1_0 = gnss_hal_->getExtensionAGnssRil(); 140 ASSERT_TRUE(agnssRil_1_0.isOk()); 141 sp<IAGnssRil_1_0> iAGnssRil_1_0 = agnssRil_1_0; 142 ASSERT_EQ(iAGnssRil_1_0, nullptr); 143 } 144 } 145 146 /* 147 * TestAGnssRil_UpdateNetworkState_2_0: 148 * 1. Updates GNSS HAL that a network has connected. 149 * 2. Updates GNSS HAL that network has disconnected. 150 */ 151 TEST_F(GnssHalTest, TestAGnssRil_UpdateNetworkState_2_0) { 152 auto agnssRil = gnss_hal_->getExtensionAGnssRil_2_0(); 153 ASSERT_TRUE(agnssRil.isOk()); 154 sp<IAGnssRil_2_0> iAGnssRil = agnssRil; 155 if (iAGnssRil == nullptr) { 156 return; 157 } 158 159 // Update GNSS HAL that a network has connected. 160 IAGnssRil_2_0::NetworkAttributes networkAttributes = { 161 .networkHandle = static_cast<uint64_t>(7700664333), 162 .isConnected = true, 163 .capabilities = static_cast<uint16_t>(IAGnssRil_2_0::NetworkCapability::NOT_ROAMING), 164 .apn = "dummy-apn"}; 165 auto result = iAGnssRil->updateNetworkState_2_0(networkAttributes); 166 ASSERT_TRUE(result.isOk()); 167 EXPECT_TRUE(result); 168 169 // Update GNSS HAL that network has disconnected. 170 networkAttributes.isConnected = false; 171 result = iAGnssRil->updateNetworkState_2_0(networkAttributes); 172 ASSERT_TRUE(result.isOk()); 173 EXPECT_TRUE(result); 174 } 175 176 /* 177 * TestGnssMeasurementFields: 178 * Sets a GnssMeasurementCallback, waits for a measurement, and verifies 179 * 1. codeType is valid, 180 * 2. constellation is valid. 181 * 3. state is valid. 182 */ 183 TEST_F(GnssHalTest, TestGnssMeasurementFields) { 184 const int kFirstGnssMeasurementTimeoutSeconds = 10; 185 186 auto gnssMeasurement = gnss_hal_->getExtensionGnssMeasurement_2_0(); 187 if (!gnssMeasurement.isOk()) { 188 return; 189 } 190 191 sp<IGnssMeasurement_2_0> iGnssMeasurement = gnssMeasurement; 192 if (iGnssMeasurement == nullptr) { 193 return; 194 } 195 196 sp<GnssMeasurementCallback> callback = new GnssMeasurementCallback(); 197 auto result = iGnssMeasurement->setCallback_2_0(callback, /* enableFullTracking= */ true); 198 ASSERT_TRUE(result.isOk()); 199 EXPECT_EQ(result, IGnssMeasurement_1_0::GnssMeasurementStatus::SUCCESS); 200 201 IGnssMeasurementCallback_2_0::GnssData lastMeasurement; 202 ASSERT_TRUE(callback->measurement_cbq_.retrieve(lastMeasurement, 203 kFirstGnssMeasurementTimeoutSeconds)); 204 EXPECT_EQ(callback->measurement_cbq_.calledCount(), 1); 205 ASSERT_TRUE(lastMeasurement.measurements.size() > 0); 206 for (auto measurement : lastMeasurement.measurements) { 207 // Verify CodeType is valid. 208 ASSERT_NE(measurement.codeType, ""); 209 210 // Verify ConstellationType is valid. 211 ASSERT_TRUE(static_cast<uint8_t>(measurement.constellation) >= 212 static_cast<uint8_t>(GnssConstellationType::UNKNOWN) && 213 static_cast<uint8_t>(measurement.constellation) <= 214 static_cast<uint8_t>(GnssConstellationType::IRNSS)); 215 216 // Verify State is valid. 217 ASSERT_TRUE( 218 static_cast<uint32_t>(measurement.state) >= 219 static_cast<uint32_t>(IGnssMeasurementCallback_2_0::GnssMeasurementState:: 220 STATE_UNKNOWN) && 221 static_cast<uint32_t>(measurement.state) <= 222 static_cast<uint32_t>(IGnssMeasurementCallback_2_0::GnssMeasurementState:: 223 STATE_2ND_CODE_LOCK)); 224 } 225 226 iGnssMeasurement->close(); 227 } 228 229 /* 230 * TestAGnssExtension: 231 * Gets the AGnssExtension and verifies that it returns an actual extension. 232 * 233 * If IAGnss interface is supported, then the GNSS HAL 2.0 implementation must support 234 * @2.0::IAGnss interface due to the deprecation of framework network API methods needed 235 * to support the @1.0::IAGnss interface. 236 */ 237 TEST_F(GnssHalTest, TestAGnssExtension) { 238 auto agnss_2_0 = gnss_hal_->getExtensionAGnss_2_0(); 239 ASSERT_TRUE(agnss_2_0.isOk()); 240 sp<IAGnss_2_0> iAGnss_2_0 = agnss_2_0; 241 if (iAGnss_2_0 == nullptr) { 242 // Verify IAGnss 1.0 is not supported. 243 auto agnss_1_0 = gnss_hal_->getExtensionAGnss(); 244 ASSERT_TRUE(agnss_1_0.isOk()); 245 sp<IAGnss_1_0> iAGnss_1_0 = agnss_1_0; 246 ASSERT_EQ(iAGnss_1_0, nullptr); 247 return; 248 } 249 250 // Set SUPL server host/port 251 auto result = 252 iAGnss_2_0->setServer(IAGnssCallback_2_0::AGnssType::SUPL, "supl.google.com", 7275); 253 ASSERT_TRUE(result.isOk()); 254 EXPECT_TRUE(result); 255 } 256 257 /* 258 * TestGnssNiExtension_Deprecation: 259 * Gets the @1.0::IGnssNi extension and verifies that it is a nullptr. 260 */ 261 TEST_F(GnssHalTest, TestGnssNiExtension_Deprecation) { 262 // Verify IGnssNi 1.0 is not supported. 263 auto gnssNi = gnss_hal_->getExtensionGnssNi(); 264 ASSERT_TRUE(!gnssNi.isOk() || ((sp<IGnssNi>)gnssNi) == nullptr); 265 } 266 267 /* 268 * TestGnssVisibilityControlExtension: 269 * Gets the GnssVisibilityControlExtension and if it is not null, verifies that it supports 270 * the gnss.visibility_control (at) 1.0::IGnssVisibilityControl interface by invoking a method. 271 */ 272 TEST_F(GnssHalTest, TestGnssVisibilityControlExtension) { 273 auto gnssVisibilityControl = gnss_hal_->getExtensionVisibilityControl(); 274 ASSERT_TRUE(gnssVisibilityControl.isOk()); 275 sp<IGnssVisibilityControl> iGnssVisibilityControl = gnssVisibilityControl; 276 if (iGnssVisibilityControl == nullptr) { 277 return; 278 } 279 280 // Set non-framework proxy apps. 281 hidl_vec<hidl_string> proxyApps{"com.example.ims", "com.example.mdt"}; 282 auto result = iGnssVisibilityControl->enableNfwLocationAccess(proxyApps); 283 ASSERT_TRUE(result.isOk()); 284 EXPECT_TRUE(result); 285 } 286 287 /* 288 * TestGnssMeasurementCorrectionsCapabilities: 289 * If measurement corrections capability is supported, verifies that the measurement corrections 290 * capabilities are reported and the mandatory LOS_SATS or the EXCESS_PATH_LENGTH 291 * capability flag is set. 292 */ 293 TEST_F(GnssHalTest, TestGnssMeasurementCorrectionsCapabilities) { 294 if (!(gnss_cb_->last_capabilities_ & IGnssCallback::Capabilities::MEASUREMENT_CORRECTIONS)) { 295 return; 296 } 297 298 auto measurementCorrections = gnss_hal_->getExtensionMeasurementCorrections(); 299 ASSERT_TRUE(measurementCorrections.isOk()); 300 sp<IMeasurementCorrections> iMeasurementCorrections = measurementCorrections; 301 ASSERT_NE(iMeasurementCorrections, nullptr); 302 303 // Setup measurement corrections callback. 304 sp<GnssMeasurementCorrectionsCallback> callback = new GnssMeasurementCorrectionsCallback(); 305 iMeasurementCorrections->setCallback(callback); 306 307 const int kMeasurementCorrectionsCapabilitiesTimeoutSeconds = 5; 308 callback->capabilities_cbq_.retrieve(callback->last_capabilities_, 309 kMeasurementCorrectionsCapabilitiesTimeoutSeconds); 310 ASSERT_TRUE(callback->capabilities_cbq_.calledCount() > 0); 311 using Capabilities = IMeasurementCorrectionsCallback::Capabilities; 312 ASSERT_TRUE((callback->last_capabilities_ & 313 (Capabilities::LOS_SATS | Capabilities::EXCESS_PATH_LENGTH)) != 0); 314 } 315 316 /* 317 * TestGnssMeasurementCorrections: 318 * If measurement corrections capability is supported, verifies that it supports the 319 * gnss.measurement_corrections (at) 1.0::IMeasurementCorrections interface by invoking a method. 320 */ 321 TEST_F(GnssHalTest, TestGnssMeasurementCorrections) { 322 if (!(gnss_cb_->last_capabilities_ & IGnssCallback::Capabilities::MEASUREMENT_CORRECTIONS)) { 323 return; 324 } 325 326 // Verify IMeasurementCorrections is supported. 327 auto measurementCorrections = gnss_hal_->getExtensionMeasurementCorrections(); 328 ASSERT_TRUE(measurementCorrections.isOk()); 329 sp<IMeasurementCorrections> iMeasurementCorrections = measurementCorrections; 330 ASSERT_NE(iMeasurementCorrections, nullptr); 331 332 sp<GnssMeasurementCorrectionsCallback> callback = new GnssMeasurementCorrectionsCallback(); 333 iMeasurementCorrections->setCallback(callback); 334 335 const int kMeasurementCorrectionsCapabilitiesTimeoutSeconds = 5; 336 callback->capabilities_cbq_.retrieve(callback->last_capabilities_, 337 kMeasurementCorrectionsCapabilitiesTimeoutSeconds); 338 ASSERT_TRUE(callback->capabilities_cbq_.calledCount() > 0); 339 340 // Set a mock MeasurementCorrections. 341 auto result = iMeasurementCorrections->setCorrections(Utils::getMockMeasurementCorrections()); 342 ASSERT_TRUE(result.isOk()); 343 EXPECT_TRUE(result); 344 } 345 346 /* 347 * TestGnssDataElapsedRealtimeFlags: 348 * Sets a GnssMeasurementCallback, waits for a GnssData object, and verifies the flags in member 349 * elapsedRealitme are valid. 350 */ 351 TEST_F(GnssHalTest, TestGnssDataElapsedRealtimeFlags) { 352 const int kFirstGnssMeasurementTimeoutSeconds = 10; 353 354 auto gnssMeasurement = gnss_hal_->getExtensionGnssMeasurement_2_0(); 355 if (!gnssMeasurement.isOk()) { 356 return; 357 } 358 359 sp<IGnssMeasurement_2_0> iGnssMeasurement = gnssMeasurement; 360 if (iGnssMeasurement == nullptr) { 361 return; 362 } 363 364 sp<GnssMeasurementCallback> callback = new GnssMeasurementCallback(); 365 auto result = iGnssMeasurement->setCallback_2_0(callback, /* enableFullTracking= */ true); 366 ASSERT_TRUE(result.isOk()); 367 EXPECT_EQ(result, IGnssMeasurement_1_0::GnssMeasurementStatus::SUCCESS); 368 369 IGnssMeasurementCallback_2_0::GnssData lastMeasurement; 370 ASSERT_TRUE(callback->measurement_cbq_.retrieve(lastMeasurement, 371 kFirstGnssMeasurementTimeoutSeconds)); 372 EXPECT_EQ(callback->measurement_cbq_.calledCount(), 1); 373 374 ASSERT_TRUE((int)lastMeasurement.elapsedRealtime.flags <= 375 (int)(ElapsedRealtimeFlags::HAS_TIMESTAMP_NS | 376 ElapsedRealtimeFlags::HAS_TIME_UNCERTAINTY_NS)); 377 378 // We expect a non-zero timestamp when set. 379 if (lastMeasurement.elapsedRealtime.flags & ElapsedRealtimeFlags::HAS_TIMESTAMP_NS) { 380 ASSERT_TRUE(lastMeasurement.elapsedRealtime.timestampNs != 0); 381 } 382 383 iGnssMeasurement->close(); 384 } 385 386 TEST_F(GnssHalTest, TestGnssLocationElapsedRealtime) { 387 StartAndCheckFirstLocation(); 388 389 ASSERT_TRUE((int)gnss_cb_->last_location_.elapsedRealtime.flags <= 390 (int)(ElapsedRealtimeFlags::HAS_TIMESTAMP_NS | 391 ElapsedRealtimeFlags::HAS_TIME_UNCERTAINTY_NS)); 392 393 // We expect a non-zero timestamp when set. 394 if (gnss_cb_->last_location_.elapsedRealtime.flags & ElapsedRealtimeFlags::HAS_TIMESTAMP_NS) { 395 ASSERT_TRUE(gnss_cb_->last_location_.elapsedRealtime.timestampNs != 0); 396 } 397 398 StopAndClearLocations(); 399 } 400 401 // This test only verify that injectBestLocation_2_0 does not crash. 402 TEST_F(GnssHalTest, TestInjectBestLocation_2_0) { 403 StartAndCheckFirstLocation(); 404 gnss_hal_->injectBestLocation_2_0(gnss_cb_->last_location_); 405 StopAndClearLocations(); 406 } 407 408 /* 409 * TestGnssBatchingExtension: 410 * Gets the @2.0::IGnssBatching extension and verifies that it doesn't return an error. Support 411 * for this interface is optional. 412 */ 413 TEST_F(GnssHalTest, TestGnssBatchingExtension) { 414 auto gnssBatching_2_0 = gnss_hal_->getExtensionGnssBatching_2_0(); 415 ASSERT_TRUE(gnssBatching_2_0.isOk()); 416 } 417