ConnectivityServiceTest.java revision a7b9796345335e4906d98432a1d194fa242cd23e
1fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com/*
2fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com * Copyright (C) 2012 The Android Open Source Project
3fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com *
4fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com * Licensed under the Apache License, Version 2.0 (the "License");
5fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com * you may not use this file except in compliance with the License.
6fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com * You may obtain a copy of the License at
7b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com *
8fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com *      http://www.apache.org/licenses/LICENSE-2.0
9fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com *
10fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com * Unless required by applicable law or agreed to in writing, software
11fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com * distributed under the License is distributed on an "AS IS" BASIS,
1215fa138f2276a77679530fb608463ff5b4133f7bcaryclark@google.com * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1315fa138f2276a77679530fb608463ff5b4133f7bcaryclark@google.com * See the License for the specific language governing permissions and
1415fa138f2276a77679530fb608463ff5b4133f7bcaryclark@google.com * limitations under the License.
15b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com */
16b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com
1715fa138f2276a77679530fb608463ff5b4133f7bcaryclark@google.compackage com.android.server;
1815fa138f2276a77679530fb608463ff5b4133f7bcaryclark@google.com
1915fa138f2276a77679530fb608463ff5b4133f7bcaryclark@google.comimport static android.net.ConnectivityManager.CONNECTIVITY_ACTION_IMMEDIATE;
2047580694fbe974a065caf7c39c3d2075708c2018caryclark@google.comimport static android.net.ConnectivityManager.TYPE_MOBILE;
2115fa138f2276a77679530fb608463ff5b4133f7bcaryclark@google.comimport static android.net.ConnectivityManager.TYPE_WIFI;
22fa0588ff672564af1c235a63589573829035a60bcaryclark@google.comimport static android.net.ConnectivityManager.getNetworkTypeName;
2347580694fbe974a065caf7c39c3d2075708c2018caryclark@google.comimport static android.net.NetworkStateTracker.EVENT_STATE_CHANGED;
2447580694fbe974a065caf7c39c3d2075708c2018caryclark@google.comimport static org.mockito.Matchers.anyInt;
2547580694fbe974a065caf7c39c3d2075708c2018caryclark@google.comimport static org.mockito.Matchers.eq;
2647580694fbe974a065caf7c39c3d2075708c2018caryclark@google.comimport static org.mockito.Matchers.isA;
2747580694fbe974a065caf7c39c3d2075708c2018caryclark@google.comimport static org.mockito.Mockito.doNothing;
28f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.comimport static org.mockito.Mockito.doReturn;
290b7da433fe0eaa2833d1b2900715b013b36d93dacaryclark@google.comimport static org.mockito.Mockito.doThrow;
308f9f468b0555e95b8fc3cf4e6ee1f1fbf5492a1bcaryclark@google.comimport static org.mockito.Mockito.mock;
3173ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.comimport static org.mockito.Mockito.reset;
32a461ff0866526bc51dbd4c4f9f066a727ec21510caryclark@google.comimport static org.mockito.Mockito.verify;
3347580694fbe974a065caf7c39c3d2075708c2018caryclark@google.com
34f9502d7dfad5b361a3cdaa42eb75b593c95f79d8caryclark@google.comimport android.content.Context;
3547580694fbe974a065caf7c39c3d2075708c2018caryclark@google.comimport android.net.INetworkPolicyManager;
3631143cf37fa38dc98f71c71e518ecc21c83b5e27caryclark@google.comimport android.net.INetworkStatsService;
37fa0588ff672564af1c235a63589573829035a60bcaryclark@google.comimport android.net.LinkProperties;
3847580694fbe974a065caf7c39c3d2075708c2018caryclark@google.comimport android.net.NetworkConfig;
39fa0588ff672564af1c235a63589573829035a60bcaryclark@google.comimport android.net.NetworkInfo;
4047580694fbe974a065caf7c39c3d2075708c2018caryclark@google.comimport android.net.NetworkInfo.DetailedState;
414eeda37a7456876cb8d509a4ea43c7f4c684477acaryclark@google.comimport android.net.NetworkStateTracker;
42fa0588ff672564af1c235a63589573829035a60bcaryclark@google.comimport android.net.RouteInfo;
4347580694fbe974a065caf7c39c3d2075708c2018caryclark@google.comimport android.os.Handler;
44c899ad9c7fa28234d99479ab09afb6866bbd8dc3caryclark@google.comimport android.os.INetworkManagementService;
45e7bd5f4041701cbab87f6e779eb18fbb9fe74216caryclark@google.comimport android.test.AndroidTestCase;
4647580694fbe974a065caf7c39c3d2075708c2018caryclark@google.comimport android.test.suitebuilder.annotation.LargeTest;
478dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.comimport android.util.Log;
48e7bd5f4041701cbab87f6e779eb18fbb9fe74216caryclark@google.comimport android.util.LogPrinter;
4947580694fbe974a065caf7c39c3d2075708c2018caryclark@google.com
50f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.comimport org.mockito.ArgumentCaptor;
51729e1c46cea63dfaa6e4a05608b8f3be41e19dcecaryclark@google.com
5247580694fbe974a065caf7c39c3d2075708c2018caryclark@google.comimport java.net.InetAddress;
538f9f468b0555e95b8fc3cf4e6ee1f1fbf5492a1bcaryclark@google.comimport java.util.concurrent.Future;
54afe56de6361a81eef537ddd8f6d5626c8546d4c7caryclark@google.com
558dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com/**
568f9f468b0555e95b8fc3cf4e6ee1f1fbf5492a1bcaryclark@google.com * Tests for {@link ConnectivityService}.
57fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com */
58fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com@LargeTest
59fa0588ff672564af1c235a63589573829035a60bcaryclark@google.compublic class ConnectivityServiceTest extends AndroidTestCase {
6047580694fbe974a065caf7c39c3d2075708c2018caryclark@google.com    private static final String TAG = "ConnectivityServiceTest";
61fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
62c91dfe417a51f73c28ecf2708df1e0bee942c6eacaryclark@google.com    private static final String MOBILE_IFACE = "rmnet3";
634eeda37a7456876cb8d509a4ea43c7f4c684477acaryclark@google.com    private static final String WIFI_IFACE = "wlan6";
646aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com
656aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com    private static final RouteInfo MOBILE_ROUTE_V4 = RouteInfo.makeHostRoute(parse("10.0.0.33"),
663350c3c68ab75cd08721da3a938b8d2b10096d70caryclark@google.com                                                                             MOBILE_IFACE);
67e7bd5f4041701cbab87f6e779eb18fbb9fe74216caryclark@google.com    private static final RouteInfo MOBILE_ROUTE_V6 = RouteInfo.makeHostRoute(parse("fd00::33"),
683350c3c68ab75cd08721da3a938b8d2b10096d70caryclark@google.com                                                                             MOBILE_IFACE);
69534aa5b9460639a09b9dc30d29e77782e44b8fffcaryclark@google.com
70e7bd5f4041701cbab87f6e779eb18fbb9fe74216caryclark@google.com    private static final RouteInfo WIFI_ROUTE_V4 = RouteInfo.makeHostRoute(parse("192.168.0.66"),
713350c3c68ab75cd08721da3a938b8d2b10096d70caryclark@google.com                                                                           parse("192.168.0.1"),
7265f9f0a1664a9cb38157ccfbcc3e0e936af0a58ecaryclark@google.com                                                                           WIFI_IFACE);
73729e1c46cea63dfaa6e4a05608b8f3be41e19dcecaryclark@google.com    private static final RouteInfo WIFI_ROUTE_V6 = RouteInfo.makeHostRoute(parse("fd00::66"),
7447580694fbe974a065caf7c39c3d2075708c2018caryclark@google.com                                                                           parse("fd00::"),
758f9f468b0555e95b8fc3cf4e6ee1f1fbf5492a1bcaryclark@google.com                                                                           WIFI_IFACE);
76afe56de6361a81eef537ddd8f6d5626c8546d4c7caryclark@google.com
7747580694fbe974a065caf7c39c3d2075708c2018caryclark@google.com    private INetworkManagementService mNetManager;
788f9f468b0555e95b8fc3cf4e6ee1f1fbf5492a1bcaryclark@google.com    private INetworkStatsService mStatsService;
79fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    private INetworkPolicyManager mPolicyService;
80fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    private ConnectivityService.NetworkFactory mNetFactory;
81fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
826aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com    private BroadcastInterceptingContext mServiceContext;
83027de226c144d9e6b7a76acb2e904952b5620a5ecaryclark@google.com    private ConnectivityService mService;
84fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
85fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    private MockNetwork mMobile;
8665f9f0a1664a9cb38157ccfbcc3e0e936af0a58ecaryclark@google.com    private MockNetwork mWifi;
87fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
88fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    private Handler mTrackerHandler;
89fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
90fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    private static class MockNetwork {
918dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com        public NetworkStateTracker tracker;
928dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com        public NetworkInfo info;
938dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com        public LinkProperties link;
948dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com
9532546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com        public MockNetwork(int type) {
9632546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com            tracker = mock(NetworkStateTracker.class);
9732546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com            info = new NetworkInfo(type, -1, getNetworkTypeName(type), null);
9832546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com            link = new LinkProperties();
9932546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com        }
10032546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com
10132546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com        public void doReturnDefaults() {
10232546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com            // TODO: eventually CS should make defensive copies
10332546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com            doReturn(new NetworkInfo(info)).when(tracker).getNetworkInfo();
104fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com            doReturn(new LinkProperties(link)).when(tracker).getLinkProperties();
105fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
10632546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com            // fallback to default TCP buffers
10732546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com            doReturn("").when(tracker).getTcpBufferSizesPropName();
108fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        }
109fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    }
110fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
111fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    @Override
112fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    public void setUp() throws Exception {
11332546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com        super.setUp();
11432546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com
1153350c3c68ab75cd08721da3a938b8d2b10096d70caryclark@google.com        mServiceContext = new BroadcastInterceptingContext(getContext());
116fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
117fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        mNetManager = mock(INetworkManagementService.class);
11832546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com        mStatsService = mock(INetworkStatsService.class);
119fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        mPolicyService = mock(INetworkPolicyManager.class);
12032546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com        mNetFactory = mock(ConnectivityService.NetworkFactory.class);
12132546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com
12273ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com        mMobile = new MockNetwork(TYPE_MOBILE);
123fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        mWifi = new MockNetwork(TYPE_WIFI);
124fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
125fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        // omit most network trackers
126fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        doThrow(new IllegalArgumentException("Not supported in test environment"))
12732546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com                .when(mNetFactory).createTracker(anyInt(), isA(NetworkConfig.class));
12832546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com
129235f56a92f6eb6accbb243e11b3c45e3798f38f2caryclark@google.com        doReturn(mMobile.tracker)
130235f56a92f6eb6accbb243e11b3c45e3798f38f2caryclark@google.com                .when(mNetFactory).createTracker(eq(TYPE_MOBILE), isA(NetworkConfig.class));
131235f56a92f6eb6accbb243e11b3c45e3798f38f2caryclark@google.com        doReturn(mWifi.tracker)
132235f56a92f6eb6accbb243e11b3c45e3798f38f2caryclark@google.com                .when(mNetFactory).createTracker(eq(TYPE_WIFI), isA(NetworkConfig.class));
133fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
134235f56a92f6eb6accbb243e11b3c45e3798f38f2caryclark@google.com        final ArgumentCaptor<Handler> trackerHandler = ArgumentCaptor.forClass(Handler.class);
13532546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com        doNothing().when(mMobile.tracker)
136fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com                .startMonitoring(isA(Context.class), trackerHandler.capture());
137fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
13873ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com        mService = new ConnectivityService(
13973ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com                mServiceContext, mNetManager, mStatsService, mPolicyService, mNetFactory);
140fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        mService.systemReady();
14132546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com
14273ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com        mTrackerHandler = trackerHandler.getValue();
14373ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com        mTrackerHandler.getLooper().setMessageLogging(new LogPrinter(Log.INFO, TAG));
14473ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com    }
14573ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com
14673ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com    @Override
14773ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com    public void tearDown() throws Exception {
14873ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com        super.tearDown();
14932546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com    }
15073ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com
15173ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com    public void testMobileConnectedAddedRoutes() throws Exception {
15273ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com        Future<?> nextConnBroadcast;
153fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
15473ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com        // bring up mobile network
155fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        mMobile.info.setDetailedState(DetailedState.CONNECTED, null, null);
156fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        mMobile.link.setInterfaceName(MOBILE_IFACE);
157fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        mMobile.link.addRoute(MOBILE_ROUTE_V4);
158fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        mMobile.link.addRoute(MOBILE_ROUTE_V6);
159fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        mMobile.doReturnDefaults();
16032546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com
161fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        nextConnBroadcast = mServiceContext.nextBroadcastIntent(CONNECTIVITY_ACTION_IMMEDIATE);
162fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        mTrackerHandler.obtainMessage(EVENT_STATE_CHANGED, mMobile.info).sendToTarget();
163fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        nextConnBroadcast.get();
164fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
165fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        // verify that both routes were added and DNS was flushed
16632546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com        verify(mNetManager).addRoute(eq(MOBILE_IFACE), eq(MOBILE_ROUTE_V4));
167fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        verify(mNetManager).addRoute(eq(MOBILE_IFACE), eq(MOBILE_ROUTE_V6));
168fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        verify(mNetManager).flushNetworkDnsCache(mMobile.tracker.getNetwork().netId);
169fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
170fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    }
171fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
17232546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com    public void testMobileWifiHandoff() throws Exception {
173fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        Future<?> nextConnBroadcast;
174fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
175fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        // bring up mobile network
176e7bd5f4041701cbab87f6e779eb18fbb9fe74216caryclark@google.com        mMobile.info.setDetailedState(DetailedState.CONNECTED, null, null);
177e7bd5f4041701cbab87f6e779eb18fbb9fe74216caryclark@google.com        mMobile.link.setInterfaceName(MOBILE_IFACE);
178e7bd5f4041701cbab87f6e779eb18fbb9fe74216caryclark@google.com        mMobile.link.addRoute(MOBILE_ROUTE_V4);
179e7bd5f4041701cbab87f6e779eb18fbb9fe74216caryclark@google.com        mMobile.link.addRoute(MOBILE_ROUTE_V6);
180e7bd5f4041701cbab87f6e779eb18fbb9fe74216caryclark@google.com        mMobile.doReturnDefaults();
181e7bd5f4041701cbab87f6e779eb18fbb9fe74216caryclark@google.com
182e7bd5f4041701cbab87f6e779eb18fbb9fe74216caryclark@google.com        nextConnBroadcast = mServiceContext.nextBroadcastIntent(CONNECTIVITY_ACTION_IMMEDIATE);
183e7bd5f4041701cbab87f6e779eb18fbb9fe74216caryclark@google.com        mTrackerHandler.obtainMessage(EVENT_STATE_CHANGED, mMobile.info).sendToTarget();
1848dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com        nextConnBroadcast.get();
1858dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com
18632546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com        reset(mNetManager);
1878dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com
1888dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com        // now bring up wifi network
1898dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com        mWifi.info.setDetailedState(DetailedState.CONNECTED, null, null);
1908dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com        mWifi.link.setInterfaceName(WIFI_IFACE);
1918dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com        mWifi.link.addRoute(WIFI_ROUTE_V4);
19232546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com        mWifi.link.addRoute(WIFI_ROUTE_V6);
1938dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com        mWifi.doReturnDefaults();
1948dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com
1958dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com        // expect that mobile will be torn down
1968dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com        doReturn(true).when(mMobile.tracker).teardown();
1978dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com
19832546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com        nextConnBroadcast = mServiceContext.nextBroadcastIntent(CONNECTIVITY_ACTION_IMMEDIATE);
1998dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com        mTrackerHandler.obtainMessage(EVENT_STATE_CHANGED, mWifi.info).sendToTarget();
200fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        nextConnBroadcast.get();
201fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
2028dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com        // verify that wifi routes added, and teardown requested
2038dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com        verify(mNetManager).addRoute(eq(WIFI_IFACE), eq(WIFI_ROUTE_V4));
2048dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com        verify(mNetManager).addRoute(eq(WIFI_IFACE), eq(WIFI_ROUTE_V6));
2058dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com        verify(mNetManager).flushNetworkDnsCache(mWifi.tracker.getNetwork().netId);
2068dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com        verify(mMobile.tracker).teardown();
2078dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com
2088dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com        reset(mNetManager, mMobile.tracker);
2098dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com
210fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        // tear down mobile network, as requested
21132546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com        mMobile.info.setDetailedState(DetailedState.DISCONNECTED, null, null);
212fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        mMobile.link.clear();
213fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        mMobile.doReturnDefaults();
214fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
215fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        nextConnBroadcast = mServiceContext.nextBroadcastIntent(CONNECTIVITY_ACTION_IMMEDIATE);
216fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        mTrackerHandler.obtainMessage(EVENT_STATE_CHANGED, mMobile.info).sendToTarget();
217fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        nextConnBroadcast.get();
218f9502d7dfad5b361a3cdaa42eb75b593c95f79d8caryclark@google.com
219f9502d7dfad5b361a3cdaa42eb75b593c95f79d8caryclark@google.com        verify(mNetManager).removeRoute(eq(MOBILE_IFACE), eq(MOBILE_ROUTE_V4));
220f9502d7dfad5b361a3cdaa42eb75b593c95f79d8caryclark@google.com        verify(mNetManager).removeRoute(eq(MOBILE_IFACE), eq(MOBILE_ROUTE_V6));
221f9502d7dfad5b361a3cdaa42eb75b593c95f79d8caryclark@google.com
222f9502d7dfad5b361a3cdaa42eb75b593c95f79d8caryclark@google.com    }
223fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
22432546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com    private static InetAddress parse(String addr) {
225fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        return InetAddress.parseNumericAddress(addr);
226fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    }
227fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com}
228fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com