| /* |
| * 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_3.DppFailureCode.AUTHENTICATION; |
| import static android.hardware.wifi.supplicant.V1_3.DppFailureCode.BUSY; |
| import static android.hardware.wifi.supplicant.V1_3.DppFailureCode.CANNOT_FIND_NETWORK; |
| import static android.hardware.wifi.supplicant.V1_3.DppFailureCode.CONFIGURATION; |
| import static android.hardware.wifi.supplicant.V1_3.DppFailureCode.CONFIGURATION_REJECTED; |
| import static android.hardware.wifi.supplicant.V1_3.DppFailureCode.ENROLLEE_AUTHENTICATION; |
| import static android.hardware.wifi.supplicant.V1_3.DppFailureCode.FAILURE; |
| import static android.hardware.wifi.supplicant.V1_3.DppFailureCode.NOT_COMPATIBLE; |
| import static android.hardware.wifi.supplicant.V1_3.DppFailureCode.NOT_SUPPORTED; |
| import static android.hardware.wifi.supplicant.V1_3.DppFailureCode.TIMEOUT; |
| import static android.hardware.wifi.supplicant.V1_3.DppProgressCode.AUTHENTICATION_SUCCESS; |
| import static android.hardware.wifi.supplicant.V1_3.DppProgressCode.CONFIGURATION_ACCEPTED; |
| import static android.hardware.wifi.supplicant.V1_3.DppProgressCode.CONFIGURATION_SENT_WAITING_RESPONSE; |
| import static android.hardware.wifi.supplicant.V1_3.DppProgressCode.RESPONSE_PENDING; |
| import static android.hardware.wifi.supplicant.V1_3.DppSuccessCode.CONFIGURATION_APPLIED; |
| import static android.hardware.wifi.supplicant.V1_3.DppSuccessCode.CONFIGURATION_SENT; |
| 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_FAILED_TO_SCAN_NETWORK_CHANNEL; |
| 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_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_CONFIGURATION_ACCEPTED; |
| import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_PROGRESS_CONFIGURATION_SENT_WAITING_RESPONSE; |
| import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_PROGRESS_RESPONSE_PENDING; |
| 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 android.net.wifi.WifiManager.EASY_CONNECT_CRYPTOGRAPHY_CURVE_PRIME256V1; |
| import static android.net.wifi.WifiManager.EASY_CONNECT_NETWORK_ROLE_STA; |
| |
| import static org.junit.Assert.assertFalse; |
| import static org.junit.Assert.assertTrue; |
| import static org.junit.Assume.assumeFalse; |
| import static org.junit.Assume.assumeTrue; |
| 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.ScanResult; |
| import android.net.wifi.WifiConfiguration; |
| import android.net.wifi.WifiSsid; |
| import android.os.Build; |
| import android.os.Handler; |
| import android.os.IBinder; |
| import android.os.test.TestLooper; |
| import android.test.suitebuilder.annotation.SmallTest; |
| |
| import com.android.internal.util.WakeupMessage; |
| import com.android.modules.utils.build.SdkLevel; |
| import com.android.server.wifi.util.WifiPermissionsUtil; |
| |
| import org.junit.Before; |
| import org.junit.Test; |
| import org.mockito.ArgumentCaptor; |
| import org.mockito.Mock; |
| import org.mockito.MockitoAnnotations; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| /** |
| * Unit tests for {@link DppManager}. |
| */ |
| @SmallTest |
| public class DppManagerTest extends WifiBaseTest { |
| 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 int TEST_BOOTSTRAP_ID = 1; |
| private static final int TEST_LISTEN_CHANNEL = 6; |
| private static final String TEST_SSID = "\"Test_SSID\""; |
| private static final String TEST_SSID_NO_QUOTE = TEST_SSID.replace("\"", ""); |
| 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; |
| private static final String TEST_BSSID = "01:02:03:04:05:06"; |
| private static final String TEST_PACKAGE_NAME = "TestPackage"; |
| |
| 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; |
| @Mock |
| ScanRequestProxy mScanRequestProxy; |
| @Mock |
| WifiPermissionsUtil mWifiPermissionsUtil; |
| |
| String mUri = |
| "DPP:C:81/1;I:DPP_TESTER;K:MDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDIgADebGHMJoCcE7OZP/aek5muaJo" |
| + "zGy2FVKPRjA/I/qyC8Q=;;"; |
| String mDeviceInfo = "DPP_TESTER"; |
| |
| @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); |
| |
| // 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); |
| |
| // Successfully generate the bootstrap QR code. |
| WifiNative.DppBootstrapQrCodeInfo mBootStrapInfo = |
| new WifiNative.DppBootstrapQrCodeInfo(); |
| mBootStrapInfo.bootstrapId = TEST_BOOTSTRAP_ID; |
| mBootStrapInfo.listenChannel = TEST_LISTEN_CHANNEL; |
| mBootStrapInfo.uri = mUri; |
| when(mWifiNative.generateDppBootstrapInfoForResponder( |
| anyString(), anyString(), anyInt())).thenReturn(mBootStrapInfo); |
| |
| // Successfully start enrollee responder |
| when(mWifiNative.startDppEnrolleeResponder(anyString(), anyInt())).thenReturn(true); |
| } |
| |
| private DppManager createDppManager() { |
| DppManager dppManger = new DppManager(new Handler(mLooper.getLooper()), mWifiNative, |
| mWifiConfigManager, mContext, mDppMetrics, mScanRequestProxy, mWifiPermissionsUtil); |
| 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); |
| |
| assertFalse(mDppManager.isSessionInProgress()); |
| mDppManager.startDppAsConfiguratorInitiator(0, TEST_PACKAGE_NAME, TEST_INTERFACE_NAME, |
| mBinder, mUri, 1, EASY_CONNECT_NETWORK_ROLE_STA, mDppCallback); |
| verify(mDppCallback).onFailure( |
| eq(EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_INVALID_NETWORK), eq(null), |
| eq(null), eq(new int[0])); |
| verify(mDppCallback, never()).onSuccess(anyInt()); |
| verify(mDppCallback, never()).onSuccessConfigReceived(anyInt()); |
| verify(mDppMetrics).updateDppConfiguratorInitiatorRequests(); |
| verify(mDppMetrics).updateDppFailure(eq(EasyConnectStatusCallback |
| .EASY_CONNECT_EVENT_FAILURE_INVALID_NETWORK)); |
| verifyNoMoreInteractions(mDppMetrics); |
| assertFalse(mDppManager.isSessionInProgress()); |
| } |
| |
| @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.setSecurityParams(WifiConfiguration.SECURITY_TYPE_PSK); |
| |
| when(mWifiConfigManager.getConfiguredNetworkWithoutMasking(anyInt())).thenReturn( |
| selectedNetwork); |
| |
| // Fail to add Peer URI |
| when(mWifiNative.addDppPeerUri(anyString(), anyString())).thenReturn(-1); |
| |
| assertFalse(mDppManager.isSessionInProgress()); |
| mDppManager.startDppAsConfiguratorInitiator(0, TEST_PACKAGE_NAME, TEST_INTERFACE_NAME, |
| mBinder, mUri, 1, EASY_CONNECT_NETWORK_ROLE_STA, mDppCallback); |
| verify(mDppCallback).onFailure( |
| eq(EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_INVALID_URI), eq(null), |
| eq(null), eq(new int[0])); |
| verify(mDppCallback, never()).onSuccess(anyInt()); |
| verify(mDppCallback, never()).onSuccessConfigReceived(anyInt()); |
| verify(mDppMetrics).updateDppConfiguratorInitiatorRequests(); |
| verify(mDppMetrics).updateDppFailure(eq(EasyConnectStatusCallback |
| .EASY_CONNECT_EVENT_FAILURE_INVALID_URI)); |
| verify(mDppMetrics).updateDppOperationTime(anyInt()); |
| verifyNoMoreInteractions(mDppMetrics); |
| assertFalse(mDppManager.isSessionInProgress()); |
| } |
| |
| @Test |
| public void testStartDppAsEnrolleeInitiatorFailAddPeer() throws Exception { |
| // Fail to add Peer URI |
| when(mWifiNative.addDppPeerUri(anyString(), anyString())).thenReturn(-1); |
| |
| assertFalse(mDppManager.isSessionInProgress()); |
| mDppManager.startDppAsEnrolleeInitiator(0, TEST_INTERFACE_NAME, mBinder, mUri, |
| mDppCallback); |
| verify(mDppCallback).onFailure( |
| eq(EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_INVALID_URI), eq(null), |
| eq(null), eq(new int[0])); |
| verify(mDppCallback, never()).onSuccess(anyInt()); |
| verify(mDppCallback, never()).onSuccessConfigReceived(anyInt()); |
| verify(mDppMetrics).updateDppEnrolleeInitiatorRequests(); |
| verify(mDppMetrics).updateDppFailure(eq(EasyConnectStatusCallback |
| .EASY_CONNECT_EVENT_FAILURE_INVALID_URI)); |
| verify(mDppMetrics).updateDppOperationTime(anyInt()); |
| verifyNoMoreInteractions(mDppMetrics); |
| assertFalse(mDppManager.isSessionInProgress()); |
| } |
| |
| @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.setSecurityParams(WifiConfiguration.SECURITY_TYPE_PSK); |
| |
| when(mWifiConfigManager.getConfiguredNetworkWithoutMasking(anyInt())).thenReturn( |
| selectedNetwork); |
| |
| assertFalse(mDppManager.isSessionInProgress()); |
| // Fail to start |
| when(mWifiNative.startDppConfiguratorInitiator(anyString(), anyInt(), anyInt(), anyString(), |
| any(), any(), anyInt(), anyInt())).thenReturn(false); |
| |
| mDppManager.startDppAsConfiguratorInitiator(0, TEST_PACKAGE_NAME, TEST_INTERFACE_NAME, |
| mBinder, mUri, 1, EASY_CONNECT_NETWORK_ROLE_STA, mDppCallback); |
| verify(mDppCallback).onFailure(eq(EASY_CONNECT_EVENT_FAILURE_GENERIC), eq(null), |
| eq(null), eq(new int[0])); |
| verify(mDppCallback, never()).onSuccess(anyInt()); |
| verify(mDppCallback, never()).onSuccessConfigReceived(anyInt()); |
| verify(mDppMetrics).updateDppConfiguratorInitiatorRequests(); |
| verify(mDppMetrics).updateDppFailure(eq(EASY_CONNECT_EVENT_FAILURE_GENERIC)); |
| verify(mDppMetrics).updateDppOperationTime(anyInt()); |
| verifyNoMoreInteractions(mDppMetrics); |
| assertFalse(mDppManager.isSessionInProgress()); |
| } |
| |
| @Test |
| public void testStartDppAsEnrolleeInitiatorFailStart() throws Exception { |
| // Fail to start |
| when(mWifiNative.startDppEnrolleeInitiator(anyString(), anyInt(), anyInt())).thenReturn( |
| false); |
| |
| assertFalse(mDppManager.isSessionInProgress()); |
| mDppManager.startDppAsEnrolleeInitiator(0, TEST_INTERFACE_NAME, mBinder, mUri, |
| mDppCallback); |
| verify(mDppCallback).onFailure(eq(EASY_CONNECT_EVENT_FAILURE_GENERIC), eq(null), |
| eq(null), eq(new int[0])); |
| verify(mDppCallback, never()).onSuccess(anyInt()); |
| verify(mDppCallback, never()).onSuccessConfigReceived(anyInt()); |
| verify(mDppMetrics).updateDppEnrolleeInitiatorRequests(); |
| verify(mDppMetrics).updateDppFailure(eq(EASY_CONNECT_EVENT_FAILURE_GENERIC)); |
| verify(mDppMetrics).updateDppOperationTime(anyInt()); |
| verifyNoMoreInteractions(mDppMetrics); |
| assertFalse(mDppManager.isSessionInProgress()); |
| } |
| |
| @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.setSecurityParams(WifiConfiguration.SECURITY_TYPE_PSK); |
| selectedNetwork.addSecurityParams(WifiConfiguration.SECURITY_TYPE_SAE); |
| |
| when(mWifiConfigManager.getConfiguredNetworkWithoutMasking(anyInt())).thenReturn( |
| selectedNetwork); |
| |
| assertFalse(mDppManager.isSessionInProgress()); |
| mDppManager.startDppAsConfiguratorInitiator(0, TEST_PACKAGE_NAME, TEST_INTERFACE_NAME, |
| mBinder, mUri, 1, EASY_CONNECT_NETWORK_ROLE_STA, mDppCallback); |
| verify(mDppCallback, never()).onFailure(anyInt(), anyString(), anyString(), any()); |
| 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); |
| assertTrue(mDppManager.isSessionInProgress()); |
| } |
| |
| @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.setSecurityParams(WifiConfiguration.SECURITY_TYPE_SAE); |
| |
| when(mWifiConfigManager.getConfiguredNetworkWithoutMasking(anyInt())).thenReturn( |
| selectedNetwork); |
| |
| assertFalse(mDppManager.isSessionInProgress()); |
| mDppManager.startDppAsConfiguratorInitiator(0, TEST_PACKAGE_NAME, TEST_INTERFACE_NAME, |
| mBinder, mUri, 1, EASY_CONNECT_NETWORK_ROLE_STA, mDppCallback); |
| verify(mDppCallback, never()).onFailure(anyInt(), anyString(), anyString(), any()); |
| 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); |
| assertTrue(mDppManager.isSessionInProgress()); |
| } |
| |
| @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.setSecurityParams(WifiConfiguration.SECURITY_TYPE_OPEN); |
| |
| when(mWifiConfigManager.getConfiguredNetworkWithoutMasking(anyInt())).thenReturn( |
| selectedNetwork); |
| |
| assertFalse(mDppManager.isSessionInProgress()); |
| mDppManager.startDppAsConfiguratorInitiator(0, TEST_PACKAGE_NAME, TEST_INTERFACE_NAME, |
| mBinder, mUri, 1, EASY_CONNECT_NETWORK_ROLE_STA, mDppCallback); |
| verify(mDppCallback).onFailure(eq(EASY_CONNECT_EVENT_FAILURE_INVALID_NETWORK), eq(null), |
| eq(null), eq(new int[0])); |
| verify(mDppCallback, never()).onSuccess(anyInt()); |
| verify(mDppCallback, never()).onSuccessConfigReceived(anyInt()); |
| verify(mDppMetrics).updateDppConfiguratorInitiatorRequests(); |
| verify(mDppMetrics).updateDppFailure(eq(EasyConnectStatusCallback |
| .EASY_CONNECT_EVENT_FAILURE_INVALID_NETWORK)); |
| verifyNoMoreInteractions(mDppMetrics); |
| assertFalse(mDppManager.isSessionInProgress()); |
| } |
| |
| @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.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP); |
| |
| when(mWifiConfigManager.getConfiguredNetworkWithoutMasking(anyInt())).thenReturn( |
| selectedNetwork); |
| |
| assertFalse(mDppManager.isSessionInProgress()); |
| mDppManager.startDppAsConfiguratorInitiator(0, TEST_PACKAGE_NAME, TEST_INTERFACE_NAME, |
| mBinder, mUri, 1, EASY_CONNECT_NETWORK_ROLE_STA, mDppCallback); |
| verify(mDppCallback).onFailure(eq(EASY_CONNECT_EVENT_FAILURE_INVALID_NETWORK), eq(null), |
| eq(null), eq(new int[0])); |
| verify(mDppCallback, never()).onSuccess(anyInt()); |
| verify(mDppCallback, never()).onSuccessConfigReceived(anyInt()); |
| verify(mDppMetrics).updateDppConfiguratorInitiatorRequests(); |
| verify(mDppMetrics).updateDppFailure(eq(EasyConnectStatusCallback |
| .EASY_CONNECT_EVENT_FAILURE_INVALID_NETWORK)); |
| verifyNoMoreInteractions(mDppMetrics); |
| assertFalse(mDppManager.isSessionInProgress()); |
| } |
| |
| @Test |
| public void testStartDppAsEnrolleeInitiatorStartCorrectly() throws Exception { |
| assertFalse(mDppManager.isSessionInProgress()); |
| mDppManager.startDppAsEnrolleeInitiator(0, TEST_INTERFACE_NAME, mBinder, mUri, |
| mDppCallback); |
| verify(mDppCallback, never()).onFailure(anyInt(), anyString(), anyString(), any()); |
| 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); |
| assertTrue(mDppManager.isSessionInProgress()); |
| } |
| |
| @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.setSecurityParams(WifiConfiguration.SECURITY_TYPE_SAE); |
| |
| when(mWifiConfigManager.getConfiguredNetworkWithoutMasking(anyInt())).thenReturn( |
| selectedNetwork); |
| |
| assertFalse(mDppManager.isSessionInProgress()); |
| mDppManager.startDppAsConfiguratorInitiator(0, TEST_PACKAGE_NAME, TEST_INTERFACE_NAME, |
| mBinder, mUri, 1, EASY_CONNECT_NETWORK_ROLE_STA, mDppCallback); |
| verify(mDppCallback, never()).onFailure(anyInt(), anyString(), anyString(), any()); |
| 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)); |
| assertTrue(mDppManager.isSessionInProgress()); |
| |
| mDppManager.startDppAsConfiguratorInitiator(1, TEST_PACKAGE_NAME, TEST_INTERFACE_NAME, |
| mBinder, mUri, 1, EASY_CONNECT_NETWORK_ROLE_STA, mDppCallbackConcurrent); |
| verify(mDppCallbackConcurrent).onFailure(eq(EASY_CONNECT_EVENT_FAILURE_BUSY), eq(null), |
| eq(null), eq(new int[0])); |
| verify(mDppCallbackConcurrent, never()).onSuccess(anyInt()); |
| verify(mDppCallbackConcurrent, never()).onSuccessConfigReceived(anyInt()); |
| verify(mDppMetrics, times(2)).updateDppConfiguratorInitiatorRequests(); |
| verify(mDppMetrics).updateDppFailure(eq(EASY_CONNECT_EVENT_FAILURE_BUSY)); |
| verifyNoMoreInteractions(mDppMetrics); |
| assertTrue(mDppManager.isSessionInProgress()); |
| } |
| |
| @Test |
| public void testStartDppAsEnrolleeInitiatorStartCorrectlyAndRejectConcurrentRequest() |
| throws Exception { |
| assertFalse(mDppManager.isSessionInProgress()); |
| mDppManager.startDppAsEnrolleeInitiator(0, TEST_INTERFACE_NAME, mBinder, mUri, |
| mDppCallback); |
| verify(mDppCallback, never()).onFailure(anyInt(), anyString(), anyString(), any()); |
| verify(mDppCallback, never()).onSuccess(anyInt()); |
| verify(mDppCallback, never()).onSuccessConfigReceived(anyInt()); |
| verify(mWifiNative).startDppEnrolleeInitiator(eq(TEST_INTERFACE_NAME), |
| eq(TEST_PEER_ID), anyInt()); |
| assertTrue(mDppManager.isSessionInProgress()); |
| |
| mDppManager.startDppAsEnrolleeInitiator(1, TEST_INTERFACE_NAME, mBinder, mUri, |
| mDppCallbackConcurrent); |
| verify(mDppCallbackConcurrent).onFailure(eq(EASY_CONNECT_EVENT_FAILURE_BUSY), eq(null), |
| eq(null), eq(new int[0])); |
| verify(mDppCallbackConcurrent, never()).onSuccess(anyInt()); |
| verify(mDppCallbackConcurrent, never()).onSuccessConfigReceived(anyInt()); |
| verify(mDppMetrics, times(2)).updateDppEnrolleeInitiatorRequests(); |
| verify(mDppMetrics).updateDppFailure(eq(EASY_CONNECT_EVENT_FAILURE_BUSY)); |
| verifyNoMoreInteractions(mDppMetrics); |
| assertTrue(mDppManager.isSessionInProgress()); |
| } |
| |
| @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.setSecurityParams(WifiConfiguration.SECURITY_TYPE_SAE); |
| |
| when(mWifiConfigManager.getConfiguredNetworkWithoutMasking(anyInt())).thenReturn( |
| selectedNetwork); |
| |
| ArgumentCaptor<WifiNative.DppEventCallback> dppEventCallbackCaptor = |
| ArgumentCaptor.forClass( |
| WifiNative.DppEventCallback.class); |
| |
| assertFalse(mDppManager.isSessionInProgress()); |
| mDppManager.startDppAsConfiguratorInitiator(0, TEST_PACKAGE_NAME, TEST_INTERFACE_NAME, |
| mBinder, mUri, 1, EASY_CONNECT_NETWORK_ROLE_STA, mDppCallback); |
| verify(mWifiNative).registerDppEventCallback(dppEventCallbackCaptor.capture()); |
| verify(mDppCallback, never()).onFailure(anyInt(), anyString(), anyString(), any()); |
| 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)); |
| assertTrue(mDppManager.isSessionInProgress()); |
| |
| WifiNative.DppEventCallback dppEventCallback = dppEventCallbackCaptor.getValue(); |
| |
| // Generate a progress event |
| dppEventCallback.onProgress(AUTHENTICATION_SUCCESS); |
| mLooper.dispatchAll(); |
| verify(mDppCallback).onProgress(eq(EASY_CONNECT_EVENT_PROGRESS_AUTHENTICATION_SUCCESS)); |
| |
| // Generate an onSuccess callback |
| dppEventCallback.onSuccess(CONFIGURATION_SENT); |
| mLooper.dispatchAll(); |
| verify(mDppCallback).onSuccess(eq(EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_SENT)); |
| verify(mDppMetrics, times(1)).updateDppR1CapableEnrolleeResponderDevices(); |
| verify(mDppCallback, never()).onSuccessConfigReceived(anyInt()); |
| verify(mDppCallback, never()).onFailure(anyInt(), anyString(), anyString(), any()); |
| verify(mDppMetrics).updateDppConfiguratorInitiatorRequests(); |
| verify(mDppMetrics).updateDppConfiguratorSuccess(eq(EasyConnectStatusCallback |
| .EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_SENT)); |
| verify(mDppMetrics).updateDppOperationTime(anyInt()); |
| verifyNoMoreInteractions(mDppMetrics); |
| assertFalse(mDppManager.isSessionInProgress()); |
| } |
| |
| @Test |
| public void testStartDppAsEnrolleeInitiatorStartCorrectlyOnSuccessCallback() throws Exception { |
| ArgumentCaptor<WifiNative.DppEventCallback> dppEventCallbackCaptor = |
| ArgumentCaptor.forClass( |
| WifiNative.DppEventCallback.class); |
| |
| assertFalse(mDppManager.isSessionInProgress()); |
| mDppManager.startDppAsEnrolleeInitiator(0, TEST_INTERFACE_NAME, mBinder, mUri, |
| mDppCallback); |
| verify(mWifiNative).registerDppEventCallback(dppEventCallbackCaptor.capture()); |
| verify(mDppCallback, never()).onFailure(anyInt(), anyString(), anyString(), any()); |
| verify(mDppCallback, never()).onSuccess(anyInt()); |
| verify(mDppCallback, never()).onSuccessConfigReceived(anyInt()); |
| verify(mWifiNative).startDppEnrolleeInitiator(eq(TEST_INTERFACE_NAME), |
| eq(TEST_PEER_ID), anyInt()); |
| assertTrue(mDppManager.isSessionInProgress()); |
| |
| // 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.setSecurityParams(WifiConfiguration.SECURITY_TYPE_SAE); |
| |
| // Generate a progress event |
| dppEventCallback.onProgress(AUTHENTICATION_SUCCESS); |
| mLooper.dispatchAll(); |
| verify(mDppCallback).onProgress(eq(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( |
| eq(WifiConfigurationUtil.addSecurityTypeToNetworkId( |
| TEST_NETWORK_ID, WifiConfiguration.SECURITY_TYPE_SAE))); |
| verify(mDppCallback, never()).onSuccess(anyInt()); |
| verify(mDppCallback, never()).onFailure(anyInt(), anyString(), anyString(), any()); |
| verify(mDppMetrics).updateDppEnrolleeInitiatorRequests(); |
| verify(mDppMetrics).updateDppEnrolleeSuccess(); |
| verify(mDppMetrics).updateDppOperationTime(anyInt()); |
| verifyNoMoreInteractions(mDppMetrics); |
| verifyCleanUpResources(DppManager.DPP_AUTH_ROLE_INITIATOR); |
| assertFalse(mDppManager.isSessionInProgress()); |
| } |
| |
| @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.setSecurityParams(WifiConfiguration.SECURITY_TYPE_SAE); |
| |
| when(mWifiConfigManager.getConfiguredNetworkWithoutMasking(anyInt())).thenReturn( |
| selectedNetwork); |
| ArgumentCaptor<WifiNative.DppEventCallback> dppEventCallbackCaptor = |
| ArgumentCaptor.forClass( |
| WifiNative.DppEventCallback.class); |
| |
| assertFalse(mDppManager.isSessionInProgress()); |
| mDppManager.startDppAsConfiguratorInitiator(0, TEST_PACKAGE_NAME, TEST_INTERFACE_NAME, |
| mBinder, mUri, 1, EASY_CONNECT_NETWORK_ROLE_STA, mDppCallback); |
| verify(mWifiNative).registerDppEventCallback(dppEventCallbackCaptor.capture()); |
| verify(mDppCallback, never()).onFailure(anyInt(), anyString(), anyString(), any()); |
| 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)); |
| assertTrue(mDppManager.isSessionInProgress()); |
| |
| WifiNative.DppEventCallback dppEventCallback = dppEventCallbackCaptor.getValue(); |
| |
| // Generate a progress event |
| dppEventCallback.onProgress(RESPONSE_PENDING); |
| mLooper.dispatchAll(); |
| verify(mDppCallback).onProgress(eq(EASY_CONNECT_EVENT_PROGRESS_RESPONSE_PENDING)); |
| |
| // Generate an onFailure callback |
| dppEventCallback.onFailure(AUTHENTICATION, null, null, null); |
| mLooper.dispatchAll(); |
| verify(mDppCallback).onFailure(eq(EASY_CONNECT_EVENT_FAILURE_AUTHENTICATION), eq(null), |
| eq(null), eq(new int[0])); |
| verify(mDppCallback, never()).onSuccess(anyInt()); |
| verify(mDppCallback, never()).onSuccessConfigReceived(anyInt()); |
| verify(mDppMetrics).updateDppConfiguratorInitiatorRequests(); |
| verify(mDppMetrics).updateDppFailure(eq(EasyConnectStatusCallback |
| .EASY_CONNECT_EVENT_FAILURE_AUTHENTICATION)); |
| verify(mDppMetrics).updateDppOperationTime(anyInt()); |
| verifyNoMoreInteractions(mDppMetrics); |
| verifyCleanUpResources(DppManager.DPP_AUTH_ROLE_INITIATOR); |
| assertFalse(mDppManager.isSessionInProgress()); |
| } |
| |
| @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); |
| |
| // Successful start |
| when(mWifiNative.startDppEnrolleeInitiator(anyString(), anyInt(), anyInt())).thenReturn( |
| true); |
| |
| ArgumentCaptor<WifiNative.DppEventCallback> dppEventCallbackCaptor = |
| ArgumentCaptor.forClass( |
| WifiNative.DppEventCallback.class); |
| |
| assertFalse(mDppManager.isSessionInProgress()); |
| mDppManager.startDppAsEnrolleeInitiator(0, TEST_INTERFACE_NAME, mBinder, mUri, |
| mDppCallback); |
| verify(mWifiNative).registerDppEventCallback(dppEventCallbackCaptor.capture()); |
| verify(mDppCallback, never()).onFailure(anyInt(), anyString(), anyString(), any()); |
| verify(mDppCallback, never()).onSuccess(anyInt()); |
| verify(mDppCallback, never()).onSuccessConfigReceived(anyInt()); |
| verify(mWifiNative).startDppEnrolleeInitiator(eq(TEST_INTERFACE_NAME), |
| eq(TEST_PEER_ID), anyInt()); |
| assertTrue(mDppManager.isSessionInProgress()); |
| |
| WifiNative.DppEventCallback dppEventCallback = dppEventCallbackCaptor.getValue(); |
| |
| // Generate a progress event |
| dppEventCallback.onProgress(RESPONSE_PENDING); |
| mLooper.dispatchAll(); |
| verify(mDppCallback).onProgress(eq(EASY_CONNECT_EVENT_PROGRESS_RESPONSE_PENDING)); |
| |
| // Generate an onFailure callback |
| dppEventCallback.onFailure(AUTHENTICATION, null, null, null); |
| mLooper.dispatchAll(); |
| verify(mDppCallback).onFailure(eq(EASY_CONNECT_EVENT_FAILURE_AUTHENTICATION), eq(null), |
| eq(null), eq(new int[0])); |
| verify(mDppCallback, never()).onSuccess(anyInt()); |
| verify(mDppCallback, never()).onSuccessConfigReceived(anyInt()); |
| verify(mDppMetrics).updateDppEnrolleeInitiatorRequests(); |
| verify(mDppMetrics).updateDppFailure(eq(EasyConnectStatusCallback |
| .EASY_CONNECT_EVENT_FAILURE_AUTHENTICATION)); |
| verify(mDppMetrics).updateDppOperationTime(anyInt()); |
| verifyNoMoreInteractions(mDppMetrics); |
| verifyCleanUpResources(DppManager.DPP_AUTH_ROLE_INITIATOR); |
| assertFalse(mDppManager.isSessionInProgress()); |
| } |
| |
| @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); |
| |
| // Successful start |
| when(mWifiNative.startDppEnrolleeInitiator(anyString(), anyInt(), anyInt())).thenReturn( |
| true); |
| |
| ArgumentCaptor<WifiNative.DppEventCallback> dppEventCallbackCaptor = |
| ArgumentCaptor.forClass( |
| WifiNative.DppEventCallback.class); |
| |
| assertFalse(mDppManager.isSessionInProgress()); |
| // Start with UID 10 |
| mDppManager.startDppAsEnrolleeInitiator(10, TEST_INTERFACE_NAME, mBinder, mUri, |
| mDppCallback); |
| verify(mWifiNative).registerDppEventCallback(dppEventCallbackCaptor.capture()); |
| verify(mDppCallback, never()).onFailure(anyInt(), anyString(), anyString(), any()); |
| verify(mDppCallback, never()).onSuccess(anyInt()); |
| verify(mDppCallback, never()).onSuccessConfigReceived(anyInt()); |
| verify(mWifiNative).startDppEnrolleeInitiator(eq(TEST_INTERFACE_NAME), |
| eq(TEST_PEER_ID), anyInt()); |
| assertTrue(mDppManager.isSessionInProgress()); |
| |
| // Check that nothing is removed or canceled |
| mDppManager.stopDppSession(0); |
| verify(mWifiNative, never()).removeDppUri(eq(TEST_INTERFACE_NAME), anyInt()); |
| verify(mWakeupMessage, never()).cancel(); |
| assertTrue(mDppManager.isSessionInProgress()); |
| } |
| |
| @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); |
| |
| // Successful start |
| when(mWifiNative.startDppEnrolleeInitiator(anyString(), anyInt(), anyInt())).thenReturn( |
| true); |
| |
| ArgumentCaptor<WifiNative.DppEventCallback> dppEventCallbackCaptor = |
| ArgumentCaptor.forClass( |
| WifiNative.DppEventCallback.class); |
| |
| assertFalse(mDppManager.isSessionInProgress()); |
| // Start with UID 10 |
| mDppManager.startDppAsEnrolleeInitiator(10, TEST_INTERFACE_NAME, mBinder, mUri, |
| mDppCallback); |
| verify(mWifiNative).registerDppEventCallback(dppEventCallbackCaptor.capture()); |
| verify(mDppCallback, never()).onFailure(anyInt(), anyString(), anyString(), any()); |
| verify(mDppCallback, never()).onSuccess(anyInt()); |
| verify(mDppCallback, never()).onSuccessConfigReceived(anyInt()); |
| verify(mWifiNative).startDppEnrolleeInitiator(eq(TEST_INTERFACE_NAME), |
| eq(TEST_PEER_ID), anyInt()); |
| assertTrue(mDppManager.isSessionInProgress()); |
| |
| // Check that WifiNative is called to stop the DPP session |
| mDppManager.stopDppSession(10); |
| verify(mWifiNative).stopDppInitiator(eq(TEST_INTERFACE_NAME)); |
| verifyCleanUpResources(DppManager.DPP_AUTH_ROLE_INITIATOR); |
| assertFalse(mDppManager.isSessionInProgress()); |
| } |
| |
| private void verifyCleanUpResources(int authRole) { |
| if (authRole == DppManager.DPP_AUTH_ROLE_INITIATOR) { |
| 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); |
| } |
| |
| /** |
| * Helper function for setting up a scan result. |
| * |
| * @param frequency Network's operating channel in Mhz. |
| * |
| */ |
| private void addTestNetworkInScanResult(int frequency) { |
| String caps = "[WPA2-FT/SAE+SAE][ESS][WPS]"; |
| ScanResult scanResult = new ScanResult(WifiSsid.createFromAsciiEncoded(TEST_SSID_NO_QUOTE), |
| TEST_SSID_NO_QUOTE, TEST_BSSID, 1245, 0, caps, -78, frequency, |
| 1025, 22, 33, 20, 0, 0, true); |
| List<ScanResult> scanResults = new ArrayList<>(); |
| scanResults.add(scanResult); |
| when(mScanRequestProxy.getScanResults()).thenReturn(scanResults); |
| } |
| |
| @Test |
| public void testOnFailureCallbackCannotFindNetworkNoErrCodeChangeOnChannelMatch() |
| throws Exception { |
| int[] bandList = new int[]{81, 83, 84, 115}; |
| addTestNetworkInScanResult(2437); //channel number 6 |
| // Include Network channel(6) in Enrollee scanned channels. |
| testOnFailureCallback(CANNOT_FIND_NETWORK, TEST_SSID_NO_QUOTE, |
| "81/1,2,3,4,5,6,7,8,9,10,11,115/48", |
| bandList, EASY_CONNECT_EVENT_FAILURE_CANNOT_FIND_NETWORK); |
| } |
| |
| @Test |
| public void testOnFailureCallbackCannotFindNetworkErrCodeIsUpdatedOnChannelMismatch() |
| throws Exception { |
| assumeTrue(SdkLevel.isAtLeastS()); |
| when(mWifiPermissionsUtil.isTargetSdkLessThan(anyString(), eq(Build.VERSION_CODES.S), |
| anyInt())).thenReturn(false); |
| int[] bandList = new int[]{81, 83, 84, 115}; |
| addTestNetworkInScanResult(5180); //channel number 36 |
| // Don't include Network channel(36) in Enrollee scanned channels. |
| testOnFailureCallback(CANNOT_FIND_NETWORK, TEST_SSID_NO_QUOTE, |
| "81/1,2,3,4,5,6,7,8,9,10,11,115/48", |
| bandList, EASY_CONNECT_EVENT_FAILURE_ENROLLEE_FAILED_TO_SCAN_NETWORK_CHANNEL); |
| } |
| |
| @Test |
| public void testCannotFindNetworkErrCodeIsUpdatedToNotCompatibleOnSdkLevelLessThanS() |
| throws Exception { |
| assumeFalse(SdkLevel.isAtLeastS()); |
| int[] bandList = new int[]{81, 83, 84, 115}; |
| addTestNetworkInScanResult(5180); //channel number 36 |
| // Don't include Network channel(36) in Enrollee scanned channels. |
| testOnFailureCallback(CANNOT_FIND_NETWORK, TEST_SSID_NO_QUOTE, |
| "81/1,2,3,4,5,6,7,8,9,10,11,115/48", |
| bandList, EASY_CONNECT_EVENT_FAILURE_NOT_COMPATIBLE); |
| } |
| |
| @Test |
| public void testCannotFindNetworkErrCodeIsUpdatedToNotCompatibleOnTargetSdkLessThanS() |
| throws Exception { |
| assumeTrue(SdkLevel.isAtLeastS()); |
| when(mWifiPermissionsUtil.isTargetSdkLessThan(anyString(), eq(Build.VERSION_CODES.S), |
| anyInt())).thenReturn(true); |
| int[] bandList = new int[]{81, 83, 84, 115}; |
| addTestNetworkInScanResult(5180); //channel number 36 |
| // Don't include Network channel(36) in Enrollee scanned channels. |
| testOnFailureCallback(CANNOT_FIND_NETWORK, TEST_SSID_NO_QUOTE, |
| "81/1,2,3,4,5,6,7,8,9,10,11,115/48", |
| bandList, EASY_CONNECT_EVENT_FAILURE_NOT_COMPATIBLE); |
| } |
| |
| @Test |
| public void testOnFailureCallbackCannotFindNetworkNoErrCodeChangeOnInvalidScannedChannelList() |
| throws Exception { |
| int[] bandList = new int[]{81, 83, 84}; |
| addTestNetworkInScanResult(5180); //channel number 36 |
| // Send Invalid operating class/channel list |
| testOnFailureCallback(CANNOT_FIND_NETWORK, TEST_SSID_NO_QUOTE, |
| "1035/1,2,3,4,5,6,7,8,9,10,11,25/45", |
| bandList, EASY_CONNECT_EVENT_FAILURE_CANNOT_FIND_NETWORK); |
| } |
| |
| @Test |
| public void testOnFailureCallbackCannotFindNetwork() throws Exception { |
| int[] bandList = new int[]{1, 6, 11}; |
| testOnFailureCallback(CANNOT_FIND_NETWORK, TEST_SSID_NO_QUOTE, "1, 3, 6, 8, 11", |
| bandList, EASY_CONNECT_EVENT_FAILURE_CANNOT_FIND_NETWORK); |
| } |
| |
| @Test |
| public void testOnFailureCallbackConfigurationRejected() throws Exception { |
| testOnFailureCallback(CONFIGURATION_REJECTED, |
| EASY_CONNECT_EVENT_FAILURE_ENROLLEE_REJECTED_CONFIGURATION); |
| } |
| |
| @Test |
| public void testOnFailureCallbackEnrolleeAuthentication() throws Exception { |
| int[] bandList = new int[]{1, 6, 11}; |
| testOnFailureCallback(ENROLLEE_AUTHENTICATION, new String(TEST_SSID_NO_QUOTE), null, |
| bandList, EASY_CONNECT_EVENT_FAILURE_ENROLLEE_AUTHENTICATION); |
| } |
| |
| @Test |
| public void testStartDppAsConfiguratorInitiatorStartOnSuccessCallbackR2() throws Exception { |
| // Generate a mock WifiConfiguration object |
| WifiConfiguration selectedNetwork = new WifiConfiguration(); |
| selectedNetwork.SSID = TEST_SSID; |
| selectedNetwork.networkId = 1; |
| selectedNetwork.preSharedKey = TEST_PASSWORD; |
| selectedNetwork.setSecurityParams(WifiConfiguration.SECURITY_TYPE_SAE); |
| |
| when(mWifiConfigManager.getConfiguredNetworkWithoutMasking(anyInt())).thenReturn( |
| selectedNetwork); |
| |
| ArgumentCaptor<WifiNative.DppEventCallback> dppEventCallbackCaptor = |
| ArgumentCaptor.forClass( |
| WifiNative.DppEventCallback.class); |
| |
| assertFalse(mDppManager.isSessionInProgress()); |
| mDppManager.startDppAsConfiguratorInitiator(0, TEST_PACKAGE_NAME, TEST_INTERFACE_NAME, |
| mBinder, mUri, 1, EASY_CONNECT_NETWORK_ROLE_STA, mDppCallback); |
| verify(mWifiNative).registerDppEventCallback(dppEventCallbackCaptor.capture()); |
| verify(mDppCallback, never()).onFailure(anyInt(), anyString(), anyString(), any()); |
| 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)); |
| assertTrue(mDppManager.isSessionInProgress()); |
| |
| WifiNative.DppEventCallback dppEventCallback = dppEventCallbackCaptor.getValue(); |
| |
| // Generate a progress events |
| dppEventCallback.onProgress(AUTHENTICATION_SUCCESS); |
| mLooper.dispatchAll(); |
| verify(mDppCallback).onProgress(eq(EASY_CONNECT_EVENT_PROGRESS_AUTHENTICATION_SUCCESS)); |
| |
| dppEventCallback.onProgress(CONFIGURATION_ACCEPTED); |
| mLooper.dispatchAll(); |
| verify(mDppCallback).onProgress(eq(EASY_CONNECT_EVENT_PROGRESS_CONFIGURATION_ACCEPTED)); |
| |
| dppEventCallback.onProgress(CONFIGURATION_SENT_WAITING_RESPONSE); |
| mLooper.dispatchAll(); |
| verify(mDppCallback) |
| .onProgress(eq(EASY_CONNECT_EVENT_PROGRESS_CONFIGURATION_SENT_WAITING_RESPONSE)); |
| verify(mDppMetrics, times(1)).updateDppR2CapableEnrolleeResponderDevices(); |
| |
| // Generate an onSuccess callback |
| dppEventCallback.onSuccess(CONFIGURATION_APPLIED); |
| mLooper.dispatchAll(); |
| verify(mDppCallback).onSuccess(eq(EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_APPLIED)); |
| verify(mDppCallback, never()).onSuccessConfigReceived(anyInt()); |
| verify(mDppCallback, never()).onFailure(anyInt(), anyString(), anyString(), any()); |
| verify(mDppMetrics).updateDppConfiguratorInitiatorRequests(); |
| verify(mDppMetrics).updateDppConfiguratorSuccess(eq(EasyConnectStatusCallback |
| .EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_APPLIED)); |
| verify(mDppMetrics).updateDppOperationTime(anyInt()); |
| verifyNoMoreInteractions(mDppMetrics); |
| assertFalse(mDppManager.isSessionInProgress()); |
| } |
| |
| private void testOnFailureCallback(int internalFailure, String ssid, String channelList, |
| int[] bandList, 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.setSecurityParams(WifiConfiguration.SECURITY_TYPE_SAE); |
| |
| when(mWifiConfigManager.getConfiguredNetworkWithoutMasking(anyInt())).thenReturn( |
| selectedNetwork); |
| ArgumentCaptor<WifiNative.DppEventCallback> dppEventCallbackCaptor = |
| ArgumentCaptor.forClass( |
| WifiNative.DppEventCallback.class); |
| |
| assertFalse(mDppManager.isSessionInProgress()); |
| mDppManager.startDppAsConfiguratorInitiator(0, TEST_PACKAGE_NAME, TEST_INTERFACE_NAME, |
| mBinder, mUri, 1, EASY_CONNECT_NETWORK_ROLE_STA, mDppCallback); |
| verify(mWifiNative).registerDppEventCallback(dppEventCallbackCaptor.capture()); |
| verify(mDppCallback, never()).onFailure(anyInt(), anyString(), anyString(), any()); |
| 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)); |
| assertTrue(mDppManager.isSessionInProgress()); |
| |
| WifiNative.DppEventCallback dppEventCallback = dppEventCallbackCaptor.getValue(); |
| |
| // Generate an onFailure callback |
| dppEventCallback.onFailure(internalFailure, ssid, channelList, bandList); |
| mLooper.dispatchAll(); |
| verify(mDppCallback).onFailure(eq(appFailure), eq(ssid), eq(channelList), |
| eq(bandList)); |
| verify(mDppCallback, never()).onSuccess(anyInt()); |
| verify(mDppCallback, never()).onSuccessConfigReceived(anyInt()); |
| verify(mDppMetrics).updateDppConfiguratorInitiatorRequests(); |
| verify(mDppMetrics).updateDppFailure(eq(appFailure)); |
| verify(mDppMetrics).updateDppOperationTime(anyInt()); |
| if ((internalFailure == CANNOT_FIND_NETWORK) |
| && (appFailure == EASY_CONNECT_EVENT_FAILURE_NOT_COMPATIBLE |
| || appFailure |
| == EASY_CONNECT_EVENT_FAILURE_ENROLLEE_FAILED_TO_SCAN_NETWORK_CHANNEL)) { |
| verify(mDppMetrics, times(1)).updateDppR2EnrolleeResponderIncompatibleConfiguration(); |
| } |
| verifyNoMoreInteractions(mDppMetrics); |
| verifyCleanUpResources(DppManager.DPP_AUTH_ROLE_INITIATOR); |
| assertFalse(mDppManager.isSessionInProgress()); |
| } |
| |
| private void testOnFailureCallback(int internalFailure, int appFailure) throws Exception { |
| testOnFailureCallback(internalFailure, null, null, new int[0], appFailure); |
| } |
| |
| @Test |
| public void testStartDppAsEnrolleeResponderFailGenerateQrCode() throws Exception { |
| // Fail to generate QR code |
| assumeTrue(SdkLevel.isAtLeastS()); |
| WifiNative.DppBootstrapQrCodeInfo bootStrapInfo = |
| new WifiNative.DppBootstrapQrCodeInfo(); |
| when(mWifiNative.generateDppBootstrapInfoForResponder( |
| anyString(), anyString(), anyInt())).thenReturn(bootStrapInfo); |
| assertFalse(mDppManager.isSessionInProgress()); |
| mDppManager.startDppAsEnrolleeResponder(0, TEST_INTERFACE_NAME, mBinder, mDeviceInfo, |
| EASY_CONNECT_CRYPTOGRAPHY_CURVE_PRIME256V1, mDppCallback); |
| verify(mDppCallback).onFailure( |
| eq(EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_URI_GENERATION), |
| eq(null), eq(null), eq(new int[0])); |
| verify(mDppCallback, never()).onSuccess(anyInt()); |
| verify(mDppCallback, never()).onSuccessConfigReceived(anyInt()); |
| verify(mDppMetrics).updateDppEnrolleeResponderRequests(); |
| verify(mDppMetrics).updateDppFailure(eq(EasyConnectStatusCallback |
| .EASY_CONNECT_EVENT_FAILURE_URI_GENERATION)); |
| verify(mDppMetrics).updateDppOperationTime(anyInt()); |
| verifyNoMoreInteractions(mDppMetrics); |
| assertFalse(mDppManager.isSessionInProgress()); |
| } |
| |
| @Test |
| public void testStartDppAsEnrolleeResponderFailStart() throws Exception { |
| // Fail to start |
| assumeTrue(SdkLevel.isAtLeastS()); |
| when(mWifiNative.startDppEnrolleeResponder(anyString(), anyInt())).thenReturn(false); |
| |
| assertFalse(mDppManager.isSessionInProgress()); |
| mDppManager.startDppAsEnrolleeResponder(0, TEST_INTERFACE_NAME, mBinder, mDeviceInfo, |
| EASY_CONNECT_CRYPTOGRAPHY_CURVE_PRIME256V1, mDppCallback); |
| verify(mDppCallback).onFailure(eq(EASY_CONNECT_EVENT_FAILURE_GENERIC), eq(null), |
| eq(null), eq(new int[0])); |
| verify(mDppCallback, never()).onSuccess(anyInt()); |
| verify(mDppCallback, never()).onSuccessConfigReceived(anyInt()); |
| verify(mDppMetrics).updateDppEnrolleeResponderRequests(); |
| verify(mDppMetrics).updateDppFailure(eq(EASY_CONNECT_EVENT_FAILURE_GENERIC)); |
| verify(mDppMetrics).updateDppOperationTime(anyInt()); |
| verifyNoMoreInteractions(mDppMetrics); |
| assertFalse(mDppManager.isSessionInProgress()); |
| } |
| |
| @Test |
| public void testStartDppAsEnrolleeResponderStartCorrectly() throws Exception { |
| assumeTrue(SdkLevel.isAtLeastS()); |
| assertFalse(mDppManager.isSessionInProgress()); |
| mDppManager.startDppAsEnrolleeResponder(0, TEST_INTERFACE_NAME, mBinder, mDeviceInfo, |
| EASY_CONNECT_CRYPTOGRAPHY_CURVE_PRIME256V1, mDppCallback); |
| verify(mDppCallback, never()).onFailure(anyInt(), anyString(), anyString(), any()); |
| verify(mDppCallback, never()).onSuccess(anyInt()); |
| verify(mDppCallback, never()).onSuccessConfigReceived(anyInt()); |
| verify(mWifiNative).startDppEnrolleeResponder(eq(TEST_INTERFACE_NAME), |
| eq(TEST_LISTEN_CHANNEL)); |
| verify(mDppMetrics).updateDppEnrolleeResponderRequests(); |
| verifyNoMoreInteractions(mDppMetrics); |
| assertTrue(mDppManager.isSessionInProgress()); |
| } |
| |
| @Test |
| public void testStartDppAsEnrolleeResponderStartCorrectlyAndRejectConcurrentRequest() |
| throws Exception { |
| assumeTrue(SdkLevel.isAtLeastS()); |
| assertFalse(mDppManager.isSessionInProgress()); |
| mDppManager.startDppAsEnrolleeResponder(0, TEST_INTERFACE_NAME, mBinder, mDeviceInfo, |
| EASY_CONNECT_CRYPTOGRAPHY_CURVE_PRIME256V1, mDppCallback); |
| verify(mDppCallback, never()).onFailure(anyInt(), anyString(), anyString(), any()); |
| verify(mDppCallback, never()).onSuccess(anyInt()); |
| verify(mDppCallback, never()).onSuccessConfigReceived(anyInt()); |
| verify(mWifiNative).startDppEnrolleeResponder(eq(TEST_INTERFACE_NAME), |
| eq(TEST_LISTEN_CHANNEL)); |
| assertTrue(mDppManager.isSessionInProgress()); |
| |
| mDppManager.startDppAsEnrolleeResponder(1, TEST_INTERFACE_NAME, mBinder, mDeviceInfo, |
| EASY_CONNECT_CRYPTOGRAPHY_CURVE_PRIME256V1, mDppCallbackConcurrent); |
| verify(mDppCallbackConcurrent).onFailure(eq(EASY_CONNECT_EVENT_FAILURE_BUSY), eq(null), |
| eq(null), eq(new int[0])); |
| verify(mDppCallbackConcurrent, never()).onSuccess(anyInt()); |
| verify(mDppCallbackConcurrent, never()).onSuccessConfigReceived(anyInt()); |
| verify(mDppMetrics, times(2)).updateDppEnrolleeResponderRequests(); |
| verify(mDppMetrics).updateDppFailure(eq(EASY_CONNECT_EVENT_FAILURE_BUSY)); |
| verifyNoMoreInteractions(mDppMetrics); |
| assertTrue(mDppManager.isSessionInProgress()); |
| } |
| |
| @Test |
| public void testStartDppAsEnrolleeResponderStartCorrectlyOnSuccessCallback() throws Exception { |
| assumeTrue(SdkLevel.isAtLeastS()); |
| ArgumentCaptor<WifiNative.DppEventCallback> dppEventCallbackCaptor = |
| ArgumentCaptor.forClass( |
| WifiNative.DppEventCallback.class); |
| |
| assertFalse(mDppManager.isSessionInProgress()); |
| mDppManager.startDppAsEnrolleeResponder(0, TEST_INTERFACE_NAME, mBinder, mDeviceInfo, |
| EASY_CONNECT_CRYPTOGRAPHY_CURVE_PRIME256V1, mDppCallback); |
| verify(mWifiNative).registerDppEventCallback(dppEventCallbackCaptor.capture()); |
| verify(mDppCallback, never()).onFailure(anyInt(), anyString(), anyString(), any()); |
| verify(mDppCallback, never()).onSuccess(anyInt()); |
| verify(mDppCallback, never()).onSuccessConfigReceived(anyInt()); |
| verify(mWifiNative).startDppEnrolleeResponder(eq(TEST_INTERFACE_NAME), |
| eq(TEST_LISTEN_CHANNEL)); |
| assertTrue(mDppManager.isSessionInProgress()); |
| |
| // 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.setSecurityParams(WifiConfiguration.SECURITY_TYPE_SAE); |
| |
| // Generate a progress event |
| dppEventCallback.onProgress(AUTHENTICATION_SUCCESS); |
| mLooper.dispatchAll(); |
| verify(mDppCallback).onProgress(eq(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( |
| eq(WifiConfigurationUtil.addSecurityTypeToNetworkId( |
| TEST_NETWORK_ID, WifiConfiguration.SECURITY_TYPE_SAE))); |
| verify(mDppCallback, never()).onSuccess(anyInt()); |
| verify(mDppCallback, never()).onFailure(anyInt(), anyString(), anyString(), any()); |
| verify(mDppMetrics).updateDppEnrolleeResponderRequests(); |
| verify(mDppMetrics).updateDppEnrolleeSuccess(); |
| verify(mDppMetrics).updateDppEnrolleeResponderSuccess(); |
| verify(mDppMetrics).updateDppOperationTime(anyInt()); |
| verifyNoMoreInteractions(mDppMetrics); |
| verifyCleanUpResources(DppManager.DPP_AUTH_ROLE_RESPONDER); |
| assertFalse(mDppManager.isSessionInProgress()); |
| } |
| |
| @Test |
| public void testStartDppAsEnrolleeResponderStartCorrectlyOnFailureCallback() throws Exception { |
| assumeTrue(SdkLevel.isAtLeastS()); |
| ArgumentCaptor<WifiNative.DppEventCallback> dppEventCallbackCaptor = |
| ArgumentCaptor.forClass( |
| WifiNative.DppEventCallback.class); |
| |
| assertFalse(mDppManager.isSessionInProgress()); |
| mDppManager.startDppAsEnrolleeResponder(0, TEST_INTERFACE_NAME, mBinder, mDeviceInfo, |
| EASY_CONNECT_CRYPTOGRAPHY_CURVE_PRIME256V1, mDppCallback); |
| verify(mWifiNative).registerDppEventCallback(dppEventCallbackCaptor.capture()); |
| verify(mDppCallback, never()).onFailure(anyInt(), anyString(), anyString(), any()); |
| verify(mDppCallback, never()).onSuccess(anyInt()); |
| verify(mDppCallback, never()).onSuccessConfigReceived(anyInt()); |
| verify(mWifiNative).startDppEnrolleeResponder(eq(TEST_INTERFACE_NAME), |
| eq(TEST_LISTEN_CHANNEL)); |
| assertTrue(mDppManager.isSessionInProgress()); |
| |
| WifiNative.DppEventCallback dppEventCallback = dppEventCallbackCaptor.getValue(); |
| |
| // Generate a progress event |
| dppEventCallback.onProgress(RESPONSE_PENDING); |
| mLooper.dispatchAll(); |
| verify(mDppCallback).onProgress(eq(EASY_CONNECT_EVENT_PROGRESS_RESPONSE_PENDING)); |
| |
| // Generate an onFailure callback |
| dppEventCallback.onFailure(AUTHENTICATION, null, null, null); |
| mLooper.dispatchAll(); |
| verify(mDppCallback).onFailure(eq(EASY_CONNECT_EVENT_FAILURE_AUTHENTICATION), |
| eq(null), eq(null), eq(new int[0])); |
| verify(mDppCallback, never()).onSuccess(anyInt()); |
| verify(mDppCallback, never()).onSuccessConfigReceived(anyInt()); |
| verify(mDppMetrics).updateDppEnrolleeResponderRequests(); |
| verify(mDppMetrics).updateDppFailure(eq(EasyConnectStatusCallback |
| .EASY_CONNECT_EVENT_FAILURE_AUTHENTICATION)); |
| verify(mDppMetrics).updateDppOperationTime(anyInt()); |
| verifyNoMoreInteractions(mDppMetrics); |
| verifyCleanUpResources(DppManager.DPP_AUTH_ROLE_RESPONDER); |
| assertFalse(mDppManager.isSessionInProgress()); |
| } |
| |
| @Test |
| public void testDppStopSessionInResponderMode() throws Exception { |
| // Check that nothing happens if UID is incorrect |
| assumeTrue(SdkLevel.isAtLeastS()); |
| ArgumentCaptor<WifiNative.DppEventCallback> dppEventCallbackCaptor = |
| ArgumentCaptor.forClass( |
| WifiNative.DppEventCallback.class); |
| |
| assertFalse(mDppManager.isSessionInProgress()); |
| // Start with UID 10 |
| mDppManager.startDppAsEnrolleeResponder(10, TEST_INTERFACE_NAME, mBinder, mDeviceInfo, |
| EASY_CONNECT_CRYPTOGRAPHY_CURVE_PRIME256V1, mDppCallback); |
| verify(mWifiNative).registerDppEventCallback(dppEventCallbackCaptor.capture()); |
| verify(mDppCallback, never()).onFailure(anyInt(), anyString(), anyString(), any()); |
| verify(mDppCallback, never()).onSuccess(anyInt()); |
| verify(mDppCallback, never()).onSuccessConfigReceived(anyInt()); |
| verify(mWifiNative).startDppEnrolleeResponder(eq(TEST_INTERFACE_NAME), |
| eq(TEST_LISTEN_CHANNEL)); |
| assertTrue(mDppManager.isSessionInProgress()); |
| |
| // Check that WifiNative is called to stop the DPP session |
| mDppManager.stopDppSession(10); |
| verify(mWifiNative).stopDppResponder(eq(TEST_INTERFACE_NAME), eq(TEST_BOOTSTRAP_ID)); |
| verify(mDppMetrics).updateDppEnrolleeResponderRequests(); |
| verifyNoMoreInteractions(mDppMetrics); |
| verifyCleanUpResources(DppManager.DPP_AUTH_ROLE_RESPONDER); |
| assertFalse(mDppManager.isSessionInProgress()); |
| } |
| } |