From 6be9a8a97fe8d6451ff277220034f6615a1dbc81 Mon Sep 17 00:00:00 2001 From: Jimmy Chen Date: Wed, 10 Jun 2020 16:37:08 +0800 Subject: p2p: trigger tethering flow before entering GroupStartedState Tethering service introduces random IP range for all downstream interfaces which means that P2P needs to wait for tethering completion before moving to next state. This also resolves timing issue which tethering service is sometimes slower and leads to no group owner IP in p2p connection changed event. Bug: 157923814 Bug: 157974505 Bug: 158633529 Test: CtsVerifier - Wi-Fi Direct Change-Id: I458266ba1197c9b976e3a1252e58945398590fbf --- .../server/wifi/p2p/WifiP2pServiceImplTest.java | 78 +++++++++++++++++++++- 1 file changed, 76 insertions(+), 2 deletions(-) (limited to 'tests') diff --git a/tests/wifitests/src/com/android/server/wifi/p2p/WifiP2pServiceImplTest.java b/tests/wifitests/src/com/android/server/wifi/p2p/WifiP2pServiceImplTest.java index 4aa2a2e42..cae812d58 100644 --- a/tests/wifitests/src/com/android/server/wifi/p2p/WifiP2pServiceImplTest.java +++ b/tests/wifitests/src/com/android/server/wifi/p2p/WifiP2pServiceImplTest.java @@ -16,6 +16,7 @@ package com.android.server.wifi.p2p; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession; import static com.android.server.wifi.WifiSettingsConfigStore.WIFI_P2P_DEVICE_NAME; import static com.android.server.wifi.WifiSettingsConfigStore.WIFI_P2P_PENDING_FACTORY_RESET; import static com.android.server.wifi.WifiSettingsConfigStore.WIFI_VERBOSE_LOGGING_ENABLED; @@ -35,6 +36,7 @@ import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.spy; @@ -53,6 +55,7 @@ import android.content.res.Resources; import android.location.LocationManager; import android.net.ConnectivityManager; import android.net.NetworkInfo; +import android.net.TetheringManager; import android.net.wifi.WifiManager; import android.net.wifi.WpsInfo; import android.net.wifi.p2p.WifiP2pConfig; @@ -89,14 +92,22 @@ import com.android.server.wifi.util.WifiPermissionsUtil; import com.android.server.wifi.util.WifiPermissionsWrapper; import com.android.wifi.resources.R; +import libcore.net.InetAddressUtils; + +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.mockito.MockitoSession; import org.mockito.Spy; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; /** @@ -106,6 +117,7 @@ import java.util.List; public class WifiP2pServiceImplTest extends WifiBaseTest { private static final String TAG = "WifiP2pServiceImplTest"; private static final String IFACE_NAME_P2P = "mockP2p0"; + private static final String P2P_GO_IP = "192.168.49.1"; private static final long STATE_CHANGE_WAITING_TIME = 1000; private static final String thisDeviceMac = "11:22:33:44:55:66"; private static final String thisDeviceName = "thisDeviceName"; @@ -121,6 +133,7 @@ public class WifiP2pServiceImplTest extends WifiBaseTest { private BroadcastReceiver mLocationModeReceiver; private BroadcastReceiver mWifiStateChangedReceiver; + private BroadcastReceiver mTetherStateReceiver; private Handler mClientHandler; private Messenger mP2pStateMachineMessenger; private Messenger mClientMessenger; @@ -135,6 +148,7 @@ public class WifiP2pServiceImplTest extends WifiBaseTest { private WifiP2pGroupList mGroups = new WifiP2pGroupList(null, null); private WifiP2pDevice mTestThisDevice; private ArgumentCaptor mMessageCaptor = ArgumentCaptor.forClass(Message.class); + private MockitoSession mStaticMockSession = null; @Mock Context mContext; @Mock FrameworkFacade mFrameworkFacade; @@ -142,6 +156,7 @@ public class WifiP2pServiceImplTest extends WifiBaseTest { @Mock NetdWrapper mNetdWrapper; @Mock PackageManager mPackageManager; @Mock Resources mResources; + @Mock NetworkInterface mP2pNetworkInterface; @Mock WifiInjector mWifiInjector; @Mock WifiManager mMockWifiManager; @Mock WifiPermissionsUtil mWifiPermissionsUtil; @@ -178,6 +193,7 @@ public class WifiP2pServiceImplTest extends WifiBaseTest { mTestWifiP2pNewPersistentGoGroup.setNetworkName("DIRECT-xy-NEW"); mTestWifiP2pNewPersistentGoGroup.setOwner(new WifiP2pDevice(thisDeviceMac)); mTestWifiP2pNewPersistentGoGroup.setIsGroupOwner(true); + mTestWifiP2pNewPersistentGoGroup.setInterface(IFACE_NAME_P2P); mGroups.clear(); WifiP2pGroup group1 = new WifiP2pGroup(); @@ -235,6 +251,26 @@ public class WifiP2pServiceImplTest extends WifiBaseTest { mWifiStateChangedReceiver.onReceive(mContext, intent); } + /** + * Simulate tethering flow is completed + */ + private void simulateTetherReady() { + ArrayList availableList = new ArrayList<>(); + ArrayList localOnlyList = new ArrayList<>(); + localOnlyList.add(IFACE_NAME_P2P); + ArrayList tetherList = new ArrayList<>(); + ArrayList erroredList = new ArrayList<>(); + + Intent intent = new Intent(TetheringManager.ACTION_TETHER_STATE_CHANGED); + intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); + intent.putStringArrayListExtra(TetheringManager.EXTRA_AVAILABLE_TETHER, availableList); + intent.putStringArrayListExtra(TetheringManager.EXTRA_ACTIVE_LOCAL_ONLY, localOnlyList); + intent.putStringArrayListExtra(TetheringManager.EXTRA_ACTIVE_TETHER, tetherList); + intent.putStringArrayListExtra(TetheringManager.EXTRA_ERRORED_TETHER, erroredList); + mTetherStateReceiver.onReceive(mContext, intent); + mLooper.dispatchAll(); + } + /** * Mock send WifiP2pManager.UPDATE_CHANNEL_INFO * @@ -699,7 +735,7 @@ public class WifiP2pServiceImplTest extends WifiBaseTest { * * @param supported defines the p2p is supported or not in this instance. */ - private void setUpWifiP2pServiceImpl(boolean supported) { + private void setUpWifiP2pServiceImpl(boolean supported) throws Exception { reset(mContext, mFrameworkFacade, mHandlerThread, mPackageManager, mResources, mWifiInjector, mWifiNative); @@ -757,10 +793,15 @@ public class WifiP2pServiceImplTest extends WifiBaseTest { mWifiP2pServiceImpl = new WifiP2pServiceImpl(mContext, mWifiInjector); if (supported) { - verify(mContext, times(2)).registerReceiver(mBcastRxCaptor.capture(), + // register these event: + // * WifiManager.WIFI_STATE_CHANGED_ACTION + // * LocationManager.MODE_CHANGED_ACTION + // * TetheringManager.ACTION_TETHER_STATE_CHANGED + verify(mContext, times(3)).registerReceiver(mBcastRxCaptor.capture(), any(IntentFilter.class)); mWifiStateChangedReceiver = mBcastRxCaptor.getAllValues().get(0); mLocationModeReceiver = mBcastRxCaptor.getAllValues().get(1); + mTetherStateReceiver = mBcastRxCaptor.getAllValues().get(2); verify(mWifiNative).registerInterfaceAvailableListener( mAvailListenerCaptor.capture(), any(Handler.class)); mAvailListenerCaptor.getValue().onAvailabilityChanged(true); @@ -775,6 +816,17 @@ public class WifiP2pServiceImplTest extends WifiBaseTest { @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); + + mStaticMockSession = mockitoSession() + .mockStatic(NetworkInterface.class) + .startMocking(); + lenient().when(NetworkInterface.getByName(eq(IFACE_NAME_P2P))) + .thenReturn(mP2pNetworkInterface); + ArrayList p2pInetAddresses = new ArrayList<>(); + p2pInetAddresses.add(InetAddressUtils.parseNumericAddress(P2P_GO_IP)); + when(mP2pNetworkInterface.getInetAddresses()) + .thenReturn(Collections.enumeration(p2pInetAddresses)); + setUpWifiP2pServiceImpl(true); mClient1 = new Binder(); mClient2 = new Binder(); @@ -782,6 +834,11 @@ public class WifiP2pServiceImplTest extends WifiBaseTest { when(mContext.createContextAsUser(any(), anyInt())).thenReturn(mContext); } + @After + public void cleanUp() throws Exception { + mStaticMockSession.finishMocking(); + } + /** * Mock enter Disabled state. */ @@ -1467,6 +1524,7 @@ public class WifiP2pServiceImplTest extends WifiBaseTest { public void testRequestGroupInfoFailureWhenNoChannelUpdated() throws Exception { forceP2pEnabled(mClient1); sendGroupStartedMsg(mTestWifiP2pGroup); + simulateTetherReady(); sendRequestGroupInfoMsg(mClientMessenger); verify(mClientHandler).sendMessage(mMessageCaptor.capture()); assertEquals(WifiP2pManager.RESPONSE_GROUP_INFO, mMessageCaptor.getValue().what); @@ -1481,6 +1539,7 @@ public class WifiP2pServiceImplTest extends WifiBaseTest { public void testRequestGroupInfoFailureWhenChannelUpdateWrongPkgName() throws Exception { forceP2pEnabled(mClient1); sendGroupStartedMsg(mTestWifiP2pGroup); + simulateTetherReady(); doThrow(new SecurityException("P2p unit test")) .when(mWifiPermissionsUtil).checkPackage(anyInt(), anyString()); sendChannelInfoUpdateMsg("testPkg1", "testFeature", mClient1, mClientMessenger); @@ -1498,6 +1557,7 @@ public class WifiP2pServiceImplTest extends WifiBaseTest { public void testRequestGroupInfoFailureWhenPermissionDenied() throws Exception { forceP2pEnabled(mClient1); sendGroupStartedMsg(mTestWifiP2pGroup); + simulateTetherReady(); doNothing().when(mWifiPermissionsUtil).checkPackage(anyInt(), anyString()); when(mWifiPermissionsUtil.checkCanAccessWifiDirect(anyString(), anyString(), anyInt(), anyBoolean())).thenReturn(false); @@ -1519,6 +1579,7 @@ public class WifiP2pServiceImplTest extends WifiBaseTest { mTestWifiP2pGroup.setOwner(mTestThisDevice); forceP2pEnabled(mClient1); sendGroupStartedMsg(mTestWifiP2pGroup); + simulateTetherReady(); when(mWifiPermissionsUtil.checkLocalMacAddressPermission(anyInt())).thenReturn(false); when(mWifiPermissionsUtil.checkCanAccessWifiDirect(anyString(), anyString(), anyInt(), anyBoolean())).thenReturn(true); @@ -1543,6 +1604,7 @@ public class WifiP2pServiceImplTest extends WifiBaseTest { mTestWifiP2pGroup.setOwner(mTestThisDevice); forceP2pEnabled(mClient1); sendGroupStartedMsg(mTestWifiP2pGroup); + simulateTetherReady(); when(mWifiPermissionsUtil.checkLocalMacAddressPermission(anyInt())).thenReturn(true); when(mWifiPermissionsUtil.checkCanAccessWifiDirect(anyString(), anyString(), anyInt(), anyBoolean())).thenReturn(true); @@ -1803,6 +1865,7 @@ public class WifiP2pServiceImplTest extends WifiBaseTest { assertEquals(3, groupsCaptor.getValue().getGroupList().size()); sendGroupStartedMsg(mTestWifiP2pNewPersistentGoGroup); + simulateTetherReady(); verify(mWifiP2pMetrics, times(2)).updatePersistentGroup(groupsCaptor.capture()); // the captured object is the same object, just get the latest one is ok. @@ -1839,6 +1902,7 @@ public class WifiP2pServiceImplTest extends WifiBaseTest { sendChannelInfoUpdateMsg("testPkg1", "testFeature", mClient1, mClientMessenger); sendGroupStartedMsg(mTestWifiP2pNewPersistentGoGroup); + simulateTetherReady(); ArgumentCaptor groupCaptor = ArgumentCaptor.forClass(WifiP2pGroup.class); @@ -2041,7 +2105,9 @@ public class WifiP2pServiceImplTest extends WifiBaseTest { group.setNetworkName("DIRECT-xy-NEW"); group.setOwner(new WifiP2pDevice("thisDeviceMac")); group.setIsGroupOwner(true); + group.setInterface(IFACE_NAME_P2P); sendGroupStartedMsg(group); + simulateTetherReady(); verify(mWifiP2pMetrics).endConnectionEvent( eq(P2pConnectionEvent.CLF_NONE)); } @@ -2353,6 +2419,7 @@ public class WifiP2pServiceImplTest extends WifiBaseTest { group.setIsGroupOwner(true); group.setInterface(IFACE_NAME_P2P); sendGroupStartedMsg(group); + simulateTetherReady(); when(mWifiNative.p2pGroupRemove(eq(IFACE_NAME_P2P))).thenReturn(true); sendSimpleMsg(mClientMessenger, WifiP2pManager.REMOVE_GROUP); @@ -2376,6 +2443,7 @@ public class WifiP2pServiceImplTest extends WifiBaseTest { group.setIsGroupOwner(true); group.setInterface(IFACE_NAME_P2P); sendGroupStartedMsg(group); + simulateTetherReady(); when(mWifiNative.p2pGroupRemove(eq(IFACE_NAME_P2P))).thenReturn(false); sendSimpleMsg(mClientMessenger, WifiP2pManager.REMOVE_GROUP); @@ -2529,6 +2597,7 @@ public class WifiP2pServiceImplTest extends WifiBaseTest { group.setIsGroupOwner(true); group.setInterface(IFACE_NAME_P2P); sendGroupStartedMsg(group); + simulateTetherReady(); when(mWifiNative.startWpsPbc(anyString(), any())).thenReturn(true); WpsInfo wps = new WpsInfo(); @@ -2562,6 +2631,7 @@ public class WifiP2pServiceImplTest extends WifiBaseTest { group.setIsGroupOwner(true); group.setInterface(IFACE_NAME_P2P); sendGroupStartedMsg(group); + simulateTetherReady(); when(mWifiNative.startWpsPinKeypad(anyString(), anyString())).thenReturn(true); WpsInfo wps = new WpsInfo(); @@ -2588,6 +2658,7 @@ public class WifiP2pServiceImplTest extends WifiBaseTest { group.setIsGroupOwner(true); group.setInterface(IFACE_NAME_P2P); sendGroupStartedMsg(group); + simulateTetherReady(); WpsInfo wps = null; sendStartWpsMsg(mClientMessenger, wps); @@ -2611,6 +2682,7 @@ public class WifiP2pServiceImplTest extends WifiBaseTest { group.setIsGroupOwner(true); group.setInterface(IFACE_NAME_P2P); sendGroupStartedMsg(group); + simulateTetherReady(); when(mWifiNative.startWpsPbc(anyString(), any())).thenReturn(false); WpsInfo wps = new WpsInfo(); wps.setup = WpsInfo.PBC; @@ -2636,6 +2708,7 @@ public class WifiP2pServiceImplTest extends WifiBaseTest { group.setIsGroupOwner(true); group.setInterface(IFACE_NAME_P2P); sendGroupStartedMsg(group); + simulateTetherReady(); when(mWifiNative.startWpsPinDisplay(anyString(), any())).thenReturn("abcd"); WpsInfo wps = new WpsInfo(); @@ -2662,6 +2735,7 @@ public class WifiP2pServiceImplTest extends WifiBaseTest { group.setIsGroupOwner(true); group.setInterface(IFACE_NAME_P2P); sendGroupStartedMsg(group); + simulateTetherReady(); when(mWifiNative.startWpsPinKeypad(anyString(), anyString())).thenReturn(false); WpsInfo wps = new WpsInfo(); -- cgit v1.2.3