blob: ee1264a9e4af92d033444ea989ebad0158923b78 [file] [log] [blame]
/*
* Copyright 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;
import static android.hardware.wifi.supplicant.V1_2.DppAkm.PSK;
import static android.hardware.wifi.supplicant.V1_2.DppAkm.SAE;
import static android.hardware.wifi.supplicant.V1_2.DppFailureCode.AUTHENTICATION;
import static android.hardware.wifi.supplicant.V1_2.DppFailureCode.BUSY;
import static android.hardware.wifi.supplicant.V1_2.DppFailureCode.CONFIGURATION;
import static android.hardware.wifi.supplicant.V1_2.DppFailureCode.FAILURE;
import static android.hardware.wifi.supplicant.V1_2.DppFailureCode.NOT_COMPATIBLE;
import static android.hardware.wifi.supplicant.V1_2.DppFailureCode.NOT_SUPPORTED;
import static android.hardware.wifi.supplicant.V1_2.DppFailureCode.TIMEOUT;
import static android.hardware.wifi.supplicant.V1_2.DppProgressCode.AUTHENTICATION_SUCCESS;
import static android.hardware.wifi.supplicant.V1_2.DppProgressCode.RESPONSE_PENDING;
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_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_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_PROGRESS_AUTHENTICATION_SUCCESS;
import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_PROGRESS_RESPONSE_PENDING;
import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_SENT;
import static android.net.wifi.WifiManager.EASY_CONNECT_NETWORK_ROLE_STA;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.net.wifi.EasyConnectStatusCallback;
import android.net.wifi.IDppCallback;
import android.net.wifi.WifiConfiguration;
import android.os.IBinder;
import android.os.test.TestLooper;
import android.test.suitebuilder.annotation.SmallTest;
import com.android.internal.util.WakeupMessage;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
/**
* Unit tests for {@link DppManager}.
*/
@SmallTest
public class DppManagerTest {
private static final String TAG = "DppManagerTest";
private static final String TEST_INTERFACE_NAME = "testif0";
private static final int TEST_PEER_ID = 1;
private static final String TEST_SSID = "\"Test_SSID\"";
private static final String TEST_SSID_ENCODED = "546573745f53534944";
private static final String TEST_PASSWORD = "\"secretPassword\"";
private static final String TEST_PASSWORD_ENCODED = "73656372657450617373776f7264";
private static final int TEST_NETWORK_ID = 1;
TestLooper mLooper;
DppManager mDppManager;
@Mock
Context mContext;
@Mock
WifiMetrics mWifiMetrics;
@Mock
WifiNative mWifiNative;
@Mock
WifiConfigManager mWifiConfigManager;
@Mock
IBinder mBinder;
@Mock
IDppCallback mDppCallback;
@Mock
IDppCallback mDppCallbackConcurrent;
@Mock
WakeupMessage mWakeupMessage;
@Mock
DppMetrics mDppMetrics;
String mUri =
"DPP:C:81/1;I:DPP_TESTER;K:MDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDIgADebGHMJoCcE7OZP/aek5muaJo"
+ "zGy2FVKPRjA/I/qyC8Q=;;";
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mLooper = new TestLooper();
mDppManager = createDppManager();
mLooper.dispatchAll();
// Add Peer URI successful, return peer ID 1
when(mWifiNative.addDppPeerUri(anyString(), anyString()))
.thenReturn(1);
when(mWifiNative.removeDppUri(anyString(), anyInt()))
.thenReturn(true);
// Return test interface name
when(mWifiNative.getClientInterfaceName()).thenReturn(TEST_INTERFACE_NAME);
// Successfully start enrollee
when(mWifiNative.startDppEnrolleeInitiator(anyString(), anyInt(), anyInt())).thenReturn(
true);
// Successfully start configurator
when(mWifiNative.startDppConfiguratorInitiator(anyString(), anyInt(), anyInt(), anyString(),
any(), any(), anyInt(), anyInt())).thenReturn(true);
}
private DppManager createDppManager() {
DppManager dppManger = new DppManager(mLooper.getLooper(), mWifiNative, mWifiConfigManager,
mContext, mDppMetrics);
dppManger.mDppTimeoutMessage = mWakeupMessage;
dppManger.enableVerboseLogging(1);
return dppManger;
}
/**
* DPP Tests
*/
@Test
public void testStartDppAsConfiguratorInitiatorWithBadNetworkId() throws Exception {
// Return NULL when for the selected network (invalid network)
when(mWifiConfigManager.getConfiguredNetworkWithoutMasking(anyInt())).thenReturn(null);
mDppManager.startDppAsConfiguratorInitiator(0, mBinder, mUri, 1,
EASY_CONNECT_NETWORK_ROLE_STA,
mDppCallback);
verify(mDppCallback).onFailure(
EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_INVALID_NETWORK);
verify(mDppCallback, never()).onSuccess(anyInt());
verify(mDppCallback, never()).onSuccessConfigReceived(anyInt());
verify(mDppMetrics).updateDppConfiguratorInitiatorRequests();
verify(mDppMetrics).updateDppFailure(EasyConnectStatusCallback
.EASY_CONNECT_EVENT_FAILURE_INVALID_NETWORK);
verifyNoMoreInteractions(mDppMetrics);
}
@Test
public void testStartDppAsConfiguratorInitiatorFailAddPeer() throws Exception {
// Generate a mock WifiConfiguration object
WifiConfiguration selectedNetwork = new WifiConfiguration();
selectedNetwork.SSID = "\"Test_SSID\"";
selectedNetwork.networkId = TEST_NETWORK_ID;
selectedNetwork.preSharedKey = "\"secretPassword\"";
selectedNetwork.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
when(mWifiConfigManager.getConfiguredNetworkWithoutMasking(anyInt())).thenReturn(
selectedNetwork);
// Fail to add Peer URI
when(mWifiNative.addDppPeerUri(anyString(), anyString())).thenReturn(-1);
mDppManager.startDppAsConfiguratorInitiator(0, mBinder, mUri, 1,
EASY_CONNECT_NETWORK_ROLE_STA,
mDppCallback);
verify(mDppCallback).onFailure(
EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_INVALID_URI);
verify(mDppCallback, never()).onSuccess(anyInt());
verify(mDppCallback, never()).onSuccessConfigReceived(anyInt());
verify(mDppMetrics).updateDppConfiguratorInitiatorRequests();
verify(mDppMetrics).updateDppFailure(EasyConnectStatusCallback
.EASY_CONNECT_EVENT_FAILURE_INVALID_URI);
verify(mDppMetrics).updateDppOperationTime(anyInt());
verifyNoMoreInteractions(mDppMetrics);
}
@Test
public void testStartDppAsEnrolleeInitiatorFailAddPeer() throws Exception {
// Fail to add Peer URI
when(mWifiNative.addDppPeerUri(anyString(), anyString())).thenReturn(-1);
mDppManager.startDppAsEnrolleeInitiator(0, mBinder, mUri, mDppCallback);
verify(mDppCallback).onFailure(
EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_INVALID_URI);
verify(mDppCallback, never()).onSuccess(anyInt());
verify(mDppCallback, never()).onSuccessConfigReceived(anyInt());
verify(mDppMetrics).updateDppEnrolleeInitiatorRequests();
verify(mDppMetrics).updateDppFailure(EasyConnectStatusCallback
.EASY_CONNECT_EVENT_FAILURE_INVALID_URI);
verify(mDppMetrics).updateDppOperationTime(anyInt());
verifyNoMoreInteractions(mDppMetrics);
}
@Test
public void testStartDppAsConfiguratorInitiatorFailStart() throws Exception {
// Generate a mock WifiConfiguration object
WifiConfiguration selectedNetwork = new WifiConfiguration();
selectedNetwork.SSID = "\"Test_SSID\"";
selectedNetwork.networkId = TEST_NETWORK_ID;
selectedNetwork.preSharedKey = "\"secretPassword\"";
selectedNetwork.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
when(mWifiConfigManager.getConfiguredNetworkWithoutMasking(anyInt())).thenReturn(
selectedNetwork);
// Fail to start
when(mWifiNative.startDppConfiguratorInitiator(anyString(), anyInt(), anyInt(), anyString(),
any(), any(), anyInt(), anyInt())).thenReturn(false);
mDppManager.startDppAsConfiguratorInitiator(0, mBinder, mUri, 1,
EASY_CONNECT_NETWORK_ROLE_STA,
mDppCallback);
verify(mDppCallback).onFailure(EASY_CONNECT_EVENT_FAILURE_GENERIC);
verify(mDppCallback, never()).onSuccess(anyInt());
verify(mDppCallback, never()).onSuccessConfigReceived(anyInt());
verify(mDppMetrics).updateDppConfiguratorInitiatorRequests();
verify(mDppMetrics).updateDppFailure(EASY_CONNECT_EVENT_FAILURE_GENERIC);
verify(mDppMetrics).updateDppOperationTime(anyInt());
verifyNoMoreInteractions(mDppMetrics);
}
@Test
public void testStartDppAsEnrolleeInitiatorFailStart() throws Exception {
// Fail to start
when(mWifiNative.startDppEnrolleeInitiator(anyString(), anyInt(), anyInt())).thenReturn(
false);
mDppManager.startDppAsEnrolleeInitiator(0, mBinder, mUri, mDppCallback);
verify(mDppCallback).onFailure(EASY_CONNECT_EVENT_FAILURE_GENERIC);
verify(mDppCallback, never()).onSuccess(anyInt());
verify(mDppCallback, never()).onSuccessConfigReceived(anyInt());
verify(mDppMetrics).updateDppEnrolleeInitiatorRequests();
verify(mDppMetrics).updateDppFailure(EASY_CONNECT_EVENT_FAILURE_GENERIC);
verify(mDppMetrics).updateDppOperationTime(anyInt());
verifyNoMoreInteractions(mDppMetrics);
}
@Test
public void testStartDppAsConfiguratorInitiatorStartCorrectlyWpa2Psk() throws Exception {
// Generate a mock WifiConfiguration object
WifiConfiguration selectedNetwork = new WifiConfiguration();
selectedNetwork.SSID = TEST_SSID;
selectedNetwork.networkId = TEST_NETWORK_ID;
selectedNetwork.preSharedKey = TEST_PASSWORD;
selectedNetwork.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
when(mWifiConfigManager.getConfiguredNetworkWithoutMasking(anyInt())).thenReturn(
selectedNetwork);
mDppManager.startDppAsConfiguratorInitiator(0, mBinder, mUri, 1,
EASY_CONNECT_NETWORK_ROLE_STA,
mDppCallback);
verify(mDppCallback, never()).onFailure(anyInt());
verify(mDppCallback, never()).onSuccess(anyInt());
verify(mDppCallback, never()).onSuccessConfigReceived(anyInt());
verify(mWifiNative).startDppConfiguratorInitiator(eq(TEST_INTERFACE_NAME),
eq(TEST_PEER_ID), anyInt(), eq(TEST_SSID_ENCODED), eq(TEST_PASSWORD_ENCODED), any(),
eq(EASY_CONNECT_NETWORK_ROLE_STA), eq(PSK));
verify(mDppMetrics).updateDppConfiguratorInitiatorRequests();
verifyNoMoreInteractions(mDppMetrics);
}
@Test
public void testStartDppAsConfiguratorInitiatorStartCorrectlyWpa3Sae() throws Exception {
// Generate a mock WifiConfiguration object
WifiConfiguration selectedNetwork = new WifiConfiguration();
selectedNetwork.SSID = TEST_SSID;
selectedNetwork.networkId = TEST_NETWORK_ID;
selectedNetwork.preSharedKey = TEST_PASSWORD;
selectedNetwork.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.SAE);
when(mWifiConfigManager.getConfiguredNetworkWithoutMasking(anyInt())).thenReturn(
selectedNetwork);
mDppManager.startDppAsConfiguratorInitiator(0, mBinder, mUri, 1,
EASY_CONNECT_NETWORK_ROLE_STA,
mDppCallback);
verify(mDppCallback, never()).onFailure(anyInt());
verify(mDppCallback, never()).onSuccess(anyInt());
verify(mDppCallback, never()).onSuccessConfigReceived(anyInt());
verify(mWifiNative).startDppConfiguratorInitiator(eq(TEST_INTERFACE_NAME),
eq(TEST_PEER_ID), anyInt(), eq(TEST_SSID_ENCODED), eq(TEST_PASSWORD_ENCODED), any(),
eq(EASY_CONNECT_NETWORK_ROLE_STA), eq(SAE));
verify(mDppMetrics).updateDppConfiguratorInitiatorRequests();
verifyNoMoreInteractions(mDppMetrics);
}
@Test
public void testStartDppAsConfiguratorInitiatorFailOpenNetwork() throws Exception {
// Generate a mock WifiConfiguration object
WifiConfiguration selectedNetwork = new WifiConfiguration();
selectedNetwork.SSID = TEST_SSID;
selectedNetwork.networkId = TEST_NETWORK_ID;
selectedNetwork.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
when(mWifiConfigManager.getConfiguredNetworkWithoutMasking(anyInt())).thenReturn(
selectedNetwork);
mDppManager.startDppAsConfiguratorInitiator(0, mBinder, mUri, 1,
EASY_CONNECT_NETWORK_ROLE_STA,
mDppCallback);
verify(mDppCallback).onFailure(EASY_CONNECT_EVENT_FAILURE_INVALID_NETWORK);
verify(mDppCallback, never()).onSuccess(anyInt());
verify(mDppCallback, never()).onSuccessConfigReceived(anyInt());
verify(mDppMetrics).updateDppConfiguratorInitiatorRequests();
verify(mDppMetrics).updateDppFailure(EasyConnectStatusCallback
.EASY_CONNECT_EVENT_FAILURE_INVALID_NETWORK);
verifyNoMoreInteractions(mDppMetrics);
}
@Test
public void testStartDppAsConfiguratorInitiatorFailEapNetwork() throws Exception {
// Generate a mock WifiConfiguration object
WifiConfiguration selectedNetwork = new WifiConfiguration();
selectedNetwork.SSID = TEST_SSID;
selectedNetwork.networkId = TEST_NETWORK_ID;
selectedNetwork.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
when(mWifiConfigManager.getConfiguredNetworkWithoutMasking(anyInt())).thenReturn(
selectedNetwork);
mDppManager.startDppAsConfiguratorInitiator(0, mBinder, mUri, 1,
EASY_CONNECT_NETWORK_ROLE_STA,
mDppCallback);
verify(mDppCallback).onFailure(EASY_CONNECT_EVENT_FAILURE_INVALID_NETWORK);
verify(mDppCallback, never()).onSuccess(anyInt());
verify(mDppCallback, never()).onSuccessConfigReceived(anyInt());
verify(mDppMetrics).updateDppConfiguratorInitiatorRequests();
verify(mDppMetrics).updateDppFailure(EasyConnectStatusCallback
.EASY_CONNECT_EVENT_FAILURE_INVALID_NETWORK);
verifyNoMoreInteractions(mDppMetrics);
}
@Test
public void testStartDppAsEnrolleeInitiatorStartCorrectly() throws Exception {
mDppManager.startDppAsEnrolleeInitiator(0, mBinder, mUri, mDppCallback);
verify(mDppCallback, never()).onFailure(anyInt());
verify(mDppCallback, never()).onSuccess(anyInt());
verify(mDppCallback, never()).onSuccessConfigReceived(anyInt());
verify(mWifiNative).startDppEnrolleeInitiator(eq(TEST_INTERFACE_NAME),
eq(TEST_PEER_ID), anyInt());
verify(mDppMetrics).updateDppEnrolleeInitiatorRequests();
verifyNoMoreInteractions(mDppMetrics);
}
@Test
public void testStartDppAsConfiguratorInitiatorStartCorrectlyAndRejectConcurrentRequest()
throws Exception {
// Generate a mock WifiConfiguration object
WifiConfiguration selectedNetwork = new WifiConfiguration();
selectedNetwork.SSID = TEST_SSID;
selectedNetwork.networkId = 1;
selectedNetwork.preSharedKey = TEST_PASSWORD;
selectedNetwork.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.SAE);
when(mWifiConfigManager.getConfiguredNetworkWithoutMasking(anyInt())).thenReturn(
selectedNetwork);
mDppManager.startDppAsConfiguratorInitiator(0, mBinder, mUri, 1,
EASY_CONNECT_NETWORK_ROLE_STA,
mDppCallback);
verify(mDppCallback, never()).onFailure(anyInt());
verify(mDppCallback, never()).onSuccess(anyInt());
verify(mDppCallback, never()).onSuccessConfigReceived(anyInt());
verify(mWifiNative).startDppConfiguratorInitiator(eq(TEST_INTERFACE_NAME),
eq(TEST_PEER_ID), anyInt(), eq(TEST_SSID_ENCODED), eq(TEST_PASSWORD_ENCODED), any(),
eq(EASY_CONNECT_NETWORK_ROLE_STA), eq(SAE));
mDppManager.startDppAsConfiguratorInitiator(1, mBinder, mUri, 1,
EASY_CONNECT_NETWORK_ROLE_STA,
mDppCallbackConcurrent);
verify(mDppCallbackConcurrent).onFailure(EASY_CONNECT_EVENT_FAILURE_BUSY);
verify(mDppCallbackConcurrent, never()).onSuccess(anyInt());
verify(mDppCallbackConcurrent, never()).onSuccessConfigReceived(anyInt());
verify(mDppMetrics, times(2)).updateDppConfiguratorInitiatorRequests();
verify(mDppMetrics).updateDppFailure(EASY_CONNECT_EVENT_FAILURE_BUSY);
verifyNoMoreInteractions(mDppMetrics);
}
@Test
public void testStartDppAsEnrolleeInitiatorStartCorrectlyAndRejectConcurrentRequest()
throws Exception {
mDppManager.startDppAsEnrolleeInitiator(0, mBinder, mUri, mDppCallback);
verify(mDppCallback, never()).onFailure(anyInt());
verify(mDppCallback, never()).onSuccess(anyInt());
verify(mDppCallback, never()).onSuccessConfigReceived(anyInt());
verify(mWifiNative).startDppEnrolleeInitiator(eq(TEST_INTERFACE_NAME),
eq(TEST_PEER_ID), anyInt());
mDppManager.startDppAsEnrolleeInitiator(1, mBinder, mUri, mDppCallbackConcurrent);
verify(mDppCallbackConcurrent).onFailure(EASY_CONNECT_EVENT_FAILURE_BUSY);
verify(mDppCallbackConcurrent, never()).onSuccess(anyInt());
verify(mDppCallbackConcurrent, never()).onSuccessConfigReceived(anyInt());
verify(mDppMetrics, times(2)).updateDppEnrolleeInitiatorRequests();
verify(mDppMetrics).updateDppFailure(EASY_CONNECT_EVENT_FAILURE_BUSY);
verifyNoMoreInteractions(mDppMetrics);
}
@Test
public void testStartDppAsConfiguratorInitiatorStartOnSuccessCallback() throws Exception {
// Generate a mock WifiConfiguration object
WifiConfiguration selectedNetwork = new WifiConfiguration();
selectedNetwork.SSID = TEST_SSID;
selectedNetwork.networkId = 1;
selectedNetwork.preSharedKey = TEST_PASSWORD;
selectedNetwork.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.SAE);
when(mWifiConfigManager.getConfiguredNetworkWithoutMasking(anyInt())).thenReturn(
selectedNetwork);
ArgumentCaptor<WifiNative.DppEventCallback> dppEventCallbackCaptor =
ArgumentCaptor.forClass(
WifiNative.DppEventCallback.class);
mDppManager.startDppAsConfiguratorInitiator(0, mBinder, mUri, 1,
EASY_CONNECT_NETWORK_ROLE_STA, mDppCallback);
verify(mWifiNative).registerDppEventCallback(dppEventCallbackCaptor.capture());
verify(mDppCallback, never()).onFailure(anyInt());
verify(mDppCallback, never()).onSuccess(anyInt());
verify(mDppCallback, never()).onSuccessConfigReceived(anyInt());
verify(mWifiNative).startDppConfiguratorInitiator(eq(TEST_INTERFACE_NAME),
eq(TEST_PEER_ID), anyInt(), eq(TEST_SSID_ENCODED), eq(TEST_PASSWORD_ENCODED), any(),
eq(EASY_CONNECT_NETWORK_ROLE_STA), eq(
SAE));
WifiNative.DppEventCallback dppEventCallback = dppEventCallbackCaptor.getValue();
// Generate a progress event
dppEventCallback.onProgress(AUTHENTICATION_SUCCESS);
mLooper.dispatchAll();
verify(mDppCallback).onProgress(EASY_CONNECT_EVENT_PROGRESS_AUTHENTICATION_SUCCESS);
// Generate an onSuccess callback
dppEventCallback.onSuccessConfigSent();
mLooper.dispatchAll();
verify(mDppCallback).onSuccess(EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_SENT);
verify(mDppCallback, never()).onSuccessConfigReceived(anyInt());
verify(mDppCallback, never()).onFailure(anyInt());
verify(mDppMetrics).updateDppConfiguratorInitiatorRequests();
verify(mDppMetrics).updateDppConfiguratorSuccess(EasyConnectStatusCallback
.EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_SENT);
verify(mDppMetrics).updateDppOperationTime(anyInt());
verifyNoMoreInteractions(mDppMetrics);
}
@Test
public void testStartDppAsEnrolleeInitiatorStartCorrectlyOnSuccessCallback() throws Exception {
ArgumentCaptor<WifiNative.DppEventCallback> dppEventCallbackCaptor =
ArgumentCaptor.forClass(
WifiNative.DppEventCallback.class);
mDppManager.startDppAsEnrolleeInitiator(0, mBinder, mUri, mDppCallback);
verify(mWifiNative).registerDppEventCallback(dppEventCallbackCaptor.capture());
verify(mDppCallback, never()).onFailure(anyInt());
verify(mDppCallback, never()).onSuccess(anyInt());
verify(mDppCallback, never()).onSuccessConfigReceived(anyInt());
verify(mWifiNative).startDppEnrolleeInitiator(eq(TEST_INTERFACE_NAME),
eq(TEST_PEER_ID), anyInt());
// Generate an onSuccessConfigReceived callback
WifiNative.DppEventCallback dppEventCallback = dppEventCallbackCaptor.getValue();
// Generate a mock WifiConfiguration object
WifiConfiguration selectedNetwork = new WifiConfiguration();
selectedNetwork.SSID = TEST_SSID;
selectedNetwork.networkId = TEST_NETWORK_ID;
selectedNetwork.preSharedKey = TEST_PASSWORD;
selectedNetwork.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.SAE);
// Generate a progress event
dppEventCallback.onProgress(AUTHENTICATION_SUCCESS);
mLooper.dispatchAll();
verify(mDppCallback).onProgress(EASY_CONNECT_EVENT_PROGRESS_AUTHENTICATION_SUCCESS);
// Generate result
NetworkUpdateResult networkUpdateResult = new NetworkUpdateResult(TEST_NETWORK_ID);
when(mWifiConfigManager.addOrUpdateNetwork(any(WifiConfiguration.class),
anyInt())).thenReturn(networkUpdateResult);
dppEventCallback.onSuccessConfigReceived(selectedNetwork);
mLooper.dispatchAll();
verify(mDppCallback).onSuccessConfigReceived(TEST_NETWORK_ID);
verify(mDppCallback, never()).onSuccess(anyInt());
verify(mDppCallback, never()).onFailure(anyInt());
verify(mDppMetrics).updateDppEnrolleeInitiatorRequests();
verify(mDppMetrics).updateDppEnrolleeSuccess();
verify(mDppMetrics).updateDppOperationTime(anyInt());
verifyNoMoreInteractions(mDppMetrics);
verifyCleanUpResources();
}
@Test
public void testStartDppAsConfiguratorInitiatorStartOnFailureCallback() throws Exception {
// Generate a mock WifiConfiguration object
WifiConfiguration selectedNetwork = new WifiConfiguration();
selectedNetwork.SSID = TEST_SSID;
selectedNetwork.networkId = TEST_NETWORK_ID;
selectedNetwork.preSharedKey = TEST_PASSWORD;
selectedNetwork.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.SAE);
when(mWifiConfigManager.getConfiguredNetworkWithoutMasking(anyInt())).thenReturn(
selectedNetwork);
ArgumentCaptor<WifiNative.DppEventCallback> dppEventCallbackCaptor =
ArgumentCaptor.forClass(
WifiNative.DppEventCallback.class);
mDppManager.startDppAsConfiguratorInitiator(0, mBinder, mUri, 1,
EASY_CONNECT_NETWORK_ROLE_STA,
mDppCallback);
verify(mWifiNative).registerDppEventCallback(dppEventCallbackCaptor.capture());
verify(mDppCallback, never()).onFailure(anyInt());
verify(mDppCallback, never()).onSuccess(anyInt());
verify(mDppCallback, never()).onSuccessConfigReceived(anyInt());
verify(mWifiNative).startDppConfiguratorInitiator(eq(TEST_INTERFACE_NAME),
eq(TEST_PEER_ID), anyInt(), eq(TEST_SSID_ENCODED), eq(TEST_PASSWORD_ENCODED), any(),
eq(EASY_CONNECT_NETWORK_ROLE_STA), eq(
SAE));
WifiNative.DppEventCallback dppEventCallback = dppEventCallbackCaptor.getValue();
// Generate a progress event
dppEventCallback.onProgress(RESPONSE_PENDING);
mLooper.dispatchAll();
verify(mDppCallback).onProgress(EASY_CONNECT_EVENT_PROGRESS_RESPONSE_PENDING);
// Generate an onFailure callback
dppEventCallback.onFailure(AUTHENTICATION);
mLooper.dispatchAll();
verify(mDppCallback).onFailure(EASY_CONNECT_EVENT_FAILURE_AUTHENTICATION);
verify(mDppCallback, never()).onSuccess(anyInt());
verify(mDppCallback, never()).onSuccessConfigReceived(anyInt());
verify(mDppMetrics).updateDppConfiguratorInitiatorRequests();
verify(mDppMetrics).updateDppFailure(EasyConnectStatusCallback
.EASY_CONNECT_EVENT_FAILURE_AUTHENTICATION);
verify(mDppMetrics).updateDppOperationTime(anyInt());
verifyNoMoreInteractions(mDppMetrics);
verifyCleanUpResources();
}
@Test
public void testStartDppAsEnrolleeInitiatorStartCorrectlyOnFailureCallback() throws Exception {
// Add Peer URI successful, return peer ID 1
when(mWifiNative.addDppPeerUri(anyString(), anyString()))
.thenReturn(1);
when(mWifiNative.removeDppUri(anyString(), anyInt()))
.thenReturn(true);
// Return test interface name
when(mWifiNative.getClientInterfaceName()).thenReturn(TEST_INTERFACE_NAME);
// Successful start
when(mWifiNative.startDppEnrolleeInitiator(anyString(), anyInt(), anyInt())).thenReturn(
true);
ArgumentCaptor<WifiNative.DppEventCallback> dppEventCallbackCaptor =
ArgumentCaptor.forClass(
WifiNative.DppEventCallback.class);
mDppManager.startDppAsEnrolleeInitiator(0, mBinder, mUri, mDppCallback);
verify(mWifiNative).registerDppEventCallback(dppEventCallbackCaptor.capture());
verify(mDppCallback, never()).onFailure(anyInt());
verify(mDppCallback, never()).onSuccess(anyInt());
verify(mDppCallback, never()).onSuccessConfigReceived(anyInt());
verify(mWifiNative).startDppEnrolleeInitiator(eq(TEST_INTERFACE_NAME),
eq(TEST_PEER_ID), anyInt());
WifiNative.DppEventCallback dppEventCallback = dppEventCallbackCaptor.getValue();
// Generate a progress event
dppEventCallback.onProgress(RESPONSE_PENDING);
mLooper.dispatchAll();
verify(mDppCallback).onProgress(EASY_CONNECT_EVENT_PROGRESS_RESPONSE_PENDING);
// Generate an onFailure callback
dppEventCallback.onFailure(AUTHENTICATION);
mLooper.dispatchAll();
verify(mDppCallback).onFailure(EASY_CONNECT_EVENT_FAILURE_AUTHENTICATION);
verify(mDppCallback, never()).onSuccess(anyInt());
verify(mDppCallback, never()).onSuccessConfigReceived(anyInt());
verify(mDppMetrics).updateDppEnrolleeInitiatorRequests();
verify(mDppMetrics).updateDppFailure(EasyConnectStatusCallback
.EASY_CONNECT_EVENT_FAILURE_AUTHENTICATION);
verify(mDppMetrics).updateDppOperationTime(anyInt());
verifyNoMoreInteractions(mDppMetrics);
verifyCleanUpResources();
}
@Test
public void testDppStopSessionNotStarted() throws Exception {
// Check that nothing happens if no DPP session started.
mDppManager.stopDppSession(0);
// Check that nothing is removed or canceled
mDppManager.stopDppSession(0);
verify(mWifiNative, never()).removeDppUri(eq(TEST_INTERFACE_NAME), anyInt());
verify(mWakeupMessage, never()).cancel();
}
@Test
public void testDppStopSessionIncorrectUid() throws Exception {
// Check that nothing happens if UID is incorrect
// Add Peer URI successful, return peer ID 1
when(mWifiNative.addDppPeerUri(anyString(), anyString()))
.thenReturn(1);
when(mWifiNative.removeDppUri(anyString(), anyInt()))
.thenReturn(true);
// Return test interface name
when(mWifiNative.getClientInterfaceName()).thenReturn(TEST_INTERFACE_NAME);
// Successful start
when(mWifiNative.startDppEnrolleeInitiator(anyString(), anyInt(), anyInt())).thenReturn(
true);
ArgumentCaptor<WifiNative.DppEventCallback> dppEventCallbackCaptor =
ArgumentCaptor.forClass(
WifiNative.DppEventCallback.class);
// Start with UID 10
mDppManager.startDppAsEnrolleeInitiator(10, mBinder, mUri, mDppCallback);
verify(mWifiNative).registerDppEventCallback(dppEventCallbackCaptor.capture());
verify(mDppCallback, never()).onFailure(anyInt());
verify(mDppCallback, never()).onSuccess(anyInt());
verify(mDppCallback, never()).onSuccessConfigReceived(anyInt());
verify(mWifiNative).startDppEnrolleeInitiator(eq(TEST_INTERFACE_NAME),
eq(TEST_PEER_ID), anyInt());
// Check that nothing is removed or canceled
mDppManager.stopDppSession(0);
verify(mWifiNative, never()).removeDppUri(eq(TEST_INTERFACE_NAME), anyInt());
verify(mWakeupMessage, never()).cancel();
}
@Test
public void testDppStopSession() throws Exception {
// Check that nothing happens if UID is incorrect
// Add Peer URI successful, return peer ID 1
when(mWifiNative.addDppPeerUri(anyString(), anyString()))
.thenReturn(1);
when(mWifiNative.removeDppUri(anyString(), anyInt()))
.thenReturn(true);
// Return test interface name
when(mWifiNative.getClientInterfaceName()).thenReturn(TEST_INTERFACE_NAME);
// Successful start
when(mWifiNative.startDppEnrolleeInitiator(anyString(), anyInt(), anyInt())).thenReturn(
true);
ArgumentCaptor<WifiNative.DppEventCallback> dppEventCallbackCaptor =
ArgumentCaptor.forClass(
WifiNative.DppEventCallback.class);
// Start with UID 10
mDppManager.startDppAsEnrolleeInitiator(10, mBinder, mUri, mDppCallback);
verify(mWifiNative).registerDppEventCallback(dppEventCallbackCaptor.capture());
verify(mDppCallback, never()).onFailure(anyInt());
verify(mDppCallback, never()).onSuccess(anyInt());
verify(mDppCallback, never()).onSuccessConfigReceived(anyInt());
verify(mWifiNative).startDppEnrolleeInitiator(eq(TEST_INTERFACE_NAME),
eq(TEST_PEER_ID), anyInt());
// Check that WifiNative is called to stop the DPP session
mDppManager.stopDppSession(10);
verify(mWifiNative).stopDppInitiator(TEST_INTERFACE_NAME);
verifyCleanUpResources();
}
private void verifyCleanUpResources() {
verify(mWifiNative).removeDppUri(eq(TEST_INTERFACE_NAME), anyInt());
verify(mWakeupMessage).cancel();
}
@Test
public void testOnFailureCallbackNotCompatible() throws Exception {
testOnFailureCallback(NOT_COMPATIBLE, EASY_CONNECT_EVENT_FAILURE_NOT_COMPATIBLE);
}
@Test
public void testOnFailureCallbackConfiguration() throws Exception {
testOnFailureCallback(CONFIGURATION, EASY_CONNECT_EVENT_FAILURE_CONFIGURATION);
}
@Test
public void testOnFailureCallbackTimeout() throws Exception {
testOnFailureCallback(TIMEOUT, EASY_CONNECT_EVENT_FAILURE_TIMEOUT);
}
@Test
public void testOnFailureCallbackNotSupported() throws Exception {
testOnFailureCallback(NOT_SUPPORTED, EASY_CONNECT_EVENT_FAILURE_NOT_SUPPORTED);
}
@Test
public void testOnFailureCallbackBusy() throws Exception {
testOnFailureCallback(BUSY, EASY_CONNECT_EVENT_FAILURE_BUSY);
}
@Test
public void testOnFailureCallbackFailure() throws Exception {
testOnFailureCallback(FAILURE, EASY_CONNECT_EVENT_FAILURE_GENERIC);
}
private void testOnFailureCallback(int internalFailure, int appFailure) throws Exception {
// Generate a mock WifiConfiguration object
WifiConfiguration selectedNetwork = new WifiConfiguration();
selectedNetwork.SSID = TEST_SSID;
selectedNetwork.networkId = TEST_NETWORK_ID;
selectedNetwork.preSharedKey = TEST_PASSWORD;
selectedNetwork.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.SAE);
when(mWifiConfigManager.getConfiguredNetworkWithoutMasking(anyInt())).thenReturn(
selectedNetwork);
ArgumentCaptor<WifiNative.DppEventCallback> dppEventCallbackCaptor =
ArgumentCaptor.forClass(
WifiNative.DppEventCallback.class);
mDppManager.startDppAsConfiguratorInitiator(0, mBinder, mUri, 1,
EASY_CONNECT_NETWORK_ROLE_STA,
mDppCallback);
verify(mWifiNative).registerDppEventCallback(dppEventCallbackCaptor.capture());
verify(mDppCallback, never()).onFailure(anyInt());
verify(mDppCallback, never()).onSuccess(anyInt());
verify(mDppCallback, never()).onSuccessConfigReceived(anyInt());
verify(mWifiNative).startDppConfiguratorInitiator(eq(TEST_INTERFACE_NAME),
eq(TEST_PEER_ID), anyInt(), eq(TEST_SSID_ENCODED), eq(TEST_PASSWORD_ENCODED), any(),
eq(EASY_CONNECT_NETWORK_ROLE_STA), eq(
SAE));
WifiNative.DppEventCallback dppEventCallback = dppEventCallbackCaptor.getValue();
// Generate an onFailure callback
dppEventCallback.onFailure(internalFailure);
mLooper.dispatchAll();
verify(mDppCallback).onFailure(eq(appFailure));
verify(mDppCallback, never()).onSuccess(anyInt());
verify(mDppCallback, never()).onSuccessConfigReceived(anyInt());
verify(mDppMetrics).updateDppConfiguratorInitiatorRequests();
verify(mDppMetrics).updateDppFailure(eq(appFailure));
verify(mDppMetrics).updateDppOperationTime(anyInt());
verifyNoMoreInteractions(mDppMetrics);
verifyCleanUpResources();
}
}