diff options
55 files changed, 464 insertions, 1261 deletions
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index 51431ebfaf14..0afb546aa4e4 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -2079,8 +2079,6 @@ public class ConnectivityManager { @SystemApi public void startTethering(int type, boolean showProvisioningUi, final OnStartTetheringCallback callback, Handler handler) { - checkNotNull(callback, "OnStartTetheringCallback cannot be null."); - ResultReceiver wrappedCallback = new ResultReceiver(handler) { @Override protected void onReceiveResult(int resultCode, Bundle resultData) { @@ -2091,7 +2089,6 @@ public class ConnectivityManager { } } }; - try { mService.startTethering(type, wrappedCallback, showProvisioningUi); } catch (RemoteException e) { @@ -2595,8 +2592,7 @@ public class ConnectivityManager { /** * Called if no network is found in the given timeout time. If no timeout is given, - * this will not be called. The associated {@link NetworkRequest} will have already - * been removed and released, as if {@link #unregisterNetworkCallback} had been called. + * this will not be called. * @hide */ public void onUnavailable() {} @@ -2660,7 +2656,6 @@ public class ConnectivityManager { public static final int CALLBACK_IP_CHANGED = BASE + 7; /** @hide */ public static final int CALLBACK_RELEASED = BASE + 8; - // TODO: consider deleting CALLBACK_EXIT and shifting following enum codes down by 1. /** @hide */ public static final int CALLBACK_EXIT = BASE + 9; /** @hide obj = NetworkCapabilities, arg1 = seq number */ @@ -2670,38 +2665,25 @@ public class ConnectivityManager { /** @hide */ public static final int CALLBACK_RESUMED = BASE + 12; - /** @hide */ - public static String getCallbackName(int whichCallback) { - switch (whichCallback) { - case CALLBACK_PRECHECK: return "CALLBACK_PRECHECK"; - case CALLBACK_AVAILABLE: return "CALLBACK_AVAILABLE"; - case CALLBACK_LOSING: return "CALLBACK_LOSING"; - case CALLBACK_LOST: return "CALLBACK_LOST"; - case CALLBACK_UNAVAIL: return "CALLBACK_UNAVAIL"; - case CALLBACK_CAP_CHANGED: return "CALLBACK_CAP_CHANGED"; - case CALLBACK_IP_CHANGED: return "CALLBACK_IP_CHANGED"; - case CALLBACK_RELEASED: return "CALLBACK_RELEASED"; - case CALLBACK_EXIT: return "CALLBACK_EXIT"; - case EXPIRE_LEGACY_REQUEST: return "EXPIRE_LEGACY_REQUEST"; - case CALLBACK_SUSPENDED: return "CALLBACK_SUSPENDED"; - case CALLBACK_RESUMED: return "CALLBACK_RESUMED"; - default: - return Integer.toString(whichCallback); - } - } - private class CallbackHandler extends Handler { + private final HashMap<NetworkRequest, NetworkCallback>mCallbackMap; + private final AtomicInteger mRefCount; private static final String TAG = "ConnectivityManager.CallbackHandler"; + private final ConnectivityManager mCm; private static final boolean DBG = false; - CallbackHandler(Looper looper) { + CallbackHandler(Looper looper, HashMap<NetworkRequest, NetworkCallback>callbackMap, + AtomicInteger refCount, ConnectivityManager cm) { super(looper); + mCallbackMap = callbackMap; + mRefCount = refCount; + mCm = cm; } @Override public void handleMessage(Message message) { - NetworkRequest request = getObject(message, NetworkRequest.class); - Network network = getObject(message, Network.class); + NetworkRequest request = (NetworkRequest) getObject(message, NetworkRequest.class); + Network network = (Network) getObject(message, Network.class); if (DBG) { Log.d(TAG, whatToString(message.what) + " for network " + network); } @@ -2744,7 +2726,9 @@ public class ConnectivityManager { case CALLBACK_CAP_CHANGED: { NetworkCallback callback = getCallback(request, "CAP_CHANGED"); if (callback != null) { - NetworkCapabilities cap = getObject(message, NetworkCapabilities.class); + NetworkCapabilities cap = (NetworkCapabilities)getObject(message, + NetworkCapabilities.class); + callback.onCapabilitiesChanged(network, cap); } break; @@ -2752,7 +2736,9 @@ public class ConnectivityManager { case CALLBACK_IP_CHANGED: { NetworkCallback callback = getCallback(request, "IP_CHANGED"); if (callback != null) { - LinkProperties lp = getObject(message, LinkProperties.class); + LinkProperties lp = (LinkProperties)getObject(message, + LinkProperties.class); + callback.onLinkPropertiesChanged(network, lp); } break; @@ -2772,16 +2758,24 @@ public class ConnectivityManager { break; } case CALLBACK_RELEASED: { - final NetworkCallback callback; - synchronized(sCallbacks) { - callback = sCallbacks.remove(request); + NetworkCallback callback = null; + synchronized(mCallbackMap) { + callback = mCallbackMap.remove(request); } - if (callback == null) { + if (callback != null) { + synchronized(mRefCount) { + if (mRefCount.decrementAndGet() == 0) { + getLooper().quit(); + } + } + } else { Log.e(TAG, "callback not found for RELEASED message"); } break; } case CALLBACK_EXIT: { + Log.d(TAG, "Listener quitting"); + getLooper().quit(); break; } case EXPIRE_LEGACY_REQUEST: { @@ -2791,14 +2785,14 @@ public class ConnectivityManager { } } - private <T> T getObject(Message msg, Class<T> c) { - return (T) msg.getData().getParcelable(c.getSimpleName()); + private Object getObject(Message msg, Class c) { + return msg.getData().getParcelable(c.getSimpleName()); } private NetworkCallback getCallback(NetworkRequest req, String name) { NetworkCallback callback; - synchronized(sCallbacks) { - callback = sCallbacks.get(req); + synchronized(mCallbackMap) { + callback = mCallbackMap.get(req); } if (callback == null) { Log.e(TAG, "callback not found for " + name + " message"); @@ -2807,56 +2801,63 @@ public class ConnectivityManager { } } - private CallbackHandler getHandler() { - synchronized (sCallbacks) { - if (sCallbackHandler == null) { - sCallbackHandler = new CallbackHandler(ConnectivityThread.getInstanceLooper()); + private void incCallbackHandlerRefCount() { + synchronized(sCallbackRefCount) { + if (sCallbackRefCount.incrementAndGet() == 1) { + // TODO: switch this to ConnectivityThread + HandlerThread callbackThread = new HandlerThread("ConnectivityManager"); + callbackThread.start(); + sCallbackHandler = new CallbackHandler(callbackThread.getLooper(), + sNetworkCallback, sCallbackRefCount, this); } - return sCallbackHandler; } } - static final HashMap<NetworkRequest, NetworkCallback> sCallbacks = new HashMap<>(); - static CallbackHandler sCallbackHandler; + private void decCallbackHandlerRefCount() { + synchronized(sCallbackRefCount) { + if (sCallbackRefCount.decrementAndGet() == 0) { + sCallbackHandler.obtainMessage(CALLBACK_EXIT).sendToTarget(); + sCallbackHandler = null; + } + } + } + + static final HashMap<NetworkRequest, NetworkCallback> sNetworkCallback = + new HashMap<NetworkRequest, NetworkCallback>(); + static final AtomicInteger sCallbackRefCount = new AtomicInteger(0); + static CallbackHandler sCallbackHandler = null; private final static int LISTEN = 1; private final static int REQUEST = 2; private NetworkRequest sendRequestForNetwork(NetworkCapabilities need, - NetworkCallback callback, int timeoutMs, int action, int legacyType) { - return sendRequestForNetwork(need, callback, getHandler(), timeoutMs, action, legacyType); - } - - private NetworkRequest sendRequestForNetwork(NetworkCapabilities need, - NetworkCallback callback, Handler handler, int timeoutMs, int action, int legacyType) { - if (callback == null) { + NetworkCallback networkCallback, int timeoutSec, int action, + int legacyType) { + if (networkCallback == null) { throw new IllegalArgumentException("null NetworkCallback"); } if (need == null && action != REQUEST) { throw new IllegalArgumentException("null NetworkCapabilities"); } - // TODO: throw an exception if callback.networkRequest is not null. - // http://b/20701525 - final NetworkRequest request; try { - synchronized(sCallbacks) { - Messenger messenger = new Messenger(handler); - Binder binder = new Binder(); + incCallbackHandlerRefCount(); + synchronized(sNetworkCallback) { if (action == LISTEN) { - request = mService.listenForNetwork(need, messenger, binder); + networkCallback.networkRequest = mService.listenForNetwork(need, + new Messenger(sCallbackHandler), new Binder()); } else { - request = mService.requestNetwork( - need, messenger, timeoutMs, binder, legacyType); + networkCallback.networkRequest = mService.requestNetwork(need, + new Messenger(sCallbackHandler), timeoutSec, new Binder(), legacyType); } - if (request != null) { - sCallbacks.put(request, callback); + if (networkCallback.networkRequest != null) { + sNetworkCallback.put(networkCallback.networkRequest, networkCallback); } - callback.networkRequest = request; } } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } - return request; + if (networkCallback.networkRequest == null) decCallbackHandlerRefCount(); + return networkCallback.networkRequest; } /** diff --git a/core/java/android/net/ConnectivityThread.java b/core/java/android/net/ConnectivityThread.java index 0b218e738b77..55c3402bf39d 100644 --- a/core/java/android/net/ConnectivityThread.java +++ b/core/java/android/net/ConnectivityThread.java @@ -27,30 +27,25 @@ import android.os.Looper; * @hide */ public final class ConnectivityThread extends HandlerThread { - - // A class implementing the lazy holder idiom: the unique static instance - // of ConnectivityThread is instantiated in a thread-safe way (guaranteed by - // the language specs) the first time that Singleton is referenced in get() - // or getInstanceLooper(). - private static class Singleton { - private static final ConnectivityThread INSTANCE = createInstance(); - } + private static ConnectivityThread sInstance; private ConnectivityThread() { super("ConnectivityThread"); } - private static ConnectivityThread createInstance() { - ConnectivityThread t = new ConnectivityThread(); - t.start(); - return t; + private static synchronized ConnectivityThread getInstance() { + if (sInstance == null) { + sInstance = new ConnectivityThread(); + sInstance.start(); + } + return sInstance; } public static ConnectivityThread get() { - return Singleton.INSTANCE; + return getInstance(); } public static Looper getInstanceLooper() { - return Singleton.INSTANCE.getLooper(); + return getInstance().getLooper(); } } diff --git a/core/java/android/net/IIpConnectivityMetrics.aidl b/core/java/android/net/IIpConnectivityMetrics.aidl index d36b7661aaa3..8f634bbf0cc9 100644 --- a/core/java/android/net/IIpConnectivityMetrics.aidl +++ b/core/java/android/net/IIpConnectivityMetrics.aidl @@ -23,8 +23,7 @@ import android.net.ConnectivityMetricsEvent; interface IIpConnectivityMetrics { /** - * @return the number of remaining available slots in buffer, - * or -1 if the event was dropped due to rate limiting. + * @return number of remaining available slots in buffer. */ int logEvent(in ConnectivityMetricsEvent event); } diff --git a/core/java/android/net/NetworkStats.java b/core/java/android/net/NetworkStats.java index f65a50f02df3..25806fa77674 100644 --- a/core/java/android/net/NetworkStats.java +++ b/core/java/android/net/NetworkStats.java @@ -904,8 +904,7 @@ public class NetworkStats implements Parcelable { if (pool.isEmpty()) { return true; } - Entry moved = - addTrafficToApplications(tunUid, tunIface, underlyingIface, tunIfaceTotal, pool); + Entry moved = addTrafficToApplications(tunIface, underlyingIface, tunIfaceTotal, pool); deductTrafficFromVpnApp(tunUid, underlyingIface, moved); if (!moved.isEmpty()) { @@ -920,9 +919,9 @@ public class NetworkStats implements Parcelable { * Initializes the data used by the migrateTun() method. * * This is the first pass iteration which does the following work: - * (1) Adds up all the traffic through the tunUid's underlyingIface + * (1) Adds up all the traffic through tun0. + * (2) Adds up all the traffic through the tunUid's underlyingIface * (both foreground and background). - * (2) Adds up all the traffic through tun0 excluding traffic from the vpn app itself. */ private void tunAdjustmentInit(int tunUid, String tunIface, String underlyingIface, Entry tunIfaceTotal, Entry underlyingIfaceTotal) { @@ -942,9 +941,8 @@ public class NetworkStats implements Parcelable { underlyingIfaceTotal.add(recycle); } - if (recycle.uid != tunUid && recycle.tag == TAG_NONE - && Objects.equals(tunIface, recycle.iface)) { - // Add up all tunIface traffic excluding traffic from the vpn app itself. + if (recycle.tag == TAG_NONE && Objects.equals(tunIface, recycle.iface)) { + // Add up all tunIface traffic. tunIfaceTotal.add(recycle); } } @@ -960,15 +958,13 @@ public class NetworkStats implements Parcelable { return pool; } - private Entry addTrafficToApplications(int tunUid, String tunIface, String underlyingIface, + private Entry addTrafficToApplications(String tunIface, String underlyingIface, Entry tunIfaceTotal, Entry pool) { Entry moved = new Entry(); Entry tmpEntry = new Entry(); tmpEntry.iface = underlyingIface; for (int i = 0; i < size; i++) { - // the vpn app is excluded from the redistribution but all moved traffic will be - // deducted from the vpn app (see deductTrafficFromVpnApp below). - if (Objects.equals(iface[i], tunIface) && uid[i] != tunUid) { + if (Objects.equals(iface[i], tunIface)) { if (tunIfaceTotal.rxBytes > 0) { tmpEntry.rxBytes = pool.rxBytes * rxBytes[i] / tunIfaceTotal.rxBytes; } else { diff --git a/core/java/android/net/nsd/NsdManager.java b/core/java/android/net/nsd/NsdManager.java index 33d12a3a3fb8..86bd5028266b 100644 --- a/core/java/android/net/nsd/NsdManager.java +++ b/core/java/android/net/nsd/NsdManager.java @@ -103,11 +103,11 @@ import com.android.internal.util.Protocol; * to {@link DiscoveryListener#onServiceFound} and a service lost is notified on * {@link DiscoveryListener#onServiceLost}. * - * <p> Once the peer application discovers the "Example" http service, and either needs to read the - * attributes of the service or wants to receive data from the "Example" application, it can - * initiate a resolve with {@link #resolveService} to resolve the attributes, host, and port - * details. A successful resolve is notified on {@link ResolveListener#onServiceResolved} and a - * failure is notified on {@link ResolveListener#onResolveFailed}. + * <p> Once the peer application discovers the "Example" http srevice, and needs to receive data + * from the "Example" application, it can initiate a resolve with {@link #resolveService} to + * resolve the host and port details for the purpose of establishing a connection. A successful + * resolve is notified on {@link ResolveListener#onServiceResolved} and a failure is notified + * on {@link ResolveListener#onResolveFailed}. * * Applications can reserve for a service type at * http://www.iana.org/form/ports-service. Existing services can be found at diff --git a/core/java/android/net/nsd/NsdServiceInfo.java b/core/java/android/net/nsd/NsdServiceInfo.java index 7b845be74921..4a06fb1220a7 100644 --- a/core/java/android/net/nsd/NsdServiceInfo.java +++ b/core/java/android/net/nsd/NsdServiceInfo.java @@ -250,8 +250,7 @@ public final class NsdServiceInfo implements Parcelable { } /** - * Retrieve attributes as a map of String keys to byte[] values. The attributes map is only - * valid for a resolved service. + * Retrive attributes as a map of String keys to byte[] values. * * <p> The returned map is unmodifiable; changes must be made through {@link #setAttribute} and * {@link #removeAttribute}. diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index e52983e995df..1350bfabaee8 100755 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -7172,13 +7172,6 @@ public final class Settings { */ public static final String MOBILE_DATA_ALWAYS_ON = "mobile_data_always_on"; - /** - * Size of the event buffer for IP connectivity metrics. - * @hide - */ - public static final String CONNECTIVITY_METRICS_BUFFER_SIZE = - "connectivity_metrics_buffer_size"; - /** {@hide} */ public static final String NETSTATS_ENABLED = "netstats_enabled"; /** {@hide} */ @@ -8035,45 +8028,11 @@ public final class Settings { public static final String PAC_CHANGE_DELAY = "pac_change_delay"; /** - * Don't attempt to detect captive portals. - * - * @hide - */ - public static final int CAPTIVE_PORTAL_MODE_IGNORE = 0; - - /** - * When detecting a captive portal, display a notification that - * prompts the user to sign in. - * - * @hide - */ - public static final int CAPTIVE_PORTAL_MODE_PROMPT = 1; - - /** - * When detecting a captive portal, immediately disconnect from the - * network and do not reconnect to that network in the future. - * - * @hide - */ - public static final int CAPTIVE_PORTAL_MODE_AVOID = 2; - - /** - * What to do when connecting a network that presents a captive portal. - * Must be one of the CAPTIVE_PORTAL_MODE_* constants above. - * - * The default for this setting is CAPTIVE_PORTAL_MODE_PROMPT. - * @hide - */ - public static final String CAPTIVE_PORTAL_MODE = "captive_portal_mode"; - - /** * Setting to turn off captive portal detection. Feature is enabled by * default and the setting needs to be set to 0 to disable it. * - * @deprecated use CAPTIVE_PORTAL_MODE_IGNORE to disable captive portal detection * @hide */ - @Deprecated public static final String CAPTIVE_PORTAL_DETECTION_ENABLED = "captive_portal_detection_enabled"; diff --git a/core/java/com/android/internal/util/TokenBucket.java b/core/java/com/android/internal/util/TokenBucket.java deleted file mode 100644 index effb82ba7a2d..000000000000 --- a/core/java/com/android/internal/util/TokenBucket.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.internal.util; - -import android.os.SystemClock; - -import static com.android.internal.util.Preconditions.checkArgumentNonnegative; -import static com.android.internal.util.Preconditions.checkArgumentPositive; - -/** - * A class useful for rate-limiting or throttling that stores and distributes tokens. - * - * A TokenBucket starts with a fixed capacity of tokens, an initial amount of tokens, and - * a fixed filling period (in milliseconds). - * - * For every filling period, the bucket gains one token, up to its maximum capacity from - * which point tokens simply overflow and are lost. Tokens can be obtained one by one or n by n. - * - * The available amount of tokens is computed lazily when the bucket state is inspected. - * Therefore it is purely synchronous and does not involve any asynchronous activity. - * It is not synchronized in any way and not a thread-safe object. - */ -public class TokenBucket { - - private final int mFillDelta; // Time in ms it takes to generate one token. - private final int mCapacity; // Maximum number of tokens that can be stored. - private long mLastFill; // Last time in ms the bucket generated tokens. - private int mAvailable; // Current number of available tokens. - - /** - * Create a new TokenBucket. - * @param deltaMs the time in milliseconds it takes to generate a new token. - * Must be strictly positive. - * @param capacity the maximum token capacity. Must be strictly positive. - * @param tokens the starting amount of token. Must be positive or zero. - */ - public TokenBucket(int deltaMs, int capacity, int tokens) { - mFillDelta = checkArgumentPositive(deltaMs, "deltaMs must be strictly positive"); - mCapacity = checkArgumentPositive(capacity, "capacity must be strictly positive"); - mAvailable = Math.min(checkArgumentNonnegative(tokens), mCapacity); - mLastFill = scaledTime(); - } - - /** - * Create a new TokenBucket that starts completely filled. - * @param deltaMs the time in milliseconds it takes to generate a new token. - * Must be strictly positive. - * @param capacity the maximum token capacity. Must be strictly positive. - */ - public TokenBucket(int deltaMs, int capacity) { - this(deltaMs, capacity, capacity); - } - - /** Reset this TokenBucket and set its number of available tokens. */ - public void reset(int tokens) { - checkArgumentNonnegative(tokens); - mAvailable = Math.min(tokens, mCapacity); - mLastFill = scaledTime(); - } - - /** Returns this TokenBucket maximum token capacity. */ - public int capacity() { - return mCapacity; - } - - /** Returns this TokenBucket currently number of available tokens. */ - public int available() { - fill(); - return mAvailable; - } - - /** Returns true if this TokenBucket as one or more tokens available. */ - public boolean has() { - fill(); - return mAvailable > 0; - } - - /** Consumes a token from this TokenBucket and returns true if a token is available. */ - public boolean get() { - return (get(1) == 1); - } - - /** - * Try to consume many tokens from this TokenBucket. - * @param n the number of tokens to consume. - * @return the number of tokens that were actually consumed. - */ - public int get(int n) { - fill(); - if (n <= 0) { - return 0; - } - if (n > mAvailable) { - int got = mAvailable; - mAvailable = 0; - return got; - } - mAvailable -= n; - return n; - } - - private void fill() { - final long now = scaledTime(); - final int diff = (int) (now - mLastFill); - mAvailable = Math.min(mCapacity, mAvailable + diff); - mLastFill = now; - } - - private long scaledTime() { - return SystemClock.elapsedRealtime() / mFillDelta; - } -} diff --git a/core/tests/coretests/src/android/net/NetworkStatsTest.java b/core/tests/coretests/src/android/net/NetworkStatsTest.java index d48a67a4c72f..9074f8a97132 100644 --- a/core/tests/coretests/src/android/net/NetworkStatsTest.java +++ b/core/tests/coretests/src/android/net/NetworkStatsTest.java @@ -454,7 +454,7 @@ public class NetworkStatsTest extends TestCase { .addValues(underlyingIface, tunUid, SET_FOREGROUND, TAG_NONE, 0L, 0L, 0L, 0L, 0L); assertTrue(delta.migrateTun(tunUid, tunIface, underlyingIface)); - assertEquals(20, delta.size()); + assertEquals(21, delta.size()); // tunIface and TEST_IFACE entries are not changed. assertValues(delta, 0, tunIface, 10100, SET_DEFAULT, TAG_NONE, ROAMING_NO, @@ -478,89 +478,38 @@ public class NetworkStatsTest extends TestCase { // Existing underlying Iface entries are updated assertValues(delta, 9, underlyingIface, 10100, SET_DEFAULT, TAG_NONE, ROAMING_NO, - 44783L, 54L, 14178L, 62L, 0L); + 44783L, 54L, 13829L, 60L, 0L); assertValues(delta, 10, underlyingIface, 10100, SET_FOREGROUND, TAG_NONE, ROAMING_NO, 0L, 0L, 0L, 0L, 0L); // VPN underlying Iface entries are updated assertValues(delta, 11, underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, ROAMING_NO, - 28304L, 27L, 1L, 2L, 0L); + 28304L, 27L, 1719L, 12L, 0L); assertValues(delta, 12, underlyingIface, tunUid, SET_FOREGROUND, TAG_NONE, ROAMING_NO, 0L, 0L, 0L, 0L, 0L); // New entries are added for new application's underlying Iface traffic assertContains(delta, underlyingIface, 10120, SET_DEFAULT, TAG_NONE, ROAMING_NO, - 72667L, 197L, 43123L, 227L, 0L); + 72667L, 197L, 41872L, 219L, 0L); assertContains(delta, underlyingIface, 10120, SET_FOREGROUND, TAG_NONE, ROAMING_NO, - 9297L, 17L, 4054, 19L, 0L); + 9297L, 17L, 3936, 19L, 0L); assertContains(delta, underlyingIface, 10120, SET_DEFAULT, testTag1, ROAMING_NO, - 21691L, 41L, 13572L, 48L, 0L); + 21691L, 41L, 13179L, 46L, 0L); assertContains(delta, underlyingIface, 10120, SET_FOREGROUND, testTag1, ROAMING_NO, - 1281L, 2L, 653L, 1L, 0L); + 1281L, 2L, 634L, 1L, 0L); // New entries are added for debug purpose assertContains(delta, underlyingIface, 10100, SET_DBG_VPN_IN, TAG_NONE, ROAMING_NO, - 39605L, 46L, 12039, 51, 0); + 39605L, 46L, 11690, 49, 0); assertContains(delta, underlyingIface, 10120, SET_DBG_VPN_IN, TAG_NONE, ROAMING_NO, - 81964, 214, 47177, 246, 0); + 81964, 214, 45808, 238, 0); + assertContains(delta, underlyingIface, tunUid, SET_DBG_VPN_IN, TAG_NONE, ROAMING_NO, + 4983, 10, 1717, 10, 0); assertContains(delta, underlyingIface, tunUid, SET_DBG_VPN_OUT, TAG_NONE, ROAMING_ALL, - 121569, 260, 59216, 297, 0); + 126552, 270, 59215, 297, 0); } - // Tests a case where all of the data received by the tun0 interface is echo back into the tun0 - // interface by the vpn app before it's sent out of the underlying interface. The VPN app should - // not be charged for the echoed data but it should still be charged for any extra data it sends - // via the underlying interface. - public void testMigrateTun_VpnAsLoopback() { - final int tunUid = 10030; - final String tunIface = "tun0"; - final String underlyingIface = "wlan0"; - NetworkStats delta = new NetworkStats(TEST_START, 9) - // 2 different apps sent/receive data via tun0. - .addValues(tunIface, 10100, SET_DEFAULT, TAG_NONE, 50000L, 25L, 100000L, 50L, 0L) - .addValues(tunIface, 20100, SET_DEFAULT, TAG_NONE, 500L, 2L, 200L, 5L, 0L) - // VPN package resends data through the tunnel (with exaggerated overhead) - .addValues(tunIface, tunUid, SET_DEFAULT, TAG_NONE, 240000, 100L, 120000L, 60L, 0L) - // 1 app already has some traffic on the underlying interface, the other doesn't yet - .addValues(underlyingIface, 10100, SET_DEFAULT, TAG_NONE, 1000L, 10L, 2000L, 20L, 0L) - // Traffic through the underlying interface via the vpn app. - // This test should redistribute this data correctly. - .addValues(underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, - 75500L, 37L, 130000L, 70L, 0L); - - assertTrue(delta.migrateTun(tunUid, tunIface, underlyingIface)); - assertEquals(9, delta.size()); - - // tunIface entries should not be changed. - assertValues(delta, 0, tunIface, 10100, SET_DEFAULT, TAG_NONE, ROAMING_NO, - 50000L, 25L, 100000L, 50L, 0L); - assertValues(delta, 1, tunIface, 20100, SET_DEFAULT, TAG_NONE, ROAMING_NO, - 500L, 2L, 200L, 5L, 0L); - assertValues(delta, 2, tunIface, tunUid, SET_DEFAULT, TAG_NONE, ROAMING_NO, - 240000L, 100L, 120000L, 60L, 0L); - - // Existing underlying Iface entries are updated - assertValues(delta, 3, underlyingIface, 10100, SET_DEFAULT, TAG_NONE, ROAMING_NO, - 51000L, 35L, 102000L, 70L, 0L); - - // VPN underlying Iface entries are updated - assertValues(delta, 4, underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, ROAMING_NO, - 25000L, 10L, 29800L, 15L, 0L); - - // New entries are added for new application's underlying Iface traffic - assertContains(delta, underlyingIface, 20100, SET_DEFAULT, TAG_NONE, ROAMING_NO, - 500L, 2L, 200L, 5L, 0L); - - // New entries are added for debug purpose - assertContains(delta, underlyingIface, 10100, SET_DBG_VPN_IN, TAG_NONE, ROAMING_NO, - 50000L, 25L, 100000L, 50L, 0L); - assertContains(delta, underlyingIface, 20100, SET_DBG_VPN_IN, TAG_NONE, ROAMING_NO, - 500, 2L, 200L, 5L, 0L); - assertContains(delta, underlyingIface, tunUid, SET_DBG_VPN_OUT, TAG_NONE, ROAMING_ALL, - 50500L, 27L, 100200L, 55, 0); - } - private static void assertContains(NetworkStats stats, String iface, int uid, int set, int tag, int roaming, long rxBytes, long rxPackets, long txBytes, long txPackets, long operations) { diff --git a/core/tests/coretests/src/android/util/TokenBucketTest.java b/core/tests/coretests/src/android/util/TokenBucketTest.java deleted file mode 100644 index f7ac20c7287f..000000000000 --- a/core/tests/coretests/src/android/util/TokenBucketTest.java +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.internal.util; - -import android.os.SystemClock; -import android.text.format.DateUtils; -import junit.framework.TestCase; - -public class TokenBucketTest extends TestCase { - - static final int FILL_DELTA_VERY_SHORT = 1; - static final int FILL_DELTA_VERY_LONG = Integer.MAX_VALUE; - - public void testArgumentValidation() { - assertThrow(() -> new TokenBucket(0, 1, 1)); - assertThrow(() -> new TokenBucket(1, 0, 1)); - assertThrow(() -> new TokenBucket(1, 1, 0)); - assertThrow(() -> new TokenBucket(0, 1)); - assertThrow(() -> new TokenBucket(1, 0)); - assertThrow(() -> new TokenBucket(-1, 1, 1)); - assertThrow(() -> new TokenBucket(1, -1, 1)); - assertThrow(() -> new TokenBucket(1, 1, -1)); - assertThrow(() -> new TokenBucket(-1, 1)); - assertThrow(() -> new TokenBucket(1, -1)); - - new TokenBucket(1000, 100, 0); - new TokenBucket(1000, 100, 10); - new TokenBucket(5000, 50); - new TokenBucket(5000, 1); - } - - public void testInitialCapacity() { - drain(new TokenBucket(FILL_DELTA_VERY_LONG, 1), 1); - drain(new TokenBucket(FILL_DELTA_VERY_LONG, 10), 10); - drain(new TokenBucket(FILL_DELTA_VERY_LONG, 1000), 1000); - - drain(new TokenBucket(FILL_DELTA_VERY_LONG, 10, 0), 0); - drain(new TokenBucket(FILL_DELTA_VERY_LONG, 10, 3), 3); - drain(new TokenBucket(FILL_DELTA_VERY_LONG, 10, 10), 10); - - drain(new TokenBucket(FILL_DELTA_VERY_LONG, 10, 100), 10); - - drain(new TokenBucket((int)DateUtils.MINUTE_IN_MILLIS, 50), 50); - drain(new TokenBucket((int)DateUtils.HOUR_IN_MILLIS, 10), 10); - drain(new TokenBucket((int)DateUtils.DAY_IN_MILLIS, 200), 200); - } - - public void testReset() { - TokenBucket tb = new TokenBucket(FILL_DELTA_VERY_LONG, 100, 10); - drain(tb, 10); - - tb.reset(50); - drain(tb, 50); - - tb.reset(50); - getOneByOne(tb, 10); - assertTrue(tb.has()); - - tb.reset(30); - drain(tb, 30); - } - - public void testFill() throws Exception { - int delta = 50; - TokenBucket tb = new TokenBucket(delta, 10, 0); - - assertEmpty(tb); - - Thread.sleep(3 * delta / 2); - - assertTrue(tb.has()); - } - - public void testRefill() throws Exception { - TokenBucket tb = new TokenBucket(FILL_DELTA_VERY_SHORT, 10, 10); - - assertEquals(5, tb.get(5)); - assertEquals(5, tb.get(5)); - - while (tb.available() < 10) { - Thread.sleep(2); - } - - assertEquals(10, tb.get(10)); - - while (tb.available() < 10) { - Thread.sleep(2); - } - - assertEquals(10, tb.get(100)); - } - - public void testAverage() throws Exception { - final int delta = 3; - final int want = 60; - - long start = SystemClock.elapsedRealtime(); - TokenBucket tb = new TokenBucket(delta, 20, 0); - - for (int i = 0; i < want; i++) { - while (!tb.has()) { - Thread.sleep(5 * delta); - } - tb.get(); - } - - assertDuration(want * delta, SystemClock.elapsedRealtime() - start); - } - - public void testBurst() throws Exception { - final int delta = 2; - final int capacity = 20; - final int want = 100; - - long start = SystemClock.elapsedRealtime(); - TokenBucket tb = new TokenBucket(delta, capacity, 0); - - int total = 0; - while (total < want) { - while (!tb.has()) { - Thread.sleep(capacity * delta - 2); - } - total += tb.get(tb.available()); - } - - assertDuration(total * delta, SystemClock.elapsedRealtime() - start); - } - - static void getOneByOne(TokenBucket tb, int n) { - while (n > 0) { - assertTrue(tb.has()); - assertTrue(tb.available() >= n); - assertTrue(tb.get()); - assertTrue(tb.available() >= n - 1); - n--; - } - } - - void assertEmpty(TokenBucket tb) { - assertFalse(tb.has()); - assertEquals(0, tb.available()); - assertFalse(tb.get()); - } - - void drain(TokenBucket tb, int n) { - getOneByOne(tb, n); - assertEmpty(tb); - } - - void assertDuration(long expected, long elapsed) { - String msg = String.format( - "expected elapsed time at least %d ms, but was %d ms", expected, elapsed); - elapsed += 1; // one millisecond extra guard - assertTrue(msg, elapsed >= expected); - } - - void assertThrow(Fn fn) { - try { - fn.call(); - fail("expected n exception to be thrown."); - } catch (Throwable t) {} - } - - interface Fn { void call(); } -} diff --git a/core/tests/utiltests/Android.mk b/core/tests/utiltests/Android.mk index 981be112a22d..6d1ebb4a6f58 100644 --- a/core/tests/utiltests/Android.mk +++ b/core/tests/utiltests/Android.mk @@ -14,7 +14,6 @@ LOCAL_SRC_FILES += src/android/util/IRemoteMemoryIntArray.aidl LOCAL_STATIC_JAVA_LIBRARIES := \ android-support-test \ - frameworks-base-testutils \ mockito-target LOCAL_JAVA_LIBRARIES := android.test.runner diff --git a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java index bb8eb2cd0797..b58c87a5094d 100644 --- a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java +++ b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java @@ -115,7 +115,6 @@ public class CaptivePortalLoginActivity extends Activity { myWebView.clearCache(true); WebSettings webSettings = myWebView.getSettings(); webSettings.setJavaScriptEnabled(true); - webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE); mWebViewClient = new MyWebViewClient(); myWebView.setWebViewClient(mWebViewClient); myWebView.setWebChromeClient(new MyWebChromeClient()); diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 090c7444c1e7..30edd9fe8bf4 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -1813,14 +1813,11 @@ public class ConnectivityService extends IConnectivityManager.Stub private void updateMtu(LinkProperties newLp, LinkProperties oldLp) { final String iface = newLp.getInterfaceName(); final int mtu = newLp.getMtu(); - if (oldLp == null && mtu == 0) { - // Silently ignore unset MTU value. - return; - } if (oldLp != null && newLp.isIdenticalMtu(oldLp)) { if (VDBG) log("identical MTU - not setting"); return; } + if (LinkProperties.isValidMtu(mtu, newLp.hasGlobalIPv6Address()) == false) { if (mtu != 0) loge("Unexpected mtu value: " + mtu + ", " + iface); return; @@ -2266,19 +2263,11 @@ public class ConnectivityService extends IConnectivityManager.Stub synchronized (mNetworkForNetId) { nai = mNetworkForNetId.get(netId); } - // If captive portal status has changed, update capabilities or disconnect. + // If captive portal status has changed, update capabilities. if (nai != null && (visible != nai.lastCaptivePortalDetected)) { final int oldScore = nai.getCurrentScore(); nai.lastCaptivePortalDetected = visible; nai.everCaptivePortalDetected |= visible; - if (nai.lastCaptivePortalDetected && - Settings.Global.CAPTIVE_PORTAL_MODE_AVOID == getCaptivePortalMode()) { - if (DBG) log("Avoiding captive portal network: " + nai.name()); - nai.asyncChannel.sendMessage( - NetworkAgent.CMD_PREVENT_AUTOMATIC_RECONNECT); - teardownUnneededNetwork(nai); - break; - } updateCapabilities(oldScore, nai, nai.networkCapabilities); } if (!visible) { @@ -2299,12 +2288,6 @@ public class ConnectivityService extends IConnectivityManager.Stub return true; } - private int getCaptivePortalMode() { - return Settings.Global.getInt(mContext.getContentResolver(), - Settings.Global.CAPTIVE_PORTAL_MODE, - Settings.Global.CAPTIVE_PORTAL_MODE_PROMPT); - } - private boolean maybeHandleNetworkAgentInfoMessage(Message msg) { switch (msg.what) { default: @@ -2614,28 +2597,14 @@ public class ConnectivityService extends IConnectivityManager.Stub "request NetworkCapabilities", ConnectivityManager.CALLBACK_CAP_CHANGED); } - private void handleTimedOutNetworkRequest(final NetworkRequestInfo nri) { - if (mNetworkRequests.get(nri.request) != null && mNetworkForRequestId.get( - nri.request.requestId) == null) { - handleRemoveNetworkRequest(nri, ConnectivityManager.CALLBACK_UNAVAIL); - } - } - private void handleReleaseNetworkRequest(NetworkRequest request, int callingUid) { final NetworkRequestInfo nri = getNriForAppRequest( request, callingUid, "release NetworkRequest"); - if (nri != null) { - handleRemoveNetworkRequest(nri, ConnectivityManager.CALLBACK_RELEASED); - } - } + if (nri == null) return; - private void handleRemoveNetworkRequest(final NetworkRequestInfo nri, final int whichCallback) { - final String logCallbackType = ConnectivityManager.getCallbackName(whichCallback); - if (VDBG || (DBG && nri.request.isRequest())) { - log("releasing " + nri.request + " (" + logCallbackType + ")"); - } + if (VDBG || (DBG && nri.request.isRequest())) log("releasing " + request); nri.unlinkDeathRecipient(); - mNetworkRequests.remove(nri.request); + mNetworkRequests.remove(request); synchronized (mUidToNetworkRequestCount) { int requests = mUidToNetworkRequestCount.get(nri.mUid, 0); if (requests < 1) { @@ -2729,7 +2698,7 @@ public class ConnectivityService extends IConnectivityManager.Stub } } } - callCallbackForRequest(nri, null, whichCallback, 0); + callCallbackForRequest(nri, null, ConnectivityManager.CALLBACK_RELEASED, 0); } @Override @@ -2966,11 +2935,6 @@ public class ConnectivityService extends IConnectivityManager.Stub handleRegisterNetworkRequestWithIntent(msg); break; } - case EVENT_TIMEOUT_NETWORK_REQUEST: { - NetworkRequestInfo nri = (NetworkRequestInfo) msg.obj; - handleTimedOutNetworkRequest(nri); - break; - } case EVENT_RELEASE_NETWORK_REQUEST_WITH_INTENT: { handleReleaseNetworkRequestWithIntent((PendingIntent) msg.obj, msg.arg1); break; @@ -5351,7 +5315,6 @@ public class ConnectivityService extends IConnectivityManager.Stub // notify only this one new request of the current state protected void notifyNetworkCallback(NetworkAgentInfo nai, NetworkRequestInfo nri) { int notifyType = ConnectivityManager.CALLBACK_AVAILABLE; - mHandler.removeMessages(EVENT_TIMEOUT_NETWORK_REQUEST, nri); if (nri.mPendingIntent == null) { callCallbackForRequest(nri, nai, notifyType, 0); } else { diff --git a/services/core/java/com/android/server/connectivity/IpConnectivityEventBuilder.java b/services/core/java/com/android/server/connectivity/IpConnectivityEventBuilder.java index f1d01e06911a..f1ef947f3472 100644 --- a/services/core/java/com/android/server/connectivity/IpConnectivityEventBuilder.java +++ b/services/core/java/com/android/server/connectivity/IpConnectivityEventBuilder.java @@ -48,10 +48,6 @@ final public class IpConnectivityEventBuilder { final IpConnectivityLog log = new IpConnectivityLog(); log.events = toProto(events); log.droppedEvents = dropped; - if ((log.events.length > 0) || (dropped > 0)) { - // Only write version number if log has some information at all. - log.version = IpConnectivityMetrics.VERSION; - } return IpConnectivityLog.toByteArray(log); } diff --git a/services/core/java/com/android/server/connectivity/IpConnectivityMetrics.java b/services/core/java/com/android/server/connectivity/IpConnectivityMetrics.java index be681739d2ee..28e724c2a7a1 100644 --- a/services/core/java/com/android/server/connectivity/IpConnectivityMetrics.java +++ b/services/core/java/com/android/server/connectivity/IpConnectivityMetrics.java @@ -19,25 +19,19 @@ package com.android.server.connectivity; import android.content.Context; import android.net.ConnectivityMetricsEvent; import android.net.IIpConnectivityMetrics; -import android.net.metrics.ApfProgramEvent; import android.net.metrics.IpConnectivityLog; import android.os.IBinder; import android.os.Parcelable; -import android.provider.Settings; import android.text.TextUtils; -import android.text.format.DateUtils; -import android.util.ArrayMap; import android.util.Base64; import android.util.Log; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.util.TokenBucket; import com.android.server.SystemService; import java.io.FileDescriptor; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; -import java.util.function.ToIntFunction; import static com.android.server.connectivity.metrics.IpConnectivityLogClass.IpConnectivityEvent; @@ -46,21 +40,10 @@ final public class IpConnectivityMetrics extends SystemService { private static final String TAG = IpConnectivityMetrics.class.getSimpleName(); private static final boolean DBG = false; - // The logical version numbers of ipconnectivity.proto, corresponding to the - // "version" field of IpConnectivityLog. - private static final int NYC = 0; - private static final int NYC_MR1 = 1; - private static final int NYC_MR2 = 2; - public static final int VERSION = NYC_MR2; - private static final String SERVICE_NAME = IpConnectivityLog.SERVICE_NAME; // Default size of the event buffer. Once the buffer is full, incoming events are dropped. private static final int DEFAULT_BUFFER_SIZE = 2000; - // Maximum size of the event buffer. - private static final int MAXIMUM_BUFFER_SIZE = DEFAULT_BUFFER_SIZE * 10; - - private static final int ERROR_RATE_LIMITED = -1; // Lock ensuring that concurrent manipulations of the event buffer are correct. // There are three concurrent operations to synchronize: @@ -79,21 +62,12 @@ final public class IpConnectivityMetrics extends SystemService { private int mDropped; @GuardedBy("mLock") private int mCapacity; - @GuardedBy("mLock") - private final ArrayMap<Class<?>, TokenBucket> mBuckets = makeRateLimitingBuckets(); - - private final ToIntFunction<Context> mCapacityGetter; - public IpConnectivityMetrics(Context ctx, ToIntFunction<Context> capacityGetter) { + public IpConnectivityMetrics(Context ctx) { super(ctx); - mCapacityGetter = capacityGetter; initBuffer(); } - public IpConnectivityMetrics(Context ctx) { - this(ctx, READ_BUFFER_SIZE); - } - @Override public void onStart() { if (DBG) Log.d(TAG, "onStart"); @@ -112,7 +86,7 @@ final public class IpConnectivityMetrics extends SystemService { @VisibleForTesting public int bufferCapacity() { - return mCapacityGetter.applyAsInt(getContext()); + return DEFAULT_BUFFER_SIZE; // TODO: read from config } private void initBuffer() { @@ -130,10 +104,6 @@ final public class IpConnectivityMetrics extends SystemService { if (event == null) { return left; } - if (isRateLimited(event)) { - // Do not count as a dropped event. TODO: consider adding separate counter - return ERROR_RATE_LIMITED; - } if (left == 0) { mDropped++; return 0; @@ -143,11 +113,6 @@ final public class IpConnectivityMetrics extends SystemService { } } - private boolean isRateLimited(ConnectivityMetricsEvent event) { - TokenBucket tb = mBuckets.get(event.data.getClass()); - return (tb != null) && !tb.get(); - } - private String flushEncodedOutput() { final ArrayList<ConnectivityMetricsEvent> events; final int dropped; @@ -221,7 +186,6 @@ final public class IpConnectivityMetrics extends SystemService { static final String CMD_FLUSH = "flush"; static final String CMD_LIST = "list"; static final String CMD_STATS = "stats"; - static final String CMD_DUMPSYS = "-a"; // dumpsys.cpp dumps services with "-a" as arguments static final String CMD_DEFAULT = CMD_STATS; @Override @@ -239,8 +203,6 @@ final public class IpConnectivityMetrics extends SystemService { case CMD_FLUSH: cmdFlush(fd, pw, args); return; - case CMD_DUMPSYS: - // Fallthrough to CMD_LIST when dumpsys.cpp dumps services states (bug reports) case CMD_LIST: cmdList(fd, pw, args); return; @@ -264,20 +226,4 @@ final public class IpConnectivityMetrics extends SystemService { getContext().enforceCallingOrSelfPermission(what, "IpConnectivityMetrics"); } }; - - private static final ToIntFunction<Context> READ_BUFFER_SIZE = (ctx) -> { - int size = Settings.Global.getInt(ctx.getContentResolver(), - Settings.Global.CONNECTIVITY_METRICS_BUFFER_SIZE, DEFAULT_BUFFER_SIZE); - if (size <= 0) { - return DEFAULT_BUFFER_SIZE; - } - return Math.min(size, MAXIMUM_BUFFER_SIZE); - }; - - private static ArrayMap<Class<?>, TokenBucket> makeRateLimitingBuckets() { - ArrayMap<Class<?>, TokenBucket> map = new ArrayMap<>(); - // one token every minute, 50 tokens max: burst of ~50 events every hour. - map.put(ApfProgramEvent.class, new TokenBucket((int)DateUtils.MINUTE_IN_MILLIS, 50)); - return map; - } } diff --git a/services/core/java/com/android/server/connectivity/NetworkMonitor.java b/services/core/java/com/android/server/connectivity/NetworkMonitor.java index c73d1dd95437..6eb89facca76 100644 --- a/services/core/java/com/android/server/connectivity/NetworkMonitor.java +++ b/services/core/java/com/android/server/connectivity/NetworkMonitor.java @@ -211,9 +211,7 @@ public class NetworkMonitor extends StateMachine { private final NetworkRequest mDefaultRequest; private final IpConnectivityLog mMetricsLog; - @VisibleForTesting - protected boolean mIsCaptivePortalCheckEnabled; - + private boolean mIsCaptivePortalCheckEnabled; private boolean mUseHttps; // Set if the user explicitly selected "Do not use this network" in captive portal sign-in app. @@ -267,8 +265,7 @@ public class NetworkMonitor extends StateMachine { setInitialState(mDefaultState); mIsCaptivePortalCheckEnabled = Settings.Global.getInt(mContext.getContentResolver(), - Settings.Global.CAPTIVE_PORTAL_MODE, Settings.Global.CAPTIVE_PORTAL_MODE_PROMPT) - != Settings.Global.CAPTIVE_PORTAL_MODE_IGNORE; + Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED, 1) == 1; mUseHttps = Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.CAPTIVE_PORTAL_USE_HTTPS, 1) == 1; @@ -635,10 +632,7 @@ public class NetworkMonitor extends StateMachine { @VisibleForTesting protected CaptivePortalProbeResult isCaptivePortal() { - if (!mIsCaptivePortalCheckEnabled) { - validationLog("Validation disabled."); - return new CaptivePortalProbeResult(204); - } + if (!mIsCaptivePortalCheckEnabled) return new CaptivePortalProbeResult(204); URL pacUrl = null, httpsUrl = null, httpUrl = null, fallbackUrl = null; diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java index 6d96a1015aa2..0beb227e5825 100644 --- a/services/core/java/com/android/server/connectivity/Tethering.java +++ b/services/core/java/com/android/server/connectivity/Tethering.java @@ -71,7 +71,6 @@ import com.android.internal.util.State; import com.android.internal.util.StateMachine; import com.android.server.connectivity.tethering.IControlsTethering; import com.android.server.connectivity.tethering.IPv6TetheringCoordinator; -import com.android.server.connectivity.tethering.IPv6TetheringInterfaceServices; import com.android.server.connectivity.tethering.TetherInterfaceStateMachine; import com.android.server.net.BaseNetworkObserver; @@ -1940,8 +1939,7 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering private void trackNewTetherableInterface(String iface, int interfaceType) { TetherState tetherState; tetherState = new TetherState(new TetherInterfaceStateMachine(iface, mLooper, - interfaceType, mNMService, mStatsService, this, - new IPv6TetheringInterfaceServices(iface, mNMService))); + interfaceType, mNMService, mStatsService, this)); mTetherStates.put(iface, tetherState); tetherState.mStateMachine.start(); } diff --git a/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringInterfaceServices.java b/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringInterfaceServices.java index dec2f77b6455..c2c1a8c5fef7 100644 --- a/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringInterfaceServices.java +++ b/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringInterfaceServices.java @@ -45,7 +45,7 @@ import java.util.Objects; /** * @hide */ -public class IPv6TetheringInterfaceServices { +class IPv6TetheringInterfaceServices { private static final String TAG = IPv6TetheringInterfaceServices.class.getSimpleName(); private static final IpPrefix LINK_LOCAL_PREFIX = new IpPrefix("fe80::/64"); private static final int RFC7421_IP_PREFIX_LENGTH = 64; @@ -59,7 +59,7 @@ public class IPv6TetheringInterfaceServices { private RouterAdvertisementDaemon mRaDaemon; private RaParams mLastRaParams; - public IPv6TetheringInterfaceServices(String ifname, INetworkManagementService nms) { + IPv6TetheringInterfaceServices(String ifname, INetworkManagementService nms) { mIfName = ifname; mNMService = nms; } diff --git a/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java b/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java index 37221a971ad1..6ca4e271ec55 100644 --- a/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java +++ b/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java @@ -94,14 +94,14 @@ public class TetherInterfaceStateMachine extends StateMachine { public TetherInterfaceStateMachine(String ifaceName, Looper looper, int interfaceType, INetworkManagementService nMService, INetworkStatsService statsService, - IControlsTethering tetherController, IPv6TetheringInterfaceServices ipv6Svc) { + IControlsTethering tetherController) { super(ifaceName, looper); mNMService = nMService; mStatsService = statsService; mTetherController = tetherController; mIfaceName = ifaceName; mInterfaceType = interfaceType; - mIPv6TetherSvc = ipv6Svc; + mIPv6TetherSvc = new IPv6TetheringInterfaceServices(mIfaceName, mNMService); mLastError = ConnectivityManager.TETHER_ERROR_NO_ERROR; mInitialState = new InitialState(); diff --git a/services/core/proto/ipconnectivity.proto b/services/core/proto/ipconnectivity.proto index 29b318f5ca89..e0d7f0984eb0 100644 --- a/services/core/proto/ipconnectivity.proto +++ b/services/core/proto/ipconnectivity.proto @@ -53,7 +53,6 @@ message IpReachabilityEvent { // The event type code of the probe, represented by constants defined in // android.net.metrics.IpReachabilityEvent. - // NUD_FAILED_ORGANIC and PROVISIONING_LOST_ORGANIC recorded since version 1. optional int32 event_type = 2; }; @@ -127,12 +126,11 @@ message DHCPEvent { // Lifetime duration in milliseconds of a DhcpClient state, or transition // time in milliseconds between specific pairs of DhcpClient's states. - // Only populated since version 1, when state_transition is populated. + // Only populated when state_transition is populated. optional int32 duration_ms = 4; } // Represents the generation of an Android Packet Filter program. -// Since version 1. message ApfProgramEvent { // Lifetime of the program in seconds. optional int64 lifetime = 1; @@ -156,7 +154,6 @@ message ApfProgramEvent { // Represents Router Advertisement listening statistics for an interface with // Android Packet Filter enabled. -// Since version 1. message ApfStatistics { // The time interval in milliseconds these stastistics cover. optional int64 duration_ms = 1; @@ -186,7 +183,6 @@ message ApfStatistics { // Represents the reception of a Router Advertisement packet for an interface // with Android Packet Filter enabled. -// Since version 1. message RaEvent { // All lifetime values are expressed in seconds. The default value for an // option lifetime that was not present in the RA option list is -1. @@ -275,11 +271,4 @@ message IpConnectivityLog { // The number of events that had to be dropped due to a full buffer. optional int32 dropped_events = 2; - - // The version number of the metrics events being collected. - // nyc-dev: not populated, implicitly 0 - // nyc-dr1: not populated, implicitly 1 (sailfish and marlin only) - // nyc-mr1: not populated, implicitly 1 - // nyc-mr2: 2 - optional int32 version = 3; }; diff --git a/services/net/java/android/net/apf/ApfFilter.java b/services/net/java/android/net/apf/ApfFilter.java index a8356dc4658e..4c7545240c23 100644 --- a/services/net/java/android/net/apf/ApfFilter.java +++ b/services/net/java/android/net/apf/ApfFilter.java @@ -283,20 +283,14 @@ public class ApfFilter { mReceiveThread.start(); } - // Returns seconds since device boot. + // Returns seconds since Unix Epoch. + // TODO: use SystemClock.elapsedRealtime() instead private static long curTime() { - return SystemClock.elapsedRealtime() / DateUtils.SECOND_IN_MILLIS; - } - - public static class InvalidRaException extends Exception { - public InvalidRaException(String m) { - super(m); - } + return System.currentTimeMillis() / DateUtils.SECOND_IN_MILLIS; } // A class to hold information about an RA. - @VisibleForTesting - class Ra { + private class Ra { // From RFC4861: private static final int ICMP6_RA_HEADER_LEN = 16; private static final int ICMP6_RA_CHECKSUM_OFFSET = @@ -368,7 +362,7 @@ public class ApfFilter { } catch (UnsupportedOperationException e) { // array() failed. Cannot happen, mPacket is array-backed and read-write. return "???"; - } catch (ClassCastException|UnknownHostException e) { + } catch (ClassCastException | UnknownHostException e) { // Cannot happen. return "???"; } @@ -378,16 +372,16 @@ public class ApfFilter { // TODO: Make this static once RA is its own class. private void prefixOptionToString(StringBuffer sb, int offset) { String prefix = IPv6AddresstoString(offset + 16); - int length = getUint8(mPacket, offset + 2); - long valid = getUint32(mPacket, offset + 4); - long preferred = getUint32(mPacket, offset + 8); + int length = uint8(mPacket.get(offset + 2)); + long valid = mPacket.getInt(offset + 4); + long preferred = mPacket.getInt(offset + 8); sb.append(String.format("%s/%d %ds/%ds ", prefix, length, valid, preferred)); } private void rdnssOptionToString(StringBuffer sb, int offset) { - int optLen = getUint8(mPacket, offset + 1) * 8; + int optLen = uint8(mPacket.get(offset + 1)) * 8; if (optLen < 24) return; // Malformed or empty. - long lifetime = getUint32(mPacket, offset + 4); + long lifetime = uint32(mPacket.getInt(offset + 4)); int numServers = (optLen - 8) / 16; sb.append("DNS ").append(lifetime).append("s"); for (int server = 0; server < numServers; server++) { @@ -401,7 +395,7 @@ public class ApfFilter { sb.append(String.format("RA %s -> %s %ds ", IPv6AddresstoString(IPV6_SRC_ADDR_OFFSET), IPv6AddresstoString(IPV6_DEST_ADDR_OFFSET), - getUint16(mPacket, ICMP6_RA_ROUTER_LIFETIME_OFFSET))); + uint16(mPacket.getShort(ICMP6_RA_ROUTER_LIFETIME_OFFSET)))); for (int i: mPrefixOptionOffsets) { prefixOptionToString(sb, i); } @@ -409,7 +403,7 @@ public class ApfFilter { rdnssOptionToString(sb, i); } return sb.toString(); - } catch (BufferUnderflowException|IndexOutOfBoundsException e) { + } catch (BufferUnderflowException | IndexOutOfBoundsException e) { return "<Malformed RA>"; } } @@ -442,20 +436,16 @@ public class ApfFilter { // Buffer.position(int) or due to an invalid-length option) or IndexOutOfBoundsException // (from ByteBuffer.get(int) ) if parsing encounters something non-compliant with // specifications. - Ra(byte[] packet, int length) throws InvalidRaException { - if (length < ICMP6_RA_OPTION_OFFSET) { - throw new InvalidRaException("Not an ICMP6 router advertisement"); - } - + Ra(byte[] packet, int length) { mPacket = ByteBuffer.wrap(Arrays.copyOf(packet, length)); mLastSeen = curTime(); // Sanity check packet in case a packet arrives before we attach RA filter // to our packet socket. b/29586253 if (getUint16(mPacket, ETH_ETHERTYPE_OFFSET) != ETH_P_IPV6 || - getUint8(mPacket, IPV6_NEXT_HEADER_OFFSET) != IPPROTO_ICMPV6 || - getUint8(mPacket, ICMP6_TYPE_OFFSET) != ICMP6_ROUTER_ADVERTISEMENT) { - throw new InvalidRaException("Not an ICMP6 router advertisement"); + uint8(mPacket.get(IPV6_NEXT_HEADER_OFFSET)) != IPPROTO_ICMPV6 || + uint8(mPacket.get(ICMP6_TYPE_OFFSET)) != ICMP6_ROUTER_ADVERTISEMENT) { + throw new IllegalArgumentException("Not an ICMP6 router advertisement"); } @@ -476,8 +466,8 @@ public class ApfFilter { mPacket.position(ICMP6_RA_OPTION_OFFSET); while (mPacket.hasRemaining()) { final int position = mPacket.position(); - final int optionType = getUint8(mPacket, position); - final int optionLength = getUint8(mPacket, position + 1) * 8; + final int optionType = uint8(mPacket.get(position)); + final int optionLength = uint8(mPacket.get(position + 1)) * 8; long lifetime; switch (optionType) { case ICMP6_PREFIX_OPTION_TYPE: @@ -521,7 +511,7 @@ public class ApfFilter { break; } if (optionLength <= 0) { - throw new InvalidRaException(String.format( + throw new IllegalArgumentException(String.format( "Invalid option length opt=%d len=%d", optionType, optionLength)); } mPacket.position(position + optionLength); @@ -562,10 +552,10 @@ public class ApfFilter { final long optionLifetime; switch (lifetimeLength) { case 2: - optionLifetime = getUint16(byteBuffer, offset); + optionLifetime = uint16(byteBuffer.getShort(offset)); break; case 4: - optionLifetime = getUint32(byteBuffer, offset); + optionLifetime = uint32(byteBuffer.getInt(offset)); break; default: throw new IllegalStateException("bogus lifetime size " + lifetimeLength); @@ -935,8 +925,8 @@ public class ApfFilter { // Execution will reach the end of the program if no filters match, which will pass the // packet to the AP. program = gen.generate(); - } catch (IllegalInstructionException|IllegalStateException e) { - Log.e(TAG, "Failed to generate APF program.", e); + } catch (IllegalInstructionException e) { + Log.e(TAG, "Program failed to generate: ", e); return; } mLastTimeInstalledProgram = curTime(); @@ -982,8 +972,7 @@ public class ApfFilter { * if the current APF program should be updated. * @return a ProcessRaResult enum describing what action was performed. */ - @VisibleForTesting - synchronized ProcessRaResult processRa(byte[] packet, int length) { + private synchronized ProcessRaResult processRa(byte[] packet, int length) { if (VDBG) hexDump("Read packet = ", packet, length); // Have we seen this RA before? @@ -1022,7 +1011,7 @@ public class ApfFilter { try { ra = new Ra(packet, length); } catch (Exception e) { - Log.e(TAG, "Error parsing RA", e); + Log.e(TAG, "Error parsing RA: " + e); return ProcessRaResult.PARSE_ERROR; } // Ignore 0 lifetime RAs. @@ -1161,11 +1150,7 @@ public class ApfFilter { return i & 0xffffffffL; } - private static int getUint8(ByteBuffer buffer, int position) { - return uint8(buffer.get(position)); - } - - private static int getUint16(ByteBuffer buffer, int position) { + private static long getUint16(ByteBuffer buffer, int position) { return uint16(buffer.getShort(position)); } diff --git a/services/net/java/android/net/ip/IpReachabilityMonitor.java b/services/net/java/android/net/ip/IpReachabilityMonitor.java index a883e28e96c6..a6bb40c6ac0b 100644 --- a/services/net/java/android/net/ip/IpReachabilityMonitor.java +++ b/services/net/java/android/net/ip/IpReachabilityMonitor.java @@ -50,9 +50,9 @@ import java.net.NetworkInterface; import java.net.SocketAddress; import java.net.SocketException; import java.nio.ByteBuffer; -import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -163,7 +163,8 @@ public class IpReachabilityMonitor { private Map<InetAddress, Short> mIpWatchList = new HashMap<>(); @GuardedBy("mLock") private int mIpWatchListVersion; - private volatile boolean mRunning; + @GuardedBy("mLock") + private boolean mRunning; // Time in milliseconds of the last forced probe request. private volatile long mLastProbeTimeMs; @@ -245,7 +246,7 @@ public class IpReachabilityMonitor { } public void stop() { - mRunning = false; + synchronized (mLock) { mRunning = false; } clearLinkProperties(); mNetlinkSocketObserver.clearNetlinkSocket(); } @@ -280,6 +281,12 @@ public class IpReachabilityMonitor { } } + private boolean stillRunning() { + synchronized (mLock) { + return mRunning; + } + } + private static boolean isOnLink(List<RouteInfo> routes, InetAddress ip) { for (RouteInfo route : routes) { if (!route.hasGateway() && route.matches(ip)) { @@ -383,12 +390,12 @@ public class IpReachabilityMonitor { } public void probeAll() { - final List<InetAddress> ipProbeList; + Set<InetAddress> ipProbeList = new HashSet<InetAddress>(); synchronized (mLock) { - ipProbeList = new ArrayList<>(mIpWatchList.keySet()); + ipProbeList.addAll(mIpWatchList.keySet()); } - if (!ipProbeList.isEmpty() && mRunning) { + if (!ipProbeList.isEmpty() && stillRunning()) { // Keep the CPU awake long enough to allow all ARP/ND // probes a reasonable chance at success. See b/23197666. // @@ -399,7 +406,7 @@ public class IpReachabilityMonitor { } for (InetAddress target : ipProbeList) { - if (!mRunning) { + if (!stillRunning()) { break; } final int returnValue = probeNeighbor(mInterfaceIndex, target); @@ -444,21 +451,21 @@ public class IpReachabilityMonitor { @Override public void run() { if (VDBG) { Log.d(TAG, "Starting observing thread."); } - mRunning = true; + synchronized (mLock) { mRunning = true; } try { setupNetlinkSocket(); } catch (ErrnoException | SocketException e) { Log.e(TAG, "Failed to suitably initialize a netlink socket", e); - mRunning = false; + synchronized (mLock) { mRunning = false; } } - while (mRunning) { - final ByteBuffer byteBuffer; + ByteBuffer byteBuffer; + while (stillRunning()) { try { byteBuffer = recvKernelReply(); } catch (ErrnoException e) { - if (mRunning) { Log.w(TAG, "ErrnoException: ", e); } + if (stillRunning()) { Log.w(TAG, "ErrnoException: ", e); } break; } final long whenMs = SystemClock.elapsedRealtime(); @@ -470,7 +477,7 @@ public class IpReachabilityMonitor { clearNetlinkSocket(); - mRunning = false; // Not a no-op when ErrnoException happened. + synchronized (mLock) { mRunning = false; } if (VDBG) { Log.d(TAG, "Finishing observing thread."); } } diff --git a/services/tests/servicestests/Android.mk b/services/tests/servicestests/Android.mk index c36462bfac1e..3183930b08ce 100644 --- a/services/tests/servicestests/Android.mk +++ b/services/tests/servicestests/Android.mk @@ -17,6 +17,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := \ services.devicepolicy \ services.net \ services.usage \ + easymocklib \ guava \ android-support-test \ mockito-target \ diff --git a/tests/net/jni/UidRangeTest.cpp b/services/tests/servicestests/jni/UidRangeTest.cpp index 7941731a07f3..7941731a07f3 100644 --- a/tests/net/jni/UidRangeTest.cpp +++ b/services/tests/servicestests/jni/UidRangeTest.cpp diff --git a/tests/net/jni/UidRangeTest.h b/services/tests/servicestests/jni/UidRangeTest.h index b7e745378800..b7e745378800 100644 --- a/tests/net/jni/UidRangeTest.h +++ b/services/tests/servicestests/jni/UidRangeTest.h diff --git a/tests/net/jni/apf_jni.cpp b/services/tests/servicestests/jni/apf_jni.cpp index ee43dd488363..ee43dd488363 100644 --- a/tests/net/jni/apf_jni.cpp +++ b/services/tests/servicestests/jni/apf_jni.cpp diff --git a/tests/net/res/raw/apf.pcap b/services/tests/servicestests/res/raw/apf.pcap Binary files differindex 963165f19f73..963165f19f73 100644 --- a/tests/net/res/raw/apf.pcap +++ b/services/tests/servicestests/res/raw/apf.pcap diff --git a/tests/net/java/android/net/ConnectivityMetricsLoggerTest.java b/services/tests/servicestests/src/android/net/ConnectivityMetricsLoggerTest.java index 6d42cce2e502..6d42cce2e502 100644 --- a/tests/net/java/android/net/ConnectivityMetricsLoggerTest.java +++ b/services/tests/servicestests/src/android/net/ConnectivityMetricsLoggerTest.java diff --git a/tests/net/java/android/net/UidRangeTest.java b/services/tests/servicestests/src/android/net/UidRangeTest.java index 0a56e1be6cae..221fe0f99f0b 100644 --- a/tests/net/java/android/net/UidRangeTest.java +++ b/services/tests/servicestests/src/android/net/UidRangeTest.java @@ -26,7 +26,7 @@ import static org.junit.Assert.assertArrayEquals; public class UidRangeTest extends TestCase { static { - System.loadLibrary("frameworksnettestsjni"); + System.loadLibrary("servicestestsjni"); } private static native byte[] readAndWriteNative(byte[] inParcel); diff --git a/tests/net/java/android/net/apf/ApfTest.java b/services/tests/servicestests/src/android/net/apf/ApfTest.java index 81f66a5bc95a..f7c61d15bb5f 100644 --- a/tests/net/java/android/net/apf/ApfTest.java +++ b/services/tests/servicestests/src/android/net/apf/ApfTest.java @@ -16,6 +16,10 @@ package android.net.apf; +import static android.system.OsConstants.*; + +import com.android.frameworks.servicestests.R; + import android.net.LinkAddress; import android.net.LinkProperties; import android.net.NetworkUtils; @@ -32,12 +36,7 @@ import android.os.Parcelable; import android.system.ErrnoException; import android.system.Os; import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.SmallTest; -import android.test.suitebuilder.annotation.MediumTest; -import static android.system.OsConstants.*; - -import com.android.frameworks.tests.net.R; -import com.android.internal.util.HexDump; +import android.test.suitebuilder.annotation.LargeTest; import org.mockito.ArgumentCaptor; import org.mockito.Mock; @@ -55,7 +54,6 @@ import java.net.InetAddress; import java.net.NetworkInterface; import java.nio.ByteBuffer; import java.util.List; -import java.util.Random; import libcore.io.IoUtils; import libcore.io.Streams; @@ -76,7 +74,7 @@ public class ApfTest extends AndroidTestCase { super.setUp(); MockitoAnnotations.initMocks(this); // Load up native shared library containing APF interpreter exposed via JNI. - System.loadLibrary("frameworksnettestsjni"); + System.loadLibrary("servicestestsjni"); } // Expected return codes from APF interpreter. @@ -155,7 +153,7 @@ public class ApfTest extends AndroidTestCase { * generating bytecode for that program and running it through the * interpreter to verify it functions correctly. */ - @MediumTest + @LargeTest public void testApfInstructions() throws IllegalInstructionException { // Empty program should pass because having the program counter reach the // location immediately after the program indicates the packet should be @@ -563,7 +561,7 @@ public class ApfTest extends AndroidTestCase { * Generate some BPF programs, translate them to APF, then run APF and BPF programs * over packet traces and verify both programs filter out the same packets. */ - @MediumTest + @LargeTest public void testApfAgainstBpf() throws Exception { String[] tcpdump_filters = new String[]{ "udp", "tcp", "icmp", "icmp6", "udp port 53", "arp", "dst 239.255.255.250", "arp or tcp or udp port 53", "net 192.168.1.0/24", @@ -721,7 +719,7 @@ public class ApfTest extends AndroidTestCase { private static final byte[] ANOTHER_IPV4_ADDR = {10, 0, 0, 2}; private static final byte[] IPV4_ANY_HOST_ADDR = {0, 0, 0, 0}; - @MediumTest + @LargeTest public void testApfFilterIPv4() throws Exception { MockIpManagerCallback ipManagerCallback = new MockIpManagerCallback(); LinkAddress link = new LinkAddress(InetAddress.getByAddress(MOCK_IPV4_ADDR), 19); @@ -776,7 +774,7 @@ public class ApfTest extends AndroidTestCase { apfFilter.shutdown(); } - @MediumTest + @LargeTest public void testApfFilterIPv6() throws Exception { MockIpManagerCallback ipManagerCallback = new MockIpManagerCallback(); ApfFilter apfFilter = new TestApfFilter(ipManagerCallback, ALLOW_MULTICAST, mLog); @@ -802,7 +800,7 @@ public class ApfTest extends AndroidTestCase { apfFilter.shutdown(); } - @MediumTest + @LargeTest public void testApfFilterMulticast() throws Exception { final byte[] unicastIpv4Addr = {(byte)192,0,2,63}; final byte[] broadcastIpv4Addr = {(byte)192,0,2,(byte)255}; @@ -912,7 +910,7 @@ public class ApfTest extends AndroidTestCase { assertDrop(program, garpReply()); } - @MediumTest + @LargeTest public void testApfFilterArp() throws Exception { MockIpManagerCallback ipManagerCallback = new MockIpManagerCallback(); ApfFilter apfFilter = new TestApfFilter(ipManagerCallback, ALLOW_MULTICAST, mLog); @@ -1031,7 +1029,7 @@ public class ApfTest extends AndroidTestCase { ipManagerCallback.assertNoProgramUpdate(); } - @MediumTest + @LargeTest public void testApfFilterRa() throws Exception { MockIpManagerCallback ipManagerCallback = new MockIpManagerCallback(); TestApfFilter apfFilter = new TestApfFilter(ipManagerCallback, DROP_MULTICAST, mLog); @@ -1148,41 +1146,6 @@ public class ApfTest extends AndroidTestCase { buffer.position(original); } - @SmallTest - public void testRaParsing() throws Exception { - final int maxRandomPacketSize = 512; - final Random r = new Random(); - MockIpManagerCallback cb = new MockIpManagerCallback(); - TestApfFilter apfFilter = new TestApfFilter(cb, DROP_MULTICAST, mLog); - for (int i = 0; i < 1000; i++) { - byte[] packet = new byte[r.nextInt(maxRandomPacketSize + 1)]; - r.nextBytes(packet); - try { - apfFilter.new Ra(packet, packet.length); - } catch (ApfFilter.InvalidRaException e) { - } catch (Exception e) { - throw new Exception("bad packet: " + HexDump.toHexString(packet), e); - } - } - } - - @SmallTest - public void testRaProcessing() throws Exception { - final int maxRandomPacketSize = 512; - final Random r = new Random(); - MockIpManagerCallback cb = new MockIpManagerCallback(); - TestApfFilter apfFilter = new TestApfFilter(cb, DROP_MULTICAST, mLog); - for (int i = 0; i < 1000; i++) { - byte[] packet = new byte[r.nextInt(maxRandomPacketSize + 1)]; - r.nextBytes(packet); - try { - apfFilter.processRa(packet, packet.length); - } catch (Exception e) { - throw new Exception("bad packet: " + HexDump.toHexString(packet), e); - } - } - } - /** * Call the APF interpreter the run {@code program} on {@code packet} pretending the * filter was installed {@code filter_age} seconds ago. @@ -1204,7 +1167,6 @@ public class ApfTest extends AndroidTestCase { private native static boolean compareBpfApf(String filter, String pcap_filename, byte[] apf_program); - @SmallTest public void testBytesToInt() { assertEquals(0x00000000, ApfFilter.bytesToInt(IPV4_ANY_HOST_ADDR)); assertEquals(0xffffffff, ApfFilter.bytesToInt(IPV4_BROADCAST_ADDRESS)); diff --git a/tests/net/java/android/net/apf/Bpf2Apf.java b/services/tests/servicestests/src/android/net/apf/Bpf2Apf.java index 220e54ddef5d..220e54ddef5d 100644 --- a/tests/net/java/android/net/apf/Bpf2Apf.java +++ b/services/tests/servicestests/src/android/net/apf/Bpf2Apf.java diff --git a/tests/net/java/android/net/dhcp/DhcpPacketTest.java b/services/tests/servicestests/src/android/net/dhcp/DhcpPacketTest.java index bc8baa12a45b..bc8baa12a45b 100644 --- a/tests/net/java/android/net/dhcp/DhcpPacketTest.java +++ b/services/tests/servicestests/src/android/net/dhcp/DhcpPacketTest.java diff --git a/tests/net/java/android/net/netlink/NetlinkErrorMessageTest.java b/services/tests/servicestests/src/android/net/netlink/NetlinkErrorMessageTest.java index e677475f5907..e677475f5907 100644 --- a/tests/net/java/android/net/netlink/NetlinkErrorMessageTest.java +++ b/services/tests/servicestests/src/android/net/netlink/NetlinkErrorMessageTest.java diff --git a/tests/net/java/android/net/netlink/NetlinkSocketTest.java b/services/tests/servicestests/src/android/net/netlink/NetlinkSocketTest.java index c599fe3e5b76..c599fe3e5b76 100644 --- a/tests/net/java/android/net/netlink/NetlinkSocketTest.java +++ b/services/tests/servicestests/src/android/net/netlink/NetlinkSocketTest.java diff --git a/tests/net/java/android/net/netlink/RtNetlinkNeighborMessageTest.java b/services/tests/servicestests/src/android/net/netlink/RtNetlinkNeighborMessageTest.java index 19ee00036b61..19ee00036b61 100644 --- a/tests/net/java/android/net/netlink/RtNetlinkNeighborMessageTest.java +++ b/services/tests/servicestests/src/android/net/netlink/RtNetlinkNeighborMessageTest.java diff --git a/tests/net/java/android/net/util/IpUtilsTest.java b/services/tests/servicestests/src/android/net/util/IpUtilsTest.java index c2d1608c461c..c2d1608c461c 100644 --- a/tests/net/java/android/net/util/IpUtilsTest.java +++ b/services/tests/servicestests/src/android/net/util/IpUtilsTest.java diff --git a/tests/utils/testutils/java/com/android/internal/util/test/FakeSettingsProvider.java b/services/tests/servicestests/src/com/android/internal/util/FakeSettingsProvider.java index 8ca849b8d37e..808f4dd7b84e 100644 --- a/tests/utils/testutils/java/com/android/internal/util/test/FakeSettingsProvider.java +++ b/services/tests/servicestests/src/com/android/internal/util/FakeSettingsProvider.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.internal.util.test; +package com.android.internal.util; import android.net.Uri; import android.os.Bundle; diff --git a/core/tests/utiltests/src/com/android/internal/util/test/FakeSettingsProviderTest.java b/services/tests/servicestests/src/com/android/internal/util/FakeSettingsProviderTest.java index f2be109c8602..05de0a53e055 100644 --- a/core/tests/utiltests/src/com/android/internal/util/test/FakeSettingsProviderTest.java +++ b/services/tests/servicestests/src/com/android/internal/util/FakeSettingsProviderTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.internal.util.test; +package com.android.internal.util; import android.content.ContentResolver; import android.database.ContentObserver; diff --git a/tests/utils/testutils/java/com/android/internal/util/test/BroadcastInterceptingContext.java b/services/tests/servicestests/src/com/android/server/BroadcastInterceptingContext.java index 27b7419f227a..13657ab7f02d 100644 --- a/tests/utils/testutils/java/com/android/internal/util/test/BroadcastInterceptingContext.java +++ b/services/tests/servicestests/src/com/android/server/BroadcastInterceptingContext.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.internal.util.test; +package com.android.server; import android.content.BroadcastReceiver; import android.content.Context; @@ -25,12 +25,13 @@ import android.os.Bundle; import android.os.Handler; import android.os.UserHandle; -import java.util.ArrayList; +import com.google.common.collect.Lists; +import com.google.common.util.concurrent.AbstractFuture; + import java.util.Iterator; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; -import java.util.concurrent.FutureTask; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; @@ -41,17 +42,9 @@ import java.util.concurrent.TimeoutException; public class BroadcastInterceptingContext extends ContextWrapper { private static final String TAG = "WatchingContext"; - private final List<BroadcastInterceptor> mInterceptors = new ArrayList<>(); - - public abstract class FutureIntent extends FutureTask<Intent> { - public FutureIntent() { - super( - () -> { throw new IllegalStateException("Cannot happen"); } - ); - } - } + private final List<BroadcastInterceptor> mInterceptors = Lists.newArrayList(); - public class BroadcastInterceptor extends FutureIntent { + public class BroadcastInterceptor extends AbstractFuture<Intent> { private final BroadcastReceiver mReceiver; private final IntentFilter mFilter; @@ -89,11 +82,11 @@ public class BroadcastInterceptingContext extends ContextWrapper { super(base); } - public FutureIntent nextBroadcastIntent(String action) { + public Future<Intent> nextBroadcastIntent(String action) { return nextBroadcastIntent(new IntentFilter(action)); } - public FutureIntent nextBroadcastIntent(IntentFilter filter) { + public Future<Intent> nextBroadcastIntent(IntentFilter filter) { final BroadcastInterceptor interceptor = new BroadcastInterceptor(null, filter); synchronized (mInterceptors) { mInterceptors.add(interceptor); diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java index fc8cc8133205..4af1cf1a0df8 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java @@ -68,16 +68,14 @@ import android.os.Process; import android.os.SystemClock; import android.provider.Settings; import android.test.AndroidTestCase; -import android.test.FlakyTest; import android.test.mock.MockContentResolver; import android.test.suitebuilder.annotation.LargeTest; import android.test.suitebuilder.annotation.SmallTest; import android.util.Log; import android.util.LogPrinter; +import com.android.internal.util.FakeSettingsProvider; import com.android.internal.util.WakeupMessage; -import com.android.internal.util.test.BroadcastInterceptingContext; -import com.android.internal.util.test.FakeSettingsProvider; import com.android.server.connectivity.NetworkAgentInfo; import com.android.server.connectivity.NetworkMonitor; import com.android.server.connectivity.NetworkMonitor.CaptivePortalProbeResult; @@ -217,20 +215,8 @@ public class ConnectivityServiceTest extends AndroidTestCase { mService.waitForIdle(); assertEquals(i, mCm.getNetworkCapabilities(n).getSignalStrength()); } - } - - @FlakyTest(tolerance = 3) - public void testNotWaitingForIdleCausesRaceConditions() { - // Bring up a network that we can use to send messages to ConnectivityService. - ConditionVariable cv = waitForConnectivityBroadcasts(1); - mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); - mWiFiNetworkAgent.connect(false); - waitFor(cv); - Network n = mWiFiNetworkAgent.getNetwork(); - assertNotNull(n); // Ensure that not calling waitForIdle causes a race condition. - final int attempts = 50; // Causes the test to take about 200ms on bullhead-eng. for (int i = 0; i < attempts; i++) { mWiFiNetworkAgent.setSignalStrength(i); if (i != mCm.getNetworkCapabilities(n).getSignalStrength()) { @@ -250,7 +236,6 @@ public class ConnectivityServiceTest extends AndroidTestCase { private final IdleableHandlerThread mHandlerThread; private final ConditionVariable mDisconnected = new ConditionVariable(); private final ConditionVariable mNetworkStatusReceived = new ConditionVariable(); - private final ConditionVariable mPreventReconnectReceived = new ConditionVariable(); private int mScore; private NetworkAgent mNetworkAgent; private int mStartKeepaliveError = PacketKeepalive.ERROR_HARDWARE_UNSUPPORTED; @@ -306,11 +291,6 @@ public class ConnectivityServiceTest extends AndroidTestCase { mRedirectUrl = redirectUrl; mNetworkStatusReceived.open(); } - - @Override - protected void preventAutomaticReconnect() { - mPreventReconnectReceived.open(); - } }; // Waits for the NetworkAgent to be registered, which includes the creation of the // NetworkMonitor. @@ -395,6 +375,11 @@ public class ConnectivityServiceTest extends AndroidTestCase { mWrappedNetworkMonitor.gen204ProbeResult = 200; mWrappedNetworkMonitor.gen204ProbeRedirectUrl = redirectUrl; connect(false); + waitFor(new Criteria() { public boolean get() { + NetworkCapabilities caps = mCm.getNetworkCapabilities(getNetwork()); + return caps != null && caps.hasCapability(NET_CAPABILITY_CAPTIVE_PORTAL);} }); + mWrappedNetworkMonitor.gen204ProbeResult = 500; + mWrappedNetworkMonitor.gen204ProbeRedirectUrl = null; } public void disconnect() { @@ -406,10 +391,6 @@ public class ConnectivityServiceTest extends AndroidTestCase { return new Network(mNetworkAgent.netId); } - public ConditionVariable getPreventReconnectReceived() { - return mPreventReconnectReceived; - } - public ConditionVariable getDisconnectedCV() { return mDisconnected; } @@ -616,7 +597,6 @@ public class ConnectivityServiceTest extends AndroidTestCase { @Override protected CaptivePortalProbeResult isCaptivePortal() { - if (!mIsCaptivePortalCheckEnabled) { return new CaptivePortalProbeResult(204); } return new CaptivePortalProbeResult(gen204ProbeResult, gen204ProbeRedirectUrl, null); } } @@ -727,7 +707,10 @@ public class ConnectivityServiceTest extends AndroidTestCase { static private void waitFor(Criteria criteria) { int delays = 0; while (!criteria.get()) { - sleepFor(50); + try { + Thread.sleep(50); + } catch (InterruptedException e) { + } if (++delays == 10) fail(); } } @@ -760,9 +743,6 @@ public class ConnectivityServiceTest extends AndroidTestCase { mService.systemReady(); mCm = new WrappedConnectivityManager(getContext(), mService); mCm.bindProcessToNetwork(null); - - // Ensure that the default setting for Captive Portals is used for most tests - setCaptivePortalMode(Settings.Global.CAPTIVE_PORTAL_MODE_PROMPT); } public void tearDown() throws Exception { @@ -1097,8 +1077,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { NETWORK_CAPABILITIES, LINK_PROPERTIES, LOSING, - LOST, - UNAVAILABLE + LOST } /** @@ -1139,11 +1118,6 @@ public class ConnectivityServiceTest extends AndroidTestCase { } @Override - public void onUnavailable() { - setLastCallback(CallbackState.UNAVAILABLE, null, null); - } - - @Override public void onLosing(Network network, int maxMsToLive) { setLastCallback(CallbackState.LOSING, network, maxMsToLive /* autoboxed int */); } @@ -1730,47 +1704,6 @@ public class ConnectivityServiceTest extends AndroidTestCase { validatedCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); } - @LargeTest - public void testAvoidOrIgnoreCaptivePortals() { - final TestNetworkCallback captivePortalCallback = new TestNetworkCallback(); - final NetworkRequest captivePortalRequest = new NetworkRequest.Builder() - .addCapability(NET_CAPABILITY_CAPTIVE_PORTAL).build(); - mCm.registerNetworkCallback(captivePortalRequest, captivePortalCallback); - - final TestNetworkCallback validatedCallback = new TestNetworkCallback(); - final NetworkRequest validatedRequest = new NetworkRequest.Builder() - .addCapability(NET_CAPABILITY_VALIDATED).build(); - mCm.registerNetworkCallback(validatedRequest, validatedCallback); - - setCaptivePortalMode(Settings.Global.CAPTIVE_PORTAL_MODE_AVOID); - // Bring up a network with a captive portal. - // Expect it to fail to connect and not result in any callbacks. - mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); - String firstRedirectUrl = "http://example.com/firstPath"; - - ConditionVariable disconnectCv = mWiFiNetworkAgent.getDisconnectedCV(); - ConditionVariable avoidCv = mWiFiNetworkAgent.getPreventReconnectReceived(); - mWiFiNetworkAgent.connectWithCaptivePortal(firstRedirectUrl); - waitFor(disconnectCv); - waitFor(avoidCv); - - assertNoCallbacks(captivePortalCallback, validatedCallback); - - // Now test ignore mode. - setCaptivePortalMode(Settings.Global.CAPTIVE_PORTAL_MODE_IGNORE); - - // Bring up a network with a captive portal. - // Since we're ignoring captive portals, the network will validate. - mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); - String secondRedirectUrl = "http://example.com/secondPath"; - mWiFiNetworkAgent.connectWithCaptivePortal(secondRedirectUrl); - - // Expect NET_CAPABILITY_VALIDATED onAvailable callback. - validatedCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); - // But there should be no CaptivePortal callback. - captivePortalCallback.assertNoCallback(); - } - @SmallTest public void testInvalidNetworkSpecifier() { boolean execptionCalled = true; @@ -1911,11 +1844,6 @@ public class ConnectivityServiceTest extends AndroidTestCase { mCm.unregisterNetworkCallback(cellNetworkCallback); } - private void setCaptivePortalMode(int mode) { - ContentResolver cr = mServiceContext.getContentResolver(); - Settings.Global.putInt(cr, Settings.Global.CAPTIVE_PORTAL_MODE, mode); - } - private void setMobileDataAlwaysOn(boolean enable) { ContentResolver cr = mServiceContext.getContentResolver(); Settings.Global.putInt(cr, Settings.Global.MOBILE_DATA_ALWAYS_ON, enable ? 1 : 0); @@ -2293,96 +2221,6 @@ public class ConnectivityServiceTest extends AndroidTestCase { mCm.unregisterNetworkCallback(defaultCallback); } - /** - * Validate that a satisfied network request does not trigger onUnavailable() once the - * time-out period expires. - */ - @SmallTest - public void testSatisfiedNetworkRequestDoesNotTriggerOnUnavailable() { - NetworkRequest nr = new NetworkRequest.Builder().addTransportType( - NetworkCapabilities.TRANSPORT_WIFI).build(); - final TestNetworkCallback networkCallback = new TestNetworkCallback(); - mCm.requestNetwork(nr, networkCallback, 10); - - mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); - mWiFiNetworkAgent.connect(false); - networkCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); - - // pass timeout and validate that UNAVAILABLE is not called - sleepFor(15); - networkCallback.assertNoCallback(); - } - - /** - * Validate that a satisfied network request followed by a disconnected (lost) network does - * not trigger onUnavailable() once the time-out period expires. - */ - @SmallTest - public void testSatisfiedThenLostNetworkRequestDoesNotTriggerOnUnavailable() { - NetworkRequest nr = new NetworkRequest.Builder().addTransportType( - NetworkCapabilities.TRANSPORT_WIFI).build(); - final TestNetworkCallback networkCallback = new TestNetworkCallback(); - mCm.requestNetwork(nr, networkCallback, 500); - - mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); - mWiFiNetworkAgent.connect(false); - networkCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); - sleepFor(20); - mWiFiNetworkAgent.disconnect(); - networkCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); - - // pass timeout and validate that UNAVAILABLE is not called - sleepFor(600); - networkCallback.assertNoCallback(); - } - - /** - * Validate that when a time-out is specified for a network request the onUnavailable() - * callback is called when time-out expires. Then validate that if network request is - * (somehow) satisfied - the callback isn't called later. - */ - @SmallTest - public void testTimedoutNetworkRequest() { - NetworkRequest nr = new NetworkRequest.Builder().addTransportType( - NetworkCapabilities.TRANSPORT_WIFI).build(); - final TestNetworkCallback networkCallback = new TestNetworkCallback(); - mCm.requestNetwork(nr, networkCallback, 10); - - // pass timeout and validate that UNAVAILABLE is called - networkCallback.expectCallback(CallbackState.UNAVAILABLE, null); - - // create a network satisfying request - validate that request not triggered - mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); - mWiFiNetworkAgent.connect(false); - networkCallback.assertNoCallback(); - } - - /** - * Validate that when a network request is unregistered (cancelled) the time-out for that - * request doesn't trigger the onUnavailable() callback. - */ - @SmallTest - public void testTimedoutAfterUnregisteredNetworkRequest() { - NetworkRequest nr = new NetworkRequest.Builder().addTransportType( - NetworkCapabilities.TRANSPORT_WIFI).build(); - final TestNetworkCallback networkCallback = new TestNetworkCallback(); - mCm.requestNetwork(nr, networkCallback, 10); - - // remove request - mCm.unregisterNetworkCallback(networkCallback); - - // pass timeout and validate that no callbacks - // Note: doesn't validate that nothing called from CS since even if called the CM already - // unregisters the callback and won't pass it through! - sleepFor(15); - networkCallback.assertNoCallback(); - - // create a network satisfying request - validate that request not triggered - mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); - mWiFiNetworkAgent.connect(false); - networkCallback.assertNoCallback(); - } - private static class TestKeepaliveCallback extends PacketKeepaliveCallback { public static enum CallbackType { ON_STARTED, ON_STOPPED, ON_ERROR }; @@ -2787,13 +2625,4 @@ public class ConnectivityServiceTest extends AndroidTestCase { mCm.unregisterNetworkCallback(pendingIntent); } } - - /* test utilities */ - static private void sleepFor(int ms) { - try { - Thread.sleep(ms); - } catch (InterruptedException e) { - } - - } } diff --git a/services/tests/servicestests/src/com/android/server/NetworkManagementServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkManagementServiceTest.java index f841bf9bff22..0d5daa5def97 100644 --- a/services/tests/servicestests/src/com/android/server/NetworkManagementServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/NetworkManagementServiceTest.java @@ -24,7 +24,6 @@ import android.os.Binder; import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.LargeTest; import com.android.server.net.BaseNetworkObserver; -import com.android.internal.util.test.BroadcastInterceptingContext; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; diff --git a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java index 8d36ac993e52..541be3dad376 100644 --- a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java @@ -78,7 +78,6 @@ import android.test.suitebuilder.annotation.Suppress; import android.text.format.Time; import android.util.TrustedTime; -import com.android.internal.util.test.BroadcastInterceptingContext; import com.android.server.net.NetworkPolicyManagerService; import com.google.common.util.concurrent.AbstractFuture; diff --git a/tests/net/java/com/android/server/connectivity/IpConnectivityEventBuilderTest.java b/services/tests/servicestests/src/com/android/server/connectivity/IpConnectivityEventBuilderTest.java index 84f0f9040b0c..aed363524560 100644 --- a/tests/net/java/com/android/server/connectivity/IpConnectivityEventBuilderTest.java +++ b/services/tests/servicestests/src/com/android/server/connectivity/IpConnectivityEventBuilderTest.java @@ -71,8 +71,7 @@ public class IpConnectivityEventBuilderTest extends TestCase { " transport_types: 3", " >", " time_ms: 1", - ">", - "version: 2"); + ">"); verifySerialization(want, ev); } @@ -94,8 +93,7 @@ public class IpConnectivityEventBuilderTest extends TestCase { " state_transition: \"SomeState\"", " >", " time_ms: 1", - ">", - "version: 2"); + ">"); verifySerialization(want, ev); } @@ -116,8 +114,7 @@ public class IpConnectivityEventBuilderTest extends TestCase { " state_transition: \"\"", " >", " time_ms: 1", - ">", - "version: 2"); + ">"); verifySerialization(want, ev); } @@ -163,8 +160,7 @@ public class IpConnectivityEventBuilderTest extends TestCase { " return_codes: 178", " >", " time_ms: 1", - ">", - "version: 2"); + ">"); verifySerialization(want, ev); } @@ -185,8 +181,7 @@ public class IpConnectivityEventBuilderTest extends TestCase { " latency_ms: 5678", " >", " time_ms: 1", - ">", - "version: 2"); + ">"); verifySerialization(want, ev); } @@ -205,8 +200,7 @@ public class IpConnectivityEventBuilderTest extends TestCase { " if_name: \"wlan0\"", " >", " time_ms: 1", - ">", - "version: 2"); + ">"); verifySerialization(want, ev); } @@ -229,8 +223,7 @@ public class IpConnectivityEventBuilderTest extends TestCase { " >", " >", " time_ms: 1", - ">", - "version: 2"); + ">"); verifySerialization(want, ev); } @@ -255,8 +248,7 @@ public class IpConnectivityEventBuilderTest extends TestCase { " probe_result: 204", " probe_type: 1", " >", - ">", - "version: 2"); + ">"); verifySerialization(want, ev); } @@ -282,8 +274,7 @@ public class IpConnectivityEventBuilderTest extends TestCase { " program_length: 2048", " >", " time_ms: 1", - ">", - "version: 2"); + ">"); verifySerialization(want, ev); } @@ -314,8 +305,7 @@ public class IpConnectivityEventBuilderTest extends TestCase { " zero_lifetime_ras: 1", " >", " time_ms: 1", - ">", - "version: 2"); + ">"); verifySerialization(want, ev); } @@ -342,8 +332,7 @@ public class IpConnectivityEventBuilderTest extends TestCase { " router_lifetime: 2000", " >", " time_ms: 1", - ">", - "version: 2"); + ">"); verifySerialization(want, ev); } diff --git a/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java b/services/tests/servicestests/src/com/android/server/connectivity/IpConnectivityMetricsTest.java index aa491bbabd79..3fc89b9ff12d 100644 --- a/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java +++ b/services/tests/servicestests/src/com/android/server/connectivity/IpConnectivityMetricsTest.java @@ -19,7 +19,6 @@ package com.android.server.connectivity; import android.content.Context; import android.net.ConnectivityMetricsEvent; import android.net.IIpConnectivityMetrics; -import android.net.metrics.ApfProgramEvent; import android.net.metrics.ApfStats; import android.net.metrics.DefaultNetworkEvent; import android.net.metrics.DhcpClientEvent; @@ -58,7 +57,7 @@ public class IpConnectivityMetricsTest extends TestCase { public void setUp() { MockitoAnnotations.initMocks(this); - mService = new IpConnectivityMetrics(mCtx, (ctx) -> 2000); + mService = new IpConnectivityMetrics(mCtx); } public void testLoggingEvents() throws Exception { @@ -113,27 +112,6 @@ public class IpConnectivityMetricsTest extends TestCase { assertEquals("", output3); } - public void testRateLimiting() { - final IpConnectivityLog logger = new IpConnectivityLog(mService.impl); - final ApfProgramEvent ev = new ApfProgramEvent(0, 0, 0, 0, 0); - final long fakeTimestamp = 1; - - int attempt = 100; // More than burst quota, but less than buffer size. - for (int i = 0; i < attempt; i++) { - logger.log(ev); - } - - String output1 = getdump("flush"); - assertFalse("".equals(output1)); - - for (int i = 0; i < attempt; i++) { - assertFalse("expected event to be dropped", logger.log(fakeTimestamp, ev)); - } - - String output2 = getdump("flush"); - assertEquals("", output2); - } - public void testEndToEndLogging() { IpConnectivityLog logger = new IpConnectivityLog(mService.impl); @@ -226,8 +204,7 @@ public class IpConnectivityMetricsTest extends TestCase { " router_lifetime: 2000", " >", " time_ms: 700", - ">", - "version: 2"); + ">"); verifySerialization(want, getdump("flush")); } diff --git a/tests/net/java/com/android/server/connectivity/LingerMonitorTest.java b/services/tests/servicestests/src/com/android/server/connectivity/LingerMonitorTest.java index bce5787ed9a5..bce5787ed9a5 100644 --- a/tests/net/java/com/android/server/connectivity/LingerMonitorTest.java +++ b/services/tests/servicestests/src/com/android/server/connectivity/LingerMonitorTest.java diff --git a/tests/net/java/com/android/server/connectivity/MetricsLoggerServiceTest.java b/services/tests/servicestests/src/com/android/server/connectivity/MetricsLoggerServiceTest.java index 5f84ea1bfd96..5f84ea1bfd96 100644 --- a/tests/net/java/com/android/server/connectivity/MetricsLoggerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/connectivity/MetricsLoggerServiceTest.java diff --git a/tests/net/java/com/android/server/connectivity/MetricsTestUtil.java b/services/tests/servicestests/src/com/android/server/connectivity/MetricsTestUtil.java index e20101278121..e20101278121 100644 --- a/tests/net/java/com/android/server/connectivity/MetricsTestUtil.java +++ b/services/tests/servicestests/src/com/android/server/connectivity/MetricsTestUtil.java diff --git a/tests/net/java/com/android/server/connectivity/NetdEventListenerServiceTest.java b/services/tests/servicestests/src/com/android/server/connectivity/NetdEventListenerServiceTest.java index 9e2fd6231ba9..9e2fd6231ba9 100644 --- a/tests/net/java/com/android/server/connectivity/NetdEventListenerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/connectivity/NetdEventListenerServiceTest.java diff --git a/tests/net/java/com/android/server/connectivity/TetheringTest.java b/services/tests/servicestests/src/com/android/server/connectivity/TetheringTest.java index a9f68c88c8c5..a9f68c88c8c5 100644 --- a/tests/net/java/com/android/server/connectivity/TetheringTest.java +++ b/services/tests/servicestests/src/com/android/server/connectivity/TetheringTest.java diff --git a/tests/net/java/com/android/server/connectivity/VpnTest.java b/services/tests/servicestests/src/com/android/server/connectivity/VpnTest.java index 5d8b843bbc17..5d8b843bbc17 100644 --- a/tests/net/java/com/android/server/connectivity/VpnTest.java +++ b/services/tests/servicestests/src/com/android/server/connectivity/VpnTest.java diff --git a/tests/net/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachineTest.java b/services/tests/servicestests/src/com/android/server/connectivity/tethering/TetherInterfaceStateMachineTest.java index 9f7261dc6019..a30b3629d5c4 100644 --- a/tests/net/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachineTest.java +++ b/services/tests/servicestests/src/com/android/server/connectivity/tethering/TetherInterfaceStateMachineTest.java @@ -59,14 +59,13 @@ public class TetherInterfaceStateMachineTest { @Mock private INetworkStatsService mStatsService; @Mock private IControlsTethering mTetherHelper; @Mock private InterfaceConfiguration mInterfaceConfiguration; - @Mock private IPv6TetheringInterfaceServices mIPv6TetheringInterfaceServices; private final TestLooper mLooper = new TestLooper(); private TetherInterfaceStateMachine mTestedSm; private void initStateMachine(int interfaceType) throws Exception { mTestedSm = new TetherInterfaceStateMachine(IFACE_NAME, mLooper.getLooper(), interfaceType, - mNMService, mStatsService, mTetherHelper, mIPv6TetheringInterfaceServices); + mNMService, mStatsService, mTetherHelper); mTestedSm.start(); // Starting the state machine always puts us in a consistent state and notifies // the test of the world that we've changed from an unknown to available state. @@ -92,8 +91,7 @@ public class TetherInterfaceStateMachineTest { @Test public void startsOutAvailable() { mTestedSm = new TetherInterfaceStateMachine(IFACE_NAME, mLooper.getLooper(), - ConnectivityManager.TETHERING_BLUETOOTH, mNMService, mStatsService, mTetherHelper, - mIPv6TetheringInterfaceServices); + ConnectivityManager.TETHERING_BLUETOOTH, mNMService, mStatsService, mTetherHelper); mTestedSm.start(); mLooper.dispatchAll(); verify(mTetherHelper).notifyInterfaceStateChange( @@ -276,4 +274,4 @@ public class TetherInterfaceStateMachineTest { upstreamIface); mLooper.dispatchAll(); } -} +}
\ No newline at end of file diff --git a/services/tests/servicestests/src/com/android/server/net/NetworkStatsServiceTest.java b/services/tests/servicestests/src/com/android/server/net/NetworkStatsServiceTest.java index f2cf90ca916f..94c6711da9ae 100644 --- a/services/tests/servicestests/src/com/android/server/net/NetworkStatsServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/net/NetworkStatsServiceTest.java @@ -40,21 +40,21 @@ import static android.text.format.DateUtils.DAY_IN_MILLIS; import static android.text.format.DateUtils.HOUR_IN_MILLIS; import static android.text.format.DateUtils.MINUTE_IN_MILLIS; import static android.text.format.DateUtils.WEEK_IN_MILLIS; - import static com.android.server.net.NetworkStatsService.ACTION_NETWORK_STATS_POLL; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyInt; -import static org.mockito.Matchers.anyLong; -import static org.mockito.Mockito.when; -import static org.mockito.Mockito.verify; +import static org.easymock.EasyMock.anyInt; +import static org.easymock.EasyMock.anyLong; +import static org.easymock.EasyMock.anyObject; +import static org.easymock.EasyMock.capture; +import static org.easymock.EasyMock.createMock; +import static org.easymock.EasyMock.eq; +import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.expectLastCall; +import static org.easymock.EasyMock.isA; import android.app.AlarmManager; +import android.app.IAlarmListener; +import android.app.IAlarmManager; +import android.app.PendingIntent; import android.app.usage.NetworkStatsManager; import android.content.Context; import android.content.Intent; @@ -63,7 +63,6 @@ import android.net.IConnectivityManager; import android.net.INetworkManagementEventObserver; import android.net.INetworkStatsSession; import android.net.LinkProperties; -import android.net.NetworkCapabilities; import android.net.NetworkInfo; import android.net.NetworkInfo.DetailedState; import android.net.NetworkState; @@ -81,28 +80,23 @@ import android.os.MessageQueue; import android.os.MessageQueue.IdleHandler; import android.os.Message; import android.os.PowerManager; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; +import android.os.WorkSource; import android.telephony.TelephonyManager; import android.test.AndroidTestCase; +import android.test.suitebuilder.annotation.LargeTest; +import android.test.suitebuilder.annotation.Suppress; import android.util.TrustedTime; import com.android.internal.net.VpnInfo; -import com.android.internal.util.test.BroadcastInterceptingContext; +import com.android.server.BroadcastInterceptingContext; import com.android.server.net.NetworkStatsService; import com.android.server.net.NetworkStatsService.NetworkStatsSettings; import com.android.server.net.NetworkStatsService.NetworkStatsSettings.Config; import libcore.io.IoUtils; -import org.junit.After; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; +import org.easymock.Capture; +import org.easymock.EasyMock; import java.io.File; import java.util.ArrayList; @@ -112,11 +106,11 @@ import java.util.List; /** * Tests for {@link NetworkStatsService}. * - * TODO: This test used to be really brittle because it used Easymock - it uses Mockito now, but - * still uses the Easymock structure, which could be simplified. + * TODO: This test is really brittle, largely due to overly-strict use of Easymock. + * Rewrite w/ Mockito. */ -@RunWith(AndroidJUnit4.class) -public class NetworkStatsServiceTest { +@LargeTest +public class NetworkStatsServiceTest extends AndroidTestCase { private static final String TAG = "NetworkStatsServiceTest"; private static final String TEST_IFACE = "test0"; @@ -143,12 +137,10 @@ public class NetworkStatsServiceTest { private BroadcastInterceptingContext mServiceContext; private File mStatsDir; - private @Mock INetworkManagementService mNetManager; - private @Mock TrustedTime mTime; - private @Mock NetworkStatsSettings mSettings; - private @Mock IConnectivityManager mConnManager; - private @Mock IBinder mBinder; - private @Mock AlarmManager mAlarmManager; + private INetworkManagementService mNetManager; + private TrustedTime mTime; + private NetworkStatsSettings mSettings; + private IConnectivityManager mConnManager; private IdleableHandlerThread mHandlerThread; private Handler mHandler; @@ -156,24 +148,32 @@ public class NetworkStatsServiceTest { private INetworkStatsSession mSession; private INetworkManagementEventObserver mNetworkObserver; - @Before + @Override public void setUp() throws Exception { - MockitoAnnotations.initMocks(this); - final Context context = InstrumentationRegistry.getContext(); + super.setUp(); - mServiceContext = new BroadcastInterceptingContext(context); - mStatsDir = context.getFilesDir(); + mServiceContext = new BroadcastInterceptingContext(getContext()); + mStatsDir = getContext().getFilesDir(); if (mStatsDir.exists()) { IoUtils.deleteContents(mStatsDir); } + mNetManager = createMock(INetworkManagementService.class); + + // TODO: Mock AlarmManager when migrating this test to Mockito. + AlarmManager alarmManager = (AlarmManager) mServiceContext + .getSystemService(Context.ALARM_SERVICE); + mTime = createMock(TrustedTime.class); + mSettings = createMock(NetworkStatsSettings.class); + mConnManager = createMock(IConnectivityManager.class); + PowerManager powerManager = (PowerManager) mServiceContext.getSystemService( Context.POWER_SERVICE); PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG); mService = new NetworkStatsService( - mServiceContext, mNetManager, mAlarmManager, wakeLock, mTime, + mServiceContext, mNetManager, alarmManager, wakeLock, mTime, TelephonyManager.getDefault(), mSettings, new NetworkStatsObservers(), mStatsDir, getBaseDir(mStatsDir)); mHandlerThread = new IdleableHandlerThread("HandlerThread"); @@ -190,20 +190,22 @@ public class NetworkStatsServiceTest { expectNetworkStatsUidDetail(buildEmptyStats()); expectSystemReady(); + // catch INetworkManagementEventObserver during systemReady() + final Capture<INetworkManagementEventObserver> networkObserver = new Capture< + INetworkManagementEventObserver>(); + mNetManager.registerObserver(capture(networkObserver)); + expectLastCall().atLeastOnce(); + + replay(); mService.systemReady(); mSession = mService.openSession(); - assertNotNull("openSession() failed", mSession); - + verifyAndReset(); - // catch INetworkManagementEventObserver during systemReady() - ArgumentCaptor<INetworkManagementEventObserver> networkObserver = - ArgumentCaptor.forClass(INetworkManagementEventObserver.class); - verify(mNetManager).registerObserver(networkObserver.capture()); mNetworkObserver = networkObserver.getValue(); } - @After + @Override public void tearDown() throws Exception { IoUtils.deleteContents(mStatsDir); @@ -217,9 +219,10 @@ public class NetworkStatsServiceTest { mSession.close(); mService = null; + + super.tearDown(); } - @Test public void testNetworkStatsWifi() throws Exception { // pretend that wifi network comes online; service should ask about full // network state, and poll any existing interfaces before updating. @@ -228,13 +231,15 @@ public class NetworkStatsServiceTest { expectNetworkState(buildWifiState()); expectNetworkStatsSummary(buildEmptyStats()); expectNetworkStatsUidDetail(buildEmptyStats()); + expectNetworkStatsPoll(); expectBandwidthControlCheck(); + replay(); mService.forceUpdateIfaces(); // verify service has empty history for wifi assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0); - + verifyAndReset(); // modify some number on wifi, and trigger poll event incrementCurrentTime(HOUR_IN_MILLIS); @@ -243,11 +248,14 @@ public class NetworkStatsServiceTest { expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1) .addIfaceValues(TEST_IFACE, 1024L, 1L, 2048L, 2L)); expectNetworkStatsUidDetail(buildEmptyStats()); + expectNetworkStatsPoll(); + + replay(); forcePollAndWaitForIdle(); // verify service recorded history assertNetworkTotal(sTemplateWifi, 1024L, 1L, 2048L, 2L, 0); - + verifyAndReset(); // and bump forward again, with counters going higher. this is // important, since polling should correctly subtract last snapshot. @@ -257,14 +265,17 @@ public class NetworkStatsServiceTest { expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1) .addIfaceValues(TEST_IFACE, 4096L, 4L, 8192L, 8L)); expectNetworkStatsUidDetail(buildEmptyStats()); + expectNetworkStatsPoll(); + + replay(); forcePollAndWaitForIdle(); // verify service recorded history assertNetworkTotal(sTemplateWifi, 4096L, 4L, 8192L, 8L, 0); + verifyAndReset(); } - @Test public void testStatsRebootPersist() throws Exception { assertStatsFilesExist(false); @@ -275,13 +286,15 @@ public class NetworkStatsServiceTest { expectNetworkState(buildWifiState()); expectNetworkStatsSummary(buildEmptyStats()); expectNetworkStatsUidDetail(buildEmptyStats()); + expectNetworkStatsPoll(); expectBandwidthControlCheck(); + replay(); mService.forceUpdateIfaces(); // verify service has empty history for wifi assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0); - + verifyAndReset(); // modify some number on wifi, and trigger poll event incrementCurrentTime(HOUR_IN_MILLIS); @@ -295,11 +308,14 @@ public class NetworkStatsServiceTest { .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, TAG_NONE, 512L, 4L, 256L, 2L, 0L) .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, 0xFAAD, 256L, 2L, 128L, 1L, 0L) .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 128L, 1L, 128L, 1L, 0L)); + expectNetworkStatsPoll(); + mService.setUidForeground(UID_RED, false); mService.incrementOperationCount(UID_RED, 0xFAAD, 4); mService.setUidForeground(UID_RED, true); mService.incrementOperationCount(UID_RED, 0xFAAD, 6); + replay(); forcePollAndWaitForIdle(); // verify service recorded history @@ -309,13 +325,16 @@ public class NetworkStatsServiceTest { assertUidTotal(sTemplateWifi, UID_RED, SET_FOREGROUND, ROAMING_NO, 512L, 4L, 256L, 2L, 6); assertUidTotal(sTemplateWifi, UID_BLUE, 128L, 1L, 128L, 1L, 0); - + verifyAndReset(); // graceful shutdown system, which should trigger persist of stats, and // clear any values in memory. expectCurrentTime(); expectDefaultSettings(); + replay(); mServiceContext.sendBroadcast(new Intent(Intent.ACTION_SHUTDOWN)); + verifyAndReset(); + assertStatsFilesExist(true); // boot through serviceReady() again @@ -324,8 +343,17 @@ public class NetworkStatsServiceTest { expectNetworkStatsUidDetail(buildEmptyStats()); expectSystemReady(); + // catch INetworkManagementEventObserver during systemReady() + final Capture<INetworkManagementEventObserver> networkObserver = new Capture< + INetworkManagementEventObserver>(); + mNetManager.registerObserver(capture(networkObserver)); + expectLastCall().atLeastOnce(); + + replay(); mService.systemReady(); + mNetworkObserver = networkObserver.getValue(); + // after systemReady(), we should have historical stats loaded again assertNetworkTotal(sTemplateWifi, 1024L, 8L, 2048L, 16L, 0); assertUidTotal(sTemplateWifi, UID_RED, 1024L, 8L, 512L, 4L, 10); @@ -333,12 +361,12 @@ public class NetworkStatsServiceTest { assertUidTotal(sTemplateWifi, UID_RED, SET_FOREGROUND, ROAMING_NO, 512L, 4L, 256L, 2L, 6); assertUidTotal(sTemplateWifi, UID_BLUE, 128L, 1L, 128L, 1L, 0); + verifyAndReset(); } // TODO: simulate reboot to test bucket resize - @Test - @Ignore + @Suppress public void testStatsBucketResize() throws Exception { NetworkStatsHistory history = null; @@ -351,10 +379,12 @@ public class NetworkStatsServiceTest { expectNetworkState(buildWifiState()); expectNetworkStatsSummary(buildEmptyStats()); expectNetworkStatsUidDetail(buildEmptyStats()); + expectNetworkStatsPoll(); expectBandwidthControlCheck(); + replay(); mService.forceUpdateIfaces(); - + verifyAndReset(); // modify some number on wifi, and trigger poll event incrementCurrentTime(2 * HOUR_IN_MILLIS); @@ -363,6 +393,9 @@ public class NetworkStatsServiceTest { expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1) .addIfaceValues(TEST_IFACE, 512L, 4L, 512L, 4L)); expectNetworkStatsUidDetail(buildEmptyStats()); + expectNetworkStatsPoll(); + + replay(); forcePollAndWaitForIdle(); // verify service recorded history @@ -370,7 +403,7 @@ public class NetworkStatsServiceTest { assertValues(history, Long.MIN_VALUE, Long.MAX_VALUE, 512L, 4L, 512L, 4L, 0); assertEquals(HOUR_IN_MILLIS, history.getBucketDuration()); assertEquals(2, history.size()); - + verifyAndReset(); // now change bucket duration setting and trigger another poll with // exact same values, which should resize existing buckets. @@ -378,6 +411,9 @@ public class NetworkStatsServiceTest { expectSettings(0L, 30 * MINUTE_IN_MILLIS, WEEK_IN_MILLIS); expectNetworkStatsSummary(buildEmptyStats()); expectNetworkStatsUidDetail(buildEmptyStats()); + expectNetworkStatsPoll(); + + replay(); forcePollAndWaitForIdle(); // verify identical stats, but spread across 4 buckets now @@ -385,10 +421,10 @@ public class NetworkStatsServiceTest { assertValues(history, Long.MIN_VALUE, Long.MAX_VALUE, 512L, 4L, 512L, 4L, 0); assertEquals(30 * MINUTE_IN_MILLIS, history.getBucketDuration()); assertEquals(4, history.size()); + verifyAndReset(); } - @Test public void testUidStatsAcrossNetworks() throws Exception { // pretend first mobile network comes online expectCurrentTime(); @@ -396,10 +432,12 @@ public class NetworkStatsServiceTest { expectNetworkState(buildMobile3gState(IMSI_1)); expectNetworkStatsSummary(buildEmptyStats()); expectNetworkStatsUidDetail(buildEmptyStats()); + expectNetworkStatsPoll(); expectBandwidthControlCheck(); + replay(); mService.forceUpdateIfaces(); - + verifyAndReset(); // create some traffic on first network incrementCurrentTime(HOUR_IN_MILLIS); @@ -411,8 +449,11 @@ public class NetworkStatsServiceTest { .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1536L, 12L, 512L, 4L, 0L) .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L) .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 512L, 4L, 0L, 0L, 0L)); + expectNetworkStatsPoll(); + mService.incrementOperationCount(UID_RED, 0xF00D, 10); + replay(); forcePollAndWaitForIdle(); // verify service recorded history @@ -420,7 +461,7 @@ public class NetworkStatsServiceTest { assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0); assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 512L, 4L, 10); assertUidTotal(sTemplateImsi1, UID_BLUE, 512L, 4L, 0L, 0L, 0); - + verifyAndReset(); // now switch networks; this also tests that we're okay with interfaces // disappearing, to verify we don't count backwards. @@ -434,11 +475,13 @@ public class NetworkStatsServiceTest { .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1536L, 12L, 512L, 4L, 0L) .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L) .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 512L, 4L, 0L, 0L, 0L)); + expectNetworkStatsPoll(); expectBandwidthControlCheck(); + replay(); mService.forceUpdateIfaces(); forcePollAndWaitForIdle(); - + verifyAndReset(); // create traffic on second network incrementCurrentTime(HOUR_IN_MILLIS); @@ -451,8 +494,11 @@ public class NetworkStatsServiceTest { .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L) .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 640L, 5L, 1024L, 8L, 0L) .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, 0xFAAD, 128L, 1L, 1024L, 8L, 0L)); + expectNetworkStatsPoll(); + mService.incrementOperationCount(UID_BLUE, 0xFAAD, 10); + replay(); forcePollAndWaitForIdle(); // verify original history still intact @@ -465,10 +511,10 @@ public class NetworkStatsServiceTest { assertNetworkTotal(sTemplateImsi2, 128L, 1L, 1024L, 8L, 0); assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0); assertUidTotal(sTemplateImsi2, UID_BLUE, 128L, 1L, 1024L, 8L, 10); + verifyAndReset(); } - @Test public void testUidRemovedIsMoved() throws Exception { // pretend that network comes online expectCurrentTime(); @@ -476,10 +522,12 @@ public class NetworkStatsServiceTest { expectNetworkState(buildWifiState()); expectNetworkStatsSummary(buildEmptyStats()); expectNetworkStatsUidDetail(buildEmptyStats()); + expectNetworkStatsPoll(); expectBandwidthControlCheck(); + replay(); mService.forceUpdateIfaces(); - + verifyAndReset(); // create some traffic incrementCurrentTime(HOUR_IN_MILLIS); @@ -492,8 +540,11 @@ public class NetworkStatsServiceTest { .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xFAAD, 16L, 1L, 16L, 1L, 0L) .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 4096L, 258L, 512L, 32L, 0L) .addValues(TEST_IFACE, UID_GREEN, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L)); + expectNetworkStatsPoll(); + mService.incrementOperationCount(UID_RED, 0xFAAD, 10); + replay(); forcePollAndWaitForIdle(); // verify service recorded history @@ -501,7 +552,7 @@ public class NetworkStatsServiceTest { assertUidTotal(sTemplateWifi, UID_RED, 16L, 1L, 16L, 1L, 10); assertUidTotal(sTemplateWifi, UID_BLUE, 4096L, 258L, 512L, 32L, 0); assertUidTotal(sTemplateWifi, UID_GREEN, 16L, 1L, 16L, 1L, 0); - + verifyAndReset(); // now pretend two UIDs are uninstalled, which should migrate stats to // special "removed" bucket. @@ -514,6 +565,9 @@ public class NetworkStatsServiceTest { .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xFAAD, 16L, 1L, 16L, 1L, 0L) .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 4096L, 258L, 512L, 32L, 0L) .addValues(TEST_IFACE, UID_GREEN, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L)); + expectNetworkStatsPoll(); + + replay(); final Intent intent = new Intent(ACTION_UID_REMOVED); intent.putExtra(EXTRA_UID, UID_BLUE); mServiceContext.sendBroadcast(intent); @@ -527,10 +581,10 @@ public class NetworkStatsServiceTest { assertUidTotal(sTemplateWifi, UID_BLUE, 0L, 0L, 0L, 0L, 0); assertUidTotal(sTemplateWifi, UID_GREEN, 16L, 1L, 16L, 1L, 0); assertUidTotal(sTemplateWifi, UID_REMOVED, 4112L, 259L, 528L, 33L, 10); + verifyAndReset(); } - @Test public void testUid3g4gCombinedByTemplate() throws Exception { // pretend that network comes online expectCurrentTime(); @@ -538,10 +592,12 @@ public class NetworkStatsServiceTest { expectNetworkState(buildMobile3gState(IMSI_1)); expectNetworkStatsSummary(buildEmptyStats()); expectNetworkStatsUidDetail(buildEmptyStats()); + expectNetworkStatsPoll(); expectBandwidthControlCheck(); + replay(); mService.forceUpdateIfaces(); - + verifyAndReset(); // create some traffic incrementCurrentTime(HOUR_IN_MILLIS); @@ -551,13 +607,16 @@ public class NetworkStatsServiceTest { expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1) .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 0L) .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L)); + expectNetworkStatsPoll(); + mService.incrementOperationCount(UID_RED, 0xF00D, 5); + replay(); forcePollAndWaitForIdle(); // verify service recorded history assertUidTotal(sTemplateImsi1, UID_RED, 1024L, 8L, 1024L, 8L, 5); - + verifyAndReset(); // now switch over to 4g network incrementCurrentTime(HOUR_IN_MILLIS); @@ -568,11 +627,13 @@ public class NetworkStatsServiceTest { expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1) .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 0L) .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L)); + expectNetworkStatsPoll(); expectBandwidthControlCheck(); + replay(); mService.forceUpdateIfaces(); forcePollAndWaitForIdle(); - + verifyAndReset(); // create traffic on second network incrementCurrentTime(HOUR_IN_MILLIS); @@ -584,15 +645,19 @@ public class NetworkStatsServiceTest { .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L) .addValues(TEST_IFACE2, UID_RED, SET_DEFAULT, TAG_NONE, 512L, 4L, 256L, 2L, 0L) .addValues(TEST_IFACE2, UID_RED, SET_DEFAULT, 0xFAAD, 512L, 4L, 256L, 2L, 0L)); + expectNetworkStatsPoll(); + mService.incrementOperationCount(UID_RED, 0xFAAD, 5); + replay(); forcePollAndWaitForIdle(); // verify that ALL_MOBILE template combines both assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 1280L, 10L, 10); + + verifyAndReset(); } - @Test public void testSummaryForAllUid() throws Exception { // pretend that network comes online expectCurrentTime(); @@ -600,10 +665,12 @@ public class NetworkStatsServiceTest { expectNetworkState(buildWifiState()); expectNetworkStatsSummary(buildEmptyStats()); expectNetworkStatsUidDetail(buildEmptyStats()); + expectNetworkStatsPoll(); expectBandwidthControlCheck(); + replay(); mService.forceUpdateIfaces(); - + verifyAndReset(); // create some traffic for two apps incrementCurrentTime(HOUR_IN_MILLIS); @@ -614,14 +681,17 @@ public class NetworkStatsServiceTest { .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 50L, 5L, 50L, 5L, 0L) .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 10L, 1L, 10L, 1L, 0L) .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 1024L, 8L, 512L, 4L, 0L)); + expectNetworkStatsPoll(); + mService.incrementOperationCount(UID_RED, 0xF00D, 1); + replay(); forcePollAndWaitForIdle(); // verify service recorded history assertUidTotal(sTemplateWifi, UID_RED, 50L, 5L, 50L, 5L, 1); assertUidTotal(sTemplateWifi, UID_BLUE, 1024L, 8L, 512L, 4L, 0); - + verifyAndReset(); // now create more traffic in next hour, but only for one app incrementCurrentTime(HOUR_IN_MILLIS); @@ -632,6 +702,9 @@ public class NetworkStatsServiceTest { .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 50L, 5L, 50L, 5L, 0L) .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 10L, 1L, 10L, 1L, 0L) .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 2048L, 16L, 1024L, 8L, 0L)); + expectNetworkStatsPoll(); + + replay(); forcePollAndWaitForIdle(); // first verify entire history present @@ -652,9 +725,10 @@ public class NetworkStatsServiceTest { assertEquals(1, stats.size()); assertValues(stats, IFACE_ALL, UID_BLUE, SET_DEFAULT, TAG_NONE, ROAMING_NO, 1024L, 8L, 512L, 4L, 0); + + verifyAndReset(); } - @Test public void testForegroundBackground() throws Exception { // pretend that network comes online expectCurrentTime(); @@ -662,10 +736,12 @@ public class NetworkStatsServiceTest { expectNetworkState(buildWifiState()); expectNetworkStatsSummary(buildEmptyStats()); expectNetworkStatsUidDetail(buildEmptyStats()); + expectNetworkStatsPoll(); expectBandwidthControlCheck(); + replay(); mService.forceUpdateIfaces(); - + verifyAndReset(); // create some initial traffic incrementCurrentTime(HOUR_IN_MILLIS); @@ -675,13 +751,16 @@ public class NetworkStatsServiceTest { expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1) .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 128L, 2L, 128L, 2L, 0L) .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 64L, 1L, 64L, 1L, 0L)); + expectNetworkStatsPoll(); + mService.incrementOperationCount(UID_RED, 0xF00D, 1); + replay(); forcePollAndWaitForIdle(); // verify service recorded history assertUidTotal(sTemplateWifi, UID_RED, 128L, 2L, 128L, 2L, 1); - + verifyAndReset(); // now switch to foreground incrementCurrentTime(HOUR_IN_MILLIS); @@ -693,9 +772,12 @@ public class NetworkStatsServiceTest { .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 64L, 1L, 64L, 1L, 0L) .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, TAG_NONE, 32L, 2L, 32L, 2L, 0L) .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, 0xFAAD, 1L, 1L, 1L, 1L, 0L)); + expectNetworkStatsPoll(); + mService.setUidForeground(UID_RED, true); mService.incrementOperationCount(UID_RED, 0xFAAD, 1); + replay(); forcePollAndWaitForIdle(); // test that we combined correctly @@ -713,9 +795,10 @@ public class NetworkStatsServiceTest { 32L, 2L, 1); assertValues(stats, IFACE_ALL, UID_RED, SET_FOREGROUND, 0xFAAD, ROAMING_NO, 1L, 1L, 1L, 1L, 1); + + verifyAndReset(); } - @Test public void testRoaming() throws Exception { // pretend that network comes online expectCurrentTime(); @@ -723,10 +806,12 @@ public class NetworkStatsServiceTest { expectNetworkState(buildMobile3gState(IMSI_1, true /* isRoaming */)); expectNetworkStatsSummary(buildEmptyStats()); expectNetworkStatsUidDetail(buildEmptyStats()); + expectNetworkStatsPoll(); expectBandwidthControlCheck(); + replay(); mService.forceUpdateIfaces(); - + verifyAndReset(); // Create some traffic incrementCurrentTime(HOUR_IN_MILLIS); @@ -741,6 +826,9 @@ public class NetworkStatsServiceTest { 128L, 2L, 0L) .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_NO, 64L, 1L, 64L, 1L, 0L)); + expectNetworkStatsPoll(); + + replay(); forcePollAndWaitForIdle(); // verify service recorded history @@ -754,9 +842,10 @@ public class NetworkStatsServiceTest { 128L, 2L, 0); assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_YES, 64L, 1L, 64L, 1L, 0); + + verifyAndReset(); } - @Test public void testTethering() throws Exception { // pretend first mobile network comes online expectCurrentTime(); @@ -764,10 +853,12 @@ public class NetworkStatsServiceTest { expectNetworkState(buildMobile3gState(IMSI_1)); expectNetworkStatsSummary(buildEmptyStats()); expectNetworkStatsUidDetail(buildEmptyStats()); + expectNetworkStatsPoll(); expectBandwidthControlCheck(); + replay(); mService.forceUpdateIfaces(); - + verifyAndReset(); // create some tethering traffic incrementCurrentTime(HOUR_IN_MILLIS); @@ -783,16 +874,19 @@ public class NetworkStatsServiceTest { .addValues(TEST_IFACE, UID_TETHERING, SET_DEFAULT, TAG_NONE, 1920L, 14L, 384L, 2L, 0L); expectNetworkStatsUidDetail(uidStats, tetherIfacePairs, tetherStats); + expectNetworkStatsPoll(); + + replay(); forcePollAndWaitForIdle(); // verify service recorded history assertNetworkTotal(sTemplateImsi1, 2048L, 16L, 512L, 4L, 0); assertUidTotal(sTemplateImsi1, UID_RED, 128L, 2L, 128L, 2L, 0); assertUidTotal(sTemplateImsi1, UID_TETHERING, 1920L, 14L, 384L, 2L, 0); + verifyAndReset(); } - @Test public void testRegisterUsageCallback() throws Exception { // pretend that wifi network comes online; service should ask about full // network state, and poll any existing interfaces before updating. @@ -801,12 +895,16 @@ public class NetworkStatsServiceTest { expectNetworkState(buildWifiState()); expectNetworkStatsSummary(buildEmptyStats()); expectNetworkStatsUidDetail(buildEmptyStats()); + expectNetworkStatsPoll(); expectBandwidthControlCheck(); + replay(); mService.forceUpdateIfaces(); // verify service has empty history for wifi assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0); + verifyAndReset(); + String callingPackage = "the.calling.package"; long thresholdInBytes = 1L; // very small; should be overriden by framework DataUsageRequest inputRequest = new DataUsageRequest( @@ -817,18 +915,23 @@ public class NetworkStatsServiceTest { LatchedHandler latchedHandler = new LatchedHandler(Looper.getMainLooper(), cv); Messenger messenger = new Messenger(latchedHandler); + // Allow binder to connect + IBinder mockBinder = createMock(IBinder.class); + mockBinder.linkToDeath((IBinder.DeathRecipient) anyObject(), anyInt()); + EasyMock.replay(mockBinder); + // Force poll expectCurrentTime(); expectDefaultSettings(); expectNetworkStatsSummary(buildEmptyStats()); expectNetworkStatsUidDetail(buildEmptyStats()); - - + expectNetworkStatsPoll(); + replay(); // Register and verify request and that binder was called DataUsageRequest request = mService.registerUsageCallback(callingPackage, inputRequest, - messenger, mBinder); + messenger, mockBinder); assertTrue(request.requestId > 0); assertTrue(Objects.equals(sTemplateWifi, request.template)); long minThresholdInBytes = 2 * 1024 * 1024; // 2 MB @@ -838,11 +941,11 @@ public class NetworkStatsServiceTest { mHandler.sendMessage(mHandler.obtainMessage(-1)); mHandlerThread.waitForIdle(WAIT_TIMEOUT); - + verifyAndReset(); // Make sure that the caller binder gets connected - verify(mBinder).linkToDeath(any(IBinder.DeathRecipient.class), anyInt()); - + EasyMock.verify(mockBinder); + EasyMock.reset(mockBinder); // modify some number on wifi, and trigger poll event // not enough traffic to call data usage callback @@ -852,9 +955,13 @@ public class NetworkStatsServiceTest { expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1) .addIfaceValues(TEST_IFACE, 1024L, 1L, 2048L, 2L)); expectNetworkStatsUidDetail(buildEmptyStats()); + expectNetworkStatsPoll(); + + replay(); forcePollAndWaitForIdle(); // verify service recorded history + verifyAndReset(); assertNetworkTotal(sTemplateWifi, 1024L, 1L, 2048L, 2L, 0); // make sure callback has not being called @@ -868,11 +975,14 @@ public class NetworkStatsServiceTest { expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1) .addIfaceValues(TEST_IFACE, 4096000L, 4L, 8192000L, 8L)); expectNetworkStatsUidDetail(buildEmptyStats()); + expectNetworkStatsPoll(); + + replay(); forcePollAndWaitForIdle(); // verify service recorded history assertNetworkTotal(sTemplateWifi, 4096000L, 4L, 8192000L, 8L, 0); - + verifyAndReset(); // Wait for the caller to ack receipt of CALLBACK_LIMIT_REACHED assertTrue(cv.block(WAIT_TIMEOUT)); @@ -880,7 +990,9 @@ public class NetworkStatsServiceTest { cv.close(); // Allow binder to disconnect - when(mBinder.unlinkToDeath(any(IBinder.DeathRecipient.class), anyInt())).thenReturn(true); + expect(mockBinder.unlinkToDeath((IBinder.DeathRecipient) anyObject(), anyInt())) + .andReturn(true); + EasyMock.replay(mockBinder); // Unregister request mService.unregisterUsageRequest(request); @@ -890,10 +1002,9 @@ public class NetworkStatsServiceTest { assertEquals(NetworkStatsManager.CALLBACK_RELEASED, latchedHandler.mLastMessageType); // Make sure that the caller binder gets disconnected - verify(mBinder).unlinkToDeath(any(IBinder.DeathRecipient.class), anyInt()); + EasyMock.verify(mockBinder); } - @Test public void testUnregisterUsageCallback_unknown_noop() throws Exception { String callingPackage = "the.calling.package"; long thresholdInBytes = 10 * 1024 * 1024; // 10 MB @@ -950,30 +1061,33 @@ public class NetworkStatsServiceTest { } private void expectSystemReady() throws Exception { + mNetManager.setGlobalAlert(anyLong()); + expectLastCall().atLeastOnce(); + expectNetworkStatsSummary(buildEmptyStats()); expectBandwidthControlCheck(); } private void expectNetworkState(NetworkState... state) throws Exception { - when(mConnManager.getAllNetworkState()).thenReturn(state); + expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce(); final LinkProperties linkProp = state.length > 0 ? state[0].linkProperties : null; - when(mConnManager.getActiveLinkProperties()).thenReturn(linkProp); + expect(mConnManager.getActiveLinkProperties()).andReturn(linkProp).atLeastOnce(); } private void expectNetworkStatsSummary(NetworkStats summary) throws Exception { - when(mConnManager.getAllVpnInfo()).thenReturn(new VpnInfo[0]); + expect(mConnManager.getAllVpnInfo()).andReturn(new VpnInfo[0]).atLeastOnce(); expectNetworkStatsSummaryDev(summary); expectNetworkStatsSummaryXt(summary); } private void expectNetworkStatsSummaryDev(NetworkStats summary) throws Exception { - when(mNetManager.getNetworkStatsSummaryDev()).thenReturn(summary); + expect(mNetManager.getNetworkStatsSummaryDev()).andReturn(summary).atLeastOnce(); } private void expectNetworkStatsSummaryXt(NetworkStats summary) throws Exception { - when(mNetManager.getNetworkStatsSummaryXt()).thenReturn(summary); + expect(mNetManager.getNetworkStatsSummaryXt()).andReturn(summary).atLeastOnce(); } private void expectNetworkStatsUidDetail(NetworkStats detail) throws Exception { @@ -983,10 +1097,11 @@ public class NetworkStatsServiceTest { private void expectNetworkStatsUidDetail( NetworkStats detail, String[] tetherIfacePairs, NetworkStats tetherStats) throws Exception { - when(mNetManager.getNetworkStatsUidDetail(UID_ALL)).thenReturn(detail); + expect(mNetManager.getNetworkStatsUidDetail(eq(UID_ALL))).andReturn(detail).atLeastOnce(); // also include tethering details, since they are folded into UID - when(mNetManager.getNetworkStatsTethering()).thenReturn(tetherStats); + expect(mNetManager.getNetworkStatsTethering()) + .andReturn(tetherStats).atLeastOnce(); } private void expectDefaultSettings() throws Exception { @@ -995,33 +1110,38 @@ public class NetworkStatsServiceTest { private void expectSettings(long persistBytes, long bucketDuration, long deleteAge) throws Exception { - when(mSettings.getPollInterval()).thenReturn(HOUR_IN_MILLIS); - when(mSettings.getTimeCacheMaxAge()).thenReturn(DAY_IN_MILLIS); - when(mSettings.getSampleEnabled()).thenReturn(true); + expect(mSettings.getPollInterval()).andReturn(HOUR_IN_MILLIS).anyTimes(); + expect(mSettings.getTimeCacheMaxAge()).andReturn(DAY_IN_MILLIS).anyTimes(); + expect(mSettings.getSampleEnabled()).andReturn(true).anyTimes(); final Config config = new Config(bucketDuration, deleteAge, deleteAge); - when(mSettings.getDevConfig()).thenReturn(config); - when(mSettings.getXtConfig()).thenReturn(config); - when(mSettings.getUidConfig()).thenReturn(config); - when(mSettings.getUidTagConfig()).thenReturn(config); - - when(mSettings.getGlobalAlertBytes(anyLong())).thenReturn(MB_IN_BYTES); - when(mSettings.getDevPersistBytes(anyLong())).thenReturn(MB_IN_BYTES); - when(mSettings.getXtPersistBytes(anyLong())).thenReturn(MB_IN_BYTES); - when(mSettings.getUidPersistBytes(anyLong())).thenReturn(MB_IN_BYTES); - when(mSettings.getUidTagPersistBytes(anyLong())).thenReturn(MB_IN_BYTES); + expect(mSettings.getDevConfig()).andReturn(config).anyTimes(); + expect(mSettings.getXtConfig()).andReturn(config).anyTimes(); + expect(mSettings.getUidConfig()).andReturn(config).anyTimes(); + expect(mSettings.getUidTagConfig()).andReturn(config).anyTimes(); + + expect(mSettings.getGlobalAlertBytes(anyLong())).andReturn(MB_IN_BYTES).anyTimes(); + expect(mSettings.getDevPersistBytes(anyLong())).andReturn(MB_IN_BYTES).anyTimes(); + expect(mSettings.getXtPersistBytes(anyLong())).andReturn(MB_IN_BYTES).anyTimes(); + expect(mSettings.getUidPersistBytes(anyLong())).andReturn(MB_IN_BYTES).anyTimes(); + expect(mSettings.getUidTagPersistBytes(anyLong())).andReturn(MB_IN_BYTES).anyTimes(); } private void expectCurrentTime() throws Exception { - when(mTime.forceRefresh()).thenReturn(false); - when(mTime.hasCache()).thenReturn(true); - when(mTime.currentTimeMillis()).thenReturn(currentTimeMillis()); - when(mTime.getCacheAge()).thenReturn(0L); - when(mTime.getCacheCertainty()).thenReturn(0L); + expect(mTime.forceRefresh()).andReturn(false).anyTimes(); + expect(mTime.hasCache()).andReturn(true).anyTimes(); + expect(mTime.currentTimeMillis()).andReturn(currentTimeMillis()).anyTimes(); + expect(mTime.getCacheAge()).andReturn(0L).anyTimes(); + expect(mTime.getCacheCertainty()).andReturn(0L).anyTimes(); + } + + private void expectNetworkStatsPoll() throws Exception { + mNetManager.setGlobalAlert(anyLong()); + expectLastCall().anyTimes(); } private void expectBandwidthControlCheck() throws Exception { - when(mNetManager.isBandwidthControlEnabled()).thenReturn(true); + expect(mNetManager.isBandwidthControlEnabled()).andReturn(true).atLeastOnce(); } private void assertStatsFilesExist(boolean exist) { @@ -1084,8 +1204,7 @@ public class NetworkStatsServiceTest { info.setDetailedState(DetailedState.CONNECTED, null, null); final LinkProperties prop = new LinkProperties(); prop.setInterfaceName(TEST_IFACE); - final NetworkCapabilities capabilities = new NetworkCapabilities(); - return new NetworkState(info, prop, capabilities, null, null, TEST_SSID); + return new NetworkState(info, prop, null, null, null, TEST_SSID); } private static NetworkState buildMobile3gState(String subscriberId) { @@ -1099,8 +1218,7 @@ public class NetworkStatsServiceTest { info.setRoaming(isRoaming); final LinkProperties prop = new LinkProperties(); prop.setInterfaceName(TEST_IFACE); - final NetworkCapabilities capabilities = new NetworkCapabilities(); - return new NetworkState(info, prop, capabilities, null, subscriberId, null); + return new NetworkState(info, prop, null, null, subscriberId, null); } private static NetworkState buildMobile4gState(String iface) { @@ -1108,8 +1226,7 @@ public class NetworkStatsServiceTest { info.setDetailedState(DetailedState.CONNECTED, null, null); final LinkProperties prop = new LinkProperties(); prop.setInterfaceName(iface); - final NetworkCapabilities capabilities = new NetworkCapabilities(); - return new NetworkState(info, prop, capabilities, null, null, null); + return new NetworkState(info, prop, null, null, null, null); } private NetworkStats buildEmptyStats() { @@ -1132,6 +1249,15 @@ public class NetworkStatsServiceTest { mElapsedRealtime += duration; } + private void replay() { + EasyMock.replay(mNetManager, mTime, mSettings, mConnManager); + } + + private void verifyAndReset() { + EasyMock.verify(mNetManager, mTime, mSettings, mConnManager); + EasyMock.reset(mNetManager, mTime, mSettings, mConnManager); + } + private void forcePollAndWaitForIdle() { mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); // Send dummy message to make sure that any previous message has been handled diff --git a/tests/net/Android.mk b/tests/net/Android.mk deleted file mode 100644 index 8aa27a9559b8..000000000000 --- a/tests/net/Android.mk +++ /dev/null @@ -1,80 +0,0 @@ -######################################################################### -# Build FrameworksNetTests package -######################################################################### - -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -# We only want this apk build for tests. -LOCAL_MODULE_TAGS := tests - -# Include all test java files. -LOCAL_SRC_FILES := $(call all-java-files-under, java) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - frameworks-base-testutils \ - framework-protos \ - android-support-test \ - mockito-target-minus-junit4 \ - platform-test-annotations \ - services.core \ - services.net - -LOCAL_JAVA_LIBRARIES := \ - android.test.runner - -LOCAL_PACKAGE_NAME := FrameworksNetTests - -LOCAL_CERTIFICATE := platform - -# These are not normally accessible from apps so they must be explicitly included. -LOCAL_JNI_SHARED_LIBRARIES := libframeworksnettestsjni \ - libbacktrace \ - libbase \ - libbinder \ - libc++ \ - libcutils \ - liblog \ - liblzma \ - libnativehelper \ - libnetdaidl \ - libui \ - libunwind \ - libutils - -LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk - -include $(BUILD_PACKAGE) - -######################################################################### -# Build JNI Shared Library -######################################################################### - -LOCAL_PATH:= $(LOCAL_PATH)/jni - -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests - -LOCAL_CFLAGS := -Wall -Wextra -Werror - -LOCAL_C_INCLUDES := \ - libpcap \ - hardware/google/apf - -LOCAL_SRC_FILES := $(call all-cpp-files-under) - -LOCAL_SHARED_LIBRARIES := \ - libbinder \ - liblog \ - libcutils \ - libnativehelper \ - libnetdaidl - -LOCAL_STATIC_LIBRARIES := \ - libpcap \ - libapf - -LOCAL_MODULE := libframeworksnettestsjni - -include $(BUILD_SHARED_LIBRARY) diff --git a/tests/net/AndroidManifest.xml b/tests/net/AndroidManifest.xml deleted file mode 100644 index e069dd052d82..000000000000 --- a/tests/net/AndroidManifest.xml +++ /dev/null @@ -1,57 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2016 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.android.frameworks.tests.net"> - - <uses-permission android:name="android.permission.READ_LOGS" /> - <uses-permission android:name="android.permission.WRITE_SETTINGS" /> - <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" /> - <uses-permission android:name="android.permission.READ_PHONE_STATE" /> - <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> - <uses-permission android:name="android.permission.BROADCAST_STICKY" /> - <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" /> - <uses-permission android:name="android.permission.UPDATE_DEVICE_STATS" /> - <uses-permission android:name="android.permission.MANAGE_APP_TOKENS" /> - <uses-permission android:name="android.permission.WAKE_LOCK" /> - <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" /> - <uses-permission android:name="android.permission.REAL_GET_TASKS" /> - <uses-permission android:name="android.permission.GET_DETAILED_TASKS" /> - <uses-permission android:name="android.permission.MANAGE_NETWORK_POLICY" /> - <uses-permission android:name="android.permission.READ_NETWORK_USAGE_HISTORY" /> - <uses-permission android:name="android.permission.MODIFY_NETWORK_ACCOUNTING" /> - <uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" /> - <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> - <uses-permission android:name="android.permission.MANAGE_USERS" /> - <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" /> - <uses-permission android:name="android.permission.MANAGE_DEVICE_ADMINS" /> - <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" /> - <uses-permission android:name="android.permission.INTERNET" /> - <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> - <uses-permission android:name="android.permission.PACKET_KEEPALIVE_OFFLOAD" /> - <uses-permission android:name="android.permission.GET_INTENT_SENDER_INTENT" /> - <uses-permission android:name="android.permission.MANAGE_ACTIVITY_STACKS" /> - <uses-permission android:name="android.permission.INSTALL_PACKAGES" /> - - <application> - <uses-library android:name="android.test.runner" /> - </application> - - <instrumentation - android:name="android.support.test.runner.AndroidJUnitRunner" - android:targetPackage="com.android.frameworks.tests.net" - android:label="Frameworks Networking Tests" /> -</manifest> diff --git a/tests/utils/testutils/Android.mk b/tests/utils/testutils/Android.mk index acbe4bcb235b..d53167f19ebe 100644 --- a/tests/utils/testutils/Android.mk +++ b/tests/utils/testutils/Android.mk @@ -27,6 +27,4 @@ LOCAL_STATIC_JAVA_LIBRARIES := \ android-support-test \ mockito-target -LOCAL_JAVA_LIBRARIES := android.test.runner - include $(BUILD_STATIC_JAVA_LIBRARY) |