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