1fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey/* 2fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey * Copyright (C) 2012 The Android Open Source Project 3fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey * 4fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License"); 5fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey * you may not use this file except in compliance with the License. 6fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey * You may obtain a copy of the License at 7fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey * 8fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey * http://www.apache.org/licenses/LICENSE-2.0 9fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey * 10fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey * Unless required by applicable law or agreed to in writing, software 11fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS, 12fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey * See the License for the specific language governing permissions and 14fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey * limitations under the License. 15fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey */ 16fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 17fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeypackage com.android.server; 18fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 19fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport static android.net.ConnectivityManager.CONNECTIVITY_ACTION_IMMEDIATE; 20fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport static android.net.ConnectivityManager.TYPE_MOBILE; 21fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport static android.net.ConnectivityManager.TYPE_WIFI; 22fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport static android.net.ConnectivityManager.getNetworkTypeName; 23fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport static android.net.NetworkStateTracker.EVENT_STATE_CHANGED; 243671b1e910e4d297bebcd3ceaa2682bfb4b1f4a1Jeff Sharkeyimport static org.mockito.Matchers.anyInt; 253671b1e910e4d297bebcd3ceaa2682bfb4b1f4a1Jeff Sharkeyimport static org.mockito.Matchers.eq; 263671b1e910e4d297bebcd3ceaa2682bfb4b1f4a1Jeff Sharkeyimport static org.mockito.Matchers.isA; 273671b1e910e4d297bebcd3ceaa2682bfb4b1f4a1Jeff Sharkeyimport static org.mockito.Mockito.doNothing; 283671b1e910e4d297bebcd3ceaa2682bfb4b1f4a1Jeff Sharkeyimport static org.mockito.Mockito.doReturn; 293671b1e910e4d297bebcd3ceaa2682bfb4b1f4a1Jeff Sharkeyimport static org.mockito.Mockito.doThrow; 303671b1e910e4d297bebcd3ceaa2682bfb4b1f4a1Jeff Sharkeyimport static org.mockito.Mockito.mock; 313671b1e910e4d297bebcd3ceaa2682bfb4b1f4a1Jeff Sharkeyimport static org.mockito.Mockito.reset; 323671b1e910e4d297bebcd3ceaa2682bfb4b1f4a1Jeff Sharkeyimport static org.mockito.Mockito.verify; 33fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 34fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport android.content.Context; 35fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport android.net.INetworkPolicyManager; 36fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport android.net.INetworkStatsService; 37fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport android.net.LinkProperties; 38fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport android.net.NetworkConfig; 39fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport android.net.NetworkInfo; 40fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport android.net.NetworkInfo.DetailedState; 41fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport android.net.NetworkStateTracker; 42fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport android.net.RouteInfo; 43fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport android.os.Handler; 44fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport android.os.INetworkManagementService; 45fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport android.test.AndroidTestCase; 46fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport android.test.suitebuilder.annotation.LargeTest; 47fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport android.util.Log; 48fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport android.util.LogPrinter; 49fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 503671b1e910e4d297bebcd3ceaa2682bfb4b1f4a1Jeff Sharkeyimport org.mockito.ArgumentCaptor; 51fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 52fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport java.net.InetAddress; 53fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport java.util.concurrent.Future; 54fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 55fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey/** 56fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey * Tests for {@link ConnectivityService}. 57fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey */ 58fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey@LargeTest 59fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeypublic class ConnectivityServiceTest extends AndroidTestCase { 60fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey private static final String TAG = "ConnectivityServiceTest"; 61fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 62fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey private static final String MOBILE_IFACE = "rmnet3"; 63fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey private static final String WIFI_IFACE = "wlan6"; 64fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 65e16713597661c326d2bb6586a8b13e27520c4227Lorenzo Colitti private static final RouteInfo MOBILE_ROUTE_V4 = RouteInfo.makeHostRoute(parse("10.0.0.33"), 66e16713597661c326d2bb6586a8b13e27520c4227Lorenzo Colitti MOBILE_IFACE); 67e16713597661c326d2bb6586a8b13e27520c4227Lorenzo Colitti private static final RouteInfo MOBILE_ROUTE_V6 = RouteInfo.makeHostRoute(parse("fd00::33"), 68e16713597661c326d2bb6586a8b13e27520c4227Lorenzo Colitti MOBILE_IFACE); 69e16713597661c326d2bb6586a8b13e27520c4227Lorenzo Colitti 70e16713597661c326d2bb6586a8b13e27520c4227Lorenzo Colitti private static final RouteInfo WIFI_ROUTE_V4 = RouteInfo.makeHostRoute(parse("192.168.0.66"), 71e16713597661c326d2bb6586a8b13e27520c4227Lorenzo Colitti parse("192.168.0.1"), 72e16713597661c326d2bb6586a8b13e27520c4227Lorenzo Colitti WIFI_IFACE); 73e16713597661c326d2bb6586a8b13e27520c4227Lorenzo Colitti private static final RouteInfo WIFI_ROUTE_V6 = RouteInfo.makeHostRoute(parse("fd00::66"), 74e16713597661c326d2bb6586a8b13e27520c4227Lorenzo Colitti parse("fd00::"), 75e16713597661c326d2bb6586a8b13e27520c4227Lorenzo Colitti WIFI_IFACE); 76fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 77fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey private INetworkManagementService mNetManager; 78fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey private INetworkStatsService mStatsService; 79fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey private INetworkPolicyManager mPolicyService; 80fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey private ConnectivityService.NetworkFactory mNetFactory; 81fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 82fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey private BroadcastInterceptingContext mServiceContext; 83fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey private ConnectivityService mService; 84fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 85fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey private MockNetwork mMobile; 86fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey private MockNetwork mWifi; 87fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 88fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey private Handler mTrackerHandler; 89fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 90fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey private static class MockNetwork { 91fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey public NetworkStateTracker tracker; 92fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey public NetworkInfo info; 93fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey public LinkProperties link; 94fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 95fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey public MockNetwork(int type) { 96fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey tracker = mock(NetworkStateTracker.class); 97fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey info = new NetworkInfo(type, -1, getNetworkTypeName(type), null); 98fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey link = new LinkProperties(); 99fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey } 100fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 101fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey public void doReturnDefaults() { 102fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey // TODO: eventually CS should make defensive copies 103fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey doReturn(new NetworkInfo(info)).when(tracker).getNetworkInfo(); 104fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey doReturn(new LinkProperties(link)).when(tracker).getLinkProperties(); 105fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 106fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey // fallback to default TCP buffers 107fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey doReturn("").when(tracker).getTcpBufferSizesPropName(); 108fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey } 109fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey } 110fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 111fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey @Override 112fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey public void setUp() throws Exception { 113fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey super.setUp(); 114fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 115fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mServiceContext = new BroadcastInterceptingContext(getContext()); 116fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 117fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mNetManager = mock(INetworkManagementService.class); 118fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mStatsService = mock(INetworkStatsService.class); 119fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mPolicyService = mock(INetworkPolicyManager.class); 120fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mNetFactory = mock(ConnectivityService.NetworkFactory.class); 121fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 122fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mMobile = new MockNetwork(TYPE_MOBILE); 123fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mWifi = new MockNetwork(TYPE_WIFI); 124fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 125fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey // omit most network trackers 126fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey doThrow(new IllegalArgumentException("Not supported in test environment")) 127fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey .when(mNetFactory).createTracker(anyInt(), isA(NetworkConfig.class)); 128fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 129fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey doReturn(mMobile.tracker) 130fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey .when(mNetFactory).createTracker(eq(TYPE_MOBILE), isA(NetworkConfig.class)); 131fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey doReturn(mWifi.tracker) 132fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey .when(mNetFactory).createTracker(eq(TYPE_WIFI), isA(NetworkConfig.class)); 133fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 1343671b1e910e4d297bebcd3ceaa2682bfb4b1f4a1Jeff Sharkey final ArgumentCaptor<Handler> trackerHandler = ArgumentCaptor.forClass(Handler.class); 135fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey doNothing().when(mMobile.tracker) 136fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey .startMonitoring(isA(Context.class), trackerHandler.capture()); 137fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 138fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mService = new ConnectivityService( 139fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mServiceContext, mNetManager, mStatsService, mPolicyService, mNetFactory); 140fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mService.systemReady(); 141fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 142fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mTrackerHandler = trackerHandler.getValue(); 143fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mTrackerHandler.getLooper().setMessageLogging(new LogPrinter(Log.INFO, TAG)); 144fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey } 145fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 146fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey @Override 147fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey public void tearDown() throws Exception { 148fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey super.tearDown(); 149fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey } 150fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 151fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey public void testMobileConnectedAddedRoutes() throws Exception { 152fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey Future<?> nextConnBroadcast; 153fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 154fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey // bring up mobile network 155fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mMobile.info.setDetailedState(DetailedState.CONNECTED, null, null); 156fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mMobile.link.setInterfaceName(MOBILE_IFACE); 157fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mMobile.link.addRoute(MOBILE_ROUTE_V4); 158fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mMobile.link.addRoute(MOBILE_ROUTE_V6); 159fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mMobile.doReturnDefaults(); 160fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 161fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey nextConnBroadcast = mServiceContext.nextBroadcastIntent(CONNECTIVITY_ACTION_IMMEDIATE); 162fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mTrackerHandler.obtainMessage(EVENT_STATE_CHANGED, mMobile.info).sendToTarget(); 163fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey nextConnBroadcast.get(); 164fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 165fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey // verify that both routes were added and DNS was flushed 166fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey verify(mNetManager).addRoute(eq(MOBILE_IFACE), eq(MOBILE_ROUTE_V4)); 167fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey verify(mNetManager).addRoute(eq(MOBILE_IFACE), eq(MOBILE_ROUTE_V6)); 168fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey verify(mNetManager).flushInterfaceDnsCache(MOBILE_IFACE); 169fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 170fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey } 171fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 172fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey public void testMobileWifiHandoff() throws Exception { 173fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey Future<?> nextConnBroadcast; 174fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 175fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey // bring up mobile network 176fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mMobile.info.setDetailedState(DetailedState.CONNECTED, null, null); 177fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mMobile.link.setInterfaceName(MOBILE_IFACE); 178fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mMobile.link.addRoute(MOBILE_ROUTE_V4); 179fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mMobile.link.addRoute(MOBILE_ROUTE_V6); 180fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mMobile.doReturnDefaults(); 181fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 182fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey nextConnBroadcast = mServiceContext.nextBroadcastIntent(CONNECTIVITY_ACTION_IMMEDIATE); 183fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mTrackerHandler.obtainMessage(EVENT_STATE_CHANGED, mMobile.info).sendToTarget(); 184fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey nextConnBroadcast.get(); 185fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 186fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey reset(mNetManager); 187fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 188fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey // now bring up wifi network 189fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mWifi.info.setDetailedState(DetailedState.CONNECTED, null, null); 190fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mWifi.link.setInterfaceName(WIFI_IFACE); 191fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mWifi.link.addRoute(WIFI_ROUTE_V4); 192fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mWifi.link.addRoute(WIFI_ROUTE_V6); 193fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mWifi.doReturnDefaults(); 194fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 195fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey // expect that mobile will be torn down 196fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey doReturn(true).when(mMobile.tracker).teardown(); 197fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 198fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey nextConnBroadcast = mServiceContext.nextBroadcastIntent(CONNECTIVITY_ACTION_IMMEDIATE); 199fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mTrackerHandler.obtainMessage(EVENT_STATE_CHANGED, mWifi.info).sendToTarget(); 200fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey nextConnBroadcast.get(); 201fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 202fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey // verify that wifi routes added, and teardown requested 203fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey verify(mNetManager).addRoute(eq(WIFI_IFACE), eq(WIFI_ROUTE_V4)); 204fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey verify(mNetManager).addRoute(eq(WIFI_IFACE), eq(WIFI_ROUTE_V6)); 205fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey verify(mNetManager).flushInterfaceDnsCache(WIFI_IFACE); 206fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey verify(mMobile.tracker).teardown(); 207fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 208fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey reset(mNetManager, mMobile.tracker); 209fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 210fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey // tear down mobile network, as requested 211fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mMobile.info.setDetailedState(DetailedState.DISCONNECTED, null, null); 212fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mMobile.link.clear(); 213fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mMobile.doReturnDefaults(); 214fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 215fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey nextConnBroadcast = mServiceContext.nextBroadcastIntent(CONNECTIVITY_ACTION_IMMEDIATE); 216fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey mTrackerHandler.obtainMessage(EVENT_STATE_CHANGED, mMobile.info).sendToTarget(); 217fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey nextConnBroadcast.get(); 218fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 219fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey verify(mNetManager).removeRoute(eq(MOBILE_IFACE), eq(MOBILE_ROUTE_V4)); 220fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey verify(mNetManager).removeRoute(eq(MOBILE_IFACE), eq(MOBILE_ROUTE_V6)); 221fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 222fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey } 223fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 224fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey private static InetAddress parse(String addr) { 225fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey return InetAddress.parseNumericAddress(addr); 226fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey } 227fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey} 228