blob: e43da8f06dd6afb3cdb6a738561bbddfd578ab22 [file] [log] [blame]
/*
* Copyright (C) 2019 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;
import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_AUTHENTICATION;
import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_BUSY;
import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_CANNOT_FIND_NETWORK;
import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_CONFIGURATION;
import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_ENROLLEE_AUTHENTICATION;
import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_ENROLLEE_REJECTED_CONFIGURATION;
import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_GENERIC;
import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_INVALID_NETWORK;
import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_INVALID_URI;
import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_NOT_COMPATIBLE;
import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_NOT_SUPPORTED;
import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_TIMEOUT;
import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_APPLIED;
import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_SENT;
import static com.android.server.wifi.DppMetrics.DPP_OPERATION_TIME;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import android.test.suitebuilder.annotation.SmallTest;
import com.android.server.wifi.proto.nano.WifiMetricsProto;
import com.android.server.wifi.proto.nano.WifiMetricsProto.HistogramBucketInt32;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.Random;
/**
* Unit tests for {@link com.android.server.wifi.DppMetrics}.
*/
@SmallTest
public class DppMetricsTest extends WifiBaseTest {
private static final int MAX_ITERATIONS = 30;
private DppMetrics mDppMetrics = new DppMetrics();
@Before
public void setUp() throws Exception {
mDppMetrics.clear();
}
@After
public void cleanUp() {
mDppMetrics.clear();
}
/**
* Helper function that matches histogram buckets to an expected value
*
* @param index Bucket index
* @param value Expected value
*/
private void checkOperationBucketEqualsTo(int index, int value) {
// Confirm that the consolidated log has the expected value
WifiMetricsProto.WifiDppLog mWifiDppLogProto = mDppMetrics.consolidateProto();
HistogramBucketInt32 hb = mWifiDppLogProto.dppOperationTime[index];
assertEquals(hb.count, value);
}
/**
* Helper function that returns a number to be used to call a counter update method
*
* @param max Upper limit for the random number
* @return returns a random number between 0 and max
*/
private int getNumOfTimes(int max) {
Random random = new Random();
return random.nextInt(max);
}
/**
* Helper function to check DPP Failures in the histogram bucket
*
* @param key Key to verify
* @param value Expected value
*/
private void checkDppFailures(int key, int value) {
boolean found = false;
// Confirm that the consolidated log has the expected value
WifiMetricsProto.WifiDppLog mWifiDppLogProto = mDppMetrics.consolidateProto();
for (WifiMetricsProto.WifiDppLog.DppFailureStatusHistogramBucket hb :
mWifiDppLogProto.dppFailureCode) {
if (hb.dppStatusType == key) {
assertEquals(hb.count, value);
found = true;
break;
}
}
assertTrue(found);
}
/**
* Helper function to check DPP Successes in the histogram bucket
*
* @param key Key to verify
* @param value Expected value
*/
private void checkDppSuccesses(int key, int value) {
boolean found = false;
// Confirm that the consolidated log has the expected value
WifiMetricsProto.WifiDppLog mWifiDppLogProto = mDppMetrics.consolidateProto();
for (WifiMetricsProto.WifiDppLog.DppConfiguratorSuccessStatusHistogramBucket hb :
mWifiDppLogProto.dppConfiguratorSuccessCode) {
if (hb.dppStatusType == key) {
assertEquals(hb.count, value);
found = true;
break;
}
}
assertTrue(found);
}
/**
* Test numDppConfiguratorInitiatorRequests
*
* @throws Exception
*/
@Test
public void testUpdateDppConfiguratorInitiatorRequests() throws Exception {
// Get a random value and call the update method 'value' times
int value = getNumOfTimes(MAX_ITERATIONS) + 1;
for (int i = 0; i < value; i++) {
mDppMetrics.updateDppConfiguratorInitiatorRequests();
}
// Confirm that the consolidated log has the expected value
WifiMetricsProto.WifiDppLog mWifiDppLogProto = mDppMetrics.consolidateProto();
assertEquals(mWifiDppLogProto.numDppConfiguratorInitiatorRequests, value);
}
/**
* Test numDppEnrolleeInitiatorRequests
*
* @throws Exception
*/
@Test
public void testUpdateDppEnrolleeInitiatorRequests() throws Exception {
// Get a random value and call the update method 'value' times
int value = getNumOfTimes(MAX_ITERATIONS) + 1;
for (int i = 0; i < value; i++) {
mDppMetrics.updateDppEnrolleeInitiatorRequests();
}
// Confirm that the consolidated log has the expected value
WifiMetricsProto.WifiDppLog mWifiDppLogProto = mDppMetrics.consolidateProto();
assertEquals(mWifiDppLogProto.numDppEnrolleeInitiatorRequests, value);
}
/**
* Test EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_SENT
*
* @throws Exception
*/
@Test
public void testUpdateDppConfiguratorSuccess() throws Exception {
// Get a random value and call the update method 'value' times
int value = getNumOfTimes(MAX_ITERATIONS) + 1;
for (int i = 0; i < value; i++) {
mDppMetrics.updateDppConfiguratorSuccess(EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_SENT);
}
for (int i = 0; i < value; i++) {
mDppMetrics.updateDppConfiguratorSuccess(
EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_APPLIED);
}
// Confirm that the consolidated log has the expected value
checkDppSuccesses(WifiMetricsProto.WifiDppLog.EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_SENT,
value);
checkDppSuccesses(WifiMetricsProto.WifiDppLog
.EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_APPLIED, value);
}
/**
* Test numDppEnrolleeSuccess
*
* @throws Exception
*/
@Test
public void testUpdateDppEnrolleeSuccess() throws Exception {
// Get a random value and call the update method 'value' times
int value = getNumOfTimes(MAX_ITERATIONS) + 1;
for (int i = 0; i < value; i++) {
mDppMetrics.updateDppEnrolleeSuccess();
}
// Confirm that the consolidated log has the expected value
WifiMetricsProto.WifiDppLog mWifiDppLogProto = mDppMetrics.consolidateProto();
assertEquals(mWifiDppLogProto.numDppEnrolleeSuccess, value);
}
/**
* Test EASY_CONNECT_EVENT_FAILURE_INVALID_URI
*
* @throws Exception
*/
@Test
public void testUpdateDppFailureInvalidUri() throws Exception {
// Get a random value and call the update method 'value' times
int value = getNumOfTimes(MAX_ITERATIONS) + 1;
for (int i = 0; i < value; i++) {
mDppMetrics.updateDppFailure(EASY_CONNECT_EVENT_FAILURE_INVALID_URI);
}
// Confirm that the consolidated log has the expected value
checkDppFailures(WifiMetricsProto.WifiDppLog.EASY_CONNECT_EVENT_FAILURE_INVALID_URI, value);
}
/**
* Test EASY_CONNECT_EVENT_FAILURE_AUTHENTICATION
*
* @throws Exception
*/
@Test
public void testUpdateDppFailureAuthentication() throws Exception {
// Get a random value and call the update method 'value' times
int value = getNumOfTimes(MAX_ITERATIONS) + 1;
for (int i = 0; i < value; i++) {
mDppMetrics.updateDppFailure(EASY_CONNECT_EVENT_FAILURE_AUTHENTICATION);
}
// Confirm that the consolidated log has the expected value
checkDppFailures(WifiMetricsProto.WifiDppLog.EASY_CONNECT_EVENT_FAILURE_AUTHENTICATION,
value);
}
/**
* Test EASY_CONNECT_EVENT_FAILURE_NOT_COMPATIBLE
*
* @throws Exception
*/
@Test
public void testUpdateDppFailureNotCompatible() throws Exception {
// Get a random value and call the update method 'value' times
int value = getNumOfTimes(MAX_ITERATIONS) + 1;
for (int i = 0; i < value; i++) {
mDppMetrics.updateDppFailure(EASY_CONNECT_EVENT_FAILURE_NOT_COMPATIBLE);
}
// Confirm that the consolidated log has the expected value
checkDppFailures(WifiMetricsProto.WifiDppLog.EASY_CONNECT_EVENT_FAILURE_NOT_COMPATIBLE,
value);
}
/**
* Test EASY_CONNECT_EVENT_FAILURE_CONFIGURATION
*
* @throws Exception
*/
@Test
public void testUpdateDppFailureConfiguration() throws Exception {
// Get a random value and call the update method 'value' times
int value = getNumOfTimes(MAX_ITERATIONS) + 1;
for (int i = 0; i < value; i++) {
mDppMetrics.updateDppFailure(EASY_CONNECT_EVENT_FAILURE_CONFIGURATION);
}
// Confirm that the consolidated log has the expected value
checkDppFailures(WifiMetricsProto.WifiDppLog.EASY_CONNECT_EVENT_FAILURE_CONFIGURATION,
value);
}
/**
* Test EASY_CONNECT_EVENT_FAILURE_BUSY
*
* @throws Exception
*/
@Test
public void testUpdateDppFailureBusy() throws Exception {
// Get a random value and call the update method 'value' times
int value = getNumOfTimes(MAX_ITERATIONS) + 1;
for (int i = 0; i < value; i++) {
mDppMetrics.updateDppFailure(EASY_CONNECT_EVENT_FAILURE_BUSY);
}
// Confirm that the consolidated log has the expected value
checkDppFailures(WifiMetricsProto.WifiDppLog.EASY_CONNECT_EVENT_FAILURE_BUSY, value);
}
/**
* Test EASY_CONNECT_EVENT_FAILURE_TIMEOUT
*
* @throws Exception
*/
@Test
public void testUpdateDppFailureTimeout() throws Exception {
// Get a random value and call the update method 'value' times
int value = getNumOfTimes(MAX_ITERATIONS) + 1;
for (int i = 0; i < value; i++) {
mDppMetrics.updateDppFailure(EASY_CONNECT_EVENT_FAILURE_TIMEOUT);
}
// Confirm that the consolidated log has the expected value
checkDppFailures(WifiMetricsProto.WifiDppLog.EASY_CONNECT_EVENT_FAILURE_TIMEOUT, value);
}
/**
* Test EASY_CONNECT_EVENT_FAILURE_GENERIC
*
* @throws Exception
*/
@Test
public void testUpdateDppFailureGeneric() throws Exception {
// Get a random value and call the update method 'value' times
int value = getNumOfTimes(MAX_ITERATIONS) + 1;
for (int i = 0; i < value; i++) {
mDppMetrics.updateDppFailure(EASY_CONNECT_EVENT_FAILURE_GENERIC);
}
// Confirm that the consolidated log has the expected value
checkDppFailures(WifiMetricsProto.WifiDppLog.EASY_CONNECT_EVENT_FAILURE_GENERIC, value);
}
/**
* Test EASY_CONNECT_EVENT_FAILURE_NOT_SUPPORTED
*
* @throws Exception
*/
@Test
public void testUpdateDppFailureNotSupported() throws Exception {
// Get a random value and call the update method 'value' times
int value = getNumOfTimes(MAX_ITERATIONS) + 1;
for (int i = 0; i < value; i++) {
mDppMetrics.updateDppFailure(EASY_CONNECT_EVENT_FAILURE_NOT_SUPPORTED);
}
// Confirm that the consolidated log has the expected value
checkDppFailures(WifiMetricsProto.WifiDppLog.EASY_CONNECT_EVENT_FAILURE_NOT_SUPPORTED,
value);
}
/**
* Test EASY_CONNECT_EVENT_FAILURE_INVALID_NETWORK
*
* @throws Exception
*/
@Test
public void testUpdateDppFailureInvalidNetwork() throws Exception {
// Get a random value and call the update method 'value' times
int value = getNumOfTimes(MAX_ITERATIONS) + 1;
for (int i = 0; i < value; i++) {
mDppMetrics.updateDppFailure(EASY_CONNECT_EVENT_FAILURE_INVALID_NETWORK);
}
// Confirm that the consolidated log has the expected value
checkDppFailures(WifiMetricsProto.WifiDppLog.EASY_CONNECT_EVENT_FAILURE_INVALID_NETWORK,
value);
}
/**
* Test EASY_CONNECT_EVENT_FAILURE_CANNOT_FIND_NETWORK
*
* @throws Exception
*/
@Test
public void testUpdateDppFailureCannotFindNetwork() throws Exception {
// Get a random value and call the update method 'value' times
int value = getNumOfTimes(MAX_ITERATIONS) + 1;
for (int i = 0; i < value; i++) {
mDppMetrics.updateDppFailure(EASY_CONNECT_EVENT_FAILURE_CANNOT_FIND_NETWORK);
}
// Confirm that the consolidated log has the expected value
checkDppFailures(WifiMetricsProto.WifiDppLog.EASY_CONNECT_EVENT_FAILURE_CANNOT_FIND_NETWORK,
value);
}
/**
* Test EASY_CONNECT_EVENT_FAILURE_ENROLLEE_AUTHENTICATION
*
* @throws Exception
*/
@Test
public void testUpdateDppFailureEnrolleeAuthentication() throws Exception {
// Get a random value and call the update method 'value' times
int value = getNumOfTimes(MAX_ITERATIONS) + 1;
for (int i = 0; i < value; i++) {
mDppMetrics.updateDppFailure(EASY_CONNECT_EVENT_FAILURE_ENROLLEE_AUTHENTICATION);
}
// Confirm that the consolidated log has the expected value
checkDppFailures(WifiMetricsProto.WifiDppLog
.EASY_CONNECT_EVENT_FAILURE_ENROLLEE_AUTHENTICATION, value);
}
/**
* Test
* EASY_CONNECT_EVENT_FAILURE_ENROLLEE_REJECTED_CONFIGURATION
*
* @throws Exception
*/
@Test
public void testUpdateDppFailureEnrolleeRejectedConfiguration() throws Exception {
// Get a random value and call the update method 'value' times
int value = getNumOfTimes(MAX_ITERATIONS) + 1;
for (int i = 0; i < value; i++) {
mDppMetrics.updateDppFailure(
EASY_CONNECT_EVENT_FAILURE_ENROLLEE_REJECTED_CONFIGURATION);
}
// Confirm that the consolidated log has the expected value
checkDppFailures(WifiMetricsProto.WifiDppLog
.EASY_CONNECT_EVENT_FAILURE_ENROLLEE_REJECTED_CONFIGURATION, value);
}
/**
* Test DPP operation time histogram. Pick a single time value from each bucket by selecting
* the max value minus 1, and call the update method random amount of times with this value.
* Then confirm that the output histogram has the expected value in each target bucket.
*
* @throws Exception
*/
@Test
public void testUpdateHistogramDppOperationTime() throws Exception {
// Iterate through the histogram array
for (int i = 0; i <= DPP_OPERATION_TIME.length; i++) {
// Get a random value and call the operation time update method
int value = getNumOfTimes(MAX_ITERATIONS) + 1;
int timeMs;
if (i < DPP_OPERATION_TIME.length) {
timeMs = DPP_OPERATION_TIME[i] - 1;
} else {
timeMs = DPP_OPERATION_TIME[i - 1];
}
// Framework uses milliseconds when it gets the time, convert to milliseconds
timeMs *= 1000;
for (int j = 0; j < value; j++) {
// Add a time value that would fall in the i'th bucket
mDppMetrics.updateDppOperationTime(timeMs);
}
// Confirm that output matches the expected value
checkOperationBucketEqualsTo(i, value);
}
}
/**
* Test numDppR1CapableEnrolleeResponderDevices
*
* @throws Exception
*/
@Test
public void testUpdateDppR1CapableEnrolleeResponderDevices() throws Exception {
// Get a random value and call the update method 'value' times
int value = getNumOfTimes(MAX_ITERATIONS) + 1;
for (int i = 0; i < value; i++) {
mDppMetrics.updateDppR1CapableEnrolleeResponderDevices();
}
// Confirm that the consolidated log has the expected value
WifiMetricsProto.WifiDppLog mWifiDppLogProto = mDppMetrics.consolidateProto();
assertEquals(mWifiDppLogProto.numDppR1CapableEnrolleeResponderDevices, value);
}
/**
* Test numDppR2CapableEnrolleeResponderDevices
*
* @throws Exception
*/
@Test
public void testUpdateDppR2CapableEnrolleeResponderDevices() throws Exception {
// Get a random value and call the update method 'value' times
int value = getNumOfTimes(MAX_ITERATIONS) + 1;
for (int i = 0; i < value; i++) {
mDppMetrics.updateDppR2CapableEnrolleeResponderDevices();
}
// Confirm that the consolidated log has the expected value
WifiMetricsProto.WifiDppLog mWifiDppLogProto = mDppMetrics.consolidateProto();
assertEquals(mWifiDppLogProto.numDppR2CapableEnrolleeResponderDevices, value);
}
/**
* Test numDppR2EnrolleeResponderIncompatibleConfiguration
*
* @throws Exception
*/
@Test
public void testUpdateDppR2EnrolleeResponderIncompatibleConfiguration() throws Exception {
// Get a random value and call the update method 'value' times
int value = getNumOfTimes(MAX_ITERATIONS) + 1;
for (int i = 0; i < value; i++) {
mDppMetrics.updateDppR2EnrolleeResponderIncompatibleConfiguration();
}
// Confirm that the consolidated log has the expected value
WifiMetricsProto.WifiDppLog mWifiDppLogProto = mDppMetrics.consolidateProto();
assertEquals(mWifiDppLogProto.numDppR2EnrolleeResponderIncompatibleConfiguration, value);
}
}