Home | History | Annotate | Download | only in functional
      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