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