Add cts test for ResponderLocation
Bug: 150976615
Test: atest WifiRttTest
Change-Id: I830c50d2011ef024b2e758d4558379ab12f1ebae
diff --git a/tests/cts/net/src/android/net/wifi/rtt/cts/WifiRttTest.java b/tests/cts/net/src/android/net/wifi/rtt/cts/WifiRttTest.java
index d5361d7..25a90b5 100644
--- a/tests/cts/net/src/android/net/wifi/rtt/cts/WifiRttTest.java
+++ b/tests/cts/net/src/android/net/wifi/rtt/cts/WifiRttTest.java
@@ -21,6 +21,7 @@
import android.net.wifi.ScanResult;
import android.net.wifi.rtt.RangingRequest;
import android.net.wifi.rtt.RangingResult;
+import android.net.wifi.rtt.ResponderLocation;
import android.platform.test.annotations.AppModeFull;
import com.android.compatibility.common.util.DeviceReportLog;
@@ -163,7 +164,8 @@
// Analyze results
assertTrue("Wi-Fi RTT failure rate exceeds threshold: FAIL=" + numFailures + ", ITERATIONS="
- + NUM_OF_RTT_ITERATIONS + ", AP RSSI=" + testAp.level,
+ + NUM_OF_RTT_ITERATIONS + ", AP RSSI=" + testAp.level
+ + ", AP SSID=" + testAp.SSID,
numFailures <= NUM_OF_RTT_ITERATIONS * MAX_FAILURE_RATE_PERCENT / 100);
if (numFailures != NUM_OF_RTT_ITERATIONS) {
double distanceAvg = distanceSum / (NUM_OF_RTT_ITERATIONS - numFailures);
@@ -213,4 +215,157 @@
+ "many peers",
false);
}
+
+ /**
+ * Verify ResponderLocation API
+ */
+ public void testRangingToTestApWithResponderLocation() throws InterruptedException {
+ if (!shouldTestWifiRtt(getContext())) {
+ return;
+ }
+ // Scan for IEEE 802.11mc supporting APs
+ ScanResult testAp = scanForTestAp(NUM_SCANS_SEARCHING_FOR_IEEE80211MC_AP);
+ assertTrue(
+ "Cannot find any test APs which support RTT / IEEE 802.11mc - please verify that "
+ + "your test setup includes them!",
+ testAp != null);
+
+ // Perform RTT operations
+ RangingRequest request = new RangingRequest.Builder().addAccessPoint(testAp).build();
+ ResultCallback callback = new ResultCallback();
+ mWifiRttManager.startRanging(request, mExecutor, callback);
+ assertTrue("Wi-Fi RTT results: no callback! ",
+ callback.waitForCallback());
+
+ RangingResult result = callback.getResults().get(0);
+ assertEquals("Ranging request not success",
+ result.getStatus(), RangingResult.STATUS_SUCCESS);
+ ResponderLocation responderLocation = result.getUnverifiedResponderLocation();
+ assertNotNull("ResponderLocation should not be null", responderLocation);
+ assertTrue("ResponderLocation is not valid", responderLocation.isLciSubelementValid());
+
+ // Check LCI related APIs
+ int exceptionCount = 0;
+ int apiCount = 0;
+ try {
+ apiCount++;
+ responderLocation.getLatitudeUncertainty();
+ } catch (IllegalStateException e) {
+ exceptionCount++;
+ }
+ try {
+ apiCount++;
+ responderLocation.getLatitude();
+ } catch (IllegalStateException e) {
+ exceptionCount++;
+ }
+ try {
+ apiCount++;
+ responderLocation.getLongitudeUncertainty();
+ } catch (IllegalStateException e) {
+ exceptionCount++;
+ }
+ try {
+ apiCount++;
+ responderLocation.getLongitude();
+ } catch (IllegalStateException e) {
+ exceptionCount++;
+ }
+ try {
+ apiCount++;
+ responderLocation.getAltitudeType();
+ } catch (IllegalStateException e) {
+ exceptionCount++;
+ }
+ try {
+ apiCount++;
+ responderLocation.getAltitudeUncertainty();
+ } catch (IllegalStateException e) {
+ exceptionCount++;
+ }
+ try {
+ apiCount++;
+ responderLocation.getAltitude();
+ } catch (IllegalStateException e) {
+ exceptionCount++;
+ }
+ try {
+ apiCount++;
+ responderLocation.getDatum();
+ } catch (IllegalStateException e) {
+ exceptionCount++;
+ }
+ try {
+ apiCount++;
+ responderLocation.getRegisteredLocationAgreementIndication();
+ } catch (IllegalStateException e) {
+ exceptionCount++;
+ }
+ try {
+ apiCount++;
+ responderLocation.getLciVersion();
+ } catch (IllegalStateException e) {
+ exceptionCount++;
+ }
+ try {
+ apiCount++;
+ assertNotNull(responderLocation.toLocation());
+ } catch (IllegalStateException e) {
+ exceptionCount++;
+ }
+ // If LCI is not valid, all APIs should throw exception, otherwise no exception.
+ assertEquals("Exception number should equal to API number",
+ responderLocation.isLciSubelementValid()? 0 : apiCount, exceptionCount);
+
+ // Verify ZaxisSubelement APIs
+ apiCount = 0;
+ exceptionCount = 0;
+
+ try {
+ apiCount++;
+ responderLocation.getExpectedToMove();
+ } catch (IllegalStateException e) {
+ exceptionCount++;
+ }
+
+ try {
+ apiCount++;
+ responderLocation.getFloorNumber();
+ } catch (IllegalStateException e) {
+ exceptionCount++;
+ }
+
+ try {
+ apiCount++;
+ responderLocation.getHeightAboveFloorMeters();
+ } catch (IllegalStateException e) {
+ exceptionCount++;
+ }
+
+ try {
+ apiCount++;
+ responderLocation.getHeightAboveFloorUncertaintyMeters();
+ } catch (IllegalStateException e) {
+ exceptionCount++;
+ }
+ // If Zaxis is not valid, all APIs should throw exception, otherwise no exception.
+ assertEquals("Exception number should equal to API number",
+ responderLocation.isZaxisSubelementValid() ? 0 : apiCount, exceptionCount);
+ // Verify civic location
+ if (responderLocation.toCivicLocationAddress() == null) {
+ assertNull(responderLocation.toCivicLocationSparseArray());
+ } else {
+ assertNotNull(responderLocation.toCivicLocationSparseArray());
+ }
+ // Verify map image
+ if (responderLocation.getMapImageUri() == null) {
+ assertNull(responderLocation.getMapImageMimeType());
+ } else {
+ assertNotNull(responderLocation.getMapImageMimeType());
+ }
+ boolean extraInfoOnAssociationIndication =
+ responderLocation.getExtraInfoOnAssociationIndication();
+ assertNotNull("ColocatedBSSID list should be nonNull",
+ responderLocation.getColocatedBssids());
+ }
}