summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorEtan Cohen <etancohen@google.com>2018-03-16 09:43:33 -0700
committerEtan Cohen <etancohen@google.com>2018-04-10 07:44:45 -0700
commit02e1422fc015b3dc38f8afdfb8e1aec95881fefc (patch)
tree39cf8121eb1112d3ad07a224ef4aa2767591836c /tests
parent7eb0e44217ee0de5600e96a4683f327beb623534 (diff)
[RTT] Wi-Fi RTT Metrics
Add Wi-Fi RTT metrics collection. Testing: - Unit tests (new) - Integration tests: -RangeApSupporting11McTest:test_rtt_80211mc_supporting_aps - RangeAwareTest - After integration tests (i.e. full framework run) exercised consolidation by: - adb shell dumpsys wifi - adb shell dumpsys wifi wifiMetricsProto - adb shell dumpsys wifi wifiMetricsProto clean Bug: 68819947 Test: unit tests Test: integration tests + adb Change-Id: I9c98a9801bc912d7f4ae68aa7261d3a068cf3339
Diffstat (limited to 'tests')
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java3
-rw-r--r--tests/wifitests/src/com/android/server/wifi/rtt/RttMetricsTest.java614
-rw-r--r--tests/wifitests/src/com/android/server/wifi/rtt/RttNativeTest.java39
-rw-r--r--tests/wifitests/src/com/android/server/wifi/rtt/RttServiceImplTest.java192
-rw-r--r--tests/wifitests/src/com/android/server/wifi/scanner/WifiScanningServiceTest.java4
5 files changed, 830 insertions, 22 deletions
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java b/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java
index c31ecb03d..d8e2267ec 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java
@@ -45,6 +45,7 @@ import com.android.server.wifi.nano.WifiMetricsProto.PnoScanMetrics;
import com.android.server.wifi.nano.WifiMetricsProto.SoftApConnectedClientsEvent;
import com.android.server.wifi.nano.WifiMetricsProto.StaEvent;
import com.android.server.wifi.nano.WifiMetricsProto.WpsMetrics;
+import com.android.server.wifi.rtt.RttMetrics;
import org.junit.Before;
import org.junit.Test;
@@ -82,7 +83,7 @@ public class WifiMetricsTest {
when(mClock.getElapsedSinceBootMillis()).thenReturn((long) 0);
mTestLooper = new TestLooper();
mWifiMetrics = new WifiMetrics(mClock, mTestLooper.getLooper(),
- new WifiAwareMetrics(mClock));
+ new WifiAwareMetrics(mClock), new RttMetrics(mClock));
mWifiMetrics.setWifiConfigManager(mWcm);
mWifiMetrics.setPasspointManager(mPpm);
mWifiMetrics.setWifiNetworkSelector(mWns);
diff --git a/tests/wifitests/src/com/android/server/wifi/rtt/RttMetricsTest.java b/tests/wifitests/src/com/android/server/wifi/rtt/RttMetricsTest.java
new file mode 100644
index 000000000..0ed7bd202
--- /dev/null
+++ b/tests/wifitests/src/com/android/server/wifi/rtt/RttMetricsTest.java
@@ -0,0 +1,614 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.wifi.rtt;
+
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.mockito.Mockito.when;
+
+import android.hardware.wifi.V1_0.RttResult;
+import android.hardware.wifi.V1_0.RttStatus;
+import android.net.MacAddress;
+import android.net.wifi.rtt.RangingRequest;
+import android.net.wifi.rtt.ResponderConfig;
+import android.os.WorkSource;
+import android.util.Log;
+
+import com.android.server.wifi.Clock;
+import com.android.server.wifi.nano.WifiMetricsProto;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ErrorCollector;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Unit test harness for RttMetrics
+ */
+public class RttMetricsTest {
+ private RttMetrics mDut;
+
+ @Mock
+ Clock mClock;
+
+ @Rule
+ public ErrorCollector collector = new ErrorCollector();
+
+ /**
+ * Pre-test configuration. Initialize and install mocks.
+ */
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+
+ setTime(1);
+ mDut = new RttMetrics(mClock);
+ }
+
+ /**
+ * Verify that recordRequest() records valid metrics.
+ */
+ @Test
+ public void testRecordRequest() {
+ WifiMetricsProto.WifiRttLog log;
+
+ // no requests
+ log = mDut.consolidateProto();
+ checkMainStats("No requests", log, 0, 0);
+ checkPeerStats("No requests: AP", log.rttToAp, 0, 0, 0, 0, 0, 0, 0, 0);
+ checkPeerStats("No requests: Aware", log.rttToAware, 0, 0, 0, 0, 0, 0, 0, 0);
+
+ // multiple AP requests from multiple sources
+ WorkSource ws1 = new WorkSource(10);
+ WorkSource ws2 = new WorkSource(20);
+ ws2.add(10);
+
+ RangingRequest requestAp1 = getDummyRangingRequest(1, 0);
+ RangingRequest requestAp2 = getDummyRangingRequest(2, 0);
+ RangingRequest requestAp5 = getDummyRangingRequest(5, 0);
+ RangingRequest requestAp6 = getDummyRangingRequest(6, 0);
+
+ mDut.clear();
+ mDut.recordRequest(ws1, requestAp1);
+ setTime(10); // delta = 9
+ mDut.recordRequest(ws1, requestAp2);
+ setTime(20); // delta = 10
+ mDut.recordRequest(ws1, requestAp5);
+ setTime(21); // delta = 1
+ mDut.recordRequest(ws1, requestAp6);
+ setTime(1000); // delta = 979
+ mDut.recordRequest(ws1, requestAp5);
+ setTime(5000); // delta = 4,000
+ mDut.recordRequest(ws1, requestAp5);
+ setTime(1000000); // delta = 995,000
+ mDut.recordRequest(ws1, requestAp2);
+ mDut.recordRequest(ws2, requestAp5);
+ mDut.recordRequest(ws2, requestAp5);
+ mDut.recordRequest(ws2, requestAp5);
+
+ log = mDut.consolidateProto();
+ checkMainStats("Sequence AP-only", log, 10, 0);
+
+ checkPeerStats("Sequence AP-only: AP", log.rttToAp, 10, 41, 2, 2, 4, 0, 0, 5);
+
+ validateProtoHistBucket("Sequence AP-only: rttToAp.histogramNumRequestsPerApp[0]",
+ log.rttToAp.histogramNumRequestsPerApp[0], 1, 10, 1);
+ validateProtoHistBucket("Sequence AP-only: rttToAp.histogramNumRequestsPerApp[1]",
+ log.rttToAp.histogramNumRequestsPerApp[1], 10, 100, 1);
+
+ validateProtoHistBucket("Sequence AP-only: rttToAp.histogramNumPeersPerRequest[0]",
+ log.rttToAp.histogramNumPeersPerRequest[0], 1, 1, 1);
+ validateProtoHistBucket("Sequence AP-only: rttToAp.histogramNumPeersPerRequest[1]",
+ log.rttToAp.histogramNumPeersPerRequest[1], 2, 2, 2);
+ validateProtoHistBucket("Sequence AP-only: rttToAp.histogramNumPeersPerRequest[2]",
+ log.rttToAp.histogramNumPeersPerRequest[2], 5, 5, 6);
+ validateProtoHistBucket("Sequence AP-only: rttToAp.histogramNumPeersPerRequest[3]",
+ log.rttToAp.histogramNumPeersPerRequest[3], 6, 6, 1);
+
+ validateProtoHistBucket("Sequence AP-only: rttToAp.histogramRequestIntervalMs[0]",
+ log.rttToAp.histogramRequestIntervalMs[0], 1, 10, 5);
+ validateProtoHistBucket("Sequence AP-only: rttToAp.histogramRequestIntervalMs[1]",
+ log.rttToAp.histogramRequestIntervalMs[1], 10, 100, 1);
+ validateProtoHistBucket("Sequence AP-only: rttToAp.histogramRequestIntervalMs[2]",
+ log.rttToAp.histogramRequestIntervalMs[2], 100, 1000, 1);
+ validateProtoHistBucket("Sequence AP-only: rttToAp.histogramRequestIntervalMs[3]",
+ log.rttToAp.histogramRequestIntervalMs[3], 1000, 10000, 1);
+ validateProtoHistBucket("Sequence AP-only: rttToAp.histogramRequestIntervalMs[4]",
+ log.rttToAp.histogramRequestIntervalMs[4], 100000, 1000000, 1);
+
+ checkPeerStats("Sequence AP-only: Aware", log.rttToAware, 0, 0, 0, 0, 0, 0, 0, 0);
+
+ // mix of AP and Aware requests
+ WorkSource ws3 = new WorkSource(30);
+ ws3.add(20);
+ ws3.add(40);
+
+ RangingRequest requestMixed03 = getDummyRangingRequest(0, 3);
+ RangingRequest requestMixed25 = getDummyRangingRequest(2, 5);
+ RangingRequest requestMixed50 = getDummyRangingRequest(5, 0);
+ RangingRequest requestMixed08 = getDummyRangingRequest(0, 8);
+
+ mDut.clear();
+ setTime(100);
+ mDut.recordRequest(ws3, requestMixed03);
+ setTime(101);
+ mDut.recordRequest(ws3, requestMixed25);
+ setTime(102);
+ mDut.recordRequest(ws3, requestMixed50);
+ setTime(103);
+ mDut.recordRequest(ws3, requestMixed08);
+
+ log = mDut.consolidateProto();
+ checkMainStats("Sequence Mixed AP/Aware", log, 4, 0);
+
+ checkPeerStats("Sequence Mixed AP/Aware: AP", log.rttToAp, 2, 7, 3, 1, 2, 0, 0, 1);
+
+ validateProtoHistBucket("Sequence Mixed AP/Aware: rttToAp.histogramNumRequestsPerApp[0]",
+ log.rttToAp.histogramNumRequestsPerApp[0], 1, 10, 3);
+
+ validateProtoHistBucket("Sequence Mixed AP/Aware: rttToAp.histogramNumPeersPerRequest[0]",
+ log.rttToAp.histogramNumPeersPerRequest[0], 2, 2, 1);
+ validateProtoHistBucket("Sequence Mixed AP/Aware: rttToAp.histogramNumPeersPerRequest[1]",
+ log.rttToAp.histogramNumPeersPerRequest[1], 5, 5, 1);
+
+ validateProtoHistBucket("Sequence Mixed AP/Aware: rttToAp.histogramRequestIntervalMs[0]",
+ log.rttToAp.histogramRequestIntervalMs[0], 1, 10, 1);
+
+ checkPeerStats("Sequence Mixed AP/Aware: Aware", log.rttToAware, 3, 16, 3, 1, 3, 0, 0, 1);
+
+ validateProtoHistBucket("Sequence Mixed AP/Aware: rttToAware.histogramNumRequestsPerApp[0]",
+ log.rttToAware.histogramNumRequestsPerApp[0], 1, 10, 3);
+
+ validateProtoHistBucket(
+ "Sequence Mixed AP/Aware: rttToAware.histogramNumPeersPerRequest[0]",
+ log.rttToAware.histogramNumPeersPerRequest[0], 3, 3, 1);
+ validateProtoHistBucket(
+ "Sequence Mixed AP/Aware: rttToAware.histogramNumPeersPerRequest[1]",
+ log.rttToAware.histogramNumPeersPerRequest[1], 5, 5, 1);
+ validateProtoHistBucket(
+ "Sequence Mixed AP/Aware: rttToAware.histogramNumPeersPerRequest[2]",
+ log.rttToAware.histogramNumPeersPerRequest[2], 8, 8, 1);
+
+ validateProtoHistBucket("Sequence Mixed AP/Aware: rttToAware.histogramRequestIntervalMs[0]",
+ log.rttToAware.histogramRequestIntervalMs[0], 1, 10, 2);
+ }
+
+ /**
+ * Verify that recordResult() records valid metrics.
+ */
+ @Test
+ public void testRecordResult() {
+ WifiMetricsProto.WifiRttLog log;
+
+ // no requests
+ log = mDut.consolidateProto();
+ checkMainStats("No requests", log, 0, 0);
+ checkPeerStats("No requests: AP", log.rttToAp, 0, 0, 0, 0, 0, 0, 0, 0);
+ checkPeerStats("No requests: Aware", log.rttToAware, 0, 0, 0, 0, 0, 0, 0, 0);
+
+ // multiple AP results
+ RangingRequest requestAp1 = getDummyRangingRequest(1, 0);
+ RangingRequest requestAp2 = getDummyRangingRequest(2, 0);
+ RangingRequest requestAp5 = getDummyRangingRequest(5, 0);
+ RangingRequest requestAp6 = getDummyRangingRequest(6, 0);
+
+ mDut.clear();
+ mDut.recordResult(requestAp1, getDummyRangingResults(requestAp1, 5, 0));
+ mDut.recordResult(requestAp2, getDummyRangingResults(requestAp2, 10, 30));
+ mDut.recordResult(requestAp5, getDummyRangingResults(requestAp5, 0.3, -0.2));
+ mDut.recordResult(requestAp6, getDummyRangingResults(requestAp6, 40, 30));
+ log = mDut.consolidateProto();
+
+ checkMainStats("Sequence AP-only", log, 0, 0);
+
+ checkPeerStats("Sequence AP-only: AP", log.rttToAp, 0, 0, 0, 0, 0, 1, 6, 0);
+
+ validateProtoIndividualStatusHistBucket(
+ "Sequence AP-only: rttToAp.histogramIndividualStatus[0]",
+ log.rttToAp.histogramIndividualStatus[0], WifiMetricsProto.WifiRttLog.SUCCESS, 14);
+
+ validateProtoHistBucket("Sequence AP-only: rttToAp.histogramDistance[0]",
+ log.rttToAp.histogramDistance[0], Integer.MIN_VALUE, 0, 3);
+ validateProtoHistBucket("Sequence AP-only: rttToAp.histogramDistance[1]",
+ log.rttToAp.histogramDistance[1], 0, 5 * 1000, 2);
+ validateProtoHistBucket("Sequence AP-only: rttToAp.histogramDistance[2]",
+ log.rttToAp.histogramDistance[2], 5 * 1000, 15 * 1000, 2);
+ validateProtoHistBucket("Sequence AP-only: rttToAp.histogramDistance[3]",
+ log.rttToAp.histogramDistance[3], 30 * 1000, 60 * 1000, 2);
+ validateProtoHistBucket("Sequence AP-only: rttToAp.histogramDistance[4]",
+ log.rttToAp.histogramDistance[4], 60 * 1000, 100 * 1000, 1);
+ validateProtoHistBucket("Sequence AP-only: rttToAp.histogramDistance[5]",
+ log.rttToAp.histogramDistance[5], 100 * 1000, Integer.MAX_VALUE, 4);
+
+ checkPeerStats("Sequence AP-only: Aware", log.rttToAware, 0, 0, 0, 0, 0, 0, 0, 0);
+
+ // mix of AP and Aware requests
+ RangingRequest requestMixed03 = getDummyRangingRequest(0, 3);
+ RangingRequest requestMixed25 = getDummyRangingRequest(2, 5);
+ RangingRequest requestMixed50 = getDummyRangingRequest(5, 0);
+ RangingRequest requestMixed08 = getDummyRangingRequest(0, 8);
+
+ mDut.clear();
+ mDut.recordResult(requestMixed03, getDummyRangingResults(requestMixed03, 5, 0));
+ mDut.recordResult(requestMixed25, getDummyRangingResults(requestMixed25, 10, 30));
+ mDut.recordResult(requestMixed50, getDummyRangingResults(requestMixed50, 0.3, -0.2));
+ mDut.recordResult(requestMixed08, getDummyRangingResults(requestMixed08, 40, 30));
+ log = mDut.consolidateProto();
+
+ checkMainStats("Sequence Mixed AP/Aware", log, 0, 0);
+
+ checkPeerStats("Sequence Mixed AP/Aware: AP", log.rttToAp, 0, 0, 0, 0, 0, 1, 4, 0);
+
+ validateProtoIndividualStatusHistBucket(
+ "Sequence Mixed AP/Aware: rttToAp.histogramIndividualStatus[0]",
+ log.rttToAp.histogramIndividualStatus[0], WifiMetricsProto.WifiRttLog.SUCCESS, 7);
+
+ validateProtoHistBucket("Sequence Mixed AP/Aware: rttToAp.histogramDistance[0]",
+ log.rttToAp.histogramDistance[0], Integer.MIN_VALUE, 0, 3);
+ validateProtoHistBucket("Sequence Mixed AP/Aware: rttToAp.histogramDistance[1]",
+ log.rttToAp.histogramDistance[1], 0, 5 * 1000, 2);
+ validateProtoHistBucket("Sequence Mixed AP/Aware: rttToAp.histogramDistance[2]",
+ log.rttToAp.histogramDistance[2], 5 * 1000, 15 * 1000, 1);
+ validateProtoHistBucket("Sequence Mixed AP/Aware: rttToAp.histogramDistance[3]",
+ log.rttToAp.histogramDistance[3], 30 * 1000, 60 * 1000, 1);
+
+ checkPeerStats("Sequence Mixed AP/Aware: Aware", log.rttToAware, 0, 0, 0, 0, 0, 1, 4, 0);
+
+ validateProtoIndividualStatusHistBucket(
+ "Sequence Mixed AP/Aware: rttToAware.histogramIndividualStatus[0]",
+ log.rttToAware.histogramIndividualStatus[0], WifiMetricsProto.WifiRttLog.SUCCESS,
+ 16);
+
+ validateProtoHistBucket("Sequence Mixed AP/Aware: rttToAware.histogramDistance[0]",
+ log.rttToAware.histogramDistance[0], 5 * 1000, 15 * 1000, 3);
+ validateProtoHistBucket("Sequence Mixed AP/Aware: rttToAware.histogramDistance[1]",
+ log.rttToAware.histogramDistance[1], 30 * 1000, 60 * 1000, 1);
+ validateProtoHistBucket("Sequence Mixed AP/Aware: rttToAware.histogramDistance[2]",
+ log.rttToAware.histogramDistance[2], 60 * 1000, 100 * 1000, 2);
+ validateProtoHistBucket("Sequence Mixed AP/Aware: rttToAware.histogramDistance[3]",
+ log.rttToAware.histogramDistance[3], 100 * 1000, Integer.MAX_VALUE, 10);
+ }
+
+ /**
+ * Verify the behavior when the HAL returns with missing results or some results set to null.
+ */
+ @Test
+ public void testRecordMissingResults() {
+ WifiMetricsProto.WifiRttLog log;
+
+ mDut.clear();
+ RangingRequest requestMixed25 = getDummyRangingRequest(2, 5);
+ List<RttResult> resultMixed25 = getDummyRangingResults(requestMixed25, 10, 30);
+ // remove some results
+ resultMixed25.remove(3); // Second Aware result: distance = 100
+ resultMixed25.remove(0); // First AP result: distance = 10
+ resultMixed25.add(null);
+ mDut.recordResult(requestMixed25, resultMixed25);
+
+ log = mDut.consolidateProto();
+
+ checkMainStats("Sequence Mixed AP/Aware", log, 0, 0);
+
+ checkPeerStats("Sequence Mixed AP/Aware: AP", log.rttToAp, 0, 0, 0, 0, 0, 2, 1, 0);
+
+ validateProtoIndividualStatusHistBucket(
+ "Sequence Mixed AP/Aware: rttToAp.histogramIndividualStatus[0]",
+ log.rttToAp.histogramIndividualStatus[0], WifiMetricsProto.WifiRttLog.SUCCESS, 1);
+ validateProtoIndividualStatusHistBucket(
+ "Sequence Mixed AP/Aware: rttToAp.histogramIndividualStatus[1]",
+ log.rttToAp.histogramIndividualStatus[1],
+ WifiMetricsProto.WifiRttLog.MISSING_RESULT, 1);
+
+ validateProtoHistBucket("Sequence Mixed AP/Aware: rttToAp.histogramDistance[0]",
+ log.rttToAp.histogramDistance[0], 30 * 1000, 60 * 1000, 1);
+
+ checkPeerStats("Sequence Mixed AP/Aware: Aware", log.rttToAware, 0, 0, 0, 0, 0, 2, 2, 0);
+
+ validateProtoIndividualStatusHistBucket(
+ "Sequence Mixed AP/Aware: rttToAware.histogramIndividualStatus[0]",
+ log.rttToAware.histogramIndividualStatus[0], WifiMetricsProto.WifiRttLog.SUCCESS,
+ 4);
+ validateProtoIndividualStatusHistBucket(
+ "Sequence Mixed AP/Aware: rttToAware.histogramIndividualStatus[1]",
+ log.rttToAware.histogramIndividualStatus[1],
+ WifiMetricsProto.WifiRttLog.MISSING_RESULT, 1);
+
+ validateProtoHistBucket("Sequence Mixed AP/Aware: rttToAware.histogramDistance[0]",
+ log.rttToAware.histogramDistance[0], 60 * 1000, 100 * 1000, 1);
+ validateProtoHistBucket("Sequence Mixed AP/Aware: rttToAware.histogramDistance[1]",
+ log.rttToAware.histogramDistance[1], 100 * 1000, Integer.MAX_VALUE, 3);
+ }
+
+ /**
+ * Verify the behavior when the HAL returns with NULL array.
+ */
+ @Test
+ public void testRecordNullArrayResults() {
+ WifiMetricsProto.WifiRttLog log;
+
+ mDut.clear();
+ RangingRequest requestMixed25 = getDummyRangingRequest(2, 5);
+ mDut.recordResult(requestMixed25, null);
+
+ log = mDut.consolidateProto();
+
+ checkMainStats("Sequence Mixed AP/Aware", log, 0, 0);
+
+ checkPeerStats("Sequence Mixed AP/Aware: AP", log.rttToAp, 0, 0, 0, 0, 0, 1, 0, 0);
+
+ validateProtoIndividualStatusHistBucket(
+ "Sequence Mixed AP/Aware: rttToAp.histogramIndividualStatus[1]",
+ log.rttToAp.histogramIndividualStatus[0],
+ WifiMetricsProto.WifiRttLog.MISSING_RESULT, 2);
+
+ checkPeerStats("Sequence Mixed AP/Aware: Aware", log.rttToAware, 0, 0, 0, 0, 0, 1, 0, 0);
+
+ validateProtoIndividualStatusHistBucket(
+ "Sequence Mixed AP/Aware: rttToAware.histogramIndividualStatus[0]",
+ log.rttToAware.histogramIndividualStatus[0],
+ WifiMetricsProto.WifiRttLog.MISSING_RESULT, 5);
+ }
+
+ /**
+ * Verify that all individual status codes are translated correctly.
+ */
+ @Test
+ public void testRecordResultsStatuses() {
+ WifiMetricsProto.WifiRttLog log;
+
+ mDut.clear();
+
+ recordResultNTimes(RttStatus.SUCCESS, 5);
+ recordResultNTimes(RttStatus.FAILURE, 6);
+ recordResultNTimes(RttStatus.FAIL_NO_RSP, 7);
+ recordResultNTimes(RttStatus.FAIL_REJECTED, 8);
+ recordResultNTimes(RttStatus.FAIL_NOT_SCHEDULED_YET, 9);
+ recordResultNTimes(RttStatus.FAIL_TM_TIMEOUT, 10);
+ recordResultNTimes(RttStatus.FAIL_AP_ON_DIFF_CHANNEL, 11);
+ recordResultNTimes(RttStatus.FAIL_NO_CAPABILITY, 12);
+ recordResultNTimes(RttStatus.ABORTED, 13);
+ recordResultNTimes(RttStatus.FAIL_INVALID_TS, 14);
+ recordResultNTimes(RttStatus.FAIL_PROTOCOL, 15);
+ recordResultNTimes(RttStatus.FAIL_SCHEDULE, 16);
+ recordResultNTimes(RttStatus.FAIL_BUSY_TRY_LATER, 17);
+ recordResultNTimes(RttStatus.INVALID_REQ, 18);
+ recordResultNTimes(RttStatus.NO_WIFI, 19);
+ recordResultNTimes(RttStatus.FAIL_FTM_PARAM_OVERRIDE, 20);
+
+ log = mDut.consolidateProto();
+
+ collector.checkThat("AP histogramIndividualStatus.length",
+ log.rttToAp.histogramIndividualStatus.length, equalTo(16));
+
+ validateProtoIndividualStatusHistBucket("rttToAp.histogramIndividualStatus[0]",
+ log.rttToAp.histogramIndividualStatus[0], WifiMetricsProto.WifiRttLog.SUCCESS, 5);
+ validateProtoIndividualStatusHistBucket("rttToAp.histogramIndividualStatus[1]",
+ log.rttToAp.histogramIndividualStatus[1], WifiMetricsProto.WifiRttLog.FAILURE, 6);
+ validateProtoIndividualStatusHistBucket("rttToAp.histogramIndividualStatus[2]",
+ log.rttToAp.histogramIndividualStatus[2], WifiMetricsProto.WifiRttLog.FAIL_NO_RSP,
+ 7);
+ validateProtoIndividualStatusHistBucket("rttToAp.histogramIndividualStatus[3]",
+ log.rttToAp.histogramIndividualStatus[3], WifiMetricsProto.WifiRttLog.FAIL_REJECTED,
+ 8);
+ validateProtoIndividualStatusHistBucket("rttToAp.histogramIndividualStatus[4]",
+ log.rttToAp.histogramIndividualStatus[4],
+ WifiMetricsProto.WifiRttLog.FAIL_NOT_SCHEDULED_YET, 9);
+ validateProtoIndividualStatusHistBucket("rttToAp.histogramIndividualStatus[5]",
+ log.rttToAp.histogramIndividualStatus[5],
+ WifiMetricsProto.WifiRttLog.FAIL_TM_TIMEOUT, 10);
+ validateProtoIndividualStatusHistBucket("rttToAp.histogramIndividualStatus[6]",
+ log.rttToAp.histogramIndividualStatus[6],
+ WifiMetricsProto.WifiRttLog.FAIL_AP_ON_DIFF_CHANNEL, 11);
+ validateProtoIndividualStatusHistBucket("rttToAp.histogramIndividualStatus[7]",
+ log.rttToAp.histogramIndividualStatus[7],
+ WifiMetricsProto.WifiRttLog.FAIL_NO_CAPABILITY, 12);
+ validateProtoIndividualStatusHistBucket("rttToAp.histogramIndividualStatus[8]",
+ log.rttToAp.histogramIndividualStatus[8], WifiMetricsProto.WifiRttLog.ABORTED, 13);
+ validateProtoIndividualStatusHistBucket("rttToAp.histogramIndividualStatus[9]",
+ log.rttToAp.histogramIndividualStatus[9],
+ WifiMetricsProto.WifiRttLog.FAIL_INVALID_TS, 14);
+ validateProtoIndividualStatusHistBucket("rttToAp.histogramIndividualStatus[10]",
+ log.rttToAp.histogramIndividualStatus[10],
+ WifiMetricsProto.WifiRttLog.FAIL_PROTOCOL, 15);
+ validateProtoIndividualStatusHistBucket("rttToAp.histogramIndividualStatus[11]",
+ log.rttToAp.histogramIndividualStatus[11],
+ WifiMetricsProto.WifiRttLog.FAIL_SCHEDULE, 16);
+ validateProtoIndividualStatusHistBucket("rttToAp.histogramIndividualStatus[12]",
+ log.rttToAp.histogramIndividualStatus[12],
+ WifiMetricsProto.WifiRttLog.FAIL_BUSY_TRY_LATER, 17);
+ validateProtoIndividualStatusHistBucket("rttToAp.histogramIndividualStatus[13]",
+ log.rttToAp.histogramIndividualStatus[13], WifiMetricsProto.WifiRttLog.INVALID_REQ,
+ 18);
+ validateProtoIndividualStatusHistBucket("rttToAp.histogramIndividualStatus[14]",
+ log.rttToAp.histogramIndividualStatus[14], WifiMetricsProto.WifiRttLog.NO_WIFI, 19);
+ validateProtoIndividualStatusHistBucket("rttToAp.histogramIndividualStatus[15]",
+ log.rttToAp.histogramIndividualStatus[15],
+ WifiMetricsProto.WifiRttLog.FAIL_FTM_PARAM_OVERRIDE, 20);
+
+ collector.checkThat("Aware histogramIndividualStatus.length",
+ log.rttToAware.histogramIndividualStatus.length, equalTo(0));
+ }
+
+ /**
+ * Verify that all overall status codes are recorded correctly.
+ */
+ @Test
+ public void testRecordOverallStatus() {
+ WifiMetricsProto.WifiRttLog log;
+
+ mDut.clear();
+
+ recordOverallStatusNTimes(WifiMetricsProto.WifiRttLog.OVERALL_SUCCESS, 5);
+ recordOverallStatusNTimes(WifiMetricsProto.WifiRttLog.OVERALL_FAIL, 6);
+ recordOverallStatusNTimes(WifiMetricsProto.WifiRttLog.OVERALL_RTT_NOT_AVAILABLE, 7);
+ recordOverallStatusNTimes(WifiMetricsProto.WifiRttLog.OVERALL_TIMEOUT, 8);
+ recordOverallStatusNTimes(WifiMetricsProto.WifiRttLog.OVERALL_THROTTLE, 9);
+ recordOverallStatusNTimes(WifiMetricsProto.WifiRttLog.OVERALL_HAL_FAILURE, 10);
+ recordOverallStatusNTimes(WifiMetricsProto.WifiRttLog.OVERALL_AWARE_TRANSLATION_FAILURE,
+ 11);
+ recordOverallStatusNTimes(WifiMetricsProto.WifiRttLog.OVERALL_LOCATION_PERMISSION_MISSING,
+ 12);
+
+ log = mDut.consolidateProto();
+
+ collector.checkThat("histogramOverallStatus.length", log.histogramOverallStatus.length,
+ equalTo(8));
+
+ validateProtoOverallStatusHistBucket("histogramOverallStatus[0]",
+ log.histogramOverallStatus[0], WifiMetricsProto.WifiRttLog.OVERALL_SUCCESS, 5);
+ validateProtoOverallStatusHistBucket("histogramOverallStatus[1]",
+ log.histogramOverallStatus[1], WifiMetricsProto.WifiRttLog.OVERALL_FAIL, 6);
+ validateProtoOverallStatusHistBucket("histogramOverallStatus[2]",
+ log.histogramOverallStatus[2],
+ WifiMetricsProto.WifiRttLog.OVERALL_RTT_NOT_AVAILABLE, 7);
+ validateProtoOverallStatusHistBucket("histogramOverallStatus[3]",
+ log.histogramOverallStatus[3], WifiMetricsProto.WifiRttLog.OVERALL_TIMEOUT, 8);
+ validateProtoOverallStatusHistBucket("histogramOverallStatus[4]",
+ log.histogramOverallStatus[4], WifiMetricsProto.WifiRttLog.OVERALL_THROTTLE, 9);
+ validateProtoOverallStatusHistBucket("histogramOverallStatus[5]",
+ log.histogramOverallStatus[5], WifiMetricsProto.WifiRttLog.OVERALL_HAL_FAILURE, 10);
+ validateProtoOverallStatusHistBucket("histogramOverallStatus[6]",
+ log.histogramOverallStatus[6],
+ WifiMetricsProto.WifiRttLog.OVERALL_AWARE_TRANSLATION_FAILURE, 11);
+ validateProtoOverallStatusHistBucket("histogramOverallStatus[7]",
+ log.histogramOverallStatus[7],
+ WifiMetricsProto.WifiRttLog.OVERALL_LOCATION_PERMISSION_MISSING, 12);
+ }
+
+ // Utilities
+
+ /**
+ * Mock the elapsed time since boot to the input argument.
+ */
+ private void setTime(long timeMs) {
+ when(mClock.getElapsedSinceBootMillis()).thenReturn(timeMs);
+ }
+
+ private void validateProtoHistBucket(String logPrefix,
+ WifiMetricsProto.WifiRttLog.HistogramBucket bucket, long start, long end, int count) {
+ collector.checkThat(logPrefix + ": start", bucket.start, equalTo(start));
+ collector.checkThat(logPrefix + ": end", bucket.end, equalTo(end));
+ collector.checkThat(logPrefix + ": count", bucket.count, equalTo(count));
+ }
+
+ private void validateProtoOverallStatusHistBucket(String logPrefix,
+ WifiMetricsProto.WifiRttLog.RttOverallStatusHistogramBucket bucket, int status,
+ int count) {
+ collector.checkThat(logPrefix + ": statusType", bucket.statusType, equalTo(status));
+ collector.checkThat(logPrefix + ": count", bucket.count, equalTo(count));
+ }
+
+ private void validateProtoIndividualStatusHistBucket(String logPrefix,
+ WifiMetricsProto.WifiRttLog.RttIndividualStatusHistogramBucket bucket, int status,
+ int count) {
+ collector.checkThat(logPrefix + ": statusType", bucket.statusType, equalTo(status));
+ collector.checkThat(logPrefix + ": count", bucket.count, equalTo(count));
+ }
+
+ private void checkMainStats(String msgPrefix, WifiMetricsProto.WifiRttLog log, int numRequests,
+ int histogramOverallStatusLength) {
+ collector.checkThat(msgPrefix + ": numRequests", log.numRequests, equalTo(numRequests));
+ collector.checkThat(msgPrefix + ": histogramOverallStatus.length",
+ log.histogramOverallStatus.length,
+ equalTo(histogramOverallStatusLength));
+ }
+
+ private void checkPeerStats(String msgPrefix, WifiMetricsProto.WifiRttLog.RttToPeerLog log,
+ int numRequests, int numIndividualRequests,
+ int numApps, int histogramNumRequestsPerAppLength,
+ int histogramNumPeersPerRequestLength, int histogramIndividualStatusLength,
+ int histogramDistanceLength, int histogramRequestIntervalMsLength) {
+ collector.checkThat(msgPrefix + ": numRequests", log.numRequests, equalTo(numRequests));
+ collector.checkThat(msgPrefix + ": numIndividualRequests", log.numIndividualRequests,
+ equalTo(numIndividualRequests));
+ collector.checkThat(msgPrefix + ": numApps", log.numApps, equalTo(numApps));
+ collector.checkThat(msgPrefix + ": histogramNumRequestsPerApp.length",
+ log.histogramNumRequestsPerApp.length, equalTo(histogramNumRequestsPerAppLength));
+ collector.checkThat(msgPrefix + ": histogramNumPeersPerRequest.length",
+ log.histogramNumPeersPerRequest.length, equalTo(histogramNumPeersPerRequestLength));
+ collector.checkThat(msgPrefix + ": histogramIndividualStatus.length",
+ log.histogramIndividualStatus.length, equalTo(histogramIndividualStatusLength));
+ collector.checkThat(msgPrefix + ": histogramDistance.length",
+ log.histogramDistance.length, equalTo(histogramDistanceLength));
+ collector.checkThat(msgPrefix + ": histogramRequestIntervalMs.length",
+ log.histogramRequestIntervalMs.length, equalTo(histogramRequestIntervalMsLength));
+ }
+
+ private RangingRequest getDummyRangingRequest(int countAp, int countAware) {
+ RangingRequest.Builder builder = new RangingRequest.Builder();
+ byte[] dummyMacBase = {0x0, 0x1, 0x2, 0x3, 0x4, 0x5};
+
+ for (int i = 0; i < countAp; ++i) {
+ dummyMacBase[0]++;
+ builder.addResponder(new ResponderConfig(MacAddress.fromBytes(dummyMacBase),
+ ResponderConfig.RESPONDER_AP, true, 0, 0, 0, 0, 0));
+ }
+ for (int i = 0; i < countAware; ++i) {
+ dummyMacBase[0]++;
+ builder.addResponder(new ResponderConfig(MacAddress.fromBytes(dummyMacBase),
+ ResponderConfig.RESPONDER_AWARE, true, 0, 0, 0, 0, 0));
+ }
+
+ return builder.build();
+ }
+
+ private List<RttResult> getDummyRangingResults(RangingRequest request, double baseDistanceM,
+ double incrDistanceM) {
+ List<RttResult> halResults = new ArrayList<>();
+ double distance = baseDistanceM;
+
+ for (ResponderConfig peer : request.mRttPeers) {
+ RttResult rttResult = new RttResult();
+ rttResult.status = RttStatus.SUCCESS;
+ System.arraycopy(peer.macAddress.toByteArray(), 0, rttResult.addr, 0, 6);
+ rttResult.distanceInMm = (int) (distance * 1000);
+ distance += incrDistanceM;
+ halResults.add(rttResult);
+ }
+
+ return halResults;
+ }
+
+ private void recordResultNTimes(int status, int n) {
+ RangingRequest request = getDummyRangingRequest(1, 0);
+ List<RttResult> results = getDummyRangingResults(request, 0, 0);
+ RttResult result = results.get(0);
+ result.status = status;
+
+ for (int i = 0; i < n; ++i) {
+ mDut.recordResult(request, results);
+ }
+ }
+
+ private void recordOverallStatusNTimes(int status, int n) {
+ for (int i = 0; i < n; ++i) {
+ mDut.recordOverallStatus(status);
+ }
+ }
+
+ private void dumpDut(String prefix) {
+ StringWriter sw = new StringWriter();
+ mDut.dump(null, new PrintWriter(sw), null);
+ Log.e("RttMetrics", prefix + sw.toString());
+ }
+}
diff --git a/tests/wifitests/src/com/android/server/wifi/rtt/RttNativeTest.java b/tests/wifitests/src/com/android/server/wifi/rtt/RttNativeTest.java
index 35c6d1477..3f5aa5f2d 100644
--- a/tests/wifitests/src/com/android/server/wifi/rtt/RttNativeTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/rtt/RttNativeTest.java
@@ -44,6 +44,7 @@ import android.net.wifi.rtt.RangingRequest;
import com.android.server.wifi.HalDeviceManager;
+import org.hamcrest.core.IsNull;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -397,6 +398,44 @@ public class RttNativeTest {
verifyNoMoreInteractions(mockRttController, mockRttServiceImpl);
}
+ /**
+ * Validate correct cleanup when a null array of results is provided by HAL.
+ */
+ @Test
+ public void testRangeResultsNullArray() {
+ int cmdId = 66;
+
+ mDut.onResults(cmdId, null);
+ verify(mockRttServiceImpl).onRangingResults(eq(cmdId), mRttResultCaptor.capture());
+
+ collector.checkThat("number of entries", mRttResultCaptor.getValue().size(), equalTo(0));
+ }
+
+ /**
+ * Validate correct cleanup when an array of results containing null entries is provided by HAL.
+ */
+ @Test
+ public void testRangeResultsSomeNulls() {
+ int cmdId = 77;
+
+ ArrayList<RttResult> results = new ArrayList<>();
+ results.add(null);
+ results.add(new RttResult());
+ results.add(null);
+ results.add(null);
+ results.add(new RttResult());
+ results.add(null);
+
+ mDut.onResults(cmdId, results);
+ verify(mockRttServiceImpl).onRangingResults(eq(cmdId), mRttResultCaptor.capture());
+
+ List<RttResult> rttR = mRttResultCaptor.getValue();
+ collector.checkThat("number of entries", rttR.size(), equalTo(2));
+ for (int i = 0; i < rttR.size(); ++i) {
+ collector.checkThat("entry", rttR.get(i), IsNull.notNullValue());
+ }
+ }
+
// Utilities
/**
diff --git a/tests/wifitests/src/com/android/server/wifi/rtt/RttServiceImplTest.java b/tests/wifitests/src/com/android/server/wifi/rtt/RttServiceImplTest.java
index a65920384..b472577d5 100644
--- a/tests/wifitests/src/com/android/server/wifi/rtt/RttServiceImplTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/rtt/RttServiceImplTest.java
@@ -72,6 +72,7 @@ import android.util.Pair;
import com.android.server.wifi.Clock;
import com.android.server.wifi.FrameworkFacade;
+import com.android.server.wifi.nano.WifiMetricsProto;
import com.android.server.wifi.util.WifiPermissionsUtil;
import org.junit.After;
@@ -102,6 +103,7 @@ public class RttServiceImplTest {
private final String mPackageName = "some.package.name.for.rtt.app";
private int mDefaultUid = 1500;
+ private WorkSource mDefaultWs = new WorkSource(mDefaultUid);
private ArgumentCaptor<Integer> mIntCaptor = ArgumentCaptor.forClass(Integer.class);
private ArgumentCaptor<IBinder.DeathRecipient> mDeathRecipientCaptor = ArgumentCaptor
@@ -131,6 +133,9 @@ public class RttServiceImplTest {
public RttNative mockNative;
@Mock
+ public RttMetrics mockMetrics;
+
+ @Mock
public IWifiAwareManager mockAwareManagerBinder;
@Mock
@@ -210,7 +215,7 @@ public class RttServiceImplTest {
doAnswer(mBinderUnlinkToDeathCounter).when(mockIbinder).unlinkToDeath(any(), anyInt());
mDut.start(mMockLooper.getLooper(), mockClock, mockAwareManagerBinder, mockNative,
- mockPermissionUtil, mFrameworkFacade);
+ mockMetrics, mockPermissionUtil, mFrameworkFacade);
mMockLooper.dispatchAll();
ArgumentCaptor<BroadcastReceiver> bcastRxCaptor = ArgumentCaptor.forClass(
BroadcastReceiver.class);
@@ -270,8 +275,17 @@ public class RttServiceImplTest {
mMockLooper.dispatchAll();
}
+ // verify metrics
+ for (int i = 0; i < numIter; ++i) {
+ verify(mockMetrics).recordRequest(eq(mDefaultWs), eq(requests[i]));
+ verify(mockMetrics).recordResult(eq(requests[i]), eq(results.get(i).first));
+ }
+ verify(mockMetrics, times(numIter)).recordOverallStatus(
+ WifiMetricsProto.WifiRttLog.OVERALL_SUCCESS);
+
verify(mockNative, atLeastOnce()).isReady();
- verifyNoMoreInteractions(mockNative, mockCallback, mAlarmManager.getAlarmManager());
+ verifyNoMoreInteractions(mockNative, mockMetrics, mockCallback,
+ mAlarmManager.getAlarmManager());
}
/**
@@ -328,8 +342,14 @@ public class RttServiceImplTest {
assertTrue(compareListContentsNoOrdering(results.second, mListCaptor.getValue()));
+ // verify metrics
+ verify(mockMetrics).recordRequest(eq(mDefaultWs), eq(request));
+ verify(mockMetrics).recordResult(eq(finalRequest), eq(results.first));
+ verify(mockMetrics).recordOverallStatus(WifiMetricsProto.WifiRttLog.OVERALL_SUCCESS);
+
verify(mockNative, atLeastOnce()).isReady();
- verifyNoMoreInteractions(mockNative, mockCallback, mAlarmManager.getAlarmManager());
+ verifyNoMoreInteractions(mockNative, mockMetrics, mockCallback,
+ mAlarmManager.getAlarmManager());
}
/**
@@ -381,8 +401,20 @@ public class RttServiceImplTest {
}
}
+ // verify metrics
+ for (int i = 0; i < numIter; ++i) {
+ verify(mockMetrics).recordRequest(eq(mDefaultWs), eq(requests[i]));
+ if (i != 0) {
+ verify(mockMetrics).recordResult(eq(requests[i]), eq(results.get(i).first));
+ }
+ }
+ verify(mockMetrics).recordOverallStatus(WifiMetricsProto.WifiRttLog.OVERALL_HAL_FAILURE);
+ verify(mockMetrics, times(numIter - 1)).recordOverallStatus(
+ WifiMetricsProto.WifiRttLog.OVERALL_SUCCESS);
+
verify(mockNative, atLeastOnce()).isReady();
- verifyNoMoreInteractions(mockNative, mockCallback, mAlarmManager.getAlarmManager());
+ verifyNoMoreInteractions(mockNative, mockMetrics, mockCallback,
+ mAlarmManager.getAlarmManager());
}
/**
@@ -412,8 +444,14 @@ public class RttServiceImplTest {
verify(mockCallback).onRangingFailure(eq(RangingResultCallback.STATUS_CODE_FAIL));
verifyWakeupCancelled();
+ // verify metrics
+ verify(mockMetrics).recordRequest(eq(mDefaultWs), eq(request));
+ verify(mockMetrics).recordOverallStatus(
+ WifiMetricsProto.WifiRttLog.OVERALL_LOCATION_PERMISSION_MISSING);
+
verify(mockNative, atLeastOnce()).isReady();
- verifyNoMoreInteractions(mockNative, mockCallback, mAlarmManager.getAlarmManager());
+ verifyNoMoreInteractions(mockNative, mockMetrics, mockCallback,
+ mAlarmManager.getAlarmManager());
}
/**
@@ -479,8 +517,21 @@ public class RttServiceImplTest {
}
}
+ // verify metrics
+ WorkSource oddWs = new WorkSource(mDefaultUid + 1);
+ for (int i = 0; i < numIter; ++i) {
+ verify(mockMetrics).recordRequest(eq((i % 2) == 0 ? mDefaultWs : oddWs),
+ eq(requests[i]));
+ if (i % 2 == 1) {
+ verify(mockMetrics).recordResult(eq(requests[i]), eq(results.get(i).first));
+ }
+ }
+ verify(mockMetrics, times(numIter / 2)).recordOverallStatus(
+ WifiMetricsProto.WifiRttLog.OVERALL_SUCCESS);
+
verify(mockNative, atLeastOnce()).isReady();
- verifyNoMoreInteractions(mockNative, mockCallback, mAlarmManager.getAlarmManager());
+ verifyNoMoreInteractions(mockNative, mockMetrics, mockCallback,
+ mAlarmManager.getAlarmManager());
}
/**
@@ -514,8 +565,12 @@ public class RttServiceImplTest {
mDut.onRangingResults(mIntCaptor.getValue(), results.first);
mMockLooper.dispatchAll();
+ // verify metrics
+ verify(mockMetrics).recordRequest(eq(ws), eq(request));
+
verify(mockNative, atLeastOnce()).isReady();
- verifyNoMoreInteractions(mockNative, mockCallback, mAlarmManager.getAlarmManager());
+ verifyNoMoreInteractions(mockNative, mockMetrics, mockCallback,
+ mAlarmManager.getAlarmManager());
}
/**
@@ -560,8 +615,12 @@ public class RttServiceImplTest {
mDut.onRangingResults(mIntCaptor.getValue(), results.first);
mMockLooper.dispatchAll();
+ // verify metrics
+ verify(mockMetrics).recordRequest(eq(worksourceRequest), eq(request));
+
verify(mockNative, atLeastOnce()).isReady();
- verifyNoMoreInteractions(mockNative, mockCallback, mAlarmManager.getAlarmManager());
+ verifyNoMoreInteractions(mockNative, mockMetrics, mockCallback,
+ mAlarmManager.getAlarmManager());
}
/**
@@ -601,8 +660,14 @@ public class RttServiceImplTest {
verify(mockCallback).onRangingResults(results.second);
verifyWakeupCancelled();
+ // verify metrics
+ verify(mockMetrics).recordRequest(eq(worksourceRequest), eq(request));
+ verify(mockMetrics).recordResult(eq(request), eq(results.first));
+ verify(mockMetrics).recordOverallStatus(WifiMetricsProto.WifiRttLog.OVERALL_SUCCESS);
+
verify(mockNative, atLeastOnce()).isReady();
- verifyNoMoreInteractions(mockNative, mockCallback, mAlarmManager.getAlarmManager());
+ verifyNoMoreInteractions(mockNative, mockMetrics, mockCallback,
+ mAlarmManager.getAlarmManager());
}
/**
@@ -636,8 +701,14 @@ public class RttServiceImplTest {
verify(mockCallback).onRangingResults(results.second);
verifyWakeupCancelled();
+ // verify metrics
+ verify(mockMetrics).recordRequest(eq(mDefaultWs), eq(request));
+ verify(mockMetrics).recordResult(eq(request), eq(results.first));
+ verify(mockMetrics).recordOverallStatus(WifiMetricsProto.WifiRttLog.OVERALL_SUCCESS);
+
verify(mockNative, atLeastOnce()).isReady();
- verifyNoMoreInteractions(mockNative, mockCallback, mAlarmManager.getAlarmManager());
+ verifyNoMoreInteractions(mockNative, mockMetrics, mockCallback,
+ mAlarmManager.getAlarmManager());
}
/**
@@ -677,8 +748,14 @@ public class RttServiceImplTest {
assertTrue(compareListContentsNoOrdering(results.second, mListCaptor.getValue()));
verifyWakeupCancelled();
+ // verify metrics
+ verify(mockMetrics).recordRequest(eq(mDefaultWs), eq(request));
+ verify(mockMetrics).recordResult(eq(request), eq(results.first));
+ verify(mockMetrics).recordOverallStatus(WifiMetricsProto.WifiRttLog.OVERALL_SUCCESS);
+
verify(mockNative, atLeastOnce()).isReady();
- verifyNoMoreInteractions(mockNative, mockCallback, mAlarmManager.getAlarmManager());
+ verifyNoMoreInteractions(mockNative, mockMetrics, mockCallback,
+ mAlarmManager.getAlarmManager());
}
/**
@@ -714,8 +791,14 @@ public class RttServiceImplTest {
assertTrue(compareListContentsNoOrdering(allFailResults, mListCaptor.getValue()));
verifyWakeupCancelled();
+ // verify metrics
+ verify(mockMetrics).recordRequest(eq(mDefaultWs), eq(request));
+ verify(mockMetrics).recordResult(eq(request), eq(new ArrayList<RttResult>()));
+ verify(mockMetrics).recordOverallStatus(WifiMetricsProto.WifiRttLog.OVERALL_SUCCESS);
+
verify(mockNative, atLeastOnce()).isReady();
- verifyNoMoreInteractions(mockNative, mockCallback, mAlarmManager.getAlarmManager());
+ verifyNoMoreInteractions(mockNative, mockMetrics, mockCallback,
+ mAlarmManager.getAlarmManager());
}
/**
@@ -761,8 +844,14 @@ public class RttServiceImplTest {
assertTrue(compareListContentsNoOrdering(results.second, mListCaptor.getValue()));
verifyWakeupCancelled();
+ // verify metrics
+ verify(mockMetrics).recordRequest(eq(mDefaultWs), eq(request));
+ verify(mockMetrics).recordResult(eq(request), eq(results.first));
+ verify(mockMetrics).recordOverallStatus(WifiMetricsProto.WifiRttLog.OVERALL_SUCCESS);
+
verify(mockNative, atLeastOnce()).isReady();
- verifyNoMoreInteractions(mockNative, mockCallback, mAlarmManager.getAlarmManager());
+ verifyNoMoreInteractions(mockNative, mockMetrics, mockCallback,
+ mAlarmManager.getAlarmManager());
}
/**
@@ -807,8 +896,16 @@ public class RttServiceImplTest {
verify(mockCallback).onRangingResults(result2.second);
verifyWakeupCancelled();
+ // verify metrics
+ verify(mockMetrics).recordRequest(eq(mDefaultWs), eq(request1));
+ verify(mockMetrics).recordRequest(eq(mDefaultWs), eq(request2));
+ verify(mockMetrics).recordResult(eq(request2), eq(result2.first));
+ verify(mockMetrics).recordOverallStatus(WifiMetricsProto.WifiRttLog.OVERALL_TIMEOUT);
+ verify(mockMetrics).recordOverallStatus(WifiMetricsProto.WifiRttLog.OVERALL_SUCCESS);
+
verify(mockNative, atLeastOnce()).isReady();
- verifyNoMoreInteractions(mockNative, mockCallback, mAlarmManager.getAlarmManager());
+ verifyNoMoreInteractions(mockNative, mockMetrics, mockCallback,
+ mAlarmManager.getAlarmManager());
}
/**
@@ -906,8 +1003,23 @@ public class RttServiceImplTest {
cbInorder.verify(mockCallback).onRangingFailure(RangingResultCallback.STATUS_CODE_FAIL);
+ // verify metrics
+ verify(mockMetrics).recordRequest(eq(mDefaultWs), eq(request1));
+ verify(mockMetrics).recordRequest(eq(mDefaultWs), eq(request2));
+ verify(mockMetrics).recordRequest(eq(mDefaultWs), eq(request3));
+ verify(mockMetrics).recordRequest(eq(mDefaultWs), eq(request4));
+ verify(mockMetrics).recordRequest(eq(mDefaultWs), eq(request5));
+ verify(mockMetrics).recordResult(eq(request1), eq(result1.first));
+ verify(mockMetrics).recordResult(eq(request3), eq(result3.first));
+ verify(mockMetrics).recordResult(eq(request4), eq(result4.first));
+ verify(mockMetrics, times(2)).recordOverallStatus(
+ WifiMetricsProto.WifiRttLog.OVERALL_THROTTLE);
+ verify(mockMetrics, times(3)).recordOverallStatus(
+ WifiMetricsProto.WifiRttLog.OVERALL_SUCCESS);
+
verify(mockNative, atLeastOnce()).isReady();
- verifyNoMoreInteractions(mockNative, mockCallback, mAlarmManager.getAlarmManager());
+ verifyNoMoreInteractions(mockNative, mockMetrics, mockCallback,
+ mAlarmManager.getAlarmManager());
}
/**
@@ -995,8 +1107,19 @@ public class RttServiceImplTest {
cbInorder.verify(mockCallback).onRangingFailure(RangingResultCallback.STATUS_CODE_FAIL);
+ // verify metrics
+ verify(mockMetrics).recordRequest(eq(wsReq1), eq(request1));
+ verify(mockMetrics).recordRequest(eq(wsReq2), eq(request2));
+ verify(mockMetrics).recordRequest(eq(wsReq1), eq(request3));
+ verify(mockMetrics).recordResult(eq(request1), eq(result1.first));
+ verify(mockMetrics).recordResult(eq(request2), eq(result2.first));
+ verify(mockMetrics).recordOverallStatus(WifiMetricsProto.WifiRttLog.OVERALL_THROTTLE);
+ verify(mockMetrics, times(2)).recordOverallStatus(
+ WifiMetricsProto.WifiRttLog.OVERALL_SUCCESS);
+
verify(mockNative, atLeastOnce()).isReady();
- verifyNoMoreInteractions(mockNative, mockCallback, mAlarmManager.getAlarmManager());
+ verifyNoMoreInteractions(mockNative, mockMetrics, mockCallback,
+ mAlarmManager.getAlarmManager());
}
/**
@@ -1056,8 +1179,20 @@ public class RttServiceImplTest {
verify(mockCallback, times(RttServiceImpl.MAX_QUEUED_PER_UID + 11)).onRangingFailure(
RangingResultCallback.STATUS_CODE_FAIL_RTT_NOT_AVAILABLE);
+ // verify metrics
+ for (int i = 0; i < RttServiceImpl.MAX_QUEUED_PER_UID + 11; ++i) {
+ WorkSource wsExtra = new WorkSource(10);
+ if (i != 0) {
+ wsExtra.add(10 + i);
+ }
+ verify(mockMetrics).recordRequest(eq(wsExtra), eq(request));
+ }
+ verify(mockMetrics, times(RttServiceImpl.MAX_QUEUED_PER_UID + 11)).recordOverallStatus(
+ WifiMetricsProto.WifiRttLog.OVERALL_RTT_NOT_AVAILABLE);
+
verify(mockNative, atLeastOnce()).isReady();
- verifyNoMoreInteractions(mockNative, mockCallback, mAlarmManager.getAlarmManager());
+ verifyNoMoreInteractions(mockNative, mockMetrics, mockCallback,
+ mAlarmManager.getAlarmManager());
}
/**
@@ -1126,8 +1261,19 @@ public class RttServiceImplTest {
cbInorder.verify(mockCallback, times(RttServiceImpl.MAX_QUEUED_PER_UID)).onRangingFailure(
RangingResultCallback.STATUS_CODE_FAIL_RTT_NOT_AVAILABLE);
+ // verify metrics
+ verify(mockMetrics, times(RttServiceImpl.MAX_QUEUED_PER_UID + 12)).recordRequest(
+ eq(useUids ? mDefaultWs : ws), eq(request));
+ verify(mockMetrics).recordResult(eq(request), eq(result.first));
+ verify(mockMetrics, times(11)).recordOverallStatus(
+ WifiMetricsProto.WifiRttLog.OVERALL_THROTTLE);
+ verify(mockMetrics, times(RttServiceImpl.MAX_QUEUED_PER_UID)).recordOverallStatus(
+ WifiMetricsProto.WifiRttLog.OVERALL_RTT_NOT_AVAILABLE);
+ verify(mockMetrics).recordOverallStatus(WifiMetricsProto.WifiRttLog.OVERALL_SUCCESS);
+
verify(mockNative, atLeastOnce()).isReady();
- verifyNoMoreInteractions(mockNative, mockCallback, mAlarmManager.getAlarmManager());
+ verifyNoMoreInteractions(mockNative, mockMetrics, mockCallback,
+ mAlarmManager.getAlarmManager());
}
/**
@@ -1225,9 +1371,15 @@ public class RttServiceImplTest {
assertTrue(mDut.isAvailable());
validateCorrectRttStatusChangeBroadcast(true);
+ // verify metrics
+ verify(mockMetrics).recordRequest(eq(mDefaultWs), eq(request1));
+ verify(mockMetrics).recordRequest(eq(mDefaultWs), eq(request2));
+ verify(mockMetrics, times(3)).recordOverallStatus(
+ WifiMetricsProto.WifiRttLog.OVERALL_RTT_NOT_AVAILABLE);
+
verify(mockNative, atLeastOnce()).isReady();
- verifyNoMoreInteractions(mockNative, mockCallback, mockCallback2, mockCallback3,
- mAlarmManager.getAlarmManager());
+ verifyNoMoreInteractions(mockNative, mockMetrics, mockCallback, mockCallback2,
+ mockCallback3, mAlarmManager.getAlarmManager());
}
/*
diff --git a/tests/wifitests/src/com/android/server/wifi/scanner/WifiScanningServiceTest.java b/tests/wifitests/src/com/android/server/wifi/scanner/WifiScanningServiceTest.java
index 24f1abccb..08eca85f7 100644
--- a/tests/wifitests/src/com/android/server/wifi/scanner/WifiScanningServiceTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/scanner/WifiScanningServiceTest.java
@@ -82,6 +82,7 @@ import com.android.server.wifi.WifiMetrics;
import com.android.server.wifi.WifiNative;
import com.android.server.wifi.aware.WifiAwareMetrics;
import com.android.server.wifi.nano.WifiMetricsProto;
+import com.android.server.wifi.rtt.RttMetrics;
import com.android.server.wifi.util.WifiAsyncChannel;
import org.junit.After;
@@ -139,7 +140,8 @@ public class WifiScanningServiceTest {
new int[]{5600, 5650, 5660});
mLooper = new TestLooper();
- mWifiMetrics = new WifiMetrics(mClock, mLooper.getLooper(), new WifiAwareMetrics(mClock));
+ mWifiMetrics = new WifiMetrics(mClock, mLooper.getLooper(), new WifiAwareMetrics(mClock),
+ new RttMetrics(mClock));
when(mWifiScannerImplFactory
.create(any(), any(), any()))
.thenReturn(mWifiScannerImpl);