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 19f851d6dd2a15b74f63c85403afad0ed747f7311cErik Klineimport static android.net.ConnectivityManager.CONNECTIVITY_ACTION; 207369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colittiimport static android.net.ConnectivityManager.TYPE_ETHERNET; 21fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport static android.net.ConnectivityManager.TYPE_MOBILE; 22fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport static android.net.ConnectivityManager.TYPE_WIFI; 23fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport static android.net.ConnectivityManager.getNetworkTypeName; 2483fa2588f662aae0b612da91fd09d205cf2e8cb0Lorenzo Colittiimport static android.net.NetworkCapabilities.*; 2583fa2588f662aae0b612da91fd09d205cf2e8cb0Lorenzo Colitti 263671b1e910e4d297bebcd3ceaa2682bfb4b1f4a1Jeff Sharkeyimport static org.mockito.Mockito.mock; 27fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 2873b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colittiimport android.app.NotificationManager; 29bb2e0e98160f099261876794518d4db62e309aecPaul Jensenimport android.app.PendingIntent; 30d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensenimport android.content.BroadcastReceiver; 316d553f6dfdcc188fa6b17d4abb11d6222009a8fbLorenzo Colittiimport android.content.ContentResolver; 32fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport android.content.Context; 33d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensenimport android.content.ContextWrapper; 34d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensenimport android.content.Intent; 35d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensenimport android.content.IntentFilter; 36d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensenimport android.net.ConnectivityManager; 37d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensenimport android.net.ConnectivityManager.NetworkCallback; 387914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colittiimport android.net.ConnectivityManager.PacketKeepalive; 397914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colittiimport android.net.ConnectivityManager.PacketKeepaliveCallback; 40fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport android.net.INetworkPolicyManager; 41fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport android.net.INetworkStatsService; 427914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colittiimport android.net.IpPrefix; 437914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colittiimport android.net.LinkAddress; 44fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport android.net.LinkProperties; 45d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensenimport android.net.Network; 46d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensenimport android.net.NetworkAgent; 47d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensenimport android.net.NetworkCapabilities; 48fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport android.net.NetworkConfig; 49348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwaltimport android.net.NetworkFactory; 50fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport android.net.NetworkInfo; 51fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport android.net.NetworkInfo.DetailedState; 52d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensenimport android.net.NetworkMisc; 53d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensenimport android.net.NetworkRequest; 54fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport android.net.RouteInfo; 55f9fdf87af2fe0cb9b70ffa81a0912448f4ef4207Hugo Benichiimport android.net.metrics.IpConnectivityLog; 56065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Klineimport android.net.util.AvoidBadWifiTracker; 57d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensenimport android.os.ConditionVariable; 58fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport android.os.Handler; 59348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwaltimport android.os.HandlerThread; 60ddb9ef0357e3ee609e188fb9e1e461f95aa601faEtan Cohenimport android.os.IBinder; 61fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport android.os.INetworkManagementService; 62e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colittiimport android.os.Looper; 637914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colittiimport android.os.Message; 64e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colittiimport android.os.MessageQueue; 65ddb9ef0357e3ee609e188fb9e1e461f95aa601faEtan Cohenimport android.os.Messenger; 66e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colittiimport android.os.MessageQueue.IdleHandler; 67d2baf792f8b7ae46aa6a35cff25eb7e3923f5125Robin Leeimport android.os.Process; 68bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colittiimport android.os.SystemClock; 696d553f6dfdcc188fa6b17d4abb11d6222009a8fbLorenzo Colittiimport android.provider.Settings; 70fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport android.test.AndroidTestCase; 716d553f6dfdcc188fa6b17d4abb11d6222009a8fbLorenzo Colittiimport android.test.mock.MockContentResolver; 72fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport android.test.suitebuilder.annotation.LargeTest; 73b7c2487c8b5fbd154643b8ddade8d88507cae137Udam Sainiimport android.test.suitebuilder.annotation.SmallTest; 74fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport android.util.Log; 75fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport android.util.LogPrinter; 76fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 776d553f6dfdcc188fa6b17d4abb11d6222009a8fbLorenzo Colittiimport com.android.internal.util.FakeSettingsProvider; 78bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colittiimport com.android.internal.util.WakeupMessage; 79cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensenimport com.android.server.connectivity.NetworkAgentInfo; 80d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensenimport com.android.server.connectivity.NetworkMonitor; 812324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensenimport com.android.server.connectivity.NetworkMonitor.CaptivePortalProbeResult; 82531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colittiimport com.android.server.net.NetworkPinner; 83d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen 84fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeyimport java.net.InetAddress; 854e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensenimport java.util.ArrayList; 86165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colittiimport java.util.Arrays; 876ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colittiimport java.util.Objects; 88ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colittiimport java.util.concurrent.CountDownLatch; 897914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colittiimport java.util.concurrent.LinkedBlockingQueue; 90ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colittiimport java.util.concurrent.TimeUnit; 91348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwaltimport java.util.concurrent.atomic.AtomicBoolean; 92fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 93fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey/** 94fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey * Tests for {@link ConnectivityService}. 95d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen * 96d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen * Build, install and run with: 97d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen * runtest frameworks-services -c com.android.server.ConnectivityServiceTest 98fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey */ 99fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkeypublic class ConnectivityServiceTest extends AndroidTestCase { 100fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey private static final String TAG = "ConnectivityServiceTest"; 101fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 102ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti private static final int TIMEOUT_MS = 500; 103b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti private static final int TEST_LINGER_DELAY_MS = 120; 104ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti 105fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey private BroadcastInterceptingContext mServiceContext; 106cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen private WrappedConnectivityService mService; 107531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti private WrappedConnectivityManager mCm; 108d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen private MockNetworkAgent mWiFiNetworkAgent; 109d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen private MockNetworkAgent mCellNetworkAgent; 1107369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti private MockNetworkAgent mEthernetNetworkAgent; 111d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen 112531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti // This class exists to test bindProcessToNetwork and getBoundNetworkForProcess. These methods 113531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti // do not go through ConnectivityService but talk to netd directly, so they don't automatically 114531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti // reflect the state of our test ConnectivityService. 115531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti private class WrappedConnectivityManager extends ConnectivityManager { 116531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti private Network mFakeBoundNetwork; 117531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti 118531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti public synchronized boolean bindProcessToNetwork(Network network) { 119531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti mFakeBoundNetwork = network; 120531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti return true; 121531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti } 122531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti 123531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti public synchronized Network getBoundNetworkForProcess() { 124531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti return mFakeBoundNetwork; 125531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti } 126531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti 127531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti public WrappedConnectivityManager(Context context, ConnectivityService service) { 128531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti super(context, service); 129531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti } 130531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti } 131531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti 132d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen private class MockContext extends BroadcastInterceptingContext { 1336d553f6dfdcc188fa6b17d4abb11d6222009a8fbLorenzo Colitti private final MockContentResolver mContentResolver; 1346d553f6dfdcc188fa6b17d4abb11d6222009a8fbLorenzo Colitti 135d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen MockContext(Context base) { 136d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen super(base); 1376d553f6dfdcc188fa6b17d4abb11d6222009a8fbLorenzo Colitti mContentResolver = new MockContentResolver(); 1386d553f6dfdcc188fa6b17d4abb11d6222009a8fbLorenzo Colitti mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider()); 139d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen } 140d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen 141d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen @Override 1426d553f6dfdcc188fa6b17d4abb11d6222009a8fbLorenzo Colitti public Object getSystemService(String name) { 14373b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti if (Context.CONNECTIVITY_SERVICE.equals(name)) return mCm; 14473b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti if (Context.NOTIFICATION_SERVICE.equals(name)) return mock(NotificationManager.class); 145d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen return super.getSystemService(name); 146d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen } 1476d553f6dfdcc188fa6b17d4abb11d6222009a8fbLorenzo Colitti 1486d553f6dfdcc188fa6b17d4abb11d6222009a8fbLorenzo Colitti @Override 1496d553f6dfdcc188fa6b17d4abb11d6222009a8fbLorenzo Colitti public ContentResolver getContentResolver() { 1506d553f6dfdcc188fa6b17d4abb11d6222009a8fbLorenzo Colitti return mContentResolver; 1516d553f6dfdcc188fa6b17d4abb11d6222009a8fbLorenzo Colitti } 152d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen } 153d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen 154e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti /** 155e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti * A subclass of HandlerThread that allows callers to wait for it to become idle. waitForIdle 156e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti * will return immediately if the handler is already idle. 157e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti */ 158e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti private class IdleableHandlerThread extends HandlerThread { 159e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti private IdleHandler mIdleHandler; 160e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti 161e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti public IdleableHandlerThread(String name) { 162e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti super(name); 163e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti } 164e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti 165e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti public void waitForIdle(int timeoutMs) { 166e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti final ConditionVariable cv = new ConditionVariable(); 167e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti final MessageQueue queue = getLooper().getQueue(); 168e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti 169e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti synchronized (queue) { 170e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti if (queue.isIdle()) { 171e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti return; 172e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti } 173e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti 174e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti assertNull("BUG: only one idle handler allowed", mIdleHandler); 175e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti mIdleHandler = new IdleHandler() { 176e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti public boolean queueIdle() { 1775eaaf747b4be27a8ef9d7fb5a2531543db490b89Lorenzo Colitti synchronized (queue) { 1785eaaf747b4be27a8ef9d7fb5a2531543db490b89Lorenzo Colitti cv.open(); 1795eaaf747b4be27a8ef9d7fb5a2531543db490b89Lorenzo Colitti mIdleHandler = null; 1805eaaf747b4be27a8ef9d7fb5a2531543db490b89Lorenzo Colitti return false; // Remove the handler. 1815eaaf747b4be27a8ef9d7fb5a2531543db490b89Lorenzo Colitti } 182e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti } 183e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti }; 184e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti queue.addIdleHandler(mIdleHandler); 185e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti } 186e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti 187e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti if (!cv.block(timeoutMs)) { 188e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti fail("HandlerThread " + getName() + 189e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti " did not become idle after " + timeoutMs + " ms"); 190e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti queue.removeIdleHandler(mIdleHandler); 191e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti } 192e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti } 193e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti } 194e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti 195e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti // Tests that IdleableHandlerThread works as expected. 196e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti public void testIdleableHandlerThread() { 197e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti final int attempts = 50; // Causes the test to take about 200ms on bullhead-eng. 198e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti 199e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti // Tests that waitForIdle returns immediately if the service is already idle. 200e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti for (int i = 0; i < attempts; i++) { 201e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti mService.waitForIdle(); 202e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti } 203e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti 204e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti // Bring up a network that we can use to send messages to ConnectivityService. 205e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti ConditionVariable cv = waitForConnectivityBroadcasts(1); 206e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 207e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti mWiFiNetworkAgent.connect(false); 208e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti waitFor(cv); 209e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti Network n = mWiFiNetworkAgent.getNetwork(); 210e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti assertNotNull(n); 211e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti 212e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti // Tests that calling waitForIdle waits for messages to be processed. 213e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti for (int i = 0; i < attempts; i++) { 214e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti mWiFiNetworkAgent.setSignalStrength(i); 215e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti mService.waitForIdle(); 216e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti assertEquals(i, mCm.getNetworkCapabilities(n).getSignalStrength()); 217e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti } 218e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti 219e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti // Ensure that not calling waitForIdle causes a race condition. 220e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti for (int i = 0; i < attempts; i++) { 221e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti mWiFiNetworkAgent.setSignalStrength(i); 222e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti if (i != mCm.getNetworkCapabilities(n).getSignalStrength()) { 223e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti // We hit a race condition, as expected. Pass the test. 224e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti return; 225e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti } 226e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti } 227e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti 228e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti // No race? There is a bug in this test. 229e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti fail("expected race condition at least once in " + attempts + " attempts"); 230e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti } 231e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti 232d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen private class MockNetworkAgent { 233cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen private final WrappedNetworkMonitor mWrappedNetworkMonitor; 234d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen private final NetworkInfo mNetworkInfo; 235d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen private final NetworkCapabilities mNetworkCapabilities; 236e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti private final IdleableHandlerThread mHandlerThread; 237e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen private final ConditionVariable mDisconnected = new ConditionVariable(); 2382324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen private final ConditionVariable mNetworkStatusReceived = new ConditionVariable(); 2393d911469a190437fe936103e861bfa171841fbd6Paul Jensen private int mScore; 240d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen private NetworkAgent mNetworkAgent; 2417914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti private int mStartKeepaliveError = PacketKeepalive.ERROR_HARDWARE_UNSUPPORTED; 2427914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti private int mStopKeepaliveError = PacketKeepalive.NO_KEEPALIVE; 2437914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti private Integer mExpectedKeepaliveSlot = null; 2442324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen // Contains the redirectUrl from networkStatus(). Before reading, wait for 2452324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen // mNetworkStatusReceived. 2462324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen private String mRedirectUrl; 247d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen 248d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen MockNetworkAgent(int transport) { 249d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen final int type = transportToLegacyType(transport); 250d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen final String typeName = ConnectivityManager.getNetworkTypeName(type); 251d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mNetworkInfo = new NetworkInfo(type, 0, typeName, "Mock"); 252d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mNetworkCapabilities = new NetworkCapabilities(); 253d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mNetworkCapabilities.addTransportType(transport); 254d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen switch (transport) { 2557369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti case TRANSPORT_ETHERNET: 2567369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mScore = 70; 2577369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti break; 258d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen case TRANSPORT_WIFI: 2593d911469a190437fe936103e861bfa171841fbd6Paul Jensen mScore = 60; 260d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen break; 261d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen case TRANSPORT_CELLULAR: 2623d911469a190437fe936103e861bfa171841fbd6Paul Jensen mScore = 50; 263d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen break; 264d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen default: 265d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen throw new UnsupportedOperationException("unimplemented network type"); 266d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen } 267e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti mHandlerThread = new IdleableHandlerThread("Mock-" + typeName); 268e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti mHandlerThread.start(); 269e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti mNetworkAgent = new NetworkAgent(mHandlerThread.getLooper(), mServiceContext, 270e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti "Mock-" + typeName, mNetworkInfo, mNetworkCapabilities, 271e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti new LinkProperties(), mScore, new NetworkMisc()) { 2727914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti @Override 273e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti public void unwanted() { mDisconnected.open(); } 2747914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 2757914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti @Override 2767914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti public void startPacketKeepalive(Message msg) { 2777914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti int slot = msg.arg1; 2787914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti if (mExpectedKeepaliveSlot != null) { 2797914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti assertEquals((int) mExpectedKeepaliveSlot, slot); 2807914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti } 2817914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti onPacketKeepaliveEvent(slot, mStartKeepaliveError); 2827914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti } 2837914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 2847914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti @Override 2857914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti public void stopPacketKeepalive(Message msg) { 2867914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti onPacketKeepaliveEvent(msg.arg1, mStopKeepaliveError); 2877914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti } 2882324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen 2892324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen @Override 2902324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen public void networkStatus(int status, String redirectUrl) { 2912324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen mRedirectUrl = redirectUrl; 2922324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen mNetworkStatusReceived.open(); 2932324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen } 294d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen }; 295e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti // Waits for the NetworkAgent to be registered, which includes the creation of the 296e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti // NetworkMonitor. 297e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti mService.waitForIdle(); 298cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen mWrappedNetworkMonitor = mService.getLastCreatedWrappedNetworkMonitor(); 2993d911469a190437fe936103e861bfa171841fbd6Paul Jensen } 3003d911469a190437fe936103e861bfa171841fbd6Paul Jensen 301e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti public void waitForIdle(int timeoutMs) { 302e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti mHandlerThread.waitForIdle(timeoutMs); 303e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti } 304e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti 305e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti public void waitForIdle() { 306e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti waitForIdle(TIMEOUT_MS); 307e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti } 308e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti 3093d911469a190437fe936103e861bfa171841fbd6Paul Jensen public void adjustScore(int change) { 3103d911469a190437fe936103e861bfa171841fbd6Paul Jensen mScore += change; 3113d911469a190437fe936103e861bfa171841fbd6Paul Jensen mNetworkAgent.sendNetworkScore(mScore); 312d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen } 313d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen 31485cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen public void addCapability(int capability) { 31585cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen mNetworkCapabilities.addCapability(capability); 31685cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen mNetworkAgent.sendNetworkCapabilities(mNetworkCapabilities); 31785cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen } 31885cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen 3197369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti public void removeCapability(int capability) { 3207369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mNetworkCapabilities.removeCapability(capability); 3217369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mNetworkAgent.sendNetworkCapabilities(mNetworkCapabilities); 3227369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti } 3237369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti 324e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti public void setSignalStrength(int signalStrength) { 325e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti mNetworkCapabilities.setSignalStrength(signalStrength); 326e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti mNetworkAgent.sendNetworkCapabilities(mNetworkCapabilities); 327e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti } 328e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti 329e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen public void connectWithoutInternet() { 330e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mNetworkInfo.setDetailedState(DetailedState.CONNECTED, null, null); 331e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mNetworkAgent.sendNetworkInfo(mNetworkInfo); 332e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen } 333e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen 334d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen /** 335e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen * Transition this NetworkAgent to CONNECTED state with NET_CAPABILITY_INTERNET. 336d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen * @param validated Indicate if network should pretend to be validated. 337d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen */ 338d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen public void connect(boolean validated) { 339b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti assertEquals("MockNetworkAgents can only be connected once", 340b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti mNetworkInfo.getDetailedState(), DetailedState.IDLE); 341d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen assertFalse(mNetworkCapabilities.hasCapability(NET_CAPABILITY_INTERNET)); 342d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen 343d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen NetworkCallback callback = null; 344d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen final ConditionVariable validatedCv = new ConditionVariable(); 345d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen if (validated) { 346cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen mWrappedNetworkMonitor.gen204ProbeResult = 204; 347d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen NetworkRequest request = new NetworkRequest.Builder() 348d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen .addTransportType(mNetworkCapabilities.getTransportTypes()[0]) 349d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen .build(); 350d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen callback = new NetworkCallback() { 351d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen public void onCapabilitiesChanged(Network network, 352d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen NetworkCapabilities networkCapabilities) { 353cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen if (network.equals(getNetwork()) && 354cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen networkCapabilities.hasCapability(NET_CAPABILITY_VALIDATED)) { 355d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen validatedCv.open(); 356d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen } 357d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen } 358d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen }; 359cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen mCm.registerNetworkCallback(request, callback); 360d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen } 361cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen addCapability(NET_CAPABILITY_INTERNET); 362d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen 363e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen connectWithoutInternet(); 364d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen 365d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen if (validated) { 366d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen // Wait for network to validate. 3673d911469a190437fe936103e861bfa171841fbd6Paul Jensen waitFor(validatedCv); 368cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen mWrappedNetworkMonitor.gen204ProbeResult = 500; 369d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen } 370d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen 371d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen if (callback != null) mCm.unregisterNetworkCallback(callback); 372d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen } 373d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen 3742324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen public void connectWithCaptivePortal(String redirectUrl) { 375cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen mWrappedNetworkMonitor.gen204ProbeResult = 200; 3762324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen mWrappedNetworkMonitor.gen204ProbeRedirectUrl = redirectUrl; 377cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen connect(false); 378cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen waitFor(new Criteria() { public boolean get() { 379cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen NetworkCapabilities caps = mCm.getNetworkCapabilities(getNetwork()); 380cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen return caps != null && caps.hasCapability(NET_CAPABILITY_CAPTIVE_PORTAL);} }); 381cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen mWrappedNetworkMonitor.gen204ProbeResult = 500; 3822324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen mWrappedNetworkMonitor.gen204ProbeRedirectUrl = null; 383cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen } 384cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen 385d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen public void disconnect() { 386d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mNetworkInfo.setDetailedState(DetailedState.DISCONNECTED, null, null); 387d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mNetworkAgent.sendNetworkInfo(mNetworkInfo); 388d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen } 389d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen 390d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen public Network getNetwork() { 391d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen return new Network(mNetworkAgent.netId); 392d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen } 393e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen 394e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen public ConditionVariable getDisconnectedCV() { 395e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen return mDisconnected; 396e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen } 397cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen 398cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen public WrappedNetworkMonitor getWrappedNetworkMonitor() { 399cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen return mWrappedNetworkMonitor; 400cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen } 4017914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 4027914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti public void sendLinkProperties(LinkProperties lp) { 4037914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti mNetworkAgent.sendLinkProperties(lp); 4047914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti } 4057914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 4067914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti public void setStartKeepaliveError(int error) { 4077914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti mStartKeepaliveError = error; 4087914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti } 4097914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 4107914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti public void setStopKeepaliveError(int error) { 4117914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti mStopKeepaliveError = error; 4127914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti } 4137914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 4147914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti public void setExpectedKeepaliveSlot(Integer slot) { 4157914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti mExpectedKeepaliveSlot = slot; 4167914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti } 4172324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen 4182324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen public String waitForRedirectUrl() { 4192324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen assertTrue(mNetworkStatusReceived.block(TIMEOUT_MS)); 4202324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen return mRedirectUrl; 4212324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen } 422d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen } 423d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen 424ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti /** 425ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti * A NetworkFactory that allows tests to wait until any in-flight NetworkRequest add or remove 426ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti * operations have been processed. Before ConnectivityService can add or remove any requests, 427ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti * the factory must be told to expect those operations by calling expectAddRequests or 428ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti * expectRemoveRequests. 429ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti */ 430348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt private static class MockNetworkFactory extends NetworkFactory { 431cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen private final ConditionVariable mNetworkStartedCV = new ConditionVariable(); 432cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen private final ConditionVariable mNetworkStoppedCV = new ConditionVariable(); 433cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen private final AtomicBoolean mNetworkStarted = new AtomicBoolean(false); 434348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt 435ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti // Used to expect that requests be removed or added on a separate thread, without sleeping. 436ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti // Callers can call either expectAddRequests() or expectRemoveRequests() exactly once, then 437ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti // cause some other thread to add or remove requests, then call waitForRequests(). We can 438ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti // either expect requests to be added or removed, but not both, because CountDownLatch can 439ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti // only count in one direction. 440ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti private CountDownLatch mExpectations; 441ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti 442ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti // Whether we are currently expecting requests to be added or removed. Valid only if 443ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti // mExpectations is non-null. 444ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti private boolean mExpectingAdditions; 445ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti 446348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt public MockNetworkFactory(Looper looper, Context context, String logTag, 447348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt NetworkCapabilities filter) { 448348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt super(looper, context, logTag, filter); 449348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt } 450348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt 451348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt public int getMyRequestCount() { 452348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt return getRequestCount(); 453348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt } 454348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt 455348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt protected void startNetwork() { 456348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt mNetworkStarted.set(true); 4570a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen mNetworkStartedCV.open(); 458348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt } 459348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt 460348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt protected void stopNetwork() { 461348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt mNetworkStarted.set(false); 4620a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen mNetworkStoppedCV.open(); 463348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt } 464348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt 465348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt public boolean getMyStartRequested() { 466348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt return mNetworkStarted.get(); 467348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt } 4680a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen 4690a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen public ConditionVariable getNetworkStartedCV() { 4700a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen mNetworkStartedCV.close(); 4710a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen return mNetworkStartedCV; 4720a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen } 4730a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen 4740a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen public ConditionVariable getNetworkStoppedCV() { 4750a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen mNetworkStoppedCV.close(); 4760a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen return mNetworkStoppedCV; 4770a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen } 4780a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen 479ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti @Override 480ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti protected void handleAddRequest(NetworkRequest request, int score) { 481ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti // If we're expecting anything, we must be expecting additions. 482ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti if (mExpectations != null && !mExpectingAdditions) { 483ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti fail("Can't add requests while expecting requests to be removed"); 484ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti } 485ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti 486ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti // Add the request. 487ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti super.handleAddRequest(request, score); 488ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti 489ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti // Reduce the number of request additions we're waiting for. 490ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti if (mExpectingAdditions) { 491ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti assertTrue("Added more requests than expected", mExpectations.getCount() > 0); 492ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti mExpectations.countDown(); 493ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti } 4940a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen } 4950a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen 496ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti @Override 497ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti protected void handleRemoveRequest(NetworkRequest request) { 498ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti // If we're expecting anything, we must be expecting removals. 499ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti if (mExpectations != null && mExpectingAdditions) { 500ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti fail("Can't remove requests while expecting requests to be added"); 501ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti } 502ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti 503ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti // Remove the request. 504ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti super.handleRemoveRequest(request); 505ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti 506ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti // Reduce the number of request removals we're waiting for. 507ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti if (!mExpectingAdditions) { 508ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti assertTrue("Removed more requests than expected", mExpectations.getCount() > 0); 509ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti mExpectations.countDown(); 510ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti } 511ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti } 512ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti 513ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti private void assertNoExpectations() { 514ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti if (mExpectations != null) { 515ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti fail("Can't add expectation, " + mExpectations.getCount() + " already pending"); 516ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti } 517ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti } 518ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti 519ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti // Expects that count requests will be added. 520ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti public void expectAddRequests(final int count) { 521ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti assertNoExpectations(); 522ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti mExpectingAdditions = true; 523ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti mExpectations = new CountDownLatch(count); 5240a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen } 5250a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen 526ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti // Expects that count requests will be removed. 527ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti public void expectRemoveRequests(final int count) { 528ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti assertNoExpectations(); 529ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti mExpectingAdditions = false; 530ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti mExpectations = new CountDownLatch(count); 5310a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen } 5320a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen 533ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti // Waits for the expected request additions or removals to happen within a timeout. 534ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti public void waitForRequests() throws InterruptedException { 535ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti assertNotNull("Nothing to wait for", mExpectations); 536ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti mExpectations.await(TIMEOUT_MS, TimeUnit.MILLISECONDS); 537ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti final long count = mExpectations.getCount(); 538ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti final String msg = count + " requests still not " + 539ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti (mExpectingAdditions ? "added" : "removed") + 540ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti " after " + TIMEOUT_MS + " ms"; 541ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti assertEquals(msg, 0, count); 542ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti mExpectations = null; 5430a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen } 5440a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen 545ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti public void waitForNetworkRequests(final int count) throws InterruptedException { 546ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti waitForRequests(); 547ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti assertEquals(count, getMyRequestCount()); 5480a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen } 549348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt } 550348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt 551bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colitti private class FakeWakeupMessage extends WakeupMessage { 552bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colitti private static final int UNREASONABLY_LONG_WAIT = 1000; 553bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colitti 554bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colitti public FakeWakeupMessage(Context context, Handler handler, String cmdName, int cmd) { 555bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colitti super(context, handler, cmdName, cmd); 556bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colitti } 557bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colitti 558b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti public FakeWakeupMessage(Context context, Handler handler, String cmdName, int cmd, 559b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti int arg1, int arg2, Object obj) { 560b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti super(context, handler, cmdName, cmd, arg1, arg2, obj); 561b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti } 562b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti 563bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colitti @Override 564bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colitti public void schedule(long when) { 565bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colitti long delayMs = when - SystemClock.elapsedRealtime(); 566bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colitti if (delayMs < 0) delayMs = 0; 567bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colitti if (delayMs > UNREASONABLY_LONG_WAIT) { 568bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colitti fail("Attempting to send msg more than " + UNREASONABLY_LONG_WAIT + 569bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colitti "ms into the future: " + delayMs); 570bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colitti } 571b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti Message msg = mHandler.obtainMessage(mCmd, mArg1, mArg2, mObj); 572b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti mHandler.sendMessageDelayed(msg, delayMs); 573bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colitti } 574bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colitti 575bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colitti @Override 576bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colitti public void cancel() { 577b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti mHandler.removeMessages(mCmd, mObj); 578bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colitti } 579bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colitti 580bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colitti @Override 581bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colitti public void onAlarm() { 582bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colitti throw new AssertionError("Should never happen. Update this fake."); 583bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colitti } 584bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colitti } 585bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colitti 586cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen // NetworkMonitor implementation allowing overriding of Internet connectivity probe result. 587cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen private class WrappedNetworkMonitor extends NetworkMonitor { 588cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen // HTTP response code fed back to NetworkMonitor for Internet connectivity probe. 589cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen public int gen204ProbeResult = 500; 5902324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen public String gen204ProbeRedirectUrl = null; 591cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen 592cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen public WrappedNetworkMonitor(Context context, Handler handler, 593f9fdf87af2fe0cb9b70ffa81a0912448f4ef4207Hugo Benichi NetworkAgentInfo networkAgentInfo, NetworkRequest defaultRequest, 594f9fdf87af2fe0cb9b70ffa81a0912448f4ef4207Hugo Benichi IpConnectivityLog log) { 595f9fdf87af2fe0cb9b70ffa81a0912448f4ef4207Hugo Benichi super(context, handler, networkAgentInfo, defaultRequest, log); 596cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen } 597cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen 598cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen @Override 5992324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen protected CaptivePortalProbeResult isCaptivePortal() { 600d953bf853d233026c9064e6a0c962b14cf4658d6Hugo Benichi return new CaptivePortalProbeResult(gen204ProbeResult, gen204ProbeRedirectUrl, null); 601cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen } 602cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen } 603cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen 604065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline private class WrappedAvoidBadWifiTracker extends AvoidBadWifiTracker { 605065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline public boolean configRestrictsAvoidBadWifi; 606065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline 607065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline public WrappedAvoidBadWifiTracker(Context c, Handler h, Runnable r) { 608065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline super(c, h, r); 609065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline } 610065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline 611065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline @Override 612065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline public boolean configRestrictsAvoidBadWifi() { 613065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline return configRestrictsAvoidBadWifi; 614065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline } 615065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline } 616065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline 617d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen private class WrappedConnectivityService extends ConnectivityService { 618065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline public WrappedAvoidBadWifiTracker wrappedAvoidBadWifiTracker; 619cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen private WrappedNetworkMonitor mLastCreatedNetworkMonitor; 620cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen 621d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen public WrappedConnectivityService(Context context, INetworkManagementService netManager, 622f9fdf87af2fe0cb9b70ffa81a0912448f4ef4207Hugo Benichi INetworkStatsService statsService, INetworkPolicyManager policyManager, 623f9fdf87af2fe0cb9b70ffa81a0912448f4ef4207Hugo Benichi IpConnectivityLog log) { 624f9fdf87af2fe0cb9b70ffa81a0912448f4ef4207Hugo Benichi super(context, netManager, statsService, policyManager, log); 625b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti mLingerDelayMs = TEST_LINGER_DELAY_MS; 626d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen } 627d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen 628d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen @Override 629e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti protected HandlerThread createHandlerThread() { 630e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti return new IdleableHandlerThread("WrappedConnectivityService"); 631e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti } 632e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti 633e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti @Override 634d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen protected int getDefaultTcpRwnd() { 635d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen // Prevent wrapped ConnectivityService from trying to write to SystemProperties. 636d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen return 0; 637d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen } 63867b0b0756b47c0ef0c50ce42f140d36c200f7984Paul Jensen 63967b0b0756b47c0ef0c50ce42f140d36c200f7984Paul Jensen @Override 64067b0b0756b47c0ef0c50ce42f140d36c200f7984Paul Jensen protected int reserveNetId() { 64167b0b0756b47c0ef0c50ce42f140d36c200f7984Paul Jensen while (true) { 64267b0b0756b47c0ef0c50ce42f140d36c200f7984Paul Jensen final int netId = super.reserveNetId(); 64367b0b0756b47c0ef0c50ce42f140d36c200f7984Paul Jensen 64467b0b0756b47c0ef0c50ce42f140d36c200f7984Paul Jensen // Don't overlap test NetIDs with real NetIDs as binding sockets to real networks 64567b0b0756b47c0ef0c50ce42f140d36c200f7984Paul Jensen // can have odd side-effects, like network validations succeeding. 64667b0b0756b47c0ef0c50ce42f140d36c200f7984Paul Jensen final Network[] networks = ConnectivityManager.from(getContext()).getAllNetworks(); 64767b0b0756b47c0ef0c50ce42f140d36c200f7984Paul Jensen boolean overlaps = false; 64867b0b0756b47c0ef0c50ce42f140d36c200f7984Paul Jensen for (Network network : networks) { 64967b0b0756b47c0ef0c50ce42f140d36c200f7984Paul Jensen if (netId == network.netId) { 65067b0b0756b47c0ef0c50ce42f140d36c200f7984Paul Jensen overlaps = true; 65167b0b0756b47c0ef0c50ce42f140d36c200f7984Paul Jensen break; 65267b0b0756b47c0ef0c50ce42f140d36c200f7984Paul Jensen } 65367b0b0756b47c0ef0c50ce42f140d36c200f7984Paul Jensen } 65467b0b0756b47c0ef0c50ce42f140d36c200f7984Paul Jensen if (overlaps) continue; 65567b0b0756b47c0ef0c50ce42f140d36c200f7984Paul Jensen 65667b0b0756b47c0ef0c50ce42f140d36c200f7984Paul Jensen return netId; 65767b0b0756b47c0ef0c50ce42f140d36c200f7984Paul Jensen } 65867b0b0756b47c0ef0c50ce42f140d36c200f7984Paul Jensen } 659cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen 660cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen @Override 661cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen public NetworkMonitor createNetworkMonitor(Context context, Handler handler, 662cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen NetworkAgentInfo nai, NetworkRequest defaultRequest) { 663f9fdf87af2fe0cb9b70ffa81a0912448f4ef4207Hugo Benichi final WrappedNetworkMonitor monitor = new WrappedNetworkMonitor( 664f9fdf87af2fe0cb9b70ffa81a0912448f4ef4207Hugo Benichi context, handler, nai, defaultRequest, mock(IpConnectivityLog.class)); 665cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen mLastCreatedNetworkMonitor = monitor; 666cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen return monitor; 667cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen } 668cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen 669b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti @Override 670065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline public AvoidBadWifiTracker createAvoidBadWifiTracker( 671065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline Context c, Handler h, Runnable r) { 672065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline final WrappedAvoidBadWifiTracker tracker = new WrappedAvoidBadWifiTracker(c, h, r); 673065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline return tracker; 674065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline } 675065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline 676065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline public WrappedAvoidBadWifiTracker getAvoidBadWifiTracker() { 677065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline return (WrappedAvoidBadWifiTracker) mAvoidBadWifiTracker; 678b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti } 679b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti 680165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti @Override 681065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline public WakeupMessage makeWakeupMessage( 682065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline Context context, Handler handler, String cmdName, int cmd, Object obj) { 683065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline return new FakeWakeupMessage(context, handler, cmdName, cmd, 0, 0, obj); 684165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti } 685165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti 686cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen public WrappedNetworkMonitor getLastCreatedWrappedNetworkMonitor() { 687cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen return mLastCreatedNetworkMonitor; 688cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen } 689cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen 690e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti public void waitForIdle(int timeoutMs) { 691e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti ((IdleableHandlerThread) mHandlerThread).waitForIdle(timeoutMs); 692cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen } 693e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti 694e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti public void waitForIdle() { 695ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti waitForIdle(TIMEOUT_MS); 696e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti } 697d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen } 698d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen 6990a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen private interface Criteria { 7000a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen public boolean get(); 7010a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen } 7020a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen 7033d911469a190437fe936103e861bfa171841fbd6Paul Jensen /** 7043d911469a190437fe936103e861bfa171841fbd6Paul Jensen * Wait up to 500ms for {@code criteria.get()} to become true, polling. 7053d911469a190437fe936103e861bfa171841fbd6Paul Jensen * Fails if 500ms goes by before {@code criteria.get()} to become true. 7063d911469a190437fe936103e861bfa171841fbd6Paul Jensen */ 7070a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen static private void waitFor(Criteria criteria) { 7080a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen int delays = 0; 7090a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen while (!criteria.get()) { 7100a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen try { 711bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colitti Thread.sleep(50); 7120a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen } catch (InterruptedException e) { 7130a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen } 714bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colitti if (++delays == 10) fail(); 7150a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen } 7160a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen } 7170a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen 7183d911469a190437fe936103e861bfa171841fbd6Paul Jensen /** 719ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti * Wait up to TIMEOUT_MS for {@code conditionVariable} to open. 720ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti * Fails if TIMEOUT_MS goes by before {@code conditionVariable} opens. 7213d911469a190437fe936103e861bfa171841fbd6Paul Jensen */ 7223d911469a190437fe936103e861bfa171841fbd6Paul Jensen static private void waitFor(ConditionVariable conditionVariable) { 723ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti assertTrue(conditionVariable.block(TIMEOUT_MS)); 7243d911469a190437fe936103e861bfa171841fbd6Paul Jensen } 7253d911469a190437fe936103e861bfa171841fbd6Paul Jensen 726d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen @Override 727d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen public void setUp() throws Exception { 728d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen super.setUp(); 729d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen 7302c1a253f2297bf9682105924aee828a0c5897027Lorenzo Colitti // InstrumentationTestRunner prepares a looper, but AndroidJUnitRunner does not. 7312c1a253f2297bf9682105924aee828a0c5897027Lorenzo Colitti // http://b/25897652 . 7322c1a253f2297bf9682105924aee828a0c5897027Lorenzo Colitti if (Looper.myLooper() == null) { 7332c1a253f2297bf9682105924aee828a0c5897027Lorenzo Colitti Looper.prepare(); 7342c1a253f2297bf9682105924aee828a0c5897027Lorenzo Colitti } 7352c1a253f2297bf9682105924aee828a0c5897027Lorenzo Colitti 736d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mServiceContext = new MockContext(getContext()); 73783fa2588f662aae0b612da91fd09d205cf2e8cb0Lorenzo Colitti mService = new WrappedConnectivityService(mServiceContext, 73883fa2588f662aae0b612da91fd09d205cf2e8cb0Lorenzo Colitti mock(INetworkManagementService.class), 73983fa2588f662aae0b612da91fd09d205cf2e8cb0Lorenzo Colitti mock(INetworkStatsService.class), 740f9fdf87af2fe0cb9b70ffa81a0912448f4ef4207Hugo Benichi mock(INetworkPolicyManager.class), 741f9fdf87af2fe0cb9b70ffa81a0912448f4ef4207Hugo Benichi mock(IpConnectivityLog.class)); 742d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen 743d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mService.systemReady(); 744531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti mCm = new WrappedConnectivityManager(getContext(), mService); 745531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti mCm.bindProcessToNetwork(null); 746d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen } 747d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen 7486ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti public void tearDown() throws Exception { 749e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti setMobileDataAlwaysOn(false); 7506ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti if (mCellNetworkAgent != null) { mCellNetworkAgent.disconnect(); } 7516ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti if (mWiFiNetworkAgent != null) { mWiFiNetworkAgent.disconnect(); } 7526ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti mCellNetworkAgent = mWiFiNetworkAgent = null; 7536ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti super.tearDown(); 7546ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti } 7556ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti 756d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen private int transportToLegacyType(int transport) { 757d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen switch (transport) { 7587369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti case TRANSPORT_ETHERNET: 7597369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti return TYPE_ETHERNET; 760d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen case TRANSPORT_WIFI: 761d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen return TYPE_WIFI; 762d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen case TRANSPORT_CELLULAR: 763d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen return TYPE_MOBILE; 764d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen default: 7657369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti throw new IllegalStateException("Unknown transport " + transport); 766d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen } 767d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen } 768d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen 769d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen private void verifyActiveNetwork(int transport) { 770d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen // Test getActiveNetworkInfo() 771d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen assertNotNull(mCm.getActiveNetworkInfo()); 772d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen assertEquals(transportToLegacyType(transport), mCm.getActiveNetworkInfo().getType()); 773d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen // Test getActiveNetwork() 774d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen assertNotNull(mCm.getActiveNetwork()); 775d2baf792f8b7ae46aa6a35cff25eb7e3923f5125Robin Lee assertEquals(mCm.getActiveNetwork(), mCm.getActiveNetworkForUid(Process.myUid())); 776d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen switch (transport) { 777d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen case TRANSPORT_WIFI: 778d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen assertEquals(mCm.getActiveNetwork(), mWiFiNetworkAgent.getNetwork()); 779d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen break; 780d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen case TRANSPORT_CELLULAR: 781d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen assertEquals(mCm.getActiveNetwork(), mCellNetworkAgent.getNetwork()); 782d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen break; 783d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen default: 784d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen throw new IllegalStateException("Unknown transport" + transport); 785d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen } 786d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen // Test getNetworkInfo(Network) 787d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen assertNotNull(mCm.getNetworkInfo(mCm.getActiveNetwork())); 788d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen assertEquals(transportToLegacyType(transport), mCm.getNetworkInfo(mCm.getActiveNetwork()).getType()); 789d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen // Test getNetworkCapabilities(Network) 790d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen assertNotNull(mCm.getNetworkCapabilities(mCm.getActiveNetwork())); 791d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen assertTrue(mCm.getNetworkCapabilities(mCm.getActiveNetwork()).hasTransport(transport)); 792d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen } 793d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen 794d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen private void verifyNoNetwork() { 795d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen // Test getActiveNetworkInfo() 796d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen assertNull(mCm.getActiveNetworkInfo()); 797d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen // Test getActiveNetwork() 798d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen assertNull(mCm.getActiveNetwork()); 799d2baf792f8b7ae46aa6a35cff25eb7e3923f5125Robin Lee assertNull(mCm.getActiveNetworkForUid(Process.myUid())); 800d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen // Test getAllNetworks() 801d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen assertEquals(0, mCm.getAllNetworks().length); 802d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen } 803d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen 804d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen /** 805d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen * Return a ConditionVariable that opens when {@code count} numbers of CONNECTIVITY_ACTION 806d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen * broadcasts are received. 807d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen */ 808d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen private ConditionVariable waitForConnectivityBroadcasts(final int count) { 809d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen final ConditionVariable cv = new ConditionVariable(); 810d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mServiceContext.registerReceiver(new BroadcastReceiver() { 811d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen private int remaining = count; 812d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen public void onReceive(Context context, Intent intent) { 813d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen if (--remaining == 0) { 814d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen cv.open(); 815d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mServiceContext.unregisterReceiver(this); 816d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen } 817d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen } 818d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen }, new IntentFilter(CONNECTIVITY_ACTION)); 819d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen return cv; 820d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen } 821d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen 822d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen @LargeTest 823d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen public void testLingering() throws Exception { 824d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen verifyNoNetwork(); 825d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); 826d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 827d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen assertNull(mCm.getActiveNetworkInfo()); 828d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen assertNull(mCm.getActiveNetwork()); 829d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen // Test bringing up validated cellular. 830d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen ConditionVariable cv = waitForConnectivityBroadcasts(1); 831d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mCellNetworkAgent.connect(true); 8323d911469a190437fe936103e861bfa171841fbd6Paul Jensen waitFor(cv); 833d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen verifyActiveNetwork(TRANSPORT_CELLULAR); 834d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen assertEquals(2, mCm.getAllNetworks().length); 835d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen assertTrue(mCm.getAllNetworks()[0].equals(mCm.getActiveNetwork()) || 836d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mCm.getAllNetworks()[1].equals(mCm.getActiveNetwork())); 837d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen assertTrue(mCm.getAllNetworks()[0].equals(mWiFiNetworkAgent.getNetwork()) || 838d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mCm.getAllNetworks()[1].equals(mWiFiNetworkAgent.getNetwork())); 839d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen // Test bringing up validated WiFi. 840d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen cv = waitForConnectivityBroadcasts(2); 841d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mWiFiNetworkAgent.connect(true); 8423d911469a190437fe936103e861bfa171841fbd6Paul Jensen waitFor(cv); 843d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen verifyActiveNetwork(TRANSPORT_WIFI); 844d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen assertEquals(2, mCm.getAllNetworks().length); 845d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen assertTrue(mCm.getAllNetworks()[0].equals(mCm.getActiveNetwork()) || 846d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mCm.getAllNetworks()[1].equals(mCm.getActiveNetwork())); 847d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen assertTrue(mCm.getAllNetworks()[0].equals(mCellNetworkAgent.getNetwork()) || 848d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mCm.getAllNetworks()[1].equals(mCellNetworkAgent.getNetwork())); 849d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen // Test cellular linger timeout. 850bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colitti waitFor(new Criteria() { 851bfecba2938bd01299c74bc7d7cf0191c1908776aLorenzo Colitti public boolean get() { return mCm.getAllNetworks().length == 1; } }); 852d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen verifyActiveNetwork(TRANSPORT_WIFI); 853d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen assertEquals(1, mCm.getAllNetworks().length); 854d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen assertEquals(mCm.getAllNetworks()[0], mCm.getActiveNetwork()); 855d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen // Test WiFi disconnect. 856d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen cv = waitForConnectivityBroadcasts(1); 857d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mWiFiNetworkAgent.disconnect(); 8583d911469a190437fe936103e861bfa171841fbd6Paul Jensen waitFor(cv); 859d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen verifyNoNetwork(); 860d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen } 861d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen 862d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen @LargeTest 863d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen public void testValidatedCellularOutscoresUnvalidatedWiFi() throws Exception { 864d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen // Test bringing up unvalidated WiFi 865d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 866d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen ConditionVariable cv = waitForConnectivityBroadcasts(1); 867d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mWiFiNetworkAgent.connect(false); 8683d911469a190437fe936103e861bfa171841fbd6Paul Jensen waitFor(cv); 869d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen verifyActiveNetwork(TRANSPORT_WIFI); 870d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen // Test bringing up unvalidated cellular 871d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); 872d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mCellNetworkAgent.connect(false); 873e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti mService.waitForIdle(); 874d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen verifyActiveNetwork(TRANSPORT_WIFI); 875d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen // Test cellular disconnect. 876d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mCellNetworkAgent.disconnect(); 877e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti mService.waitForIdle(); 878d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen verifyActiveNetwork(TRANSPORT_WIFI); 879d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen // Test bringing up validated cellular 880d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); 881d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen cv = waitForConnectivityBroadcasts(2); 882d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mCellNetworkAgent.connect(true); 8833d911469a190437fe936103e861bfa171841fbd6Paul Jensen waitFor(cv); 884d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen verifyActiveNetwork(TRANSPORT_CELLULAR); 885d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen // Test cellular disconnect. 886d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen cv = waitForConnectivityBroadcasts(2); 887d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mCellNetworkAgent.disconnect(); 8883d911469a190437fe936103e861bfa171841fbd6Paul Jensen waitFor(cv); 889d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen verifyActiveNetwork(TRANSPORT_WIFI); 890d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen // Test WiFi disconnect. 891d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen cv = waitForConnectivityBroadcasts(1); 892d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mWiFiNetworkAgent.disconnect(); 8933d911469a190437fe936103e861bfa171841fbd6Paul Jensen waitFor(cv); 894d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen verifyNoNetwork(); 895d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen } 896d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen 897d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen @LargeTest 898d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen public void testUnvalidatedWifiOutscoresUnvalidatedCellular() throws Exception { 899d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen // Test bringing up unvalidated cellular. 900d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); 901d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen ConditionVariable cv = waitForConnectivityBroadcasts(1); 902d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mCellNetworkAgent.connect(false); 9033d911469a190437fe936103e861bfa171841fbd6Paul Jensen waitFor(cv); 904d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen verifyActiveNetwork(TRANSPORT_CELLULAR); 905d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen // Test bringing up unvalidated WiFi. 906d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 907d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen cv = waitForConnectivityBroadcasts(2); 908d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mWiFiNetworkAgent.connect(false); 9093d911469a190437fe936103e861bfa171841fbd6Paul Jensen waitFor(cv); 910d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen verifyActiveNetwork(TRANSPORT_WIFI); 911d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen // Test WiFi disconnect. 912d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen cv = waitForConnectivityBroadcasts(2); 913d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mWiFiNetworkAgent.disconnect(); 9143d911469a190437fe936103e861bfa171841fbd6Paul Jensen waitFor(cv); 915d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen verifyActiveNetwork(TRANSPORT_CELLULAR); 916d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen // Test cellular disconnect. 917d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen cv = waitForConnectivityBroadcasts(1); 918d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen mCellNetworkAgent.disconnect(); 9193d911469a190437fe936103e861bfa171841fbd6Paul Jensen waitFor(cv); 920d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen verifyNoNetwork(); 921d7b6ca91e9ecac15949a4484d560cfab5833a431Paul Jensen } 922fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey 923348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt @LargeTest 924e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen public void testUnlingeringDoesNotValidate() throws Exception { 925cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen // Test bringing up unvalidated WiFi. 926cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 927e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen ConditionVariable cv = waitForConnectivityBroadcasts(1); 928cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen mWiFiNetworkAgent.connect(false); 929e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen waitFor(cv); 930cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen verifyActiveNetwork(TRANSPORT_WIFI); 931cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen assertFalse(mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()).hasCapability( 932e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen NET_CAPABILITY_VALIDATED)); 933cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen // Test bringing up validated cellular. 934cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); 935e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen cv = waitForConnectivityBroadcasts(2); 936cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen mCellNetworkAgent.connect(true); 937e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen waitFor(cv); 938cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen verifyActiveNetwork(TRANSPORT_CELLULAR); 939cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen assertFalse(mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()).hasCapability( 940e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen NET_CAPABILITY_VALIDATED)); 941cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen // Test cellular disconnect. 942e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen cv = waitForConnectivityBroadcasts(2); 943cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen mCellNetworkAgent.disconnect(); 944e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen waitFor(cv); 945cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen verifyActiveNetwork(TRANSPORT_WIFI); 946e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen // Unlingering a network should not cause it to be marked as validated. 947cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen assertFalse(mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()).hasCapability( 948e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen NET_CAPABILITY_VALIDATED)); 949e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen } 950e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen 951e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen @LargeTest 9523d911469a190437fe936103e861bfa171841fbd6Paul Jensen public void testCellularOutscoresWeakWifi() throws Exception { 9533d911469a190437fe936103e861bfa171841fbd6Paul Jensen // Test bringing up validated cellular. 9543d911469a190437fe936103e861bfa171841fbd6Paul Jensen mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); 9553d911469a190437fe936103e861bfa171841fbd6Paul Jensen ConditionVariable cv = waitForConnectivityBroadcasts(1); 9563d911469a190437fe936103e861bfa171841fbd6Paul Jensen mCellNetworkAgent.connect(true); 9573d911469a190437fe936103e861bfa171841fbd6Paul Jensen waitFor(cv); 9583d911469a190437fe936103e861bfa171841fbd6Paul Jensen verifyActiveNetwork(TRANSPORT_CELLULAR); 9593d911469a190437fe936103e861bfa171841fbd6Paul Jensen // Test bringing up validated WiFi. 9603d911469a190437fe936103e861bfa171841fbd6Paul Jensen mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 9613d911469a190437fe936103e861bfa171841fbd6Paul Jensen cv = waitForConnectivityBroadcasts(2); 9623d911469a190437fe936103e861bfa171841fbd6Paul Jensen mWiFiNetworkAgent.connect(true); 9633d911469a190437fe936103e861bfa171841fbd6Paul Jensen waitFor(cv); 9643d911469a190437fe936103e861bfa171841fbd6Paul Jensen verifyActiveNetwork(TRANSPORT_WIFI); 9653d911469a190437fe936103e861bfa171841fbd6Paul Jensen // Test WiFi getting really weak. 9663d911469a190437fe936103e861bfa171841fbd6Paul Jensen cv = waitForConnectivityBroadcasts(2); 9673d911469a190437fe936103e861bfa171841fbd6Paul Jensen mWiFiNetworkAgent.adjustScore(-11); 9683d911469a190437fe936103e861bfa171841fbd6Paul Jensen waitFor(cv); 9693d911469a190437fe936103e861bfa171841fbd6Paul Jensen verifyActiveNetwork(TRANSPORT_CELLULAR); 9703d911469a190437fe936103e861bfa171841fbd6Paul Jensen // Test WiFi restoring signal strength. 9713d911469a190437fe936103e861bfa171841fbd6Paul Jensen cv = waitForConnectivityBroadcasts(2); 9723d911469a190437fe936103e861bfa171841fbd6Paul Jensen mWiFiNetworkAgent.adjustScore(11); 9733d911469a190437fe936103e861bfa171841fbd6Paul Jensen waitFor(cv); 9743d911469a190437fe936103e861bfa171841fbd6Paul Jensen verifyActiveNetwork(TRANSPORT_WIFI); 9753d911469a190437fe936103e861bfa171841fbd6Paul Jensen } 9763d911469a190437fe936103e861bfa171841fbd6Paul Jensen 977e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen @LargeTest 978e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen public void testReapingNetwork() throws Exception { 979e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen // Test bringing up WiFi without NET_CAPABILITY_INTERNET. 980e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen // Expect it to be torn down immediately because it satisfies no requests. 981e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 982e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen ConditionVariable cv = mWiFiNetworkAgent.getDisconnectedCV(); 983e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mWiFiNetworkAgent.connectWithoutInternet(); 984e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen waitFor(cv); 985e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen // Test bringing up cellular without NET_CAPABILITY_INTERNET. 986e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen // Expect it to be torn down immediately because it satisfies no requests. 987e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 988e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen cv = mCellNetworkAgent.getDisconnectedCV(); 989e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mCellNetworkAgent.connectWithoutInternet(); 990e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen waitFor(cv); 991e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen // Test bringing up validated WiFi. 992e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 993e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen cv = waitForConnectivityBroadcasts(1); 994e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mWiFiNetworkAgent.connect(true); 995e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen waitFor(cv); 996e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen verifyActiveNetwork(TRANSPORT_WIFI); 997e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen // Test bringing up unvalidated cellular. 998e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen // Expect it to be torn down because it could never be the highest scoring network 999e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen // satisfying the default request even if it validated. 1000e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); 1001e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen cv = mCellNetworkAgent.getDisconnectedCV(); 1002e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mCellNetworkAgent.connect(false); 1003e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen waitFor(cv); 1004e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen verifyActiveNetwork(TRANSPORT_WIFI); 1005e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen cv = mWiFiNetworkAgent.getDisconnectedCV(); 1006e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mWiFiNetworkAgent.disconnect(); 1007e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen waitFor(cv); 1008e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen } 1009e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen 1010e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen @LargeTest 1011e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen public void testCellularFallback() throws Exception { 1012e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen // Test bringing up validated cellular. 1013e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); 1014e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen ConditionVariable cv = waitForConnectivityBroadcasts(1); 1015e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mCellNetworkAgent.connect(true); 1016e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen waitFor(cv); 1017e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen verifyActiveNetwork(TRANSPORT_CELLULAR); 1018e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen // Test bringing up validated WiFi. 1019e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 1020e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen cv = waitForConnectivityBroadcasts(2); 1021e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mWiFiNetworkAgent.connect(true); 1022e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen waitFor(cv); 1023e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen verifyActiveNetwork(TRANSPORT_WIFI); 1024e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen // Reevaluate WiFi (it'll instantly fail DNS). 1025e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen cv = waitForConnectivityBroadcasts(2); 1026e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen assertTrue(mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()).hasCapability( 1027e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen NET_CAPABILITY_VALIDATED)); 1028e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mCm.reportBadNetwork(mWiFiNetworkAgent.getNetwork()); 1029e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen // Should quickly fall back to Cellular. 1030e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen waitFor(cv); 1031e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen assertFalse(mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()).hasCapability( 1032e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen NET_CAPABILITY_VALIDATED)); 1033e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen verifyActiveNetwork(TRANSPORT_CELLULAR); 1034e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen // Reevaluate cellular (it'll instantly fail DNS). 1035e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen cv = waitForConnectivityBroadcasts(2); 1036e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen assertTrue(mCm.getNetworkCapabilities(mCellNetworkAgent.getNetwork()).hasCapability( 1037e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen NET_CAPABILITY_VALIDATED)); 1038e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mCm.reportBadNetwork(mCellNetworkAgent.getNetwork()); 1039e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen // Should quickly fall back to WiFi. 1040e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen waitFor(cv); 1041e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen assertFalse(mCm.getNetworkCapabilities(mCellNetworkAgent.getNetwork()).hasCapability( 1042e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen NET_CAPABILITY_VALIDATED)); 1043e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen assertFalse(mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()).hasCapability( 1044e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen NET_CAPABILITY_VALIDATED)); 1045e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen verifyActiveNetwork(TRANSPORT_WIFI); 1046e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen } 1047e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen 1048e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen @LargeTest 1049e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen public void testWiFiFallback() throws Exception { 1050e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen // Test bringing up unvalidated WiFi. 1051e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 1052e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen ConditionVariable cv = waitForConnectivityBroadcasts(1); 1053e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mWiFiNetworkAgent.connect(false); 1054e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen waitFor(cv); 1055e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen verifyActiveNetwork(TRANSPORT_WIFI); 1056e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen // Test bringing up validated cellular. 1057e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); 1058e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen cv = waitForConnectivityBroadcasts(2); 1059e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mCellNetworkAgent.connect(true); 1060e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen waitFor(cv); 1061e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen verifyActiveNetwork(TRANSPORT_CELLULAR); 1062e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen // Reevaluate cellular (it'll instantly fail DNS). 1063e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen cv = waitForConnectivityBroadcasts(2); 1064e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen assertTrue(mCm.getNetworkCapabilities(mCellNetworkAgent.getNetwork()).hasCapability( 1065e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen NET_CAPABILITY_VALIDATED)); 1066e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mCm.reportBadNetwork(mCellNetworkAgent.getNetwork()); 1067e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen // Should quickly fall back to WiFi. 1068e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen waitFor(cv); 1069e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen assertFalse(mCm.getNetworkCapabilities(mCellNetworkAgent.getNetwork()).hasCapability( 1070e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen NET_CAPABILITY_VALIDATED)); 1071e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen verifyActiveNetwork(TRANSPORT_WIFI); 1072e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen } 1073e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen 10743d911469a190437fe936103e861bfa171841fbd6Paul Jensen enum CallbackState { 10753d911469a190437fe936103e861bfa171841fbd6Paul Jensen NONE, 10763d911469a190437fe936103e861bfa171841fbd6Paul Jensen AVAILABLE, 1077acdd639513858629f804316e9dd4105634504a90Erik Kline NETWORK_CAPABILITIES, 1078acdd639513858629f804316e9dd4105634504a90Erik Kline LINK_PROPERTIES, 10793d911469a190437fe936103e861bfa171841fbd6Paul Jensen LOSING, 10803d911469a190437fe936103e861bfa171841fbd6Paul Jensen LOST 10813d911469a190437fe936103e861bfa171841fbd6Paul Jensen } 10823d911469a190437fe936103e861bfa171841fbd6Paul Jensen 108383fa2588f662aae0b612da91fd09d205cf2e8cb0Lorenzo Colitti /** 108483fa2588f662aae0b612da91fd09d205cf2e8cb0Lorenzo Colitti * Utility NetworkCallback for testing. The caller must explicitly test for all the callbacks 108583fa2588f662aae0b612da91fd09d205cf2e8cb0Lorenzo Colitti * this class receives, by calling expectCallback() exactly once each time a callback is 108683fa2588f662aae0b612da91fd09d205cf2e8cb0Lorenzo Colitti * received. assertNoCallback may be called at any time. 108783fa2588f662aae0b612da91fd09d205cf2e8cb0Lorenzo Colitti */ 10883d911469a190437fe936103e861bfa171841fbd6Paul Jensen private class TestNetworkCallback extends NetworkCallback { 108909e202103d160efcb721e3b1ed699416e2b3a5bbLorenzo Colitti // Chosen to be much less than the linger timeout. This ensures that we can distinguish 109009e202103d160efcb721e3b1ed699416e2b3a5bbLorenzo Colitti // between a LOST callback that arrives immediately and a LOST callback that arrives after 109109e202103d160efcb721e3b1ed699416e2b3a5bbLorenzo Colitti // the linger timeout. 109209e202103d160efcb721e3b1ed699416e2b3a5bbLorenzo Colitti private final static int TIMEOUT_MS = 50; 109309e202103d160efcb721e3b1ed699416e2b3a5bbLorenzo Colitti 10946ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti private class CallbackInfo { 10956ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti public final CallbackState state; 10966ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti public final Network network; 1097b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti public Object arg; 1098b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti public CallbackInfo(CallbackState s, Network n, Object o) { 1099b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti state = s; network = n; arg = o; 1100b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti } 11016ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti public String toString() { return String.format("%s (%s)", state, network); } 11026ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti public boolean equals(Object o) { 11036ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti if (!(o instanceof CallbackInfo)) return false; 1104b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti // Ignore timeMs, since it's unpredictable. 11056ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti CallbackInfo other = (CallbackInfo) o; 11066ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti return state == other.state && Objects.equals(network, other.network); 11076ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti } 11086ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti } 11096ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti private final LinkedBlockingQueue<CallbackInfo> mCallbacks = new LinkedBlockingQueue<>(); 11106ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti 1111acdd639513858629f804316e9dd4105634504a90Erik Kline protected void setLastCallback(CallbackState state, Network network, Object o) { 1112b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti mCallbacks.offer(new CallbackInfo(state, network, o)); 11136ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti } 11143d911469a190437fe936103e861bfa171841fbd6Paul Jensen 1115acdd639513858629f804316e9dd4105634504a90Erik Kline @Override 11163d911469a190437fe936103e861bfa171841fbd6Paul Jensen public void onAvailable(Network network) { 1117b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti setLastCallback(CallbackState.AVAILABLE, network, null); 11183d911469a190437fe936103e861bfa171841fbd6Paul Jensen } 11193d911469a190437fe936103e861bfa171841fbd6Paul Jensen 1120acdd639513858629f804316e9dd4105634504a90Erik Kline @Override 11213d911469a190437fe936103e861bfa171841fbd6Paul Jensen public void onLosing(Network network, int maxMsToLive) { 1122b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti setLastCallback(CallbackState.LOSING, network, maxMsToLive /* autoboxed int */); 11233d911469a190437fe936103e861bfa171841fbd6Paul Jensen } 11243d911469a190437fe936103e861bfa171841fbd6Paul Jensen 1125acdd639513858629f804316e9dd4105634504a90Erik Kline @Override 11263d911469a190437fe936103e861bfa171841fbd6Paul Jensen public void onLost(Network network) { 1127b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti setLastCallback(CallbackState.LOST, network, null); 1128a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline } 1129a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline 1130b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti void expectCallback(CallbackState state, MockNetworkAgent mockAgent, int timeoutMs) { 11316ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti CallbackInfo expected = new CallbackInfo( 1132b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti state, (mockAgent != null) ? mockAgent.getNetwork() : null, 0); 1133b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti CallbackInfo actual; 11346ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti try { 1135b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti actual = mCallbacks.poll(timeoutMs, TimeUnit.MILLISECONDS); 1136b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti assertEquals("Unexpected callback:", expected, actual); 11376ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti } catch (InterruptedException e) { 11386ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti fail("Did not receive expected " + expected + " after " + TIMEOUT_MS + "ms"); 1139b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti actual = null; // Or the compiler can't tell it's never used uninitialized. 1140b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti } 1141b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti if (state == CallbackState.LOSING) { 1142b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti String msg = String.format( 1143b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti "Invalid linger time value %d, must be between %d and %d", 1144b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti actual.arg, 0, TEST_LINGER_DELAY_MS); 1145b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti int maxMsToLive = (Integer) actual.arg; 1146b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti assertTrue(msg, 0 <= maxMsToLive && maxMsToLive <= TEST_LINGER_DELAY_MS); 1147a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline } 11483d911469a190437fe936103e861bfa171841fbd6Paul Jensen } 11493d911469a190437fe936103e861bfa171841fbd6Paul Jensen 1150b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti void expectCallback(CallbackState state, MockNetworkAgent mockAgent) { 1151b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti expectCallback(state, mockAgent, TIMEOUT_MS); 1152b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti } 1153b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti 115483fa2588f662aae0b612da91fd09d205cf2e8cb0Lorenzo Colitti void assertNoCallback() { 11556ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti mService.waitForIdle(); 11566ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti CallbackInfo c = mCallbacks.peek(); 11576ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti assertNull("Unexpected callback: " + c, c); 11586ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti } 11596ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti } 11606ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti 11616ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti // Can't be part of TestNetworkCallback because "cannot be declared static; static methods can 11626ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti // only be declared in a static or top level type". 11636ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti static void assertNoCallbacks(TestNetworkCallback ... callbacks) { 11646ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti for (TestNetworkCallback c : callbacks) { 11656ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti c.assertNoCallback(); 11663d911469a190437fe936103e861bfa171841fbd6Paul Jensen } 11673d911469a190437fe936103e861bfa171841fbd6Paul Jensen } 11683d911469a190437fe936103e861bfa171841fbd6Paul Jensen 11693d911469a190437fe936103e861bfa171841fbd6Paul Jensen @LargeTest 11703d911469a190437fe936103e861bfa171841fbd6Paul Jensen public void testStateChangeNetworkCallbacks() throws Exception { 11716ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti final TestNetworkCallback genericNetworkCallback = new TestNetworkCallback(); 11723d911469a190437fe936103e861bfa171841fbd6Paul Jensen final TestNetworkCallback wifiNetworkCallback = new TestNetworkCallback(); 11733d911469a190437fe936103e861bfa171841fbd6Paul Jensen final TestNetworkCallback cellNetworkCallback = new TestNetworkCallback(); 11746ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti final NetworkRequest genericRequest = new NetworkRequest.Builder() 11756ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti .clearCapabilities().build(); 11763d911469a190437fe936103e861bfa171841fbd6Paul Jensen final NetworkRequest wifiRequest = new NetworkRequest.Builder() 11773d911469a190437fe936103e861bfa171841fbd6Paul Jensen .addTransportType(TRANSPORT_WIFI).build(); 11783d911469a190437fe936103e861bfa171841fbd6Paul Jensen final NetworkRequest cellRequest = new NetworkRequest.Builder() 11793d911469a190437fe936103e861bfa171841fbd6Paul Jensen .addTransportType(TRANSPORT_CELLULAR).build(); 11806ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti mCm.registerNetworkCallback(genericRequest, genericNetworkCallback); 11813d911469a190437fe936103e861bfa171841fbd6Paul Jensen mCm.registerNetworkCallback(wifiRequest, wifiNetworkCallback); 11823d911469a190437fe936103e861bfa171841fbd6Paul Jensen mCm.registerNetworkCallback(cellRequest, cellNetworkCallback); 11833d911469a190437fe936103e861bfa171841fbd6Paul Jensen 11843d911469a190437fe936103e861bfa171841fbd6Paul Jensen // Test unvalidated networks 11853d911469a190437fe936103e861bfa171841fbd6Paul Jensen ConditionVariable cv = waitForConnectivityBroadcasts(1); 11863d911469a190437fe936103e861bfa171841fbd6Paul Jensen mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); 11873d911469a190437fe936103e861bfa171841fbd6Paul Jensen mCellNetworkAgent.connect(false); 11886ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti genericNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 11896ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti cellNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 11903d911469a190437fe936103e861bfa171841fbd6Paul Jensen assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); 11913d911469a190437fe936103e861bfa171841fbd6Paul Jensen waitFor(cv); 11926ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti assertNoCallbacks(genericNetworkCallback, wifiNetworkCallback, cellNetworkCallback); 11933d911469a190437fe936103e861bfa171841fbd6Paul Jensen 11943d911469a190437fe936103e861bfa171841fbd6Paul Jensen // This should not trigger spurious onAvailable() callbacks, b/21762680. 11953d911469a190437fe936103e861bfa171841fbd6Paul Jensen mCellNetworkAgent.adjustScore(-1); 1196e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti mService.waitForIdle(); 11976ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti assertNoCallbacks(genericNetworkCallback, wifiNetworkCallback, cellNetworkCallback); 11983d911469a190437fe936103e861bfa171841fbd6Paul Jensen assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); 11993d911469a190437fe936103e861bfa171841fbd6Paul Jensen 12003d911469a190437fe936103e861bfa171841fbd6Paul Jensen cv = waitForConnectivityBroadcasts(2); 12013d911469a190437fe936103e861bfa171841fbd6Paul Jensen mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 12023d911469a190437fe936103e861bfa171841fbd6Paul Jensen mWiFiNetworkAgent.connect(false); 12036ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti genericNetworkCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); 12046ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti wifiNetworkCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); 12053d911469a190437fe936103e861bfa171841fbd6Paul Jensen assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); 12063d911469a190437fe936103e861bfa171841fbd6Paul Jensen waitFor(cv); 12076ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti assertNoCallbacks(genericNetworkCallback, wifiNetworkCallback, cellNetworkCallback); 12083d911469a190437fe936103e861bfa171841fbd6Paul Jensen 12093d911469a190437fe936103e861bfa171841fbd6Paul Jensen cv = waitForConnectivityBroadcasts(2); 12103d911469a190437fe936103e861bfa171841fbd6Paul Jensen mWiFiNetworkAgent.disconnect(); 12116ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti genericNetworkCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); 12126ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti wifiNetworkCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); 121383fa2588f662aae0b612da91fd09d205cf2e8cb0Lorenzo Colitti cellNetworkCallback.assertNoCallback(); 12143d911469a190437fe936103e861bfa171841fbd6Paul Jensen waitFor(cv); 12156ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti assertNoCallbacks(genericNetworkCallback, wifiNetworkCallback, cellNetworkCallback); 12163d911469a190437fe936103e861bfa171841fbd6Paul Jensen 12173d911469a190437fe936103e861bfa171841fbd6Paul Jensen cv = waitForConnectivityBroadcasts(1); 12183d911469a190437fe936103e861bfa171841fbd6Paul Jensen mCellNetworkAgent.disconnect(); 12196ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti genericNetworkCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); 12206ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti cellNetworkCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); 12213d911469a190437fe936103e861bfa171841fbd6Paul Jensen waitFor(cv); 12226ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti assertNoCallbacks(genericNetworkCallback, wifiNetworkCallback, cellNetworkCallback); 12233d911469a190437fe936103e861bfa171841fbd6Paul Jensen 12243d911469a190437fe936103e861bfa171841fbd6Paul Jensen // Test validated networks 12253d911469a190437fe936103e861bfa171841fbd6Paul Jensen mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); 12263d911469a190437fe936103e861bfa171841fbd6Paul Jensen mCellNetworkAgent.connect(true); 12276ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti genericNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 12286ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti cellNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 12293d911469a190437fe936103e861bfa171841fbd6Paul Jensen assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); 12306ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti assertNoCallbacks(genericNetworkCallback, wifiNetworkCallback, cellNetworkCallback); 12313d911469a190437fe936103e861bfa171841fbd6Paul Jensen 12323d911469a190437fe936103e861bfa171841fbd6Paul Jensen // This should not trigger spurious onAvailable() callbacks, b/21762680. 12333d911469a190437fe936103e861bfa171841fbd6Paul Jensen mCellNetworkAgent.adjustScore(-1); 1234e58961aa5f86553f0106edbc03d1534b097fa25cLorenzo Colitti mService.waitForIdle(); 12356ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti assertNoCallbacks(genericNetworkCallback, wifiNetworkCallback, cellNetworkCallback); 12363d911469a190437fe936103e861bfa171841fbd6Paul Jensen assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); 12373d911469a190437fe936103e861bfa171841fbd6Paul Jensen 12383d911469a190437fe936103e861bfa171841fbd6Paul Jensen mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 12393d911469a190437fe936103e861bfa171841fbd6Paul Jensen mWiFiNetworkAgent.connect(true); 12406ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti genericNetworkCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); 12416ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti genericNetworkCallback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); 12426ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti wifiNetworkCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); 12436ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti cellNetworkCallback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); 12443d911469a190437fe936103e861bfa171841fbd6Paul Jensen assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); 12456ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti assertNoCallbacks(genericNetworkCallback, wifiNetworkCallback, cellNetworkCallback); 12463d911469a190437fe936103e861bfa171841fbd6Paul Jensen 12473d911469a190437fe936103e861bfa171841fbd6Paul Jensen mWiFiNetworkAgent.disconnect(); 12486ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti genericNetworkCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); 12496ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti wifiNetworkCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); 12506ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti assertNoCallbacks(genericNetworkCallback, wifiNetworkCallback, cellNetworkCallback); 12513d911469a190437fe936103e861bfa171841fbd6Paul Jensen 12523d911469a190437fe936103e861bfa171841fbd6Paul Jensen mCellNetworkAgent.disconnect(); 12536ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti genericNetworkCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); 12546ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti cellNetworkCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); 12556ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti assertNoCallbacks(genericNetworkCallback, wifiNetworkCallback, cellNetworkCallback); 12563d911469a190437fe936103e861bfa171841fbd6Paul Jensen } 12573d911469a190437fe936103e861bfa171841fbd6Paul Jensen 12587369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti @SmallTest 12597369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti public void testMultipleLingering() { 12607369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti NetworkRequest request = new NetworkRequest.Builder() 12617369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti .clearCapabilities().addCapability(NET_CAPABILITY_NOT_METERED) 12627369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti .build(); 12637369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti TestNetworkCallback callback = new TestNetworkCallback(); 12647369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mCm.registerNetworkCallback(request, callback); 12657369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti 12667369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti TestNetworkCallback defaultCallback = new TestNetworkCallback(); 12677369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mCm.registerDefaultNetworkCallback(defaultCallback); 12687369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti 12697369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); 12707369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 12717369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mEthernetNetworkAgent = new MockNetworkAgent(TRANSPORT_ETHERNET); 12727369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti 12737369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mCellNetworkAgent.addCapability(NET_CAPABILITY_NOT_METERED); 12747369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mWiFiNetworkAgent.addCapability(NET_CAPABILITY_NOT_METERED); 12757369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mEthernetNetworkAgent.addCapability(NET_CAPABILITY_NOT_METERED); 12767369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti 12777369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mCellNetworkAgent.connect(true); 12787369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti callback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 12797369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti defaultCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 12807369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); 12817369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti 12827369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mWiFiNetworkAgent.connect(true); 12837369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti // We get AVAILABLE on wifi when wifi connects and satisfies our unmetered request. 12847369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti // We then get LOSING when wifi validates and cell is outscored. 12857369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti callback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); 12867369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); 12877369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti defaultCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); 12887369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); 12897369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti 12907369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mEthernetNetworkAgent.connect(true); 12917369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti callback.expectCallback(CallbackState.AVAILABLE, mEthernetNetworkAgent); 12927369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti callback.expectCallback(CallbackState.LOSING, mWiFiNetworkAgent); 12937369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti defaultCallback.expectCallback(CallbackState.AVAILABLE, mEthernetNetworkAgent); 12947369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti assertEquals(mEthernetNetworkAgent.getNetwork(), mCm.getActiveNetwork()); 12957369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti 12967369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mEthernetNetworkAgent.disconnect(); 12977369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti callback.expectCallback(CallbackState.LOST, mEthernetNetworkAgent); 12987369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti defaultCallback.expectCallback(CallbackState.LOST, mEthernetNetworkAgent); 12997369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti defaultCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); 13007369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti 13017369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti for (int i = 0; i < 4; i++) { 13027369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti MockNetworkAgent oldNetwork, newNetwork; 13037369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti if (i % 2 == 0) { 13047369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mWiFiNetworkAgent.adjustScore(-15); 13057369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti oldNetwork = mWiFiNetworkAgent; 13067369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti newNetwork = mCellNetworkAgent; 13077369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti } else { 13087369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mWiFiNetworkAgent.adjustScore(15); 13097369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti oldNetwork = mCellNetworkAgent; 13107369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti newNetwork = mWiFiNetworkAgent; 13117369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti 13127369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti } 13137369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti callback.expectCallback(CallbackState.LOSING, oldNetwork); 1314b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti // TODO: should we send an AVAILABLE callback to newNetwork, to indicate that it is no 1315b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti // longer lingering? 13167369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti defaultCallback.expectCallback(CallbackState.AVAILABLE, newNetwork); 13177369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti assertEquals(newNetwork.getNetwork(), mCm.getActiveNetwork()); 13187369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti } 13197369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); 13207369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti 13217369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti // Verify that if a network no longer satisfies a request, we send LOST and not LOSING, even 13227369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti // if the network is still up. 13237369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mWiFiNetworkAgent.removeCapability(NET_CAPABILITY_NOT_METERED); 13247369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); 13257369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti 13267369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti // Wifi no longer satisfies our listen, which is for an unmetered network. 13277369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti // But because its score is 55, it's still up (and the default network). 13287369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti defaultCallback.assertNoCallback(); 13297369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); 13307369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti 13317369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti // Disconnect our test networks. 13327369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mWiFiNetworkAgent.disconnect(); 13337369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti defaultCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); 13347369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti defaultCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 13357369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mCellNetworkAgent.disconnect(); 13367369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti defaultCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); 13377369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti 13387369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mCm.unregisterNetworkCallback(callback); 13397369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mService.waitForIdle(); 13407369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti 13417369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti // Check that a network is only lingered or torn down if it would not satisfy a request even 13427369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti // if it validated. 13437369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti request = new NetworkRequest.Builder().clearCapabilities().build(); 13447369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti callback = new TestNetworkCallback(); 13457369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti 13467369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mCm.registerNetworkCallback(request, callback); 13477369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti 13487369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); 13497369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mCellNetworkAgent.connect(false); // Score: 10 13507369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti callback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 13517369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti defaultCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 13527369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); 13537369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti 13547369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti // Bring up wifi with a score of 20. 13557369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti // Cell stays up because it would satisfy the default request if it validated. 13567369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 13577369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mWiFiNetworkAgent.connect(false); // Score: 20 13587369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti callback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); 13597369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti defaultCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); 13607369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); 13617369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti 13627369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mWiFiNetworkAgent.disconnect(); 13637369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); 13647369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti defaultCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); 13657369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti defaultCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 13667369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); 13677369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti 13687369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti // Bring up wifi with a score of 70. 136909e202103d160efcb721e3b1ed699416e2b3a5bbLorenzo Colitti // Cell is lingered because it would not satisfy any request, even if it validated. 13707369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 13717369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mWiFiNetworkAgent.adjustScore(50); 13727369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mWiFiNetworkAgent.connect(false); // Score: 70 13737369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti callback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); 1374b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); 13757369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti defaultCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); 13767369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); 13777369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti 13787369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti // Tear down wifi. 13797369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mWiFiNetworkAgent.disconnect(); 13807369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); 13817369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti defaultCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); 13827369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti defaultCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 13837369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); 13847369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti 1385b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti // Bring up wifi, then validate it. Previous versions would immediately tear down cell, but 1386b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti // it's arguably correct to linger it, since it was the default network before it validated. 13877369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 13887369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mWiFiNetworkAgent.connect(true); 13897369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti callback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); 1390b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); 13917369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti defaultCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); 13927369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); 13937369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti 13947369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mWiFiNetworkAgent.disconnect(); 13957369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); 139609e202103d160efcb721e3b1ed699416e2b3a5bbLorenzo Colitti defaultCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); 1397b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti defaultCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 1398b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti mCellNetworkAgent.disconnect(); 1399b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti callback.expectCallback(CallbackState.LOST, mCellNetworkAgent); 1400b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti defaultCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); 140109e202103d160efcb721e3b1ed699416e2b3a5bbLorenzo Colitti 1402b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti // If a network is lingering, and we add and remove a request from it, resume lingering. 140309e202103d160efcb721e3b1ed699416e2b3a5bbLorenzo Colitti mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); 140409e202103d160efcb721e3b1ed699416e2b3a5bbLorenzo Colitti mCellNetworkAgent.connect(true); 140509e202103d160efcb721e3b1ed699416e2b3a5bbLorenzo Colitti callback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 140609e202103d160efcb721e3b1ed699416e2b3a5bbLorenzo Colitti defaultCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 140709e202103d160efcb721e3b1ed699416e2b3a5bbLorenzo Colitti mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 140809e202103d160efcb721e3b1ed699416e2b3a5bbLorenzo Colitti mWiFiNetworkAgent.connect(true); 140909e202103d160efcb721e3b1ed699416e2b3a5bbLorenzo Colitti callback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); 141009e202103d160efcb721e3b1ed699416e2b3a5bbLorenzo Colitti defaultCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); 141109e202103d160efcb721e3b1ed699416e2b3a5bbLorenzo Colitti callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); 141209e202103d160efcb721e3b1ed699416e2b3a5bbLorenzo Colitti 141309e202103d160efcb721e3b1ed699416e2b3a5bbLorenzo Colitti NetworkRequest cellRequest = new NetworkRequest.Builder() 141409e202103d160efcb721e3b1ed699416e2b3a5bbLorenzo Colitti .addTransportType(TRANSPORT_CELLULAR).build(); 141509e202103d160efcb721e3b1ed699416e2b3a5bbLorenzo Colitti NetworkCallback noopCallback = new NetworkCallback(); 141609e202103d160efcb721e3b1ed699416e2b3a5bbLorenzo Colitti mCm.requestNetwork(cellRequest, noopCallback); 1417b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti // TODO: should this cause an AVAILABLE callback, to indicate that the network is no longer 1418b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti // lingering? 141909e202103d160efcb721e3b1ed699416e2b3a5bbLorenzo Colitti mCm.unregisterNetworkCallback(noopCallback); 1420b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); 1421b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti 1422b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti // Similar to the above: lingering can start even after the lingered request is removed. 1423b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti // Disconnect wifi and switch to cell. 1424b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti mWiFiNetworkAgent.disconnect(); 1425b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); 1426b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti defaultCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); 1427b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti defaultCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 1428b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti 1429b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti // Cell is now the default network. Pin it with a cell-specific request. 1430b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti noopCallback = new NetworkCallback(); // Can't reuse NetworkCallbacks. http://b/20701525 1431b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti mCm.requestNetwork(cellRequest, noopCallback); 1432b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti 1433b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti // Now connect wifi, and expect it to become the default network. 1434b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 1435b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti mWiFiNetworkAgent.connect(true); 1436b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti callback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); 1437b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti defaultCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); 1438b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti // The default request is lingering on cell, but nothing happens to cell, and we send no 1439b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti // callbacks for it, because it's kept up by cellRequest. 1440b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti callback.assertNoCallback(); 1441b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti // Now unregister cellRequest and expect cell to start lingering. 1442b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti mCm.unregisterNetworkCallback(noopCallback); 1443b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); 144409e202103d160efcb721e3b1ed699416e2b3a5bbLorenzo Colitti 1445b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti // Let linger run its course. 1446b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti callback.assertNoCallback(); 1447b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti callback.expectCallback(CallbackState.LOST, mCellNetworkAgent, 1448b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti TEST_LINGER_DELAY_MS /* timeoutMs */); 1449b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti 1450b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti // Clean up. 145109e202103d160efcb721e3b1ed699416e2b3a5bbLorenzo Colitti mWiFiNetworkAgent.disconnect(); 145209e202103d160efcb721e3b1ed699416e2b3a5bbLorenzo Colitti callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); 1453b57578ca4f0fa64406ffad09ad9250391e3bbfa5Lorenzo Colitti defaultCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); 14547369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti 14557369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mCm.unregisterNetworkCallback(callback); 14567369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti mCm.unregisterNetworkCallback(defaultCallback); 14577369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti } 14587369d8d1b6a5118d9b20d72931e22c645945f3bcLorenzo Colitti 145985cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen private void tryNetworkFactoryRequests(int capability) throws Exception { 1460487ffe7d3d84bf65212158f7098e8a84b5b55e09Paul Jensen // Verify NOT_RESTRICTED is set appropriately 1461487ffe7d3d84bf65212158f7098e8a84b5b55e09Paul Jensen final NetworkCapabilities nc = new NetworkRequest.Builder().addCapability(capability) 1462487ffe7d3d84bf65212158f7098e8a84b5b55e09Paul Jensen .build().networkCapabilities; 1463487ffe7d3d84bf65212158f7098e8a84b5b55e09Paul Jensen if (capability == NET_CAPABILITY_CBS || capability == NET_CAPABILITY_DUN || 1464487ffe7d3d84bf65212158f7098e8a84b5b55e09Paul Jensen capability == NET_CAPABILITY_EIMS || capability == NET_CAPABILITY_FOTA || 1465487ffe7d3d84bf65212158f7098e8a84b5b55e09Paul Jensen capability == NET_CAPABILITY_IA || capability == NET_CAPABILITY_IMS || 1466aae613d96134245af7c55976731a49fa59e77470Paul Jensen capability == NET_CAPABILITY_RCS || capability == NET_CAPABILITY_XCAP) { 1467487ffe7d3d84bf65212158f7098e8a84b5b55e09Paul Jensen assertFalse(nc.hasCapability(NET_CAPABILITY_NOT_RESTRICTED)); 1468487ffe7d3d84bf65212158f7098e8a84b5b55e09Paul Jensen } else { 1469487ffe7d3d84bf65212158f7098e8a84b5b55e09Paul Jensen assertTrue(nc.hasCapability(NET_CAPABILITY_NOT_RESTRICTED)); 1470487ffe7d3d84bf65212158f7098e8a84b5b55e09Paul Jensen } 1471487ffe7d3d84bf65212158f7098e8a84b5b55e09Paul Jensen 1472348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt NetworkCapabilities filter = new NetworkCapabilities(); 147385cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen filter.addCapability(capability); 1474348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt final HandlerThread handlerThread = new HandlerThread("testNetworkFactoryRequests"); 1475348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt handlerThread.start(); 14760a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen final MockNetworkFactory testFactory = new MockNetworkFactory(handlerThread.getLooper(), 1477348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt mServiceContext, "testFactory", filter); 1478348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt testFactory.setScoreFilter(40); 14790a2823e539abeb037d3acb01b5d5eed7c85f4ed7Paul Jensen ConditionVariable cv = testFactory.getNetworkStartedCV(); 1480ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti testFactory.expectAddRequests(1); 1481348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt testFactory.register(); 1482ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti testFactory.waitForNetworkRequests(1); 148385cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen int expectedRequestCount = 1; 148485cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen NetworkCallback networkCallback = null; 148585cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen // For non-INTERNET capabilities we cannot rely on the default request being present, so 148685cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen // add one. 148785cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen if (capability != NET_CAPABILITY_INTERNET) { 148885cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen assertFalse(testFactory.getMyStartRequested()); 148985cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen NetworkRequest request = new NetworkRequest.Builder().addCapability(capability).build(); 149085cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen networkCallback = new NetworkCallback(); 1491ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti testFactory.expectAddRequests(1); 149285cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen mCm.requestNetwork(request, networkCallback); 149385cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen expectedRequestCount++; 1494ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti testFactory.waitForNetworkRequests(expectedRequestCount); 149585cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen } 14963d911469a190437fe936103e861bfa171841fbd6Paul Jensen waitFor(cv); 149785cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen assertEquals(expectedRequestCount, testFactory.getMyRequestCount()); 149885cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen assertTrue(testFactory.getMyStartRequested()); 1499348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt 150085cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen // Now bring in a higher scored network. 1501348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt MockNetworkAgent testAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); 150285cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen // Rather than create a validated network which complicates things by registering it's 150385cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen // own NetworkRequest during startup, just bump up the score to cancel out the 150485cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen // unvalidated penalty. 150585cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen testAgent.adjustScore(40); 150685cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen cv = testFactory.getNetworkStoppedCV(); 1507ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti 1508ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti // When testAgent connects, ConnectivityService will re-send us all current requests with 1509ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti // the new score. There are expectedRequestCount such requests, and we must wait for all of 1510ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti // them. 1511ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti testFactory.expectAddRequests(expectedRequestCount); 151285cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen testAgent.connect(false); 151385cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen testAgent.addCapability(capability); 15143d911469a190437fe936103e861bfa171841fbd6Paul Jensen waitFor(cv); 1515ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti testFactory.waitForNetworkRequests(expectedRequestCount); 151685cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen assertFalse(testFactory.getMyStartRequested()); 1517348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt 151885cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen // Bring in a bunch of requests. 1519ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti testFactory.expectAddRequests(10); 1520ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti assertEquals(expectedRequestCount, testFactory.getMyRequestCount()); 1521348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt ConnectivityManager.NetworkCallback[] networkCallbacks = 1522348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt new ConnectivityManager.NetworkCallback[10]; 1523348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt for (int i = 0; i< networkCallbacks.length; i++) { 1524348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt networkCallbacks[i] = new ConnectivityManager.NetworkCallback(); 1525348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt NetworkRequest.Builder builder = new NetworkRequest.Builder(); 152685cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen builder.addCapability(capability); 1527348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt mCm.requestNetwork(builder.build(), networkCallbacks[i]); 1528348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt } 152985cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen testFactory.waitForNetworkRequests(10 + expectedRequestCount); 153085cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen assertFalse(testFactory.getMyStartRequested()); 1531348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt 153285cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen // Remove the requests. 1533ffa390b6f37f20ab5f4ebf5c861c565db200107eLorenzo Colitti testFactory.expectRemoveRequests(10); 1534348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt for (int i = 0; i < networkCallbacks.length; i++) { 1535348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt mCm.unregisterNetworkCallback(networkCallbacks[i]); 1536348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt } 153785cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen testFactory.waitForNetworkRequests(expectedRequestCount); 153885cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen assertFalse(testFactory.getMyStartRequested()); 1539348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt 154085cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen // Drop the higher scored network. 154185cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen cv = testFactory.getNetworkStartedCV(); 1542348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt testAgent.disconnect(); 15433d911469a190437fe936103e861bfa171841fbd6Paul Jensen waitFor(cv); 154485cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen assertEquals(expectedRequestCount, testFactory.getMyRequestCount()); 154585cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen assertTrue(testFactory.getMyStartRequested()); 1546348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt 1547348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt testFactory.unregister(); 154885cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen if (networkCallback != null) mCm.unregisterNetworkCallback(networkCallback); 1549348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt handlerThread.quit(); 1550348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt } 1551348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt 1552bb2e0e98160f099261876794518d4db62e309aecPaul Jensen @LargeTest 155385cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen public void testNetworkFactoryRequests() throws Exception { 155485cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen tryNetworkFactoryRequests(NET_CAPABILITY_MMS); 155585cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen tryNetworkFactoryRequests(NET_CAPABILITY_SUPL); 155685cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen tryNetworkFactoryRequests(NET_CAPABILITY_DUN); 155785cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen tryNetworkFactoryRequests(NET_CAPABILITY_FOTA); 155885cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen tryNetworkFactoryRequests(NET_CAPABILITY_IMS); 155985cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen tryNetworkFactoryRequests(NET_CAPABILITY_CBS); 156085cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen tryNetworkFactoryRequests(NET_CAPABILITY_WIFI_P2P); 156185cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen tryNetworkFactoryRequests(NET_CAPABILITY_IA); 156285cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen tryNetworkFactoryRequests(NET_CAPABILITY_RCS); 156385cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen tryNetworkFactoryRequests(NET_CAPABILITY_XCAP); 156485cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen tryNetworkFactoryRequests(NET_CAPABILITY_EIMS); 156585cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen tryNetworkFactoryRequests(NET_CAPABILITY_NOT_METERED); 156685cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen tryNetworkFactoryRequests(NET_CAPABILITY_INTERNET); 156785cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen tryNetworkFactoryRequests(NET_CAPABILITY_TRUSTED); 156885cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen tryNetworkFactoryRequests(NET_CAPABILITY_NOT_VPN); 156985cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen // Skipping VALIDATED and CAPTIVE_PORTAL as they're disallowed. 157085cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen } 157185cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen 157285cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen @LargeTest 1573bb2e0e98160f099261876794518d4db62e309aecPaul Jensen public void testNoMutableNetworkRequests() throws Exception { 1574bb2e0e98160f099261876794518d4db62e309aecPaul Jensen PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, new Intent("a"), 0); 1575bb2e0e98160f099261876794518d4db62e309aecPaul Jensen NetworkRequest.Builder builder = new NetworkRequest.Builder(); 157685cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen builder.addCapability(NET_CAPABILITY_VALIDATED); 1577bb2e0e98160f099261876794518d4db62e309aecPaul Jensen try { 1578bb2e0e98160f099261876794518d4db62e309aecPaul Jensen mCm.requestNetwork(builder.build(), new NetworkCallback()); 1579bb2e0e98160f099261876794518d4db62e309aecPaul Jensen fail(); 1580bb2e0e98160f099261876794518d4db62e309aecPaul Jensen } catch (IllegalArgumentException expected) {} 1581bb2e0e98160f099261876794518d4db62e309aecPaul Jensen try { 1582bb2e0e98160f099261876794518d4db62e309aecPaul Jensen mCm.requestNetwork(builder.build(), pendingIntent); 1583bb2e0e98160f099261876794518d4db62e309aecPaul Jensen fail(); 1584bb2e0e98160f099261876794518d4db62e309aecPaul Jensen } catch (IllegalArgumentException expected) {} 1585bb2e0e98160f099261876794518d4db62e309aecPaul Jensen builder = new NetworkRequest.Builder(); 158685cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen builder.addCapability(NET_CAPABILITY_CAPTIVE_PORTAL); 1587bb2e0e98160f099261876794518d4db62e309aecPaul Jensen try { 1588bb2e0e98160f099261876794518d4db62e309aecPaul Jensen mCm.requestNetwork(builder.build(), new NetworkCallback()); 1589bb2e0e98160f099261876794518d4db62e309aecPaul Jensen fail(); 1590bb2e0e98160f099261876794518d4db62e309aecPaul Jensen } catch (IllegalArgumentException expected) {} 1591bb2e0e98160f099261876794518d4db62e309aecPaul Jensen try { 1592bb2e0e98160f099261876794518d4db62e309aecPaul Jensen mCm.requestNetwork(builder.build(), pendingIntent); 1593bb2e0e98160f099261876794518d4db62e309aecPaul Jensen fail(); 1594bb2e0e98160f099261876794518d4db62e309aecPaul Jensen } catch (IllegalArgumentException expected) {} 1595bb2e0e98160f099261876794518d4db62e309aecPaul Jensen } 1596348e98dba046a33c4ba6069ef7a6ac18c2040fe2Robert Greenwalt 1597e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen @LargeTest 1598e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen public void testMMSonWiFi() throws Exception { 1599e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen // Test bringing up cellular without MMS NetworkRequest gets reaped 1600e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); 1601e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mCellNetworkAgent.addCapability(NET_CAPABILITY_MMS); 1602e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen ConditionVariable cv = mCellNetworkAgent.getDisconnectedCV(); 1603e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mCellNetworkAgent.connectWithoutInternet(); 1604e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen waitFor(cv); 1605e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen waitFor(new Criteria() { 1606e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen public boolean get() { return mCm.getAllNetworks().length == 0; } }); 1607e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen verifyNoNetwork(); 1608e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen // Test bringing up validated WiFi. 1609e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 1610e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen cv = waitForConnectivityBroadcasts(1); 1611e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mWiFiNetworkAgent.connect(true); 1612e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen waitFor(cv); 1613e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen verifyActiveNetwork(TRANSPORT_WIFI); 1614e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen // Register MMS NetworkRequest 1615e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen NetworkRequest.Builder builder = new NetworkRequest.Builder(); 1616e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen builder.addCapability(NetworkCapabilities.NET_CAPABILITY_MMS); 1617e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen final TestNetworkCallback networkCallback = new TestNetworkCallback(); 1618e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mCm.requestNetwork(builder.build(), networkCallback); 1619e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen // Test bringing up unvalidated cellular with MMS 1620e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); 1621e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mCellNetworkAgent.addCapability(NET_CAPABILITY_MMS); 1622e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mCellNetworkAgent.connectWithoutInternet(); 16236ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti networkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 1624e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen verifyActiveNetwork(TRANSPORT_WIFI); 1625e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen // Test releasing NetworkRequest disconnects cellular with MMS 1626e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen cv = mCellNetworkAgent.getDisconnectedCV(); 1627e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mCm.unregisterNetworkCallback(networkCallback); 1628e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen waitFor(cv); 1629e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen verifyActiveNetwork(TRANSPORT_WIFI); 1630e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen } 1631e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen 1632e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen @LargeTest 1633e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen public void testMMSonCell() throws Exception { 1634e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen // Test bringing up cellular without MMS 1635e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); 1636e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen ConditionVariable cv = waitForConnectivityBroadcasts(1); 1637e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mCellNetworkAgent.connect(false); 1638e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen waitFor(cv); 1639e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen verifyActiveNetwork(TRANSPORT_CELLULAR); 1640e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen // Register MMS NetworkRequest 1641e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen NetworkRequest.Builder builder = new NetworkRequest.Builder(); 1642e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen builder.addCapability(NetworkCapabilities.NET_CAPABILITY_MMS); 1643e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen final TestNetworkCallback networkCallback = new TestNetworkCallback(); 1644e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mCm.requestNetwork(builder.build(), networkCallback); 1645e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen // Test bringing up MMS cellular network 1646e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen MockNetworkAgent mmsNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); 1647e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mmsNetworkAgent.addCapability(NET_CAPABILITY_MMS); 1648e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mmsNetworkAgent.connectWithoutInternet(); 16496ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti networkCallback.expectCallback(CallbackState.AVAILABLE, mmsNetworkAgent); 1650e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen verifyActiveNetwork(TRANSPORT_CELLULAR); 1651e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen // Test releasing MMS NetworkRequest does not disconnect main cellular NetworkAgent 1652e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen cv = mmsNetworkAgent.getDisconnectedCV(); 1653e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen mCm.unregisterNetworkCallback(networkCallback); 1654e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen waitFor(cv); 1655e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen verifyActiveNetwork(TRANSPORT_CELLULAR); 1656e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen } 1657e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen 1658cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen @LargeTest 1659cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen public void testCaptivePortal() { 1660cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen final TestNetworkCallback captivePortalCallback = new TestNetworkCallback(); 1661cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen final NetworkRequest captivePortalRequest = new NetworkRequest.Builder() 1662cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen .addCapability(NET_CAPABILITY_CAPTIVE_PORTAL).build(); 1663cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen mCm.registerNetworkCallback(captivePortalRequest, captivePortalCallback); 1664cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen 1665cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen final TestNetworkCallback validatedCallback = new TestNetworkCallback(); 1666cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen final NetworkRequest validatedRequest = new NetworkRequest.Builder() 1667cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen .addCapability(NET_CAPABILITY_VALIDATED).build(); 1668cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen mCm.registerNetworkCallback(validatedRequest, validatedCallback); 1669cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen 1670cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen // Bring up a network with a captive portal. 1671cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen // Expect onAvailable callback of listen for NET_CAPABILITY_CAPTIVE_PORTAL. 1672cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 16732324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen String firstRedirectUrl = "http://example.com/firstPath"; 16742324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen mWiFiNetworkAgent.connectWithCaptivePortal(firstRedirectUrl); 16756ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti captivePortalCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); 16762324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen assertEquals(mWiFiNetworkAgent.waitForRedirectUrl(), firstRedirectUrl); 1677cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen 1678cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen // Take down network. 1679cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen // Expect onLost callback. 1680cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen mWiFiNetworkAgent.disconnect(); 16816ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti captivePortalCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); 1682cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen 1683cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen // Bring up a network with a captive portal. 1684cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen // Expect onAvailable callback of listen for NET_CAPABILITY_CAPTIVE_PORTAL. 1685cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 16862324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen String secondRedirectUrl = "http://example.com/secondPath"; 16872324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen mWiFiNetworkAgent.connectWithCaptivePortal(secondRedirectUrl); 16886ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti captivePortalCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); 16892324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen assertEquals(mWiFiNetworkAgent.waitForRedirectUrl(), secondRedirectUrl); 1690cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen 1691cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen // Make captive portal disappear then revalidate. 1692cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen // Expect onLost callback because network no longer provides NET_CAPABILITY_CAPTIVE_PORTAL. 1693cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen mWiFiNetworkAgent.getWrappedNetworkMonitor().gen204ProbeResult = 204; 1694cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen mCm.reportNetworkConnectivity(mWiFiNetworkAgent.getNetwork(), true); 16956ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti captivePortalCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); 1696cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen 1697cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen // Expect NET_CAPABILITY_VALIDATED onAvailable callback. 16986ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti validatedCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); 1699cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen 1700cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen // Break network connectivity. 1701cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen // Expect NET_CAPABILITY_VALIDATED onLost callback. 1702cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen mWiFiNetworkAgent.getWrappedNetworkMonitor().gen204ProbeResult = 500; 1703cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen mCm.reportNetworkConnectivity(mWiFiNetworkAgent.getNetwork(), false); 17046ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti validatedCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); 1705cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen } 17067914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 1707ddb9ef0357e3ee609e188fb9e1e461f95aa601faEtan Cohen @SmallTest 1708ddb9ef0357e3ee609e188fb9e1e461f95aa601faEtan Cohen public void testInvalidNetworkSpecifier() { 1709ddb9ef0357e3ee609e188fb9e1e461f95aa601faEtan Cohen boolean execptionCalled = true; 1710ddb9ef0357e3ee609e188fb9e1e461f95aa601faEtan Cohen 1711ddb9ef0357e3ee609e188fb9e1e461f95aa601faEtan Cohen try { 1712ddb9ef0357e3ee609e188fb9e1e461f95aa601faEtan Cohen NetworkRequest.Builder builder = new NetworkRequest.Builder(); 1713ddb9ef0357e3ee609e188fb9e1e461f95aa601faEtan Cohen builder.setNetworkSpecifier(MATCH_ALL_REQUESTS_NETWORK_SPECIFIER); 1714ddb9ef0357e3ee609e188fb9e1e461f95aa601faEtan Cohen execptionCalled = false; 1715ddb9ef0357e3ee609e188fb9e1e461f95aa601faEtan Cohen } catch (IllegalArgumentException e) { 1716ddb9ef0357e3ee609e188fb9e1e461f95aa601faEtan Cohen // do nothing - should get here 1717ddb9ef0357e3ee609e188fb9e1e461f95aa601faEtan Cohen } 1718ddb9ef0357e3ee609e188fb9e1e461f95aa601faEtan Cohen 17196ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti assertTrue("NetworkRequest builder with MATCH_ALL_REQUESTS_NETWORK_SPECIFIER", 1720ddb9ef0357e3ee609e188fb9e1e461f95aa601faEtan Cohen execptionCalled); 1721ddb9ef0357e3ee609e188fb9e1e461f95aa601faEtan Cohen 1722ddb9ef0357e3ee609e188fb9e1e461f95aa601faEtan Cohen try { 1723ddb9ef0357e3ee609e188fb9e1e461f95aa601faEtan Cohen NetworkCapabilities networkCapabilities = new NetworkCapabilities(); 1724ddb9ef0357e3ee609e188fb9e1e461f95aa601faEtan Cohen networkCapabilities.addTransportType(TRANSPORT_WIFI) 1725ddb9ef0357e3ee609e188fb9e1e461f95aa601faEtan Cohen .setNetworkSpecifier(NetworkCapabilities.MATCH_ALL_REQUESTS_NETWORK_SPECIFIER); 1726ddb9ef0357e3ee609e188fb9e1e461f95aa601faEtan Cohen mService.requestNetwork(networkCapabilities, null, 0, null, 1727ddb9ef0357e3ee609e188fb9e1e461f95aa601faEtan Cohen ConnectivityManager.TYPE_WIFI); 1728ddb9ef0357e3ee609e188fb9e1e461f95aa601faEtan Cohen execptionCalled = false; 1729ddb9ef0357e3ee609e188fb9e1e461f95aa601faEtan Cohen } catch (IllegalArgumentException e) { 1730ddb9ef0357e3ee609e188fb9e1e461f95aa601faEtan Cohen // do nothing - should get here 1731ddb9ef0357e3ee609e188fb9e1e461f95aa601faEtan Cohen } 1732ddb9ef0357e3ee609e188fb9e1e461f95aa601faEtan Cohen 1733ddb9ef0357e3ee609e188fb9e1e461f95aa601faEtan Cohen assertTrue("ConnectivityService requestNetwork with MATCH_ALL_REQUESTS_NETWORK_SPECIFIER", 1734ddb9ef0357e3ee609e188fb9e1e461f95aa601faEtan Cohen execptionCalled); 1735ddb9ef0357e3ee609e188fb9e1e461f95aa601faEtan Cohen } 1736ddb9ef0357e3ee609e188fb9e1e461f95aa601faEtan Cohen 1737a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline @LargeTest 1738a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline public void testRegisterDefaultNetworkCallback() throws Exception { 1739a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline final TestNetworkCallback defaultNetworkCallback = new TestNetworkCallback(); 1740a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline mCm.registerDefaultNetworkCallback(defaultNetworkCallback); 1741a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline defaultNetworkCallback.assertNoCallback(); 1742a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline 1743a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline // Create a TRANSPORT_CELLULAR request to keep the mobile interface up 1744a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline // whenever Wi-Fi is up. Without this, the mobile network agent is 1745a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline // reaped before any other activity can take place. 1746a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline final TestNetworkCallback cellNetworkCallback = new TestNetworkCallback(); 1747a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline final NetworkRequest cellRequest = new NetworkRequest.Builder() 1748a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline .addTransportType(TRANSPORT_CELLULAR).build(); 1749a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline mCm.requestNetwork(cellRequest, cellNetworkCallback); 1750a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline cellNetworkCallback.assertNoCallback(); 1751a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline 1752a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline // Bring up cell and expect CALLBACK_AVAILABLE. 1753a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); 1754a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline mCellNetworkAgent.connect(true); 1755a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline cellNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 1756a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline defaultNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 1757a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline 1758a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline // Bring up wifi and expect CALLBACK_AVAILABLE. 1759a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 1760a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline mWiFiNetworkAgent.connect(true); 1761a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline cellNetworkCallback.assertNoCallback(); 1762a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline defaultNetworkCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); 1763a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline 1764a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline // Bring down cell. Expect no default network callback, since it wasn't the default. 1765a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline mCellNetworkAgent.disconnect(); 1766a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline cellNetworkCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); 1767a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline defaultNetworkCallback.assertNoCallback(); 1768a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline 1769a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline // Bring up cell. Expect no default network callback, since it won't be the default. 1770a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); 1771a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline mCellNetworkAgent.connect(true); 1772a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline cellNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 1773a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline defaultNetworkCallback.assertNoCallback(); 1774a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline 1775a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline // Bring down wifi. Expect the default network callback to notified of LOST wifi 1776a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline // followed by AVAILABLE cell. 1777a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline mWiFiNetworkAgent.disconnect(); 1778a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline cellNetworkCallback.assertNoCallback(); 1779a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline defaultNetworkCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); 1780a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline defaultNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 1781a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline mCellNetworkAgent.disconnect(); 1782a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline cellNetworkCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); 1783a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline defaultNetworkCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); 1784a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline } 1785a2d29407d02ba692a90507db8b6fc2cf5cf89725Erik Kline 1786acdd639513858629f804316e9dd4105634504a90Erik Kline private class TestRequestUpdateCallback extends TestNetworkCallback { 1787acdd639513858629f804316e9dd4105634504a90Erik Kline @Override 1788acdd639513858629f804316e9dd4105634504a90Erik Kline public void onCapabilitiesChanged(Network network, NetworkCapabilities netCap) { 1789acdd639513858629f804316e9dd4105634504a90Erik Kline setLastCallback(CallbackState.NETWORK_CAPABILITIES, network, netCap); 1790acdd639513858629f804316e9dd4105634504a90Erik Kline } 1791acdd639513858629f804316e9dd4105634504a90Erik Kline 1792acdd639513858629f804316e9dd4105634504a90Erik Kline @Override 1793acdd639513858629f804316e9dd4105634504a90Erik Kline public void onLinkPropertiesChanged(Network network, LinkProperties linkProp) { 1794acdd639513858629f804316e9dd4105634504a90Erik Kline setLastCallback(CallbackState.LINK_PROPERTIES, network, linkProp); 1795acdd639513858629f804316e9dd4105634504a90Erik Kline } 1796acdd639513858629f804316e9dd4105634504a90Erik Kline } 1797acdd639513858629f804316e9dd4105634504a90Erik Kline 1798acdd639513858629f804316e9dd4105634504a90Erik Kline @LargeTest 1799acdd639513858629f804316e9dd4105634504a90Erik Kline public void testRequestCallbackUpdates() throws Exception { 1800acdd639513858629f804316e9dd4105634504a90Erik Kline // File a network request for mobile. 1801acdd639513858629f804316e9dd4105634504a90Erik Kline final TestNetworkCallback cellNetworkCallback = new TestRequestUpdateCallback(); 1802acdd639513858629f804316e9dd4105634504a90Erik Kline final NetworkRequest cellRequest = new NetworkRequest.Builder() 1803acdd639513858629f804316e9dd4105634504a90Erik Kline .addTransportType(TRANSPORT_CELLULAR).build(); 1804acdd639513858629f804316e9dd4105634504a90Erik Kline mCm.requestNetwork(cellRequest, cellNetworkCallback); 1805acdd639513858629f804316e9dd4105634504a90Erik Kline 1806acdd639513858629f804316e9dd4105634504a90Erik Kline // Bring up the mobile network. 1807acdd639513858629f804316e9dd4105634504a90Erik Kline mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); 1808acdd639513858629f804316e9dd4105634504a90Erik Kline mCellNetworkAgent.connect(true); 1809acdd639513858629f804316e9dd4105634504a90Erik Kline 1810acdd639513858629f804316e9dd4105634504a90Erik Kline // We should get onAvailable(). 1811acdd639513858629f804316e9dd4105634504a90Erik Kline cellNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 1812acdd639513858629f804316e9dd4105634504a90Erik Kline // We should get onCapabilitiesChanged(), when the mobile network successfully validates. 1813acdd639513858629f804316e9dd4105634504a90Erik Kline cellNetworkCallback.expectCallback(CallbackState.NETWORK_CAPABILITIES, mCellNetworkAgent); 1814acdd639513858629f804316e9dd4105634504a90Erik Kline cellNetworkCallback.assertNoCallback(); 1815acdd639513858629f804316e9dd4105634504a90Erik Kline 1816acdd639513858629f804316e9dd4105634504a90Erik Kline // Update LinkProperties. 1817acdd639513858629f804316e9dd4105634504a90Erik Kline final LinkProperties lp = new LinkProperties(); 1818acdd639513858629f804316e9dd4105634504a90Erik Kline lp.setInterfaceName("foonet_data0"); 1819acdd639513858629f804316e9dd4105634504a90Erik Kline mCellNetworkAgent.sendLinkProperties(lp); 1820acdd639513858629f804316e9dd4105634504a90Erik Kline // We should get onLinkPropertiesChanged(). 1821acdd639513858629f804316e9dd4105634504a90Erik Kline cellNetworkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent); 1822acdd639513858629f804316e9dd4105634504a90Erik Kline cellNetworkCallback.assertNoCallback(); 1823acdd639513858629f804316e9dd4105634504a90Erik Kline 1824acdd639513858629f804316e9dd4105634504a90Erik Kline // Register a garden variety default network request. 1825acdd639513858629f804316e9dd4105634504a90Erik Kline final TestNetworkCallback dfltNetworkCallback = new TestRequestUpdateCallback(); 1826acdd639513858629f804316e9dd4105634504a90Erik Kline mCm.registerDefaultNetworkCallback(dfltNetworkCallback); 1827acdd639513858629f804316e9dd4105634504a90Erik Kline // Only onAvailable() is called; no other information is delivered. 1828acdd639513858629f804316e9dd4105634504a90Erik Kline dfltNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 1829acdd639513858629f804316e9dd4105634504a90Erik Kline dfltNetworkCallback.assertNoCallback(); 1830acdd639513858629f804316e9dd4105634504a90Erik Kline 1831acdd639513858629f804316e9dd4105634504a90Erik Kline // Request a NetworkCapabilities update; only the requesting callback is notified. 1832acdd639513858629f804316e9dd4105634504a90Erik Kline mCm.requestNetworkCapabilities(dfltNetworkCallback); 1833acdd639513858629f804316e9dd4105634504a90Erik Kline dfltNetworkCallback.expectCallback(CallbackState.NETWORK_CAPABILITIES, mCellNetworkAgent); 1834acdd639513858629f804316e9dd4105634504a90Erik Kline cellNetworkCallback.assertNoCallback(); 1835acdd639513858629f804316e9dd4105634504a90Erik Kline dfltNetworkCallback.assertNoCallback(); 1836acdd639513858629f804316e9dd4105634504a90Erik Kline 1837acdd639513858629f804316e9dd4105634504a90Erik Kline // Request a LinkProperties update; only the requesting callback is notified. 1838acdd639513858629f804316e9dd4105634504a90Erik Kline mCm.requestLinkProperties(dfltNetworkCallback); 1839acdd639513858629f804316e9dd4105634504a90Erik Kline dfltNetworkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent); 1840acdd639513858629f804316e9dd4105634504a90Erik Kline cellNetworkCallback.assertNoCallback(); 1841acdd639513858629f804316e9dd4105634504a90Erik Kline dfltNetworkCallback.assertNoCallback(); 1842acdd639513858629f804316e9dd4105634504a90Erik Kline 1843acdd639513858629f804316e9dd4105634504a90Erik Kline mCm.unregisterNetworkCallback(dfltNetworkCallback); 1844acdd639513858629f804316e9dd4105634504a90Erik Kline mCm.unregisterNetworkCallback(cellNetworkCallback); 1845acdd639513858629f804316e9dd4105634504a90Erik Kline } 1846acdd639513858629f804316e9dd4105634504a90Erik Kline 1847e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti private void setMobileDataAlwaysOn(boolean enable) { 1848e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti ContentResolver cr = mServiceContext.getContentResolver(); 1849e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti Settings.Global.putInt(cr, Settings.Global.MOBILE_DATA_ALWAYS_ON, enable ? 1 : 0); 1850e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti mService.updateMobileDataAlwaysOn(); 1851e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti mService.waitForIdle(); 1852e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti } 1853e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti 1854e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti private boolean isForegroundNetwork(MockNetworkAgent network) { 1855e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti NetworkCapabilities nc = mCm.getNetworkCapabilities(network.getNetwork()); 1856e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti assertNotNull(nc); 1857e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti return nc.hasCapability(NET_CAPABILITY_FOREGROUND); 1858e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti } 1859e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti 1860e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti @SmallTest 1861e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti public void testBackgroundNetworks() throws Exception { 1862e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti // Create a background request. We can't do this ourselves because ConnectivityService 1863e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti // doesn't have an API for it. So just turn on mobile data always on. 1864e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti setMobileDataAlwaysOn(true); 1865e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti final NetworkRequest request = new NetworkRequest.Builder().build(); 1866e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti final NetworkRequest fgRequest = new NetworkRequest.Builder() 1867e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti .addCapability(NET_CAPABILITY_FOREGROUND).build(); 1868e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti final TestNetworkCallback callback = new TestNetworkCallback(); 1869e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti final TestNetworkCallback fgCallback = new TestNetworkCallback(); 1870e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti mCm.registerNetworkCallback(request, callback); 1871e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti mCm.registerNetworkCallback(fgRequest, fgCallback); 1872e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti 1873e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); 1874e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti mCellNetworkAgent.connect(true); 1875e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti callback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 1876e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti fgCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 1877e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti assertTrue(isForegroundNetwork(mCellNetworkAgent)); 1878e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti 1879e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 1880e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti mWiFiNetworkAgent.connect(true); 1881e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti 1882e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti // When wifi connects, cell lingers. 1883e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti callback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); 1884e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti fgCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); 1885e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); 1886e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti fgCallback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); 1887e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti assertTrue(isForegroundNetwork(mCellNetworkAgent)); 1888e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti assertTrue(isForegroundNetwork(mWiFiNetworkAgent)); 1889e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti 1890e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti // When lingering is complete, cell is still there but is now in the background. 1891e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti fgCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent, TEST_LINGER_DELAY_MS); 1892e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti callback.assertNoCallback(); 1893e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti assertFalse(isForegroundNetwork(mCellNetworkAgent)); 1894e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti assertTrue(isForegroundNetwork(mWiFiNetworkAgent)); 1895e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti 1896e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti // File a cell request and check that cell comes into the foreground. 1897e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti final NetworkRequest cellRequest = new NetworkRequest.Builder() 1898e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti .addTransportType(TRANSPORT_CELLULAR).build(); 1899e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti final TestNetworkCallback cellCallback = new TestNetworkCallback(); 1900e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti mCm.requestNetwork(cellRequest, cellCallback); 1901e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti cellCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 1902e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti fgCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 1903e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti callback.assertNoCallback(); // Because the network is already up. 1904e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti assertTrue(isForegroundNetwork(mCellNetworkAgent)); 1905e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti assertTrue(isForegroundNetwork(mWiFiNetworkAgent)); 1906e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti 1907e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti // Release the request. The network immediately goes into the background, since it was not 1908e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti // lingering. 1909e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti mCm.unregisterNetworkCallback(cellCallback); 1910e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti fgCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); 1911e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti callback.assertNoCallback(); 1912e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti assertFalse(isForegroundNetwork(mCellNetworkAgent)); 1913e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti assertTrue(isForegroundNetwork(mWiFiNetworkAgent)); 1914e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti 1915e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti // Disconnect wifi and check that cell is foreground again. 1916e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti mWiFiNetworkAgent.disconnect(); 1917e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); 1918e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti fgCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); 1919e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti fgCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 1920e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti assertTrue(isForegroundNetwork(mCellNetworkAgent)); 1921e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti 1922e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti mCm.unregisterNetworkCallback(callback); 1923e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti mCm.unregisterNetworkCallback(fgCallback); 1924e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti } 1925e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti 1926762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti @SmallTest 19276ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti public void testRequestBenchmark() throws Exception { 19286ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti // Benchmarks connecting and switching performance in the presence of a large number of 19296ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti // NetworkRequests. 19306ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti // 1. File NUM_REQUESTS requests. 19316ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti // 2. Have a network connect. Wait for NUM_REQUESTS onAvailable callbacks to fire. 19326ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti // 3. Have a new network connect and outscore the previous. Wait for NUM_REQUESTS onLosing 19336ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti // and NUM_REQUESTS onAvailable callbacks to fire. 19346ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti // See how long it took. 19356ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti final int NUM_REQUESTS = 90; 19366ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti final NetworkRequest request = new NetworkRequest.Builder().clearCapabilities().build(); 19376ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti final NetworkCallback[] callbacks = new NetworkCallback[NUM_REQUESTS]; 19386ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti final CountDownLatch availableLatch = new CountDownLatch(NUM_REQUESTS); 19396ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti final CountDownLatch losingLatch = new CountDownLatch(NUM_REQUESTS); 19406ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti 19416ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti final int REGISTER_TIME_LIMIT_MS = 100; 19426ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti long startTime = System.currentTimeMillis(); 19436ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti for (int i = 0; i < NUM_REQUESTS; i++) { 19446ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti callbacks[i] = new NetworkCallback() { 19456ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti @Override public void onAvailable(Network n) { availableLatch.countDown(); } 19466ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti @Override public void onLosing(Network n, int t) { losingLatch.countDown(); } 19476ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti }; 19486ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti mCm.registerNetworkCallback(request, callbacks[i]); 19496ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti } 19506ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti long timeTaken = System.currentTimeMillis() - startTime; 19516ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti String msg = String.format("Register %d callbacks: %dms, acceptable %dms", 19526ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti NUM_REQUESTS, timeTaken, REGISTER_TIME_LIMIT_MS); 19536ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti Log.d(TAG, msg); 19546ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti assertTrue(msg, timeTaken < REGISTER_TIME_LIMIT_MS); 19556ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti 19566ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti final int CONNECT_TIME_LIMIT_MS = 30; 19576ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); 19586ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti // Don't request that the network validate, because otherwise connect() will block until 19596ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti // the network gets NET_CAPABILITY_VALIDATED, after all the callbacks below have fired, 19606ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti // and we won't actually measure anything. 19616ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti mCellNetworkAgent.connect(false); 19626ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti startTime = System.currentTimeMillis(); 19636ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti if (!availableLatch.await(CONNECT_TIME_LIMIT_MS, TimeUnit.MILLISECONDS)) { 19646ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti fail(String.format("Only dispatched %d/%d onAvailable callbacks in %dms", 19656ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti NUM_REQUESTS - availableLatch.getCount(), NUM_REQUESTS, 19666ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti CONNECT_TIME_LIMIT_MS)); 19676ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti } 19686ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti timeTaken = System.currentTimeMillis() - startTime; 19696ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti Log.d(TAG, String.format("Connect, %d callbacks: %dms, acceptable %dms", 19706ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti NUM_REQUESTS, timeTaken, CONNECT_TIME_LIMIT_MS)); 19716ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti 19726ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti final int SWITCH_TIME_LIMIT_MS = 30; 19736ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 19746ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti // Give wifi a high enough score that we'll linger cell when wifi comes up. 19756ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti mWiFiNetworkAgent.adjustScore(40); 19766ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti mWiFiNetworkAgent.connect(false); 19776ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti startTime = System.currentTimeMillis(); 19786ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti if (!losingLatch.await(SWITCH_TIME_LIMIT_MS, TimeUnit.MILLISECONDS)) { 19796ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti fail(String.format("Only dispatched %d/%d onLosing callbacks in %dms", 19806ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti NUM_REQUESTS - losingLatch.getCount(), NUM_REQUESTS, SWITCH_TIME_LIMIT_MS)); 19816ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti } 19826ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti timeTaken = System.currentTimeMillis() - startTime; 19836ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti Log.d(TAG, String.format("Linger, %d callbacks: %dms, acceptable %dms", 19846ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti NUM_REQUESTS, timeTaken, SWITCH_TIME_LIMIT_MS)); 19856ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti 19866ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti final int UNREGISTER_TIME_LIMIT_MS = 10; 19876ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti startTime = System.currentTimeMillis(); 19886ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti for (int i = 0; i < NUM_REQUESTS; i++) { 19896ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti mCm.unregisterNetworkCallback(callbacks[i]); 19906ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti } 19916ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti timeTaken = System.currentTimeMillis() - startTime; 19926ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti msg = String.format("Unregister %d callbacks: %dms, acceptable %dms", 19936ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti NUM_REQUESTS, timeTaken, UNREGISTER_TIME_LIMIT_MS); 19946ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti Log.d(TAG, msg); 19956ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti assertTrue(msg, timeTaken < UNREGISTER_TIME_LIMIT_MS); 19966ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti } 19976ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti 19986ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti @SmallTest 1999762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti public void testMobileDataAlwaysOn() throws Exception { 2000762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti final TestNetworkCallback cellNetworkCallback = new TestNetworkCallback(); 2001762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti final NetworkRequest cellRequest = new NetworkRequest.Builder() 2002762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti .addTransportType(TRANSPORT_CELLULAR).build(); 2003762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti mCm.registerNetworkCallback(cellRequest, cellNetworkCallback); 2004762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti 2005762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti final HandlerThread handlerThread = new HandlerThread("MobileDataAlwaysOnFactory"); 2006762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti handlerThread.start(); 2007762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti NetworkCapabilities filter = new NetworkCapabilities() 2008762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti .addTransportType(TRANSPORT_CELLULAR) 2009762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti .addCapability(NET_CAPABILITY_INTERNET); 2010762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti final MockNetworkFactory testFactory = new MockNetworkFactory(handlerThread.getLooper(), 2011762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti mServiceContext, "testFactory", filter); 2012762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti testFactory.setScoreFilter(40); 2013762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti 2014762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti // Register the factory and expect it to start looking for a network. 2015762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti testFactory.expectAddRequests(1); 2016762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti testFactory.register(); 2017762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti testFactory.waitForNetworkRequests(1); 2018762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti assertTrue(testFactory.getMyStartRequested()); 2019762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti 2020762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti // Bring up wifi. The factory stops looking for a network. 2021762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 2022762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti testFactory.expectAddRequests(2); // Because the default request changes score twice. 2023762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti mWiFiNetworkAgent.connect(true); 2024762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti testFactory.waitForNetworkRequests(1); 2025762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti assertFalse(testFactory.getMyStartRequested()); 2026762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti 2027762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti ContentResolver cr = mServiceContext.getContentResolver(); 2028762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti 2029762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti // Turn on mobile data always on. The factory starts looking again. 2030762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti testFactory.expectAddRequests(1); 2031e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti setMobileDataAlwaysOn(true); 2032762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti testFactory.waitForNetworkRequests(2); 2033762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti assertTrue(testFactory.getMyStartRequested()); 2034762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti 2035762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti // Bring up cell data and check that the factory stops looking. 2036762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti assertEquals(1, mCm.getAllNetworks().length); 2037762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); 2038762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti testFactory.expectAddRequests(2); // Because the cell request changes score twice. 2039762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti mCellNetworkAgent.connect(true); 20406ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti cellNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 2041762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti testFactory.waitForNetworkRequests(2); 2042762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti assertFalse(testFactory.getMyStartRequested()); // Because the cell network outscores us. 2043762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti 2044762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti // Check that cell data stays up. 2045762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti mService.waitForIdle(); 2046762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti verifyActiveNetwork(TRANSPORT_WIFI); 2047762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti assertEquals(2, mCm.getAllNetworks().length); 2048762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti 2049762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti // Turn off mobile data always on and expect the request to disappear... 2050762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti testFactory.expectRemoveRequests(1); 2051e14d49ad5962330a112d46b12d456ecd6bc593b5Lorenzo Colitti setMobileDataAlwaysOn(false); 2052762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti testFactory.waitForNetworkRequests(1); 2053762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti 2054762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti // ... and cell data to be torn down. 20556ee0a92ca04f89081094842487a279cc47e8b5adLorenzo Colitti cellNetworkCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); 2056762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti assertEquals(1, mCm.getAllNetworks().length); 2057762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti 2058762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti testFactory.unregister(); 2059762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti mCm.unregisterNetworkCallback(cellNetworkCallback); 2060762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti handlerThread.quit(); 2061762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti } 2062762ea7aab7636b33daeee2c4ba169f163c61347fLorenzo Colitti 206373b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti @SmallTest 206473b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti public void testAvoidBadWifiSetting() throws Exception { 2065165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti final ContentResolver cr = mServiceContext.getContentResolver(); 2066065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline final WrappedAvoidBadWifiTracker tracker = mService.getAvoidBadWifiTracker(); 2067165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti final String settingName = Settings.Global.NETWORK_AVOID_BAD_WIFI; 2068165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti 2069065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline tracker.configRestrictsAvoidBadWifi = false; 2070165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti String[] values = new String[] {null, "0", "1"}; 2071165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti for (int i = 0; i < values.length; i++) { 2072165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti Settings.Global.putInt(cr, settingName, 1); 2073065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline tracker.reevaluate(); 2074165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti mService.waitForIdle(); 2075165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti String msg = String.format("config=false, setting=%s", values[i]); 2076165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti assertTrue(msg, mService.avoidBadWifi()); 2077065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline assertFalse(msg, tracker.shouldNotifyWifiUnvalidated()); 2078165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti } 2079165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti 2080065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline tracker.configRestrictsAvoidBadWifi = true; 2081165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti 2082165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti Settings.Global.putInt(cr, settingName, 0); 2083065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline tracker.reevaluate(); 2084165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti mService.waitForIdle(); 2085165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti assertFalse(mService.avoidBadWifi()); 2086065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline assertFalse(tracker.shouldNotifyWifiUnvalidated()); 2087165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti 2088165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti Settings.Global.putInt(cr, settingName, 1); 2089065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline tracker.reevaluate(); 2090165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti mService.waitForIdle(); 2091165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti assertTrue(mService.avoidBadWifi()); 2092065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline assertFalse(tracker.shouldNotifyWifiUnvalidated()); 2093165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti 2094165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti Settings.Global.putString(cr, settingName, null); 2095065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline tracker.reevaluate(); 2096165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti mService.waitForIdle(); 2097165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti assertFalse(mService.avoidBadWifi()); 2098065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline assertTrue(tracker.shouldNotifyWifiUnvalidated()); 2099165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti } 2100165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti 2101165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti @SmallTest 2102165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti public void testAvoidBadWifi() throws Exception { 2103065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline final ContentResolver cr = mServiceContext.getContentResolver(); 2104065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline final WrappedAvoidBadWifiTracker tracker = mService.getAvoidBadWifiTracker(); 210573b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti 2106165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti // Pretend we're on a carrier that restricts switching away from bad wifi. 2107065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline tracker.configRestrictsAvoidBadWifi = true; 2108165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti 210973b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti // File a request for cell to ensure it doesn't go down. 211073b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti final TestNetworkCallback cellNetworkCallback = new TestNetworkCallback(); 211173b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti final NetworkRequest cellRequest = new NetworkRequest.Builder() 211273b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti .addTransportType(TRANSPORT_CELLULAR).build(); 211373b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti mCm.requestNetwork(cellRequest, cellNetworkCallback); 211473b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti 211573b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti TestNetworkCallback defaultCallback = new TestNetworkCallback(); 211673b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti mCm.registerDefaultNetworkCallback(defaultCallback); 211773b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti 211873b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti NetworkRequest validatedWifiRequest = new NetworkRequest.Builder() 211973b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti .addTransportType(TRANSPORT_WIFI) 212073b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti .addCapability(NET_CAPABILITY_VALIDATED) 212173b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti .build(); 212273b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti TestNetworkCallback validatedWifiCallback = new TestNetworkCallback(); 212373b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti mCm.registerNetworkCallback(validatedWifiRequest, validatedWifiCallback); 212473b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti 212573b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti Settings.Global.putInt(cr, Settings.Global.NETWORK_AVOID_BAD_WIFI, 0); 2126065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline tracker.reevaluate(); 212773b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti 212873b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti // Bring up validated cell. 212973b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); 213073b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti mCellNetworkAgent.connect(true); 213173b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti cellNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 213273b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti defaultCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 213373b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti Network cellNetwork = mCellNetworkAgent.getNetwork(); 213473b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti 213573b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti // Bring up validated wifi. 213673b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 213773b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti mWiFiNetworkAgent.connect(true); 213873b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti defaultCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); 213973b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti validatedWifiCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); 214073b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti Network wifiNetwork = mWiFiNetworkAgent.getNetwork(); 214173b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti 214273b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti // Fail validation on wifi. 214373b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti mWiFiNetworkAgent.getWrappedNetworkMonitor().gen204ProbeResult = 599; 214473b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti mCm.reportNetworkConnectivity(wifiNetwork, false); 214573b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti validatedWifiCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); 214673b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti 214773b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti // Because avoid bad wifi is off, we don't switch to cellular. 214873b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti defaultCallback.assertNoCallback(); 214973b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti assertFalse(mCm.getNetworkCapabilities(wifiNetwork).hasCapability( 215073b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti NET_CAPABILITY_VALIDATED)); 215173b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti assertTrue(mCm.getNetworkCapabilities(cellNetwork).hasCapability( 215273b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti NET_CAPABILITY_VALIDATED)); 215373b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti assertEquals(mCm.getActiveNetwork(), wifiNetwork); 215473b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti 2155165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti // Simulate switching to a carrier that does not restrict avoiding bad wifi, and expect 2156165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti // that we switch back to cell. 2157065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline tracker.configRestrictsAvoidBadWifi = false; 2158065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline tracker.reevaluate(); 2159165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti defaultCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 2160165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti assertEquals(mCm.getActiveNetwork(), cellNetwork); 2161165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti 2162165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti // Switch back to a restrictive carrier. 2163065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline tracker.configRestrictsAvoidBadWifi = true; 2164065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline tracker.reevaluate(); 2165165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti defaultCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); 2166165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti assertEquals(mCm.getActiveNetwork(), wifiNetwork); 2167165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti 2168165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti // Simulate the user selecting "switch" on the dialog, and check that we switch to cell. 2169165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti mCm.setAvoidUnvalidated(wifiNetwork); 2170165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti defaultCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 2171165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti assertFalse(mCm.getNetworkCapabilities(wifiNetwork).hasCapability( 2172165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti NET_CAPABILITY_VALIDATED)); 2173165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti assertTrue(mCm.getNetworkCapabilities(cellNetwork).hasCapability( 2174165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti NET_CAPABILITY_VALIDATED)); 2175165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti assertEquals(mCm.getActiveNetwork(), cellNetwork); 2176165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti 2177165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti // Disconnect and reconnect wifi to clear the one-time switch above. 2178165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti mWiFiNetworkAgent.disconnect(); 2179165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 2180165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti mWiFiNetworkAgent.connect(true); 2181165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti defaultCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); 2182165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti validatedWifiCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); 2183165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti wifiNetwork = mWiFiNetworkAgent.getNetwork(); 2184165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti 2185165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti // Fail validation on wifi and expect the dialog to appear. 2186165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti mWiFiNetworkAgent.getWrappedNetworkMonitor().gen204ProbeResult = 599; 2187165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti mCm.reportNetworkConnectivity(wifiNetwork, false); 2188165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti validatedWifiCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); 2189165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti 2190165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti // Simulate the user selecting "switch" and checking the don't ask again checkbox. 219173b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti Settings.Global.putInt(cr, Settings.Global.NETWORK_AVOID_BAD_WIFI, 1); 2192065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline tracker.reevaluate(); 219373b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti 219473b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti // We now switch to cell. 219573b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti defaultCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 219673b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti assertFalse(mCm.getNetworkCapabilities(wifiNetwork).hasCapability( 219773b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti NET_CAPABILITY_VALIDATED)); 219873b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti assertTrue(mCm.getNetworkCapabilities(cellNetwork).hasCapability( 219973b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti NET_CAPABILITY_VALIDATED)); 220073b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti assertEquals(mCm.getActiveNetwork(), cellNetwork); 220173b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti 2202165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti // Simulate the user turning the cellular fallback setting off and then on. 2203165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti // We switch to wifi and then to cell. 2204165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti Settings.Global.putString(cr, Settings.Global.NETWORK_AVOID_BAD_WIFI, null); 2205065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline tracker.reevaluate(); 2206165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti defaultCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); 2207165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti assertEquals(mCm.getActiveNetwork(), wifiNetwork); 2208165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti Settings.Global.putInt(cr, Settings.Global.NETWORK_AVOID_BAD_WIFI, 1); 2209065ab6ee407dc8b3b5b477e483b6f48e50720113Erik Kline tracker.reevaluate(); 2210165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti defaultCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); 2211165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti assertEquals(mCm.getActiveNetwork(), cellNetwork); 2212165c51c0eb9834a3d95ce0b31b07c7c8975a54d7Lorenzo Colitti 221373b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti // If cell goes down, we switch to wifi. 221473b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti mCellNetworkAgent.disconnect(); 221573b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti defaultCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); 221673b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti defaultCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); 221773b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti validatedWifiCallback.assertNoCallback(); 221873b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti 221973b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti mCm.unregisterNetworkCallback(cellNetworkCallback); 222073b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti mCm.unregisterNetworkCallback(validatedWifiCallback); 222173b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti mCm.unregisterNetworkCallback(defaultCallback); 222273b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti } 222373b20938c7b0a27c027204a7d4bdcf18766cb167Lorenzo Colitti 22247914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti private static class TestKeepaliveCallback extends PacketKeepaliveCallback { 22257914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 22267914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti public static enum CallbackType { ON_STARTED, ON_STOPPED, ON_ERROR }; 22277914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 22287914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti private class CallbackValue { 22297914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti public CallbackType callbackType; 22307914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti public int error; 22317914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 22327914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti public CallbackValue(CallbackType type) { 22337914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti this.callbackType = type; 22347914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti this.error = PacketKeepalive.SUCCESS; 22357914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti assertTrue("onError callback must have error", type != CallbackType.ON_ERROR); 22367914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti } 22377914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 22387914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti public CallbackValue(CallbackType type, int error) { 22397914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti this.callbackType = type; 22407914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti this.error = error; 22417914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti assertEquals("error can only be set for onError", type, CallbackType.ON_ERROR); 22427914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti } 22437914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 22447914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti @Override 22457914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti public boolean equals(Object o) { 22467914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti return o instanceof CallbackValue && 22477914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti this.callbackType == ((CallbackValue) o).callbackType && 22487914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti this.error == ((CallbackValue) o).error; 22497914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti } 22507914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 22517914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti @Override 22527914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti public String toString() { 22537914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti return String.format("%s(%s, %d)", getClass().getSimpleName(), callbackType, error); 22547914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti } 22557914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti } 22567914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 22577914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti private LinkedBlockingQueue<CallbackValue> mCallbacks = new LinkedBlockingQueue<>(); 22587914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 22597914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti @Override 22607914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti public void onStarted() { 22617914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti mCallbacks.add(new CallbackValue(CallbackType.ON_STARTED)); 22627914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti } 22637914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 22647914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti @Override 22657914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti public void onStopped() { 22667914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti mCallbacks.add(new CallbackValue(CallbackType.ON_STOPPED)); 22677914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti } 22687914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 22697914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti @Override 22707914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti public void onError(int error) { 22717914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti mCallbacks.add(new CallbackValue(CallbackType.ON_ERROR, error)); 22727914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti } 22737914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 22747914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti private void expectCallback(CallbackValue callbackValue) { 22757914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti try { 22767914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti assertEquals( 22777914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti callbackValue, 22787914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti mCallbacks.poll(TIMEOUT_MS, TimeUnit.MILLISECONDS)); 22797914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti } catch (InterruptedException e) { 22807914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti fail(callbackValue.callbackType + " callback not seen after " + TIMEOUT_MS + " ms"); 22817914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti } 22827914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti } 22837914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 22847914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti public void expectStarted() { 22857914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti expectCallback(new CallbackValue(CallbackType.ON_STARTED)); 22867914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti } 22877914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 22887914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti public void expectStopped() { 22897914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti expectCallback(new CallbackValue(CallbackType.ON_STOPPED)); 22907914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti } 22917914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 22927914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti public void expectError(int error) { 22937914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti expectCallback(new CallbackValue(CallbackType.ON_ERROR, error)); 22947914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti } 22957914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti } 22967914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 22977914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti private Network connectKeepaliveNetwork(LinkProperties lp) { 22987914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti // Ensure the network is disconnected before we do anything. 22997914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti if (mWiFiNetworkAgent != null) { 23007914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti assertNull(mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork())); 23017914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti } 23027914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 23037914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 23047914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti ConditionVariable cv = waitForConnectivityBroadcasts(1); 23057914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti mWiFiNetworkAgent.connect(true); 23067914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti waitFor(cv); 23077914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti verifyActiveNetwork(TRANSPORT_WIFI); 23087914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti mWiFiNetworkAgent.sendLinkProperties(lp); 23097914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti mService.waitForIdle(); 23107914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti return mWiFiNetworkAgent.getNetwork(); 23117914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti } 23127914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 23137914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti public void testPacketKeepalives() throws Exception { 23147914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti InetAddress myIPv4 = InetAddress.getByName("192.0.2.129"); 23157914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti InetAddress notMyIPv4 = InetAddress.getByName("192.0.2.35"); 23167914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti InetAddress myIPv6 = InetAddress.getByName("2001:db8::1"); 23177914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti InetAddress dstIPv4 = InetAddress.getByName("8.8.8.8"); 23187914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti InetAddress dstIPv6 = InetAddress.getByName("2001:4860:4860::8888"); 23197914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 23207914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti LinkProperties lp = new LinkProperties(); 23217914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti lp.setInterfaceName("wlan12"); 23227914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti lp.addLinkAddress(new LinkAddress(myIPv6, 64)); 23237914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti lp.addLinkAddress(new LinkAddress(myIPv4, 25)); 23247914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti lp.addRoute(new RouteInfo(InetAddress.getByName("fe80::1234"))); 23257914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti lp.addRoute(new RouteInfo(InetAddress.getByName("192.0.2.254"))); 23267914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 23277914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti Network notMyNet = new Network(61234); 23287914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti Network myNet = connectKeepaliveNetwork(lp); 23297914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 23307914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti TestKeepaliveCallback callback = new TestKeepaliveCallback(); 23317914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti PacketKeepalive ka; 23327914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 23337914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti // Attempt to start keepalives with invalid parameters and check for errors. 23347914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti ka = mCm.startNattKeepalive(notMyNet, 25, callback, myIPv4, 1234, dstIPv4); 23357914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti callback.expectError(PacketKeepalive.ERROR_INVALID_NETWORK); 23367914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 23377914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti ka = mCm.startNattKeepalive(myNet, 19, callback, notMyIPv4, 1234, dstIPv4); 23387914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti callback.expectError(PacketKeepalive.ERROR_INVALID_INTERVAL); 23397914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 23407914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv4, 1234, dstIPv6); 23417914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti callback.expectError(PacketKeepalive.ERROR_INVALID_IP_ADDRESS); 23427914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 23437914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv6, 1234, dstIPv4); 23447914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti callback.expectError(PacketKeepalive.ERROR_INVALID_IP_ADDRESS); 23457914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 23467914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv6, 1234, dstIPv6); 23477914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti callback.expectError(PacketKeepalive.ERROR_INVALID_IP_ADDRESS); // NAT-T is IPv4-only. 23487914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 23497914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv4, 123456, dstIPv4); 23507914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti callback.expectError(PacketKeepalive.ERROR_INVALID_PORT); 23517914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 23527914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv4, 123456, dstIPv4); 23537914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti callback.expectError(PacketKeepalive.ERROR_INVALID_PORT); 23547914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 23557914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv4, 12345, dstIPv4); 23567914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti callback.expectError(PacketKeepalive.ERROR_HARDWARE_UNSUPPORTED); 23577914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 23587914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv4, 12345, dstIPv4); 23597914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti callback.expectError(PacketKeepalive.ERROR_HARDWARE_UNSUPPORTED); 23607914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 23617914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti // Check that a started keepalive can be stopped. 23627914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti mWiFiNetworkAgent.setStartKeepaliveError(PacketKeepalive.SUCCESS); 23637914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv4, 12345, dstIPv4); 23647914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti callback.expectStarted(); 23657914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti mWiFiNetworkAgent.setStopKeepaliveError(PacketKeepalive.SUCCESS); 23667914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti ka.stop(); 23677914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti callback.expectStopped(); 23687914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 23697914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti // Check that deleting the IP address stops the keepalive. 23707914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti LinkProperties bogusLp = new LinkProperties(lp); 23717914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv4, 12345, dstIPv4); 23727914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti callback.expectStarted(); 23737914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti bogusLp.removeLinkAddress(new LinkAddress(myIPv4, 25)); 23747914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti bogusLp.addLinkAddress(new LinkAddress(notMyIPv4, 25)); 23757914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti mWiFiNetworkAgent.sendLinkProperties(bogusLp); 23767914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti callback.expectError(PacketKeepalive.ERROR_INVALID_IP_ADDRESS); 23777914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti mWiFiNetworkAgent.sendLinkProperties(lp); 23787914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 23797914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti // Check that a started keepalive is stopped correctly when the network disconnects. 23807914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv4, 12345, dstIPv4); 23817914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti callback.expectStarted(); 23827914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti mWiFiNetworkAgent.disconnect(); 23837914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti callback.expectError(PacketKeepalive.ERROR_INVALID_NETWORK); 23847914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 23857914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti // ... and that stopping it after that has no adverse effects. 23867914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti assertNull(mCm.getNetworkCapabilities(myNet)); 23877914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti ka.stop(); 23887914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 23897914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti // Reconnect. 23907914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti myNet = connectKeepaliveNetwork(lp); 23917914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti mWiFiNetworkAgent.setStartKeepaliveError(PacketKeepalive.SUCCESS); 23927914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 23937914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti // Check things work as expected when the keepalive is stopped and the network disconnects. 23947914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv4, 12345, dstIPv4); 23957914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti callback.expectStarted(); 23967914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti ka.stop(); 23977914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti mWiFiNetworkAgent.disconnect(); 23987914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti mService.waitForIdle(); 23997914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti callback.expectStopped(); 24007914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 24017914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti // Reconnect. 24027914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti myNet = connectKeepaliveNetwork(lp); 24037914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti mWiFiNetworkAgent.setStartKeepaliveError(PacketKeepalive.SUCCESS); 24047914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 24057914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti // Check that keepalive slots start from 1 and increment. The first one gets slot 1. 24067914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti mWiFiNetworkAgent.setExpectedKeepaliveSlot(1); 24077914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv4, 12345, dstIPv4); 24087914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti callback.expectStarted(); 24097914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 24107914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti // The second one gets slot 2. 24117914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti mWiFiNetworkAgent.setExpectedKeepaliveSlot(2); 24127914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti TestKeepaliveCallback callback2 = new TestKeepaliveCallback(); 24137914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti PacketKeepalive ka2 = mCm.startNattKeepalive(myNet, 25, callback2, myIPv4, 6789, dstIPv4); 24147914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti callback2.expectStarted(); 24157914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 24167914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti // Now stop the first one and create a third. This also gets slot 1. 24177914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti ka.stop(); 24187914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti callback.expectStopped(); 24197914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 24207914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti mWiFiNetworkAgent.setExpectedKeepaliveSlot(1); 24217914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti TestKeepaliveCallback callback3 = new TestKeepaliveCallback(); 24227914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti PacketKeepalive ka3 = mCm.startNattKeepalive(myNet, 25, callback3, myIPv4, 9876, dstIPv4); 24237914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti callback3.expectStarted(); 24247914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 24257914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti ka2.stop(); 24267914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti callback2.expectStopped(); 24277914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti 24287914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti ka3.stop(); 24297914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti callback3.expectStopped(); 24307914ce5dd4d2e53eba1a3a8a1ed97da96cec129fLorenzo Colitti } 2431b7c2487c8b5fbd154643b8ddade8d88507cae137Udam Saini 2432b7c2487c8b5fbd154643b8ddade8d88507cae137Udam Saini @SmallTest 2433b7c2487c8b5fbd154643b8ddade8d88507cae137Udam Saini public void testGetCaptivePortalServerUrl() throws Exception { 2434b7c2487c8b5fbd154643b8ddade8d88507cae137Udam Saini String url = mCm.getCaptivePortalServerUrl(); 2435b7c2487c8b5fbd154643b8ddade8d88507cae137Udam Saini assertEquals("http://connectivitycheck.gstatic.com/generate_204", url); 2436b7c2487c8b5fbd154643b8ddade8d88507cae137Udam Saini } 2437531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti 2438531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti private static class TestNetworkPinner extends NetworkPinner { 2439531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti public static boolean awaitPin(int timeoutMs) { 2440531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti synchronized(sLock) { 2441531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti if (sNetwork == null) { 2442531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti try { 2443531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti sLock.wait(timeoutMs); 2444531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti } catch (InterruptedException e) {} 2445531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti } 2446531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti return sNetwork != null; 2447531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti } 2448531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti } 2449531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti 2450531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti public static boolean awaitUnpin(int timeoutMs) { 2451531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti synchronized(sLock) { 2452531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti if (sNetwork != null) { 2453531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti try { 2454531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti sLock.wait(timeoutMs); 2455531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti } catch (InterruptedException e) {} 2456531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti } 2457531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti return sNetwork == null; 2458531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti } 2459531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti } 2460531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti } 2461531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti 2462531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti private void assertPinnedToWifiWithCellDefault() { 2463531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getBoundNetworkForProcess()); 2464531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); 2465531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti } 2466531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti 2467531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti private void assertPinnedToWifiWithWifiDefault() { 2468531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getBoundNetworkForProcess()); 2469531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); 2470531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti } 2471531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti 2472531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti private void assertNotPinnedToWifi() { 2473531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti assertNull(mCm.getBoundNetworkForProcess()); 2474531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); 2475531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti } 2476531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti 2477531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti @SmallTest 2478531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti public void testNetworkPinner() { 2479531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti NetworkRequest wifiRequest = new NetworkRequest.Builder() 2480531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti .addTransportType(TRANSPORT_WIFI) 2481531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti .build(); 2482531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti assertNull(mCm.getBoundNetworkForProcess()); 2483531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti 2484531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti TestNetworkPinner.pin(mServiceContext, wifiRequest); 2485531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti assertNull(mCm.getBoundNetworkForProcess()); 2486531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti 2487531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); 2488531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti mCellNetworkAgent.connect(true); 2489531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 2490531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti mWiFiNetworkAgent.connect(false); 2491531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti 2492531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti // When wi-fi connects, expect to be pinned. 2493531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti assertTrue(TestNetworkPinner.awaitPin(100)); 2494531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti assertPinnedToWifiWithCellDefault(); 2495531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti 2496531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti // Disconnect and expect the pin to drop. 2497531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti mWiFiNetworkAgent.disconnect(); 2498531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti assertTrue(TestNetworkPinner.awaitUnpin(100)); 2499531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti assertNotPinnedToWifi(); 2500531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti 2501531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti // Reconnecting does not cause the pin to come back. 2502531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 2503531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti mWiFiNetworkAgent.connect(false); 2504531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti assertFalse(TestNetworkPinner.awaitPin(100)); 2505531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti assertNotPinnedToWifi(); 2506531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti 2507531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti // Pinning while connected causes the pin to take effect immediately. 2508531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti TestNetworkPinner.pin(mServiceContext, wifiRequest); 2509531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti assertTrue(TestNetworkPinner.awaitPin(100)); 2510531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti assertPinnedToWifiWithCellDefault(); 2511531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti 2512531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti // Explicitly unpin and expect to use the default network again. 2513531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti TestNetworkPinner.unpin(); 2514531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti assertNotPinnedToWifi(); 2515531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti 2516531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti // Disconnect cell and wifi. 2517531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti ConditionVariable cv = waitForConnectivityBroadcasts(3); // cell down, wifi up, wifi down. 2518531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti mCellNetworkAgent.disconnect(); 2519531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti mWiFiNetworkAgent.disconnect(); 2520531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti waitFor(cv); 2521531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti 2522531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti // Pinning takes effect even if the pinned network is the default when the pin is set... 2523531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti TestNetworkPinner.pin(mServiceContext, wifiRequest); 2524531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 2525531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti mWiFiNetworkAgent.connect(false); 2526531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti assertTrue(TestNetworkPinner.awaitPin(100)); 2527531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti assertPinnedToWifiWithWifiDefault(); 2528531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti 2529531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti // ... and is maintained even when that network is no longer the default. 2530531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti cv = waitForConnectivityBroadcasts(1); 2531531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); 2532531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti mCellNetworkAgent.connect(true); 2533531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti waitFor(cv); 2534531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti assertPinnedToWifiWithCellDefault(); 2535531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti } 25364e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen 25374e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen @SmallTest 25384e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen public void testNetworkRequestMaximum() { 25394e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen final int MAX_REQUESTS = 100; 25404e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen // Test that the limit is enforced when MAX_REQUESTS simultaneous requests are added. 25414e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen NetworkRequest networkRequest = new NetworkRequest.Builder().build(); 25424e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen ArrayList<NetworkCallback> networkCallbacks = new ArrayList<NetworkCallback>(); 25434e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen try { 25444e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen for (int i = 0; i < MAX_REQUESTS; i++) { 25454e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen NetworkCallback networkCallback = new NetworkCallback(); 25464e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen mCm.requestNetwork(networkRequest, networkCallback); 25474e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen networkCallbacks.add(networkCallback); 25484e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen } 25494e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen fail("Registering " + MAX_REQUESTS + " NetworkRequests did not throw exception"); 25504e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen } catch (IllegalArgumentException expected) {} 25514e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen for (NetworkCallback networkCallback : networkCallbacks) { 25524e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen mCm.unregisterNetworkCallback(networkCallback); 25534e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen } 25544e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen networkCallbacks.clear(); 25554e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen 25564e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen try { 25574e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen for (int i = 0; i < MAX_REQUESTS; i++) { 25584e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen NetworkCallback networkCallback = new NetworkCallback(); 25594e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen mCm.registerNetworkCallback(networkRequest, networkCallback); 25604e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen networkCallbacks.add(networkCallback); 25614e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen } 25624e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen fail("Registering " + MAX_REQUESTS + " NetworkCallbacks did not throw exception"); 25634e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen } catch (IllegalArgumentException expected) {} 25644e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen for (NetworkCallback networkCallback : networkCallbacks) { 25654e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen mCm.unregisterNetworkCallback(networkCallback); 25664e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen } 25674e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen networkCallbacks.clear(); 25684e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen 25694e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen ArrayList<PendingIntent> pendingIntents = new ArrayList<PendingIntent>(); 25704e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen try { 25714e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen for (int i = 0; i < MAX_REQUESTS + 1; i++) { 25724e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen PendingIntent pendingIntent = 25734e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen PendingIntent.getBroadcast(mContext, 0, new Intent("a" + i), 0); 25744e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen mCm.requestNetwork(networkRequest, pendingIntent); 25754e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen pendingIntents.add(pendingIntent); 25764e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen } 25774e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen fail("Registering " + MAX_REQUESTS + 25784e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen " PendingIntent NetworkRequests did not throw exception"); 25794e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen } catch (IllegalArgumentException expected) {} 25804e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen for (PendingIntent pendingIntent : pendingIntents) { 25814e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen mCm.unregisterNetworkCallback(pendingIntent); 25824e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen } 25834e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen pendingIntents.clear(); 25844e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen 25854e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen try { 25864e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen for (int i = 0; i < MAX_REQUESTS + 1; i++) { 25874e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen PendingIntent pendingIntent = 25884e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen PendingIntent.getBroadcast(mContext, 0, new Intent("a" + i), 0); 25894e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen mCm.registerNetworkCallback(networkRequest, pendingIntent); 25904e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen pendingIntents.add(pendingIntent); 25914e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen } 25924e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen fail("Registering " + MAX_REQUESTS + 25934e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen " PendingIntent NetworkCallbacks did not throw exception"); 25944e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen } catch (IllegalArgumentException expected) {} 25954e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen for (PendingIntent pendingIntent : pendingIntents) { 25964e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen mCm.unregisterNetworkCallback(pendingIntent); 25974e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen } 25984e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen pendingIntents.clear(); 25994e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen mService.waitForIdle(5000); 26004e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen 26014e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen // Test that the limit is not hit when MAX_REQUESTS requests are added and removed. 26024e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen for (int i = 0; i < MAX_REQUESTS; i++) { 26034e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen NetworkCallback networkCallback = new NetworkCallback(); 26044e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen mCm.requestNetwork(networkRequest, networkCallback); 26054e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen mCm.unregisterNetworkCallback(networkCallback); 26064e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen } 26074e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen mService.waitForIdle(); 26084e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen for (int i = 0; i < MAX_REQUESTS; i++) { 26094e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen NetworkCallback networkCallback = new NetworkCallback(); 26104e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen mCm.registerNetworkCallback(networkRequest, networkCallback); 26114e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen mCm.unregisterNetworkCallback(networkCallback); 26124e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen } 26134e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen mService.waitForIdle(); 26144e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen for (int i = 0; i < MAX_REQUESTS; i++) { 26154e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen PendingIntent pendingIntent = 26164e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen PendingIntent.getBroadcast(mContext, 0, new Intent("b" + i), 0); 26174e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen mCm.requestNetwork(networkRequest, pendingIntent); 26184e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen mCm.unregisterNetworkCallback(pendingIntent); 26194e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen } 26204e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen mService.waitForIdle(); 26214e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen for (int i = 0; i < MAX_REQUESTS; i++) { 26224e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen PendingIntent pendingIntent = 26234e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen PendingIntent.getBroadcast(mContext, 0, new Intent("c" + i), 0); 26244e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen mCm.registerNetworkCallback(networkRequest, pendingIntent); 26254e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen mCm.unregisterNetworkCallback(pendingIntent); 26264e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen } 26274e1d3fdf7a43b3e43efac0a26ca3d0f458ce87d3Paul Jensen } 2628fb878b66b9456f8fee2bcb1076263852d207949dJeff Sharkey} 2629