diff options
-rw-r--r-- | service/Android.bp | 1 | ||||
-rw-r--r-- | service/java/com/android/server/wifi/p2p/WifiP2pServiceImpl.java | 162 | ||||
-rw-r--r-- | tests/wifitests/src/com/android/server/wifi/p2p/WifiP2pServiceImplTest.java | 78 |
3 files changed, 218 insertions, 23 deletions
diff --git a/service/Android.bp b/service/Android.bp index 5becbe21d..71cf728de 100644 --- a/service/Android.bp +++ b/service/Android.bp @@ -63,6 +63,7 @@ java_library { // compile time "framework-wifi-pre-jarjar", "framework-statsd.stubs.module_lib", + "framework-tethering.stubs.module_lib", "unsupportedappusage", ], diff --git a/service/java/com/android/server/wifi/p2p/WifiP2pServiceImpl.java b/service/java/com/android/server/wifi/p2p/WifiP2pServiceImpl.java index b65ac643a..56cdba83d 100644 --- a/service/java/com/android/server/wifi/p2p/WifiP2pServiceImpl.java +++ b/service/java/com/android/server/wifi/p2p/WifiP2pServiceImpl.java @@ -28,6 +28,7 @@ import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.content.res.Resources; @@ -38,6 +39,7 @@ import android.net.InetAddresses; import android.net.LinkProperties; import android.net.NetworkInfo; import android.net.NetworkStack; +import android.net.TetheringManager; import android.net.ip.IIpClient; import android.net.ip.IpClientCallbacks; import android.net.ip.IpClientUtil; @@ -101,10 +103,14 @@ import com.android.wifi.resources.R; import java.io.FileDescriptor; import java.io.PrintWriter; +import java.net.Inet4Address; import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.SocketException; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collection; +import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -221,6 +227,8 @@ public class WifiP2pServiceImpl extends IWifiP2pManager.Stub { private static final int IPC_PROVISIONING_SUCCESS = BASE + 33; private static final int IPC_PROVISIONING_FAILURE = BASE + 34; + private static final int GROUP_OWNER_TETHER_READY = BASE + 35; + public static final int ENABLED = 1; public static final int DISABLED = 0; @@ -264,10 +272,6 @@ public class WifiP2pServiceImpl extends IWifiP2pManager.Stub { // clients(application) channel list private Map<IBinder, Messenger> mClientChannelList = new HashMap<IBinder, Messenger>(); - // Is chosen as a unique address to avoid conflict with - // the ranges defined in Tethering.java - private static final String SERVER_ADDRESS = "192.168.49.1"; - // The empty device address set by wpa_supplicant. private static final String EMPTY_DEVICE_ADDRESS = "00:00:00:00:00:00"; @@ -855,6 +859,22 @@ public class WifiP2pServiceImpl extends IWifiP2pManager.Stub { } } }, new IntentFilter(LocationManager.MODE_CHANGED_ACTION)); + // Register for tethering state + mContext.registerReceiver(new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (mGroup == null) return; + if (!mGroup.isGroupOwner()) return; + if (TextUtils.isEmpty(mGroup.getInterface())) return; + + final ArrayList<String> interfaces = intent.getStringArrayListExtra( + TetheringManager.EXTRA_ACTIVE_LOCAL_ONLY); + + if (interfaces.contains(mGroup.getInterface())) { + sendMessage(GROUP_OWNER_TETHER_READY); + } + } + }, new IntentFilter(TetheringManager.ACTION_TETHER_STATE_CHANGED)); // Register for interface availability from HalDeviceManager mWifiNative.registerInterfaceAvailableListener((boolean isAvailable) -> { mIsHalInterfaceAvailable = isAvailable; @@ -1122,6 +1142,7 @@ public class WifiP2pServiceImpl extends IWifiP2pManager.Stub { case IPC_DHCP_RESULTS: case IPC_PROVISIONING_SUCCESS: case IPC_PROVISIONING_FAILURE: + case GROUP_OWNER_TETHER_READY: case WifiP2pMonitor.P2P_PROV_DISC_FAILURE_EVENT: case SET_MIRACAST_MODE: case WifiP2pManager.START_LISTEN: @@ -2407,27 +2428,46 @@ public class WifiP2pServiceImpl extends IWifiP2pManager.Stub { // {@link com.android.server.connectivity.Tethering} listens to // {@link WifiP2pManager#WIFI_P2P_CONNECTION_CHANGED_ACTION} // events and takes over the DHCP server management automatically. - } else { - mWifiNative.setP2pGroupIdle(mGroup.getInterface(), GROUP_IDLE_TIME_S); - startIpClient(mGroup.getInterface(), getHandler()); - WifiP2pDevice groupOwner = mGroup.getOwner(); - WifiP2pDevice peer = mPeers.get(groupOwner.deviceAddress); - if (peer != null) { - // update group owner details with peer details found at discovery - groupOwner.updateSupplicantDetails(peer); - mPeers.updateStatus(groupOwner.deviceAddress, - WifiP2pDevice.CONNECTED); - sendPeersChangedBroadcast(); + // Because tethering service introduces random IP range, P2P could not + // hard-coded group owner IP and needs to wait for tethering completion. + // As a result, P2P sends a unicast intent to tether service to trigger + // the whole flow before entering GroupCreatedState. + setWifiP2pInfoOnGroupFormation(null); + String tetheringServicePackage = findTetheringServicePackage(); + if (!TextUtils.isEmpty(tetheringServicePackage)) { + sendP2pTetherRequestBroadcast(tetheringServicePackage); } else { - // A supplicant bug can lead to reporting an invalid - // group owner address (all zeroes) at times. Avoid a - // crash, but continue group creation since it is not - // essential. - logw("Unknown group owner " + groupOwner); + loge("No valid tethering service, remove " + mGroup); + mWifiNative.p2pGroupRemove(mGroup.getInterface()); } + break; + } + + mWifiNative.setP2pGroupIdle(mGroup.getInterface(), GROUP_IDLE_TIME_S); + startIpClient(mGroup.getInterface(), getHandler()); + WifiP2pDevice groupOwner = mGroup.getOwner(); + WifiP2pDevice peer = mPeers.get(groupOwner.deviceAddress); + if (peer != null) { + // update group owner details with peer details found at discovery + groupOwner.updateSupplicantDetails(peer); + mPeers.updateStatus(groupOwner.deviceAddress, + WifiP2pDevice.CONNECTED); + sendPeersChangedBroadcast(); + } else { + // A supplicant bug can lead to reporting an invalid + // group owner address (all zeroes) at times. Avoid a + // crash, but continue group creation since it is not + // essential. + logw("Unknown group owner " + groupOwner); } transitionTo(mGroupCreatedState); break; + case GROUP_OWNER_TETHER_READY: + if (mGroup != null && mGroup.isGroupOwner()) { + Log.d(TAG, "tether " + mGroup.getInterface() + " ready"); + transitionTo(mGroupCreatedState); + } + break; case WifiP2pMonitor.P2P_GO_NEGOTIATION_FAILURE_EVENT: P2pStatus status = (P2pStatus) message.obj; if (status == P2pStatus.NO_COMMON_CHANNEL) { @@ -2491,6 +2531,15 @@ public class WifiP2pServiceImpl extends IWifiP2pManager.Stub { transitionTo(mInactiveState); } break; + case WifiP2pMonitor.AP_STA_CONNECTED_EVENT: + case WifiP2pMonitor.AP_STA_DISCONNECTED_EVENT: + // Group owner needs to wait for tethering completion before + // moving to GroupCreatedState. If native layer reports STA event + // earlier, defer it. + if (mGroup != null && mGroup.isGroupOwner()) { + deferMessage(message); + break; + } default: return NOT_HANDLED; } @@ -2606,7 +2655,14 @@ public class WifiP2pServiceImpl extends IWifiP2pManager.Stub { // DHCP server has already been started if I am a group owner if (mGroup.isGroupOwner()) { - setWifiP2pInfoOnGroupFormation(SERVER_ADDRESS); + Inet4Address addr = getInterfaceAddress(mGroup.getInterface()); + if (addr != null) { + setWifiP2pInfoOnGroupFormation(addr.getHostAddress()); + Log.d(TAG, "Group owner address: " + addr.getHostAddress() + + " at " + mGroup.getInterface()); + } else { + mWifiNative.p2pGroupRemove(mGroup.getInterface()); + } } // In case of a negotiation group, connection changed is sent @@ -3065,6 +3121,49 @@ public class WifiP2pServiceImpl extends IWifiP2pManager.Stub { } } + private boolean isPackageExisted(String pkgName) { + PackageManager pm = mContext.getPackageManager(); + try { + PackageInfo info = pm.getPackageInfo(pkgName, PackageManager.GET_META_DATA); + } catch (PackageManager.NameNotFoundException e) { + return false; + } + return true; + } + + private String findTetheringServicePackage() { + ArrayList<String> possiblePackageNames = new ArrayList<>(); + // AOSP + possiblePackageNames.add("com.android.networkstack.tethering"); + // mainline release + possiblePackageNames.add("com.google.android.networkstack.tethering"); + // Android Go + possiblePackageNames.add("com.android.networkstack.tethering.inprocess"); + + for (String pkgName: possiblePackageNames) { + if (isPackageExisted(pkgName)) { + Log.d(TAG, "Tethering service package: " + pkgName); + return pkgName; + } + } + Log.w(TAG, "Cannot find tethering service package!"); + return null; + } + + private void sendP2pTetherRequestBroadcast(String tetheringServicePackage) { + if (mVerboseLoggingEnabled) logd("sending p2p tether request broadcast"); + + Intent intent = new Intent(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION); + intent.setPackage(tetheringServicePackage); + intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT + | Intent.FLAG_RECEIVER_REPLACE_PENDING); + intent.putExtra(WifiP2pManager.EXTRA_WIFI_P2P_INFO, new WifiP2pInfo(mWifiP2pInfo)); + intent.putExtra(WifiP2pManager.EXTRA_NETWORK_INFO, makeNetworkInfo()); + intent.putExtra(WifiP2pManager.EXTRA_WIFI_P2P_GROUP, eraseOwnDeviceAddress(mGroup)); + + sendBroadcastMultiplePermissions(intent); + } + private void sendP2pPersistentGroupsChangedBroadcast() { if (mVerboseLoggingEnabled) logd("sending p2p persistent groups changed broadcast"); Intent intent = new Intent(WifiP2pManager.ACTION_WIFI_P2P_PERSISTENT_GROUPS_CHANGED); @@ -3589,6 +3688,27 @@ public class WifiP2pServiceImpl extends IWifiP2pManager.Stub { return true; } + private Inet4Address getInterfaceAddress(String interfaceName) { + NetworkInterface iface; + try { + iface = NetworkInterface.getByName(interfaceName); + } catch (SocketException ex) { + Log.w(TAG, "Could not obtain address of network interface " + + interfaceName, ex); + return null; + } + Enumeration<InetAddress> addrs = iface.getInetAddresses(); + while (addrs.hasMoreElements()) { + InetAddress addr = addrs.nextElement(); + if (addr instanceof Inet4Address) { + return (Inet4Address) addr; + } + } + Log.w(TAG, "Could not obtain address of network interface " + + interfaceName + " because it had no IPv4 addresses."); + return null; + } + private void setWifiP2pInfoOnGroupFormation(String serverAddress) { InetAddress serverInetAddress = serverAddress == null ? null 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<Message> 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(); @@ -236,6 +252,26 @@ public class WifiP2pServiceImplTest extends WifiBaseTest { } /** + * Simulate tethering flow is completed + */ + private void simulateTetherReady() { + ArrayList<String> availableList = new ArrayList<>(); + ArrayList<String> localOnlyList = new ArrayList<>(); + localOnlyList.add(IFACE_NAME_P2P); + ArrayList<String> tetherList = new ArrayList<>(); + ArrayList<String> 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 * * @param pkgName package name used for p2p channel init @@ -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<InetAddress> 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<WifiP2pGroup> 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(); |