Merge "Stop location to avoid timing issue (VTS 2.0)" into rvc-dev am: de47235b01
am: 64fac9d815
Original change: https://googleplex-android-review.googlesource.com/c/platform/hardware/interfaces/+/11788485 Change-Id: I45b2c99642aeb4f02543cefc243f2cb3e1767f42
This commit is contained in:
commit
28da9e5450
7 changed files with 178 additions and 70 deletions
|
@ -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: [
|
||||
|
|
|
@ -247,3 +247,46 @@ Return<void> 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<IGnssCallback_2_0::GnssSvInfo> 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;
|
||||
}
|
||||
|
|
|
@ -31,6 +31,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;
|
||||
|
||||
|
@ -194,6 +197,16 @@ class GnssHalTest : public testing::TestWithParam<std::string> {
|
|||
*/
|
||||
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<IGnss> gnss_hal_; // GNSS HAL to call into
|
||||
sp<GnssCallback> gnss_cb_; // Primary callback interface
|
||||
};
|
||||
|
|
|
@ -24,8 +24,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;
|
||||
|
@ -491,31 +489,6 @@ TEST_P(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:
|
||||
*
|
||||
|
@ -555,7 +528,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()) {
|
||||
|
@ -694,7 +667,7 @@ TEST_P(GnssHalTest, BlacklistIndividualSatellites) {
|
|||
hidl_vec<IGnssCallback_2_0::GnssSvInfo> 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));
|
||||
|
@ -736,7 +709,7 @@ TEST_P(GnssHalTest, BlacklistIndividualSatellites) {
|
|||
hidl_vec<IGnssCallback_2_0::GnssSvInfo> 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)) {
|
||||
|
@ -752,7 +725,7 @@ TEST_P(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.
|
||||
|
@ -761,12 +734,11 @@ TEST_P(GnssHalTest, BlacklistIndividualSatellites) {
|
|||
* GnssStatus does not use any constellation but GPS.
|
||||
* 4a & b) Clean up by turning off location, and send in empty blacklist.
|
||||
*/
|
||||
TEST_P(GnssHalTest, BlacklistConstellation) {
|
||||
TEST_P(GnssHalTest, BlacklistConstellationWithLocationOff) {
|
||||
if (!IsGnssHalVersion_2_0()) {
|
||||
ALOGI("Test BlacklistConstellation skipped. GNSS HAL version is greater than 2.0.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(gnss_cb_->last_capabilities_ & IGnssCallback::Capabilities::SATELLITE_BLACKLIST)) {
|
||||
ALOGI("Test BlacklistConstellation skipped. SATELLITE_BLACKLIST capability not supported.");
|
||||
return;
|
||||
|
@ -774,43 +746,12 @@ TEST_P(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<IGnssCallback_2_0::GnssSvInfo> 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
|
||||
|
@ -824,6 +765,7 @@ TEST_P(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);
|
||||
|
@ -835,15 +777,93 @@ TEST_P(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<IGnssCallback_2_0::GnssSvInfo> 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_P(GnssHalTest, BlacklistConstellationWithLocationOn) {
|
||||
if (!IsGnssHalVersion_2_0()) {
|
||||
ALOGI("Test BlacklistConstellation skipped. GNSS HAL version is greater than 2.0.");
|
||||
return;
|
||||
}
|
||||
|
||||
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<IGnssConfiguration_1_1> gnss_configuration_hal = gnss_configuration_hal_return;
|
||||
ASSERT_NE(gnss_configuration_hal, nullptr);
|
||||
|
||||
hidl_vec<IGnssConfiguration_1_1::BlacklistedSource> 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<IGnssCallback_2_0::GnssSvInfo> 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));
|
||||
}
|
||||
|
|
|
@ -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",
|
||||
"android.hardware.gnss.measurement_corrections@1.1",
|
||||
],
|
||||
|
|
|
@ -169,6 +169,31 @@ const MeasurementCorrections_1_1 Utils::getMockMeasurementCorrections_1_1() {
|
|||
return mockCorrections_1_1;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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
|
||||
|
|
|
@ -18,9 +18,12 @@
|
|||
#define android_hardware_gnss_common_vts_Utils_H_
|
||||
|
||||
#include <android/hardware/gnss/1.0/IGnss.h>
|
||||
#include <android/hardware/gnss/2.0/IGnss.h>
|
||||
#include <android/hardware/gnss/measurement_corrections/1.0/IMeasurementCorrections.h>
|
||||
#include <android/hardware/gnss/measurement_corrections/1.1/IMeasurementCorrections.h>
|
||||
|
||||
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;
|
||||
|
||||
|
@ -44,6 +47,8 @@ struct Utils {
|
|||
bool check_more_accuracies);
|
||||
static const MeasurementCorrections_1_0 getMockMeasurementCorrections();
|
||||
static const MeasurementCorrections_1_1 getMockMeasurementCorrections_1_1();
|
||||
|
||||
static GnssConstellationType_1_0 mapConstellationType(GnssConstellationType_2_0 constellation);
|
||||
};
|
||||
|
||||
} // namespace common
|
||||
|
|
Loading…
Reference in a new issue