/* * 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 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 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 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 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 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 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 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(); } }