diff --git a/gnss/1.1/vts/functional/Android.bp b/gnss/1.1/vts/functional/Android.bp index cc34290fa8..237ac429d3 100644 --- a/gnss/1.1/vts/functional/Android.bp +++ b/gnss/1.1/vts/functional/Android.bp @@ -25,6 +25,7 @@ cc_test { static_libs: [ "android.hardware.gnss@1.0", "android.hardware.gnss@1.1", + "android.hardware.gnss@2.0", "android.hardware.gnss@common-vts-lib", ], shared_libs: [ diff --git a/gnss/1.1/vts/functional/gnss_hal_test_cases.cpp b/gnss/1.1/vts/functional/gnss_hal_test_cases.cpp index 503e419756..7a7b6af46c 100644 --- a/gnss/1.1/vts/functional/gnss_hal_test_cases.cpp +++ b/gnss/1.1/vts/functional/gnss_hal_test_cases.cpp @@ -427,6 +427,7 @@ TEST_F(GnssHalTest, BlacklistConstellationWithLocationOn) { sources.resize(1); sources[0] = source_to_blacklist; + // setBlacklist when location is on. auto result = gnss_configuration_hal->setBlacklist(sources); ASSERT_TRUE(result.isOk()); EXPECT_TRUE(result); diff --git a/gnss/2.0/vts/functional/gnss_hal_test.cpp b/gnss/2.0/vts/functional/gnss_hal_test.cpp index 14ae43ce26..c01e91dc97 100644 --- a/gnss/2.0/vts/functional/gnss_hal_test.cpp +++ b/gnss/2.0/vts/functional/gnss_hal_test.cpp @@ -221,3 +221,46 @@ Return GnssHalTest::GnssMeasurementCorrectionsCallback::setCapabilitiesCb( capabilities_cbq_.store(capabilities); return Void(); } + +GnssConstellationType_1_0 GnssHalTest::startLocationAndGetNonGpsConstellation() { + const int kLocationsToAwait = 3; + + gnss_cb_->location_cbq_.reset(); + StartAndCheckLocations(kLocationsToAwait); + const int location_called_count = gnss_cb_->location_cbq_.calledCount(); + + // Tolerate 1 less sv status to handle edge cases in reporting. + int sv_info_list_cbq_size = gnss_cb_->sv_info_list_cbq_.size(); + EXPECT_GE(sv_info_list_cbq_size + 1, kLocationsToAwait); + ALOGD("Observed %d GnssSvStatus, while awaiting %d Locations (%d received)", + sv_info_list_cbq_size, kLocationsToAwait, location_called_count); + + // Find first non-GPS constellation to blacklist. Exclude IRNSS in GnssConstellationType_2_0 + // as blacklisting of this constellation is not supported in gnss@2.0. + const int kGnssSvStatusTimeout = 2; + GnssConstellationType_1_0 constellation_to_blacklist = GnssConstellationType_1_0::UNKNOWN; + for (int i = 0; i < sv_info_list_cbq_size; ++i) { + hidl_vec sv_info_list; + gnss_cb_->sv_info_list_cbq_.retrieve(sv_info_list, kGnssSvStatusTimeout); + for (IGnssCallback_2_0::GnssSvInfo sv_info : sv_info_list) { + if ((sv_info.v1_0.svFlag & IGnssCallback_2_0::GnssSvFlags::USED_IN_FIX) && + (sv_info.constellation != GnssConstellationType_2_0::UNKNOWN) && + (sv_info.constellation != GnssConstellationType_2_0::IRNSS) && + (sv_info.constellation != GnssConstellationType_2_0::GPS)) { + // found a non-GPS V1_0 constellation + constellation_to_blacklist = Utils::mapConstellationType(sv_info.constellation); + break; + } + } + if (constellation_to_blacklist != GnssConstellationType_1_0::UNKNOWN) { + break; + } + } + + if (constellation_to_blacklist == GnssConstellationType_1_0::UNKNOWN) { + ALOGI("No non-GPS constellations found, constellation blacklist test less effective."); + // Proceed functionally to blacklist something. + constellation_to_blacklist = GnssConstellationType_1_0::GLONASS; + } + return constellation_to_blacklist; +} diff --git a/gnss/2.0/vts/functional/gnss_hal_test.h b/gnss/2.0/vts/functional/gnss_hal_test.h index 90a7866082..5bfcb1f8bb 100644 --- a/gnss/2.0/vts/functional/gnss_hal_test.h +++ b/gnss/2.0/vts/functional/gnss_hal_test.h @@ -34,6 +34,9 @@ using android::hardware::gnss::measurement_corrections::V1_0::IMeasurementCorrec using android::hardware::gnss::V1_0::GnssLocationFlags; using android::hardware::gnss::V2_0::IGnss; +using GnssConstellationType_1_0 = android::hardware::gnss::V1_0::GnssConstellationType; +using GnssConstellationType_2_0 = android::hardware::gnss::V2_0::GnssConstellationType; + using GnssLocation_1_0 = android::hardware::gnss::V1_0::GnssLocation; using GnssLocation_2_0 = android::hardware::gnss::V2_0::GnssLocation; @@ -248,6 +251,16 @@ class GnssHalTest : public ::testing::VtsHalHidlTargetTestBase { */ void SetPositionMode(const int min_interval_msec, const bool low_power_mode); + /* + * startLocationAndGetNonGpsConstellation: + * 1. Start location + * 2. Find and return first non-GPS constellation + * + * Note that location is not stopped in this method. The client should call + * StopAndClearLocations() after the call. + */ + GnssConstellationType_1_0 startLocationAndGetNonGpsConstellation(); + sp gnss_hal_; // GNSS HAL to call into sp gnss_cb_; // Primary callback interface }; diff --git a/gnss/2.0/vts/functional/gnss_hal_test_cases.cpp b/gnss/2.0/vts/functional/gnss_hal_test_cases.cpp index 39736cc250..b42f43218d 100644 --- a/gnss/2.0/vts/functional/gnss_hal_test_cases.cpp +++ b/gnss/2.0/vts/functional/gnss_hal_test_cases.cpp @@ -23,8 +23,6 @@ using android::hardware::hidl_string; using android::hardware::hidl_vec; -using GnssConstellationType_2_0 = android::hardware::gnss::V2_0::GnssConstellationType; -using GnssConstellationType_1_0 = android::hardware::gnss::V1_0::GnssConstellationType; using IGnssConfiguration_2_0 = android::hardware::gnss::V2_0::IGnssConfiguration; using IGnssConfiguration_1_1 = android::hardware::gnss::V1_1::IGnssConfiguration; using IAGnssRil_2_0 = android::hardware::gnss::V2_0::IAGnssRil; @@ -479,31 +477,6 @@ TEST_F(GnssHalTest, GetLocationLowPower) { StopAndClearLocations(); } -/* - * MapConstellationType: - * Given a GnssConstellationType_2_0 type constellation, maps to its equivalent - * GnssConstellationType_1_0 type constellation. For constellations that do not have - * an equivalent value, maps to GnssConstellationType_1_0::UNKNOWN - */ -GnssConstellationType_1_0 MapConstellationType(GnssConstellationType_2_0 constellation) { - switch (constellation) { - case GnssConstellationType_2_0::GPS: - return GnssConstellationType_1_0::GPS; - case GnssConstellationType_2_0::SBAS: - return GnssConstellationType_1_0::SBAS; - case GnssConstellationType_2_0::GLONASS: - return GnssConstellationType_1_0::GLONASS; - case GnssConstellationType_2_0::QZSS: - return GnssConstellationType_1_0::QZSS; - case GnssConstellationType_2_0::BEIDOU: - return GnssConstellationType_1_0::BEIDOU; - case GnssConstellationType_2_0::GALILEO: - return GnssConstellationType_1_0::GALILEO; - default: - return GnssConstellationType_1_0::UNKNOWN; - } -} - /* * FindStrongFrequentNonGpsSource: * @@ -543,7 +516,7 @@ IGnssConfiguration_1_1::BlacklistedSource FindStrongFrequentNonGpsSource( (sv_info.constellation != GnssConstellationType_2_0::GPS)) { ComparableBlacklistedSource source; source.id.svid = sv_info.v1_0.svid; - source.id.constellation = MapConstellationType(sv_info.constellation); + source.id.constellation = Utils::mapConstellationType(sv_info.constellation); const auto& itSignal = mapSignals.find(source); if (itSignal == mapSignals.end()) { @@ -677,7 +650,7 @@ TEST_F(GnssHalTest, BlacklistIndividualSatellites) { hidl_vec sv_info_list; gnss_cb_->sv_info_list_cbq_.retrieve(sv_info_list, kGnssSvStatusTimeout); for (IGnssCallback_2_0::GnssSvInfo sv_info : sv_info_list) { - auto constellation = MapConstellationType(sv_info.constellation); + auto constellation = Utils::mapConstellationType(sv_info.constellation); EXPECT_FALSE((sv_info.v1_0.svid == source_to_blacklist.svid) && (constellation == source_to_blacklist.constellation) && (sv_info.v1_0.svFlag & IGnssCallback::GnssSvFlags::USED_IN_FIX)); @@ -719,7 +692,7 @@ TEST_F(GnssHalTest, BlacklistIndividualSatellites) { hidl_vec sv_info_list; gnss_cb_->sv_info_list_cbq_.retrieve(sv_info_list, kGnssSvStatusTimeout); for (IGnssCallback_2_0::GnssSvInfo sv_info : sv_info_list) { - auto constellation = MapConstellationType(sv_info.constellation); + auto constellation = Utils::mapConstellationType(sv_info.constellation); if ((sv_info.v1_0.svid == source_to_blacklist.svid) && (constellation == source_to_blacklist.constellation) && (sv_info.v1_0.svFlag & IGnssCallback::GnssSvFlags::USED_IN_FIX)) { @@ -735,7 +708,7 @@ TEST_F(GnssHalTest, BlacklistIndividualSatellites) { } /* - * BlacklistConstellation: + * BlacklistConstellationWithLocationOff: * * 1) Turns on location, waits for 3 locations, ensuring they are valid, and checks corresponding * GnssStatus for any non-GPS constellations. @@ -744,7 +717,7 @@ TEST_F(GnssHalTest, BlacklistIndividualSatellites) { * GnssStatus does not use any constellation but GPS. * 4a & b) Clean up by turning off location, and send in empty blacklist. */ -TEST_F(GnssHalTest, BlacklistConstellation) { +TEST_F(GnssHalTest, BlacklistConstellationWithLocationOff) { if (!(gnss_cb_->last_capabilities_ & IGnssCallback::Capabilities::SATELLITE_BLACKLIST)) { ALOGI("Test BlacklistConstellation skipped. SATELLITE_BLACKLIST capability not supported."); return; @@ -752,43 +725,12 @@ TEST_F(GnssHalTest, BlacklistConstellation) { const int kLocationsToAwait = 3; - gnss_cb_->location_cbq_.reset(); - StartAndCheckLocations(kLocationsToAwait); - const int location_called_count = gnss_cb_->location_cbq_.calledCount(); + // Find first non-GPS constellation to blacklist + GnssConstellationType_1_0 constellation_to_blacklist = startLocationAndGetNonGpsConstellation(); - // Tolerate 1 less sv status to handle edge cases in reporting. - int sv_info_list_cbq_size = gnss_cb_->sv_info_list_cbq_.size(); - EXPECT_GE(sv_info_list_cbq_size + 1, kLocationsToAwait); - ALOGD("Observed %d GnssSvStatus, while awaiting %d Locations (%d received)", - sv_info_list_cbq_size, kLocationsToAwait, location_called_count); + // Turns off location + StopAndClearLocations(); - // Find first non-GPS constellation to blacklist. Exclude IRNSS in GnssConstellationType_2_0 - // as blacklisting of this constellation is not supported in gnss@2.0. - const int kGnssSvStatusTimeout = 2; - GnssConstellationType_1_0 constellation_to_blacklist = GnssConstellationType_1_0::UNKNOWN; - for (int i = 0; i < sv_info_list_cbq_size; ++i) { - hidl_vec sv_info_list; - gnss_cb_->sv_info_list_cbq_.retrieve(sv_info_list, kGnssSvStatusTimeout); - for (IGnssCallback_2_0::GnssSvInfo sv_info : sv_info_list) { - if ((sv_info.v1_0.svFlag & IGnssCallback::GnssSvFlags::USED_IN_FIX) && - (sv_info.constellation != GnssConstellationType_2_0::UNKNOWN) && - (sv_info.constellation != GnssConstellationType_2_0::IRNSS) && - (sv_info.constellation != GnssConstellationType_2_0::GPS)) { - // found a non-GPS V1_0 constellation - constellation_to_blacklist = MapConstellationType(sv_info.constellation); - break; - } - } - if (constellation_to_blacklist != GnssConstellationType_1_0::UNKNOWN) { - break; - } - } - - if (constellation_to_blacklist == GnssConstellationType_1_0::UNKNOWN) { - ALOGI("No non-GPS constellations found, constellation blacklist test less effective."); - // Proceed functionally to blacklist something. - constellation_to_blacklist = GnssConstellationType_1_0::GLONASS; - } IGnssConfiguration_1_1::BlacklistedSource source_to_blacklist; source_to_blacklist.constellation = constellation_to_blacklist; source_to_blacklist.svid = 0; // documented wildcard for all satellites in this constellation @@ -802,6 +744,7 @@ TEST_F(GnssHalTest, BlacklistConstellation) { sources.resize(1); sources[0] = source_to_blacklist; + // setBlacklist when location is off. auto result = gnss_configuration_hal->setBlacklist(sources); ASSERT_TRUE(result.isOk()); EXPECT_TRUE(result); @@ -813,15 +756,88 @@ TEST_F(GnssHalTest, BlacklistConstellation) { StartAndCheckLocations(kLocationsToAwait); // Tolerate 1 less sv status to handle edge cases in reporting. - sv_info_list_cbq_size = gnss_cb_->sv_info_list_cbq_.size(); + int sv_info_list_cbq_size = gnss_cb_->sv_info_list_cbq_.size(); EXPECT_GE(sv_info_list_cbq_size + 1, kLocationsToAwait); ALOGD("Observed %d GnssSvStatus, while awaiting %d Locations", sv_info_list_cbq_size, kLocationsToAwait); + const int kGnssSvStatusTimeout = 2; for (int i = 0; i < sv_info_list_cbq_size; ++i) { hidl_vec sv_info_list; gnss_cb_->sv_info_list_cbq_.retrieve(sv_info_list, kGnssSvStatusTimeout); for (IGnssCallback_2_0::GnssSvInfo sv_info : sv_info_list) { - auto constellation = MapConstellationType(sv_info.constellation); + auto constellation = Utils::mapConstellationType(sv_info.constellation); + EXPECT_FALSE((constellation == source_to_blacklist.constellation) && + (sv_info.v1_0.svFlag & IGnssCallback::GnssSvFlags::USED_IN_FIX)); + } + } + + // clean up + StopAndClearLocations(); + sources.resize(0); + result = gnss_configuration_hal->setBlacklist(sources); + ASSERT_TRUE(result.isOk()); + EXPECT_TRUE(result); +} + +/* + * BlacklistConstellationWithLocationOn: + * + * 1) Turns on location, waits for 3 locations, ensuring they are valid, and checks corresponding + * GnssStatus for any non-GPS constellations. + * 2a & b) Blacklist first non-GPS constellations, and turns off location. + * 3) Restart location, wait for 3 locations, ensuring they are valid, and checks corresponding + * GnssStatus does not use any constellation but GPS. + * 4a & b) Clean up by turning off location, and send in empty blacklist. + */ +TEST_F(GnssHalTest, BlacklistConstellationWithLocationOn) { + if (!(gnss_cb_->last_capabilities_ & IGnssCallback::Capabilities::SATELLITE_BLACKLIST)) { + ALOGI("Test BlacklistConstellation skipped. SATELLITE_BLACKLIST capability not supported."); + return; + } + + const int kLocationsToAwait = 3; + + // Find first non-GPS constellation to blacklist + GnssConstellationType_1_0 constellation_to_blacklist = startLocationAndGetNonGpsConstellation(); + + IGnssConfiguration_1_1::BlacklistedSource source_to_blacklist; + source_to_blacklist.constellation = constellation_to_blacklist; + source_to_blacklist.svid = 0; // documented wildcard for all satellites in this constellation + + auto gnss_configuration_hal_return = gnss_hal_->getExtensionGnssConfiguration_1_1(); + ASSERT_TRUE(gnss_configuration_hal_return.isOk()); + sp gnss_configuration_hal = gnss_configuration_hal_return; + ASSERT_NE(gnss_configuration_hal, nullptr); + + hidl_vec sources; + sources.resize(1); + sources[0] = source_to_blacklist; + + // setBlacklist when location is on. + auto result = gnss_configuration_hal->setBlacklist(sources); + ASSERT_TRUE(result.isOk()); + EXPECT_TRUE(result); + + // Turns off location + StopAndClearLocations(); + + // retry and ensure constellation not used + gnss_cb_->sv_info_list_cbq_.reset(); + + gnss_cb_->location_cbq_.reset(); + StartAndCheckLocations(kLocationsToAwait); + + // Tolerate 1 less sv status to handle edge cases in reporting. + int sv_info_list_cbq_size = gnss_cb_->sv_info_list_cbq_.size(); + EXPECT_GE(sv_info_list_cbq_size + 1, kLocationsToAwait); + ALOGD("Observed %d GnssSvStatus, while awaiting %d Locations", sv_info_list_cbq_size, + kLocationsToAwait); + const int kGnssSvStatusTimeout = 2; + for (int i = 0; i < sv_info_list_cbq_size; ++i) { + hidl_vec sv_info_list; + gnss_cb_->sv_info_list_cbq_.retrieve(sv_info_list, kGnssSvStatusTimeout); + for (IGnssCallback_2_0::GnssSvInfo sv_info : sv_info_list) { + auto constellation = Utils::mapConstellationType(sv_info.constellation); EXPECT_FALSE((constellation == source_to_blacklist.constellation) && (sv_info.v1_0.svFlag & IGnssCallback::GnssSvFlags::USED_IN_FIX)); } diff --git a/gnss/common/utils/vts/Android.bp b/gnss/common/utils/vts/Android.bp index 1988171979..ed383fca94 100644 --- a/gnss/common/utils/vts/Android.bp +++ b/gnss/common/utils/vts/Android.bp @@ -29,6 +29,7 @@ cc_library_static { export_include_dirs: ["include"], shared_libs: [ "android.hardware.gnss@1.0", + "android.hardware.gnss@2.0", "android.hardware.gnss.measurement_corrections@1.0", ], static_libs: [ diff --git a/gnss/common/utils/vts/Utils.cpp b/gnss/common/utils/vts/Utils.cpp index 51d3ea18d5..4e42f75e3e 100644 --- a/gnss/common/utils/vts/Utils.cpp +++ b/gnss/common/utils/vts/Utils.cpp @@ -139,6 +139,31 @@ const MeasurementCorrections Utils::getMockMeasurementCorrections() { return mockCorrections; } +/* + * MapConstellationType: + * Given a GnssConstellationType_2_0 type constellation, maps to its equivalent + * GnssConstellationType_1_0 type constellation. For constellations that do not have + * an equivalent value, maps to GnssConstellationType_1_0::UNKNOWN + */ +GnssConstellationType_1_0 Utils::mapConstellationType(GnssConstellationType_2_0 constellation) { + switch (constellation) { + case GnssConstellationType_2_0::GPS: + return GnssConstellationType_1_0::GPS; + case GnssConstellationType_2_0::SBAS: + return GnssConstellationType_1_0::SBAS; + case GnssConstellationType_2_0::GLONASS: + return GnssConstellationType_1_0::GLONASS; + case GnssConstellationType_2_0::QZSS: + return GnssConstellationType_1_0::QZSS; + case GnssConstellationType_2_0::BEIDOU: + return GnssConstellationType_1_0::BEIDOU; + case GnssConstellationType_2_0::GALILEO: + return GnssConstellationType_1_0::GALILEO; + default: + return GnssConstellationType_1_0::UNKNOWN; + } +} + } // namespace common } // namespace gnss } // namespace hardware diff --git a/gnss/common/utils/vts/include/Utils.h b/gnss/common/utils/vts/include/Utils.h index dce4c7b323..b5f833ba97 100644 --- a/gnss/common/utils/vts/include/Utils.h +++ b/gnss/common/utils/vts/include/Utils.h @@ -18,8 +18,11 @@ #define android_hardware_gnss_common_vts_Utils_H_ #include +#include #include +using GnssConstellationType_1_0 = android::hardware::gnss::V1_0::GnssConstellationType; +using GnssConstellationType_2_0 = android::hardware::gnss::V2_0::GnssConstellationType; using GnssLocation = ::android::hardware::gnss::V1_0::GnssLocation; using namespace android::hardware::gnss::measurement_corrections::V1_0; @@ -32,6 +35,8 @@ struct Utils { static void checkLocation(const GnssLocation& location, bool check_speed, bool check_more_accuracies); static const MeasurementCorrections getMockMeasurementCorrections(); + + static GnssConstellationType_1_0 mapConstellationType(GnssConstellationType_2_0 constellation); }; } // namespace common