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