diff options
82 files changed, 1479 insertions, 2621 deletions
diff --git a/Android.mk b/Android.mk index 5dfa58a6ba62..93c545e580c3 100644 --- a/Android.mk +++ b/Android.mk @@ -45,7 +45,6 @@ LOCAL_SRC_FILES += \ core/java/android/app/admin/SecurityLogTags.logtags \ core/java/android/content/EventLogTags.logtags \ core/java/android/speech/tts/EventLogTags.logtags \ - core/java/android/net/EventLogTags.logtags \ core/java/android/webkit/EventLogTags.logtags \ core/java/com/android/internal/logging/EventLogTags.logtags \ diff --git a/api/current.txt b/api/current.txt index 86b2119aed9e..8ba57a4e3c7a 100644 --- a/api/current.txt +++ b/api/current.txt @@ -6447,7 +6447,6 @@ package android.app.usage { public static class NetworkStats.Bucket { ctor public NetworkStats.Bucket(); method public long getEndTimeStamp(); - method public int getMetered(); method public int getRoaming(); method public long getRxBytes(); method public long getRxPackets(); @@ -6457,9 +6456,6 @@ package android.app.usage { method public long getTxBytes(); method public long getTxPackets(); method public int getUid(); - field public static final int METERED_ALL = -1; // 0xffffffff - field public static final int METERED_NO = 1; // 0x1 - field public static final int METERED_YES = 2; // 0x2 field public static final int ROAMING_ALL = -1; // 0xffffffff field public static final int ROAMING_NO = 1; // 0x1 field public static final int ROAMING_YES = 2; // 0x2 diff --git a/api/system-current.txt b/api/system-current.txt index b2f2a3ca43da..1849289f51ef 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -6739,7 +6739,6 @@ package android.app.usage { public static class NetworkStats.Bucket { ctor public NetworkStats.Bucket(); method public long getEndTimeStamp(); - method public int getMetered(); method public int getRoaming(); method public long getRxBytes(); method public long getRxPackets(); @@ -6749,9 +6748,6 @@ package android.app.usage { method public long getTxBytes(); method public long getTxPackets(); method public int getUid(); - field public static final int METERED_ALL = -1; // 0xffffffff - field public static final int METERED_NO = 1; // 0x1 - field public static final int METERED_YES = 2; // 0x2 field public static final int ROAMING_ALL = -1; // 0xffffffff field public static final int ROAMING_NO = 1; // 0x1 field public static final int ROAMING_YES = 2; // 0x2 diff --git a/api/test-current.txt b/api/test-current.txt index e3a395be4acb..969e39d8bf5d 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -6456,7 +6456,6 @@ package android.app.usage { public static class NetworkStats.Bucket { ctor public NetworkStats.Bucket(); method public long getEndTimeStamp(); - method public int getMetered(); method public int getRoaming(); method public long getRxBytes(); method public long getRxPackets(); @@ -6466,9 +6465,6 @@ package android.app.usage { method public long getTxBytes(); method public long getTxPackets(); method public int getUid(); - field public static final int METERED_ALL = -1; // 0xffffffff - field public static final int METERED_NO = 1; // 0x1 - field public static final int METERED_YES = 2; // 0x2 field public static final int ROAMING_ALL = -1; // 0xffffffff field public static final int ROAMING_NO = 1; // 0x1 field public static final int ROAMING_YES = 2; // 0x2 diff --git a/core/java/android/app/usage/NetworkStats.java b/core/java/android/app/usage/NetworkStats.java index 3670b914ecf3..226aa8f2706d 100644 --- a/core/java/android/app/usage/NetworkStats.java +++ b/core/java/android/app/usage/NetworkStats.java @@ -164,29 +164,6 @@ public final class NetworkStats implements AutoCloseable { public static final int UID_TETHERING = TrafficStats.UID_TETHERING; /** @hide */ - @IntDef({METERED_ALL, METERED_NO, METERED_YES}) - @Retention(RetentionPolicy.SOURCE) - public @interface Metered {} - - /** - * Combined usage across all metered states. Covers metered and unmetered usage. - */ - public static final int METERED_ALL = -1; - - /** - * Usage that occurs on an unmetered network. - */ - public static final int METERED_NO = 0x1; - - /** - * Usage that occurs on a metered network. - * - * <p>A network is classified as metered when the user is sensitive to heavy data usage on - * that connection. - */ - public static final int METERED_YES = 0x2; - - /** @hide */ @IntDef({ROAMING_ALL, ROAMING_NO, ROAMING_YES}) @Retention(RetentionPolicy.SOURCE) public @interface Roaming {} @@ -223,7 +200,6 @@ public final class NetworkStats implements AutoCloseable { private int mUid; private int mTag; private int mState; - private int mMetered; private int mRoaming; private long mBeginTimeStamp; private long mEndTimeStamp; @@ -256,15 +232,6 @@ public final class NetworkStats implements AutoCloseable { return tag; } - private static @Metered int convertMetered(int metered) { - switch (metered) { - case android.net.NetworkStats.METERED_ALL : return METERED_ALL; - case android.net.NetworkStats.METERED_NO: return METERED_NO; - case android.net.NetworkStats.METERED_YES: return METERED_YES; - } - return 0; - } - private static @Roaming int convertRoaming(int roaming) { switch (roaming) { case android.net.NetworkStats.ROAMING_ALL : return ROAMING_ALL; @@ -312,21 +279,6 @@ public final class NetworkStats implements AutoCloseable { } /** - * Metered state. One of the following values:<p/> - * <ul> - * <li>{@link #METERED_ALL}</li> - * <li>{@link #METERED_NO}</li> - * <li>{@link #METERED_YES}</li> - * </ul> - * <p>A network is classified as metered when the user is sensitive to heavy data usage on - * that connection. Apps may warn before using these networks for large downloads. The - * metered state can be set by the user within data usage network restrictions. - */ - public @Metered int getMetered() { - return mMetered; - } - - /** * Roaming state. One of the following values:<p/> * <ul> * <li>{@link #ROAMING_ALL}</li> @@ -539,7 +491,6 @@ public final class NetworkStats implements AutoCloseable { bucketOut.mUid = Bucket.convertUid(mRecycledSummaryEntry.uid); bucketOut.mTag = Bucket.convertTag(mRecycledSummaryEntry.tag); bucketOut.mState = Bucket.convertState(mRecycledSummaryEntry.set); - bucketOut.mMetered = Bucket.convertMetered(mRecycledSummaryEntry.metered); bucketOut.mRoaming = Bucket.convertRoaming(mRecycledSummaryEntry.roaming); bucketOut.mBeginTimeStamp = mStartTimeStamp; bucketOut.mEndTimeStamp = mEndTimeStamp; @@ -588,7 +539,6 @@ public final class NetworkStats implements AutoCloseable { bucketOut.mUid = Bucket.convertUid(getUid()); bucketOut.mTag = Bucket.convertTag(mTag); bucketOut.mState = Bucket.STATE_ALL; - bucketOut.mMetered = Bucket.METERED_ALL; bucketOut.mRoaming = Bucket.ROAMING_ALL; bucketOut.mBeginTimeStamp = mRecycledHistoryEntry.bucketStart; bucketOut.mEndTimeStamp = mRecycledHistoryEntry.bucketStart + diff --git a/core/java/android/app/usage/NetworkStatsManager.java b/core/java/android/app/usage/NetworkStatsManager.java index 840413a1151e..7961a72a12e4 100644 --- a/core/java/android/app/usage/NetworkStatsManager.java +++ b/core/java/android/app/usage/NetworkStatsManager.java @@ -51,17 +51,16 @@ import android.util.Log; * {@link #querySummaryForUser} <p /> * {@link #querySummary} <p /> * These queries aggregate network usage across the whole interval. Therefore there will be only one - * bucket for a particular key, state, metered and roaming combination. In case of the user-wide - * and device-wide summaries a single bucket containing the totalised network usage is returned. + * bucket for a particular key and state and roaming combination. In case of the user-wide and + * device-wide summaries a single bucket containing the totalised network usage is returned. * <h3> * History queries * </h3> * {@link #queryDetailsForUid} <p /> * {@link #queryDetails} <p /> - * These queries do not aggregate over time but do aggregate over state, metered and roaming. - * Therefore there can be multiple buckets for a particular key but all Bucket's state is going to - * be {@link NetworkStats.Bucket#STATE_ALL}, all Bucket's metered is going to be - * {@link NetworkStats.Bucket#METERED_ALL}, and all Bucket's roaming is going to be + * These queries do not aggregate over time but do aggregate over state and roaming. Therefore there + * can be multiple buckets for a particular key but all Bucket's state is going to be + * {@link NetworkStats.Bucket#STATE_ALL} and all Bucket's roaming is going to be * {@link NetworkStats.Bucket#ROAMING_ALL}. * <p /> * <b>NOTE:</b> Calling {@link #querySummaryForDevice} or accessing stats for apps other than the @@ -104,11 +103,10 @@ public class NetworkStatsManager { /** * Query network usage statistics summaries. Result is summarised data usage for the whole - * device. Result is a single Bucket aggregated over time, state, uid, tag, metered, and - * roaming. This means the bucket's start and end timestamp are going to be the same as the - * 'startTime' and 'endTime' parameters. State is going to be - * {@link NetworkStats.Bucket#STATE_ALL}, uid {@link NetworkStats.Bucket#UID_ALL}, - * tag {@link NetworkStats.Bucket#TAG_NONE}, metered {@link NetworkStats.Bucket#METERED_ALL}, + * device. Result is a single Bucket aggregated over time, state, uid, tag and roaming. This + * means the bucket's start and end timestamp are going to be the same as the 'startTime' and + * 'endTime' parameters. State is going to be {@link NetworkStats.Bucket#STATE_ALL}, uid + * {@link NetworkStats.Bucket#UID_ALL}, tag {@link NetworkStats.Bucket#TAG_NONE} * and roaming {@link NetworkStats.Bucket#ROAMING_ALL}. * * @param networkType As defined in {@link ConnectivityManager}, e.g. @@ -144,10 +142,8 @@ public class NetworkStatsManager { * Query network usage statistics summaries. Result is summarised data usage for all uids * belonging to calling user. Result is a single Bucket aggregated over time, state and uid. * This means the bucket's start and end timestamp are going to be the same as the 'startTime' - * and 'endTime' parameters. State is going to be {@link NetworkStats.Bucket#STATE_ALL}, - * uid {@link NetworkStats.Bucket#UID_ALL}, tag {@link NetworkStats.Bucket#TAG_NONE}, - * metered {@link NetworkStats.Bucket#METERED_ALL}, and roaming - * {@link NetworkStats.Bucket#ROAMING_ALL}. + * and 'endTime' parameters, state is going to be {@link NetworkStats.Bucket#STATE_ALL} and uid + * {@link NetworkStats.Bucket#UID_ALL}. * * @param networkType As defined in {@link ConnectivityManager}, e.g. * {@link ConnectivityManager#TYPE_MOBILE}, {@link ConnectivityManager#TYPE_WIFI} @@ -181,10 +177,9 @@ public class NetworkStatsManager { /** * Query network usage statistics summaries. Result filtered to include only uids belonging to * calling user. Result is aggregated over time, hence all buckets will have the same start and - * end timestamps. State is going to be {@link NetworkStats.Bucket#STATE_ALL}, - * uid {@link NetworkStats.Bucket#UID_ALL}, tag {@link NetworkStats.Bucket#TAG_NONE}, - * metered {@link NetworkStats.Bucket#METERED_ALL}, and roaming - * {@link NetworkStats.Bucket#ROAMING_ALL}. + * end timestamps. Not aggregated over state or uid. This means buckets' start and end + * timestamps are going to be the same as the 'startTime' and 'endTime' parameters. + * State and uid are going to vary, and tag is going to be the same. * * @param networkType As defined in {@link ConnectivityManager}, e.g. * {@link ConnectivityManager#TYPE_MOBILE}, {@link ConnectivityManager#TYPE_WIFI} @@ -267,12 +262,10 @@ public class NetworkStatsManager { /** * Query network usage statistics details. Result filtered to include only uids belonging to - * calling user. Result is aggregated over state but not aggregated over time, uid, tag, - * metered, nor roaming. This means buckets' start and end timestamps are going to be between - * 'startTime' and 'endTime' parameters. State is going to be - * {@link NetworkStats.Bucket#STATE_ALL}, uid will vary, - * tag {@link NetworkStats.Bucket#TAG_NONE}, metered is going to be - * {@link NetworkStats.Bucket#METERED_ALL}, and roaming is going to be + * calling user. Result is aggregated over state but not aggregated over time or uid. This means + * buckets' start and end timestamps are going to be between 'startTime' and 'endTime' + * parameters. State is going to be {@link NetworkStats.Bucket#STATE_ALL}, uid will vary, + * tag {@link NetworkStats.Bucket#TAG_NONE} and roaming is going to be * {@link NetworkStats.Bucket#ROAMING_ALL}. * <p>Only includes buckets that atomically occur in the inclusive time range. Doesn't * interpolate across partial buckets. Since bucket length is in the order of hours, this 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/EventLogTags.logtags b/core/java/android/net/EventLogTags.logtags deleted file mode 100644 index d5ed01496eba..000000000000 --- a/core/java/android/net/EventLogTags.logtags +++ /dev/null @@ -1,6 +0,0 @@ -# See system/core/logcat/event.logtags for a description of the format of this file. - -option java_package android.net - -50080 ntp_success (server|3),(rtt|2),(offset|2) -50081 ntp_failure (server|3),(msg|3) 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/NetworkIdentity.java b/core/java/android/net/NetworkIdentity.java index c704ef0c9ca7..d570e66a2435 100644 --- a/core/java/android/net/NetworkIdentity.java +++ b/core/java/android/net/NetworkIdentity.java @@ -171,8 +171,7 @@ public class NetworkIdentity implements Comparable<NetworkIdentity> { String subscriberId = null; String networkId = null; boolean roaming = false; - boolean metered = !state.networkCapabilities.hasCapability( - NetworkCapabilities.NET_CAPABILITY_NOT_METERED); + boolean metered = false; if (isNetworkTypeMobile(type)) { if (state.subscriberId == null) { @@ -186,6 +185,9 @@ public class NetworkIdentity implements Comparable<NetworkIdentity> { subscriberId = state.subscriberId; roaming = state.networkInfo.isRoaming(); + metered = !state.networkCapabilities.hasCapability( + NetworkCapabilities.NET_CAPABILITY_NOT_METERED); + } else if (type == TYPE_WIFI) { if (state.networkId != null) { networkId = state.networkId; diff --git a/core/java/android/net/NetworkStats.java b/core/java/android/net/NetworkStats.java index 77ce65b0815a..25806fa77674 100644 --- a/core/java/android/net/NetworkStats.java +++ b/core/java/android/net/NetworkStats.java @@ -68,18 +68,11 @@ public class NetworkStats implements Parcelable { // TODO: Rename TAG_NONE to TAG_ALL. public static final int TAG_NONE = 0; - /** {@link #metered} value to account for all metered states. */ - public static final int METERED_ALL = -1; - /** {@link #metered} value where native, unmetered data is accounted. */ - public static final int METERED_NO = 0; - /** {@link #metered} value where metered data is accounted. */ - public static final int METERED_YES = 1; - - /** {@link #roaming} value to account for all roaming states. */ + /** {@link #set} value for all roaming values. */ public static final int ROAMING_ALL = -1; - /** {@link #roaming} value where native, non-roaming data is accounted. */ + /** {@link #set} value where native, non-roaming data is accounted. */ public static final int ROAMING_NO = 0; - /** {@link #roaming} value where roaming data is accounted. */ + /** {@link #set} value where roaming data is accounted. */ public static final int ROAMING_YES = 1; // TODO: move fields to "mVariable" notation @@ -95,7 +88,6 @@ public class NetworkStats implements Parcelable { private int[] uid; private int[] set; private int[] tag; - private int[] metered; private int[] roaming; private long[] rxBytes; private long[] rxPackets; @@ -113,12 +105,6 @@ public class NetworkStats implements Parcelable { * to disk. We merge in the correct value when reporting this value to clients of * getSummary(). */ - public int metered; - /** - * Note that this is only populated w/ the default value when read from /proc or written - * to disk. We merge in the correct value when reporting this value to clients of - * getSummary(). - */ public int roaming; public long rxBytes; public long rxPackets; @@ -137,17 +123,16 @@ public class NetworkStats implements Parcelable { public Entry(String iface, int uid, int set, int tag, long rxBytes, long rxPackets, long txBytes, long txPackets, long operations) { - this(iface, uid, set, tag, METERED_NO, ROAMING_NO, rxBytes, rxPackets, txBytes, - txPackets, operations); + this(iface, uid, set, tag, ROAMING_NO, rxBytes, rxPackets, txBytes, txPackets, + operations); } - public Entry(String iface, int uid, int set, int tag, int metered, int roaming, - long rxBytes, long rxPackets, long txBytes, long txPackets, long operations) { + public Entry(String iface, int uid, int set, int tag, int roaming, long rxBytes, + long rxPackets, long txBytes, long txPackets, long operations) { this.iface = iface; this.uid = uid; this.set = set; this.tag = tag; - this.metered = metered; this.roaming = roaming; this.rxBytes = rxBytes; this.rxPackets = rxPackets; @@ -180,7 +165,6 @@ public class NetworkStats implements Parcelable { builder.append(" uid=").append(uid); builder.append(" set=").append(setToString(set)); builder.append(" tag=").append(tagToString(tag)); - builder.append(" metered=").append(meteredToString(metered)); builder.append(" roaming=").append(roamingToString(roaming)); builder.append(" rxBytes=").append(rxBytes); builder.append(" rxPackets=").append(rxPackets); @@ -194,18 +178,13 @@ public class NetworkStats implements Parcelable { public boolean equals(Object o) { if (o instanceof Entry) { final Entry e = (Entry) o; - return uid == e.uid && set == e.set && tag == e.tag && metered == e.metered - && roaming == e.roaming && rxBytes == e.rxBytes && rxPackets == e.rxPackets - && txBytes == e.txBytes && txPackets == e.txPackets - && operations == e.operations && iface.equals(e.iface); + return uid == e.uid && set == e.set && tag == e.tag && roaming == e.roaming + && rxBytes == e.rxBytes && rxPackets == e.rxPackets && txBytes == e.txBytes + && txPackets == e.txPackets && operations == e.operations + && iface.equals(e.iface); } return false; } - - @Override - public int hashCode() { - return Objects.hash(uid, set, tag, metered, roaming, iface); - } } public NetworkStats(long elapsedRealtime, int initialSize) { @@ -217,7 +196,6 @@ public class NetworkStats implements Parcelable { this.uid = new int[initialSize]; this.set = new int[initialSize]; this.tag = new int[initialSize]; - this.metered = new int[initialSize]; this.roaming = new int[initialSize]; this.rxBytes = new long[initialSize]; this.rxPackets = new long[initialSize]; @@ -231,7 +209,6 @@ public class NetworkStats implements Parcelable { this.uid = EmptyArray.INT; this.set = EmptyArray.INT; this.tag = EmptyArray.INT; - this.metered = EmptyArray.INT; this.roaming = EmptyArray.INT; this.rxBytes = EmptyArray.LONG; this.rxPackets = EmptyArray.LONG; @@ -249,7 +226,6 @@ public class NetworkStats implements Parcelable { uid = parcel.createIntArray(); set = parcel.createIntArray(); tag = parcel.createIntArray(); - metered = parcel.createIntArray(); roaming = parcel.createIntArray(); rxBytes = parcel.createLongArray(); rxPackets = parcel.createLongArray(); @@ -267,7 +243,6 @@ public class NetworkStats implements Parcelable { dest.writeIntArray(uid); dest.writeIntArray(set); dest.writeIntArray(tag); - dest.writeIntArray(metered); dest.writeIntArray(roaming); dest.writeLongArray(rxBytes); dest.writeLongArray(rxPackets); @@ -302,11 +277,10 @@ public class NetworkStats implements Parcelable { } @VisibleForTesting - public NetworkStats addValues(String iface, int uid, int set, int tag, int metered, int roaming, + public NetworkStats addValues(String iface, int uid, int set, int tag, int roaming, long rxBytes, long rxPackets, long txBytes, long txPackets, long operations) { return addValues(new Entry( - iface, uid, set, tag, metered, roaming, rxBytes, rxPackets, txBytes, txPackets, - operations)); + iface, uid, set, tag, roaming, rxBytes, rxPackets, txBytes, txPackets, operations)); } /** @@ -320,7 +294,6 @@ public class NetworkStats implements Parcelable { uid = Arrays.copyOf(uid, newLength); set = Arrays.copyOf(set, newLength); tag = Arrays.copyOf(tag, newLength); - metered = Arrays.copyOf(metered, newLength); roaming = Arrays.copyOf(roaming, newLength); rxBytes = Arrays.copyOf(rxBytes, newLength); rxPackets = Arrays.copyOf(rxPackets, newLength); @@ -334,7 +307,6 @@ public class NetworkStats implements Parcelable { uid[size] = entry.uid; set[size] = entry.set; tag[size] = entry.tag; - metered[size] = entry.metered; roaming[size] = entry.roaming; rxBytes[size] = entry.rxBytes; rxPackets[size] = entry.rxPackets; @@ -355,7 +327,6 @@ public class NetworkStats implements Parcelable { entry.uid = uid[i]; entry.set = set[i]; entry.tag = tag[i]; - entry.metered = metered[i]; entry.roaming = roaming[i]; entry.rxBytes = rxBytes[i]; entry.rxPackets = rxPackets[i]; @@ -410,8 +381,7 @@ public class NetworkStats implements Parcelable { * also be used to subtract values from existing rows. */ public NetworkStats combineValues(Entry entry) { - final int i = findIndex(entry.iface, entry.uid, entry.set, entry.tag, entry.metered, - entry.roaming); + final int i = findIndex(entry.iface, entry.uid, entry.set, entry.tag, entry.roaming); if (i == -1) { // only create new entry when positive contribution addValues(entry); @@ -439,11 +409,10 @@ public class NetworkStats implements Parcelable { /** * Find first stats index that matches the requested parameters. */ - public int findIndex(String iface, int uid, int set, int tag, int metered, int roaming) { + public int findIndex(String iface, int uid, int set, int tag, int roaming) { for (int i = 0; i < size; i++) { if (uid == this.uid[i] && set == this.set[i] && tag == this.tag[i] - && metered == this.metered[i] && roaming == this.roaming[i] - && Objects.equals(iface, this.iface[i])) { + && roaming == this.roaming[i] && Objects.equals(iface, this.iface[i])) { return i; } } @@ -455,7 +424,7 @@ public class NetworkStats implements Parcelable { * search around the hinted index as an optimization. */ @VisibleForTesting - public int findIndexHinted(String iface, int uid, int set, int tag, int metered, int roaming, + public int findIndexHinted(String iface, int uid, int set, int tag, int roaming, int hintIndex) { for (int offset = 0; offset < size; offset++) { final int halfOffset = offset / 2; @@ -469,8 +438,7 @@ public class NetworkStats implements Parcelable { } if (uid == this.uid[i] && set == this.set[i] && tag == this.tag[i] - && metered == this.metered[i] && roaming == this.roaming[i] - && Objects.equals(iface, this.iface[i])) { + && roaming == this.roaming[i] && Objects.equals(iface, this.iface[i])) { return i; } } @@ -484,7 +452,7 @@ public class NetworkStats implements Parcelable { */ public void spliceOperationsFrom(NetworkStats stats) { for (int i = 0; i < size; i++) { - final int j = stats.findIndex(iface[i], uid[i], set[i], tag[i], metered[i], roaming[i]); + final int j = stats.findIndex(iface[i], uid[i], set[i], tag[i], roaming[i]); if (j == -1) { operations[i] = 0; } else { @@ -574,7 +542,6 @@ public class NetworkStats implements Parcelable { entry.uid = limitUid; entry.set = SET_ALL; entry.tag = TAG_NONE; - entry.metered = METERED_ALL; entry.roaming = ROAMING_ALL; entry.rxBytes = 0; entry.rxPackets = 0; @@ -670,12 +637,11 @@ public class NetworkStats implements Parcelable { entry.uid = left.uid[i]; entry.set = left.set[i]; entry.tag = left.tag[i]; - entry.metered = left.metered[i]; entry.roaming = left.roaming[i]; // find remote row that matches, and subtract final int j = right.findIndexHinted(entry.iface, entry.uid, entry.set, entry.tag, - entry.metered, entry.roaming, i); + entry.roaming, i); if (j == -1) { // newly appearing row, return entire value entry.rxBytes = left.rxBytes[i]; @@ -721,7 +687,6 @@ public class NetworkStats implements Parcelable { entry.uid = UID_ALL; entry.set = SET_ALL; entry.tag = TAG_NONE; - entry.metered = METERED_ALL; entry.roaming = ROAMING_ALL; entry.operations = 0L; @@ -751,7 +716,6 @@ public class NetworkStats implements Parcelable { entry.iface = IFACE_ALL; entry.set = SET_ALL; entry.tag = TAG_NONE; - entry.metered = METERED_ALL; entry.roaming = ROAMING_ALL; for (int i = 0; i < size; i++) { @@ -798,7 +762,6 @@ public class NetworkStats implements Parcelable { pw.print(" uid="); pw.print(uid[i]); pw.print(" set="); pw.print(setToString(set[i])); pw.print(" tag="); pw.print(tagToString(tag[i])); - pw.print(" metered="); pw.print(meteredToString(metered[i])); pw.print(" roaming="); pw.print(roamingToString(roaming[i])); pw.print(" rxBytes="); pw.print(rxBytes[i]); pw.print(" rxPackets="); pw.print(rxPackets[i]); @@ -867,22 +830,6 @@ public class NetworkStats implements Parcelable { } /** - * Return text description of {@link #metered} value. - */ - public static String meteredToString(int metered) { - switch (metered) { - case METERED_ALL: - return "ALL"; - case METERED_NO: - return "NO"; - case METERED_YES: - return "YES"; - default: - return "UNKNOWN"; - } - } - - /** * Return text description of {@link #roaming} value. */ public static String roamingToString(int roaming) { @@ -957,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()) { @@ -973,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) { @@ -995,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); } } @@ -1013,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 { @@ -1051,7 +994,6 @@ public class NetworkStats implements Parcelable { tmpEntry.uid = uid[i]; tmpEntry.tag = tag[i]; tmpEntry.set = set[i]; - tmpEntry.metered = metered[i]; tmpEntry.roaming = roaming[i]; combineValues(tmpEntry); if (tag[i] == TAG_NONE) { @@ -1071,25 +1013,24 @@ public class NetworkStats implements Parcelable { moved.set = SET_DBG_VPN_OUT; moved.tag = TAG_NONE; moved.iface = underlyingIface; - moved.metered = METERED_ALL; moved.roaming = ROAMING_ALL; combineValues(moved); // Caveat: if the vpn software uses tag, the total tagged traffic may be greater than // the TAG_NONE traffic. // - // Relies on the fact that the underlying traffic only has state ROAMING_NO and METERED_NO, - // which should be the case as it comes directly from the /proc file. We only blend in the + // Relies on the fact that the underlying traffic only has state ROAMING_NO, which + // should be the case as it comes directly from the /proc file. We only blend in the // roaming data after applying these adjustments, by checking the NetworkIdentity of the // underlying iface. int idxVpnBackground = findIndex(underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, - METERED_NO, ROAMING_NO); + ROAMING_NO); if (idxVpnBackground != -1) { tunSubtract(idxVpnBackground, this, moved); } int idxVpnForeground = findIndex(underlyingIface, tunUid, SET_FOREGROUND, TAG_NONE, - METERED_NO, ROAMING_NO); + ROAMING_NO); if (idxVpnForeground != -1) { tunSubtract(idxVpnForeground, this, moved); } diff --git a/core/java/android/net/SntpClient.java b/core/java/android/net/SntpClient.java index cea56b53d763..cf9243f7e7a3 100644 --- a/core/java/android/net/SntpClient.java +++ b/core/java/android/net/SntpClient.java @@ -36,7 +36,8 @@ import java.util.Arrays; * } * </pre> */ -public class SntpClient { +public class SntpClient +{ private static final String TAG = "SntpClient"; private static final boolean DBG = true; @@ -87,7 +88,6 @@ public class SntpClient { try { address = InetAddress.getByName(host); } catch (Exception e) { - EventLogTags.writeNtpFailure(host, e.toString()); if (DBG) Log.d(TAG, "request time failed: " + e); return false; } @@ -142,7 +142,6 @@ public class SntpClient { // = (transit + skew - transit + skew)/2 // = (2 * skew)/2 = skew long clockOffset = ((receiveTime - originateTime) + (transmitTime - responseTime))/2; - EventLogTags.writeNtpSuccess(address.toString(), roundTripTime, clockOffset); if (DBG) { Log.d(TAG, "round trip: " + roundTripTime + "ms, " + "clock offset: " + clockOffset + "ms"); @@ -154,7 +153,6 @@ public class SntpClient { mNtpTimeReference = responseTicks; mRoundTripTime = roundTripTime; } catch (Exception e) { - EventLogTags.writeNtpFailure(address.toString(), e.toString()); if (DBG) Log.d(TAG, "request time failed: " + e); return false; } finally { diff --git a/core/java/android/net/metrics/NetworkEvent.java b/core/java/android/net/metrics/NetworkEvent.java index 06674950a044..3b3fa6976fc9 100644 --- a/core/java/android/net/metrics/NetworkEvent.java +++ b/core/java/android/net/metrics/NetworkEvent.java @@ -42,15 +42,6 @@ public final class NetworkEvent implements Parcelable { public static final int NETWORK_DISCONNECTED = 7; /** {@hide} */ - public static final int NETWORK_FIRST_VALIDATION_SUCCESS = 8; - /** {@hide} */ - public static final int NETWORK_REVALIDATION_SUCCESS = 9; - /** {@hide} */ - public static final int NETWORK_FIRST_VALIDATION_PORTAL_FOUND = 10; - /** {@hide} */ - public static final int NETWORK_REVALIDATION_PORTAL_FOUND = 11; - - /** {@hide} */ @IntDef(value = { NETWORK_CONNECTED, NETWORK_VALIDATED, @@ -59,10 +50,6 @@ public final class NetworkEvent implements Parcelable { NETWORK_LINGER, NETWORK_UNLINGER, NETWORK_DISCONNECTED, - NETWORK_FIRST_VALIDATION_SUCCESS, - NETWORK_REVALIDATION_SUCCESS, - NETWORK_FIRST_VALIDATION_PORTAL_FOUND, - NETWORK_REVALIDATION_PORTAL_FOUND, }) @Retention(RetentionPolicy.SOURCE) public @interface EventType {} diff --git a/core/java/android/net/metrics/ValidationProbeEvent.java b/core/java/android/net/metrics/ValidationProbeEvent.java index a724ec12ed32..1a31b56f1ffb 100644 --- a/core/java/android/net/metrics/ValidationProbeEvent.java +++ b/core/java/android/net/metrics/ValidationProbeEvent.java @@ -44,8 +44,10 @@ public final class ValidationProbeEvent implements Parcelable { public static final int DNS_FAILURE = 0; public static final int DNS_SUCCESS = 1; - private static final int FIRST_VALIDATION = 1 << 8; - private static final int REVALIDATION = 2 << 8; + /** {@hide} */ + @IntDef(value = {PROBE_DNS, PROBE_HTTP, PROBE_HTTPS, PROBE_PAC}) + @Retention(RetentionPolicy.SOURCE) + public @interface ProbeType {} /** {@hide} */ @IntDef(value = {DNS_FAILURE, DNS_SUCCESS}) @@ -54,17 +56,12 @@ public final class ValidationProbeEvent implements Parcelable { public final int netId; public final long durationMs; - // probeType byte format (MSB to LSB): - // byte 0: unused - // byte 1: unused - // byte 2: 0 = UNKNOWN, 1 = FIRST_VALIDATION, 2 = REVALIDATION - // byte 3: PROBE_* constant - public final int probeType; + public final @ProbeType int probeType; public final @ReturnCode int returnCode; /** {@hide} */ public ValidationProbeEvent( - int netId, long durationMs, int probeType, @ReturnCode int returnCode) { + int netId, long durationMs, @ProbeType int probeType, @ReturnCode int returnCode) { this.netId = netId; this.durationMs = durationMs; this.probeType = probeType; @@ -103,18 +100,8 @@ public final class ValidationProbeEvent implements Parcelable { }; /** @hide */ - public static int makeProbeType(int probeType, boolean firstValidation) { - return (probeType & 0xff) | (firstValidation ? FIRST_VALIDATION : REVALIDATION); - } - - /** @hide */ public static String getProbeName(int probeType) { - return Decoder.constants.get(probeType & 0xff, "PROBE_???"); - } - - /** @hide */ - public static String getValidationStage(int probeType) { - return Decoder.constants.get(probeType & 0xff00, "UNKNOWN"); + return Decoder.constants.get(probeType, "PROBE_???"); } public static void logEvent(int netId, long durationMs, int probeType, int returnCode) { @@ -122,13 +109,12 @@ public final class ValidationProbeEvent implements Parcelable { @Override public String toString() { - return String.format("ValidationProbeEvent(%d, %s:%d %s, %dms)", netId, - getProbeName(probeType), returnCode, getValidationStage(probeType), durationMs); + return String.format("ValidationProbeEvent(%d, %s:%d, %dms)", + netId, getProbeName(probeType), returnCode, durationMs); } final static class Decoder { static final SparseArray<String> constants = MessageUtils.findMessageNames( - new Class[]{ValidationProbeEvent.class}, - new String[]{"PROBE_", "FIRST_", "REVALIDATION"}); + new Class[]{ValidationProbeEvent.class}, new String[]{"PROBE_"}); } } 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/jni/com_android_internal_net_NetworkStatsFactory.cpp b/core/jni/com_android_internal_net_NetworkStatsFactory.cpp index 4a2b88142e78..9fa90acc02a4 100644 --- a/core/jni/com_android_internal_net_NetworkStatsFactory.cpp +++ b/core/jni/com_android_internal_net_NetworkStatsFactory.cpp @@ -43,7 +43,6 @@ static struct { jfieldID uid; jfieldID set; jfieldID tag; - jfieldID metered; jfieldID roaming; jfieldID rxBytes; jfieldID rxPackets; @@ -240,9 +239,6 @@ static int readNetworkStatsDetail(JNIEnv* env, jclass clazz, jobject stats, ScopedIntArrayRW tag(env, get_int_array(env, stats, gNetworkStatsClassInfo.tag, size, grow)); if (tag.get() == NULL) return -1; - ScopedIntArrayRW metered(env, get_int_array(env, stats, - gNetworkStatsClassInfo.metered, size, grow)); - if (metered.get() == NULL) return -1; ScopedIntArrayRW roaming(env, get_int_array(env, stats, gNetworkStatsClassInfo.roaming, size, grow)); if (roaming.get() == NULL) return -1; @@ -269,7 +265,7 @@ static int readNetworkStatsDetail(JNIEnv* env, jclass clazz, jobject stats, uid[i] = lines[i].uid; set[i] = lines[i].set; tag[i] = lines[i].tag; - // Metered and Roaming are populated in Java-land by inspecting the iface properties. + // Roaming is populated in Java-land by inspecting the iface properties. rxBytes[i] = lines[i].rxBytes; rxPackets[i] = lines[i].rxPackets; txBytes[i] = lines[i].txBytes; @@ -283,7 +279,6 @@ static int readNetworkStatsDetail(JNIEnv* env, jclass clazz, jobject stats, env->SetObjectField(stats, gNetworkStatsClassInfo.uid, uid.getJavaArray()); env->SetObjectField(stats, gNetworkStatsClassInfo.set, set.getJavaArray()); env->SetObjectField(stats, gNetworkStatsClassInfo.tag, tag.getJavaArray()); - env->SetObjectField(stats, gNetworkStatsClassInfo.metered, metered.getJavaArray()); env->SetObjectField(stats, gNetworkStatsClassInfo.roaming, roaming.getJavaArray()); env->SetObjectField(stats, gNetworkStatsClassInfo.rxBytes, rxBytes.getJavaArray()); env->SetObjectField(stats, gNetworkStatsClassInfo.rxPackets, rxPackets.getJavaArray()); @@ -316,7 +311,6 @@ int register_com_android_internal_net_NetworkStatsFactory(JNIEnv* env) { gNetworkStatsClassInfo.uid = GetFieldIDOrDie(env, clazz, "uid", "[I"); gNetworkStatsClassInfo.set = GetFieldIDOrDie(env, clazz, "set", "[I"); gNetworkStatsClassInfo.tag = GetFieldIDOrDie(env, clazz, "tag", "[I"); - gNetworkStatsClassInfo.metered = GetFieldIDOrDie(env, clazz, "metered", "[I"); gNetworkStatsClassInfo.roaming = GetFieldIDOrDie(env, clazz, "roaming", "[I"); gNetworkStatsClassInfo.rxBytes = GetFieldIDOrDie(env, clazz, "rxBytes", "[J"); gNetworkStatsClassInfo.rxPackets = GetFieldIDOrDie(env, clazz, "rxPackets", "[J"); diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 4cf122639a22..4c5019e2195f 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1682,7 +1682,7 @@ <bool name="config_actionMenuItemAllCaps">true</bool> <!-- Remote server that can provide NTP responses. --> - <string translatable="false" name="config_ntpServer">time.android.com</string> + <string translatable="false" name="config_ntpServer">2.android.pool.ntp.org</string> <!-- Normal polling frequency in milliseconds --> <integer name="config_ntpPollingInterval">86400000</integer> <!-- Try-again polling interval in milliseconds, in case the network request failed --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index fe88cd1ff423..d2cc9076b4e1 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2725,6 +2725,7 @@ <java-symbol type="bool" name="config_permissionReviewRequired" /> + <java-symbol type="drawable" name="ic_restart" /> <java-symbol type="drawable" name="emergency_icon" /> @@ -2739,4 +2740,5 @@ <!-- Network Recommendation --> <java-symbol type="array" name="config_networkRecommendationPackageNames" /> + </resources> diff --git a/core/tests/coretests/src/android/net/NetworkStatsTest.java b/core/tests/coretests/src/android/net/NetworkStatsTest.java index eb85eb445cbc..9074f8a97132 100644 --- a/core/tests/coretests/src/android/net/NetworkStatsTest.java +++ b/core/tests/coretests/src/android/net/NetworkStatsTest.java @@ -16,9 +16,6 @@ package android.net; -import static android.net.NetworkStats.METERED_ALL; -import static android.net.NetworkStats.METERED_NO; -import static android.net.NetworkStats.METERED_YES; import static android.net.NetworkStats.ROAMING_ALL; import static android.net.NetworkStats.ROAMING_NO; import static android.net.NetworkStats.ROAMING_YES; @@ -48,124 +45,103 @@ public class NetworkStatsTest extends TestCase { private static final long TEST_START = 1194220800000L; public void testFindIndex() throws Exception { - final NetworkStats stats = new NetworkStats(TEST_START, 5) - .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 1024L, - 8L, 0L, 0L, 10) - .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 0L, 0L, - 1024L, 8L, 11) - .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO, 0L, 0L, - 1024L, 8L, 11) - .addValues(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 1024L, - 8L, 1024L, 8L, 12) - .addValues(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_YES, 1024L, - 8L, 1024L, 8L, 12); - - assertEquals(4, stats.findIndex(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, METERED_YES, - ROAMING_YES)); - assertEquals(3, stats.findIndex(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, METERED_NO, - ROAMING_NO)); - assertEquals(2, stats.findIndex(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_YES, - ROAMING_NO)); - assertEquals(1, stats.findIndex(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, - ROAMING_NO)); - assertEquals(0, stats.findIndex(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, - ROAMING_NO)); - assertEquals(-1, stats.findIndex(TEST_IFACE, 6, SET_DEFAULT, TAG_NONE, METERED_NO, - ROAMING_NO)); + final NetworkStats stats = new NetworkStats(TEST_START, 4) + .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_NO, 1024L, 8L, 0L, + 0L, 10) + .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_NO, 0L, 0L, 1024L, + 8L, 11) + .addValues(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, ROAMING_NO, 1024L, 8L, + 1024L, 8L, 12) + .addValues(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, ROAMING_YES, 1024L, 8L, + 1024L, 8L, 12); + + assertEquals(3, stats.findIndex(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, ROAMING_YES)); + assertEquals(2, stats.findIndex(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, ROAMING_NO)); + assertEquals(1, stats.findIndex(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_NO)); + assertEquals(0, stats.findIndex(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_NO)); + assertEquals(-1, stats.findIndex(TEST_IFACE, 6, SET_DEFAULT, TAG_NONE, ROAMING_NO)); } public void testFindIndexHinted() { final NetworkStats stats = new NetworkStats(TEST_START, 3) - .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 1024L, - 8L, 0L, 0L, 10) - .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 0L, 0L, - 1024L, 8L, 11) - .addValues(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 1024L, - 8L, 1024L, 8L, 12) - .addValues(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO, - 1024L, 8L, 0L, 0L, 10) - .addValues(TEST_IFACE2, 101, SET_DEFAULT, 0xF00D, METERED_NO, ROAMING_NO, 0L, 0L, - 1024L, 8L, 11) - .addValues(TEST_IFACE2, 101, SET_DEFAULT, 0xF00D, METERED_YES, ROAMING_NO, 0L, 0L, - 1024L, 8L, 11) - .addValues(TEST_IFACE2, 102, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 1024L, - 8L, 1024L, 8L, 12) - .addValues(TEST_IFACE2, 102, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_YES, 1024L, - 8L, 1024L, 8L, 12); + .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_NO, 1024L, 8L, 0L, + 0L, 10) + .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_NO, 0L, 0L, 1024L, + 8L, 11) + .addValues(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, ROAMING_NO, 1024L, 8L, + 1024L, 8L, 12) + .addValues(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE, ROAMING_NO, 1024L, 8L, + 0L, 0L, 10) + .addValues(TEST_IFACE2, 101, SET_DEFAULT, 0xF00D, ROAMING_NO, 0L, 0L, 1024L, + 8L, 11) + .addValues(TEST_IFACE2, 102, SET_DEFAULT, TAG_NONE, ROAMING_NO, 1024L, 8L, + 1024L, 8L, 12) + .addValues(TEST_IFACE2, 102, SET_DEFAULT, TAG_NONE, ROAMING_YES, 1024L, 8L, + 1024L, 8L, 12); // verify that we correctly find across regardless of hinting for (int hint = 0; hint < stats.size(); hint++) { assertEquals(0, stats.findIndexHinted(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, - METERED_NO, ROAMING_NO, hint)); + ROAMING_NO, hint)); assertEquals(1, stats.findIndexHinted(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, - METERED_NO, ROAMING_NO, hint)); + ROAMING_NO, hint)); assertEquals(2, stats.findIndexHinted(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, - METERED_NO, ROAMING_NO, hint)); + ROAMING_NO, hint)); assertEquals(3, stats.findIndexHinted(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE, - METERED_NO, ROAMING_NO, hint)); + ROAMING_NO, hint)); assertEquals(4, stats.findIndexHinted(TEST_IFACE2, 101, SET_DEFAULT, 0xF00D, - METERED_NO, ROAMING_NO, hint)); - assertEquals(5, stats.findIndexHinted(TEST_IFACE2, 101, SET_DEFAULT, 0xF00D, - METERED_YES, ROAMING_NO, hint)); + ROAMING_NO, hint)); + assertEquals(5, stats.findIndexHinted(TEST_IFACE2, 102, SET_DEFAULT, TAG_NONE, + ROAMING_NO, hint)); assertEquals(6, stats.findIndexHinted(TEST_IFACE2, 102, SET_DEFAULT, TAG_NONE, - METERED_NO, ROAMING_NO, hint)); - assertEquals(7, stats.findIndexHinted(TEST_IFACE2, 102, SET_DEFAULT, TAG_NONE, - METERED_YES, ROAMING_YES, hint)); + ROAMING_YES, hint)); assertEquals(-1, stats.findIndexHinted(TEST_IFACE, 6, SET_DEFAULT, TAG_NONE, - METERED_NO, ROAMING_NO, hint)); + ROAMING_NO, hint)); } } public void testAddEntryGrow() throws Exception { - final NetworkStats stats = new NetworkStats(TEST_START, 4); + final NetworkStats stats = new NetworkStats(TEST_START, 3); assertEquals(0, stats.size()); - assertEquals(4, stats.internalSize()); - - stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 1L, 1L, + assertEquals(3, stats.internalSize()); + + stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_NO, 1L, 1L, 2L, + 2L, 3); + stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_NO, 2L, 2L, 2L, + 2L, 4); + stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_YES, 3L, 3L, 2L, + 2L, 5); + + assertEquals(3, stats.size()); + assertEquals(3, stats.internalSize()); + + stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_NO, 4L, 40L, 4L, + 40L, 7); + stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_NO, 5L, 50L, 4L, + 40L, 8); + stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_NO, 6L, 60L, 5L, + 50L, 10); + stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_YES, 7L, 70L, 5L, + 50L, 11); + + assertEquals(7, stats.size()); + assertTrue(stats.internalSize() >= 7); + + assertValues(stats, 0, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_NO, 1L, 1L, 2L, 2L, 3); - stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 2L, 2L, + assertValues(stats, 1, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_NO, 2L, 2L, 2L, 2L, 4); - stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_YES, 3L, - 3L, 2L, 2L, 5); - stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_YES, 3L, - 3L, 2L, 2L, 5); - - assertEquals(4, stats.size()); - assertEquals(4, stats.internalSize()); - - stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 4L, + assertValues(stats, 2, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_YES, 3L, 3L, + 2L, 2L, 5); + assertValues(stats, 3, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_NO, 4L, 40L, 4L, 40L, 7); - stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 5L, + assertValues(stats, 4, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_NO, 5L, 50L, 4L, 40L, 8); - stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 6L, + assertValues(stats, 5, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_NO, 6L, 60L, 5L, 50L, 10); - stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_YES, 7L, + assertValues(stats, 6, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_YES, 7L, 70L, 5L, 50L, 11); - stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_YES, 7L, - 70L, 5L, 50L, 11); - - assertEquals(9, stats.size()); - assertTrue(stats.internalSize() >= 9); - - assertValues(stats, 0, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, - 1L, 1L, 2L, 2L, 3); - assertValues(stats, 1, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, - 2L, 2L, 2L, 2L, 4); - assertValues(stats, 2, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_YES, - 3L, 3L, 2L, 2L, 5); - assertValues(stats, 3, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_YES, - ROAMING_YES, 3L, 3L, 2L, 2L, 5); - assertValues(stats, 4, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, - 4L, 40L, 4L, 40L, 7); - assertValues(stats, 5, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, - 5L, 50L, 4L, 40L, 8); - assertValues(stats, 6, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, - 6L, 60L, 5L, 50L, 10); - assertValues(stats, 7, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_YES, - 7L, 70L, 5L, 50L, 11); - assertValues(stats, 8, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_YES, - ROAMING_YES, 7L, 70L, 5L, 50L, 11); } public void testCombineExisting() throws Exception { @@ -176,18 +152,20 @@ public class NetworkStatsTest extends TestCase { stats.combineValues(TEST_IFACE, 1001, SET_DEFAULT, TAG_NONE, -128L, -1L, -128L, -1L, -1); - assertValues(stats, 0, TEST_IFACE, 1001, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, - 384L, 3L, 128L, 1L, 9); - assertValues(stats, 1, TEST_IFACE, 1001, SET_DEFAULT, 0xff, METERED_NO, ROAMING_NO, 128L, - 1L, 128L, 1L, 2); + assertValues(stats, 0, TEST_IFACE, 1001, SET_DEFAULT, TAG_NONE, ROAMING_NO, 384L, 3L, + 128L, 1L, 9); + assertValues(stats, 1, TEST_IFACE, 1001, SET_DEFAULT, 0xff, ROAMING_NO, 128L, 1L, 128L, + 1L, 2); // now try combining that should create row - stats.combineValues(TEST_IFACE, 5005, SET_DEFAULT, TAG_NONE, 128L, 1L, 128L, 1L, 3); - assertValues(stats, 2, TEST_IFACE, 5005, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, - 128L, 1L, 128L, 1L, 3); - stats.combineValues(TEST_IFACE, 5005, SET_DEFAULT, TAG_NONE, 128L, 1L, 128L, 1L, 3); - assertValues(stats, 2, TEST_IFACE, 5005, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, - 256L, 2L, 256L, 2L, 6); + stats.combineValues(TEST_IFACE, 5005, SET_DEFAULT, TAG_NONE, 128L, 1L, + 128L, 1L, 3); + assertValues(stats, 2, TEST_IFACE, 5005, SET_DEFAULT, TAG_NONE, ROAMING_NO, 128L, 1L, + 128L, 1L, 3); + stats.combineValues(TEST_IFACE, 5005, SET_DEFAULT, TAG_NONE, 128L, 1L, + 128L, 1L, 3); + assertValues(stats, 2, TEST_IFACE, 5005, SET_DEFAULT, TAG_NONE, ROAMING_NO, 256L, 2L, + 256L, 2L, 6); } public void testSubtractIdenticalData() throws Exception { @@ -202,10 +180,10 @@ public class NetworkStatsTest extends TestCase { final NetworkStats result = after.subtract(before); // identical data should result in zero delta - assertValues(result, 0, TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 0L, - 0L, 0L, 0L, 0); - assertValues(result, 1, TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 0L, - 0L, 0L, 0L, 0); + assertValues(result, 0, TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_NO, 0L, 0L, 0L, + 0L, 0); + assertValues(result, 1, TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_NO, 0L, 0L, 0L, + 0L, 0); } public void testSubtractIdenticalRows() throws Exception { @@ -220,10 +198,10 @@ public class NetworkStatsTest extends TestCase { final NetworkStats result = after.subtract(before); // expect delta between measurements - assertValues(result, 0, TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 1L, - 1L, 2L, 1L, 4); - assertValues(result, 1, TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 3L, - 1L, 4L, 1L, 8); + assertValues(result, 0, TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_NO, 1L, 1L, 2L, + 1L, 4); + assertValues(result, 1, TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_NO, 3L, 1L, 4L, + 1L, 8); } public void testSubtractNewRows() throws Exception { @@ -239,12 +217,12 @@ public class NetworkStatsTest extends TestCase { final NetworkStats result = after.subtract(before); // its okay to have new rows - assertValues(result, 0, TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 0L, - 0L, 0L, 0L, 0); - assertValues(result, 1, TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 0L, - 0L, 0L, 0L, 0); - assertValues(result, 2, TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, - 1024L, 8L, 1024L, 8L, 20); + assertValues(result, 0, TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_NO, 0L, 0L, 0L, + 0L, 0); + assertValues(result, 1, TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_NO, 0L, 0L, 0L, + 0L, 0); + assertValues(result, 2, TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, ROAMING_NO, 1024L, 8L, + 1024L, 8L, 20); } public void testSubtractMissingRows() throws Exception { @@ -259,8 +237,8 @@ public class NetworkStatsTest extends TestCase { // should silently drop omitted rows assertEquals(1, result.size()); - assertValues(result, 0, TEST_IFACE2, UID_ALL, SET_DEFAULT, TAG_NONE, METERED_NO, - ROAMING_NO, 1L, 2L, 3L, 4L, 0); + assertValues(result, 0, TEST_IFACE2, UID_ALL, SET_DEFAULT, TAG_NONE, ROAMING_NO, 1L, + 2L, 3L, 4L, 0); assertEquals(4L, result.getTotalBytes()); } @@ -285,22 +263,13 @@ public class NetworkStatsTest extends TestCase { .addValues(TEST_IFACE, 101, SET_DEFAULT, 0xF00D, 8L, 0L, 0L, 0L, 0L); assertEquals(64L, uidTag.getTotalBytes()); - final NetworkStats uidMetered = new NetworkStats(TEST_START, 3) - .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 32L, 0L, - 0L, 0L, 0L) - .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO, 32L, 0L, - 0L, 0L, 0L) - .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO, 32L, 0L, - 0L, 0L, 0L); - assertEquals(96L, uidMetered.getTotalBytes()); - final NetworkStats uidRoaming = new NetworkStats(TEST_START, 3) - .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 32L, 0L, - 0L, 0L, 0L) - .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO, 32L, 0L, - 0L, 0L, 0L) - .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_YES, 32L, 0L, - 0L, 0L, 0L); + .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_NO, 32L, 0L, 0L, 0L, + 0L) + .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_NO, 32L, 0L, 0L, 0L, + 0L) + .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_YES, 32L, 0L, 0L, 0L, + 0L); assertEquals(96L, uidRoaming.getTotalBytes()); } @@ -314,95 +283,95 @@ public class NetworkStatsTest extends TestCase { public void testGroupedByIfaceAll() throws Exception { final NetworkStats uidStats = new NetworkStats(TEST_START, 3) - .addValues(IFACE_ALL, 100, SET_ALL, TAG_NONE, METERED_NO, ROAMING_NO, 128L, 8L, 0L, + .addValues(IFACE_ALL, 100, SET_ALL, TAG_NONE, ROAMING_NO, 128L, 8L, 0L, 2L, + 20L) + .addValues(IFACE_ALL, 101, SET_FOREGROUND, TAG_NONE, ROAMING_NO, 128L, 8L, 0L, 2L, 20L) - .addValues(IFACE_ALL, 101, SET_FOREGROUND, TAG_NONE, METERED_YES, ROAMING_NO, 128L, - 8L, 0L, 2L, 20L) - .addValues(IFACE_ALL, 101, SET_ALL, TAG_NONE, METERED_NO, ROAMING_YES, 128L, 8L, 0L, - 2L, 20L); + .addValues(IFACE_ALL, 101, SET_ALL, TAG_NONE, ROAMING_YES, 128L, 8L, 0L, 2L, + 20L); final NetworkStats grouped = uidStats.groupedByIface(); assertEquals(3, uidStats.size()); assertEquals(1, grouped.size()); - assertValues(grouped, 0, IFACE_ALL, UID_ALL, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL, - 384L, 24L, 0L, 6L, 0L); + assertValues(grouped, 0, IFACE_ALL, UID_ALL, SET_ALL, TAG_NONE, ROAMING_ALL, 384L, 24L, 0L, + 6L, 0L); } public void testGroupedByIface() throws Exception { final NetworkStats uidStats = new NetworkStats(TEST_START, 7) - .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 128L, 8L, - 0L, 2L, 20L) - .addValues(TEST_IFACE2, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 512L, - 32L, 0L, 0L, 0L) - .addValues(TEST_IFACE2, 100, SET_DEFAULT, 0xF00D, METERED_NO, ROAMING_NO, 64L, 4L, - 0L, 0L, 0L) - .addValues(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO, 512L, - 32L, 0L, 0L, 0L) - .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 128L, 8L, - 0L, 0L, 0L) - .addValues(TEST_IFACE, 101, SET_DEFAULT, 0xF00D, METERED_YES, ROAMING_NO, 128L, 8L, + .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_NO, 128L, 8L, 0L, + 2L, 20L) + .addValues(TEST_IFACE2, 100, SET_DEFAULT, TAG_NONE, ROAMING_NO, 512L, 32L, 0L, + 0L, 0L) + .addValues(TEST_IFACE2, 100, SET_DEFAULT, 0xF00D, ROAMING_NO, 64L, 4L, 0L, 0L, + 0L) + .addValues(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE, ROAMING_NO, 512L, 32L, 0L, 0L, 0L) - .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_YES, 128L, - 8L, 0L, 0L, 0L); + .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_NO, 128L, 8L, 0L, + 0L, 0L) + .addValues(TEST_IFACE, 101, SET_DEFAULT, 0xF00D, ROAMING_NO, 128L, 8L, 0L, 0L, + 0L) + .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_YES, 128L, 8L, 0L, + 0L, 0L); final NetworkStats grouped = uidStats.groupedByIface(); assertEquals(7, uidStats.size()); assertEquals(2, grouped.size()); - assertValues(grouped, 0, TEST_IFACE, UID_ALL, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL, - 384L, 24L, 0L, 2L, 0L); - assertValues(grouped, 1, TEST_IFACE2, UID_ALL, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL, - 1024L, 64L, 0L, 0L, 0L); + assertValues(grouped, 0, TEST_IFACE, UID_ALL, SET_ALL, TAG_NONE, ROAMING_ALL, 384L, 24L, 0L, + 2L, 0L); + assertValues(grouped, 1, TEST_IFACE2, UID_ALL, SET_ALL, TAG_NONE, ROAMING_ALL, 1024L, 64L, + 0L, 0L, 0L); } public void testAddAllValues() { final NetworkStats first = new NetworkStats(TEST_START, 5) - .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO, 32L, 0L, - 0L, 0L, 0L) - .addValues(TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO, 32L, - 0L, 0L, 0L, 0L) - .addValues(TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, METERED_YES, ROAMING_YES, 32L, - 0L, 0L, 0L, 0L); + .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_NO, 32L, 0L, 0L, 0L, + 0L) + .addValues(TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, ROAMING_NO, 32L, 0L, 0L, + 0L, 0L) + .addValues(TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, ROAMING_YES, 32L, 0L, 0L, + 0L, 0L); final NetworkStats second = new NetworkStats(TEST_START, 2) - .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO, 32L, 0L, + .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_NO, 32L, 0L, 0L, 0L, + 0L) + .addValues(TEST_IFACE2, UID_ALL, SET_DEFAULT, TAG_NONE, ROAMING_NO, 32L, 0L, 0L, 0L, 0L) - .addValues(TEST_IFACE2, UID_ALL, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 32L, - 0L, 0L, 0L, 0L) - .addValues(TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, METERED_YES, ROAMING_YES, 32L, - 0L, 0L, 0L, 0L); + .addValues(TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, ROAMING_YES, 32L, 0L, 0L, + 0L, 0L); first.combineAllValues(second); assertEquals(4, first.size()); - assertValues(first, 0, TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO, 64L, + assertValues(first, 0, TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_NO, 64L, 0L, 0L, + 0L, 0L); + assertValues(first, 1, TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, ROAMING_NO, 32L, 0L, + 0L, 0L, 0L); + assertValues(first, 2, TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, ROAMING_YES, 64L, 0L, + 0L, 0L, 0L); + assertValues(first, 3, TEST_IFACE2, UID_ALL, SET_DEFAULT, TAG_NONE, ROAMING_NO, 32L, 0L, 0L, 0L, 0L); - assertValues(first, 1, TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO, - 32L, 0L, 0L, 0L, 0L); - assertValues(first, 2, TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, METERED_YES, ROAMING_YES, - 64L, 0L, 0L, 0L, 0L); - assertValues(first, 3, TEST_IFACE2, UID_ALL, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, - 32L, 0L, 0L, 0L, 0L); } public void testGetTotal() { final NetworkStats stats = new NetworkStats(TEST_START, 7) - .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 128L, 8L, - 0L, 2L, 20L) - .addValues(TEST_IFACE2, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 512L, - 32L, 0L, 0L, 0L) - .addValues(TEST_IFACE2, 100, SET_DEFAULT, 0xF00D, METERED_NO, ROAMING_NO, 64L, 4L, - 0L, 0L, 0L) - .addValues(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO, 512L, - 32L, 0L, 0L, 0L) - .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO, 128L, - 8L, 0L, 0L, 0L) - .addValues(TEST_IFACE, 101, SET_DEFAULT, 0xF00D, METERED_NO, ROAMING_NO, 128L, 8L, + .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_NO, 128L, 8L, 0L, + 2L, 20L) + .addValues(TEST_IFACE2, 100, SET_DEFAULT, TAG_NONE, ROAMING_NO, 512L, 32L, 0L, + 0L, 0L) + .addValues(TEST_IFACE2, 100, SET_DEFAULT, 0xF00D, ROAMING_NO, 64L, 4L, 0L, 0L, + 0L) + .addValues(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE, ROAMING_NO, 512L, 32L, 0L, 0L, 0L) - .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_YES, 128L, - 8L, 0L, 0L, 0L); + .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_NO, 128L, 8L, 0L, + 0L, 0L) + .addValues(TEST_IFACE, 101, SET_DEFAULT, 0xF00D, ROAMING_NO, 128L, 8L, 0L, 0L, + 0L) + .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_YES, 128L, 8L, 0L, + 0L, 0L); assertValues(stats.getTotal(null), 1408L, 88L, 0L, 2L, 20L); assertValues(stats.getTotal(null, 100), 1280L, 80L, 0L, 2L, 20L); @@ -427,10 +396,10 @@ public class NetworkStatsTest extends TestCase { final NetworkStats after = before.withoutUids(new int[] { 100 }); assertEquals(6, before.size()); assertEquals(2, after.size()); - assertValues(after, 0, TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, - 128L, 8L, 0L, 0L, 0L); - assertValues(after, 1, TEST_IFACE, 101, SET_DEFAULT, 0xF00D, METERED_NO, ROAMING_NO, 128L, - 8L, 0L, 0L, 0L); + assertValues(after, 0, TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_NO, 128L, 8L, + 0L, 0L, 0L); + assertValues(after, 1, TEST_IFACE, 101, SET_DEFAULT, 0xF00D, ROAMING_NO, 128L, 8L, 0L, + 0L, 0L); } public void testClone() throws Exception { @@ -465,175 +434,105 @@ public class NetworkStatsTest extends TestCase { final String underlyingIface = "wlan0"; final int testTag1 = 8888; NetworkStats delta = new NetworkStats(TEST_START, 17) - .addValues(tunIface, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 39605L, 46L, - 12259L, 55L, 0L) - .addValues(tunIface, 10100, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO, 0L, 0L, - 0L, 0L, 0L) - .addValues(tunIface, 10120, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 72667L, 197L, - 43909L, 241L, 0L) - .addValues(tunIface, 10120, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO, 9297L, - 17L, 4128L, 21L, 0L) + .addValues(tunIface, 10100, SET_DEFAULT, TAG_NONE, 39605L, 46L, 12259L, 55L, 0L) + .addValues(tunIface, 10100, SET_FOREGROUND, TAG_NONE, 0L, 0L, 0L, 0L, 0L) + .addValues(tunIface, 10120, SET_DEFAULT, TAG_NONE, 72667L, 197L, 43909L, 241L, 0L) + .addValues(tunIface, 10120, SET_FOREGROUND, TAG_NONE, 9297L, 17L, 4128L, 21L, 0L) // VPN package also uses some traffic through unprotected network. - .addValues(tunIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 4983L, 10L, - 1801L, 12L, 0L) - .addValues(tunIface, tunUid, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO, 0L, 0L, - 0L, 0L, 0L) + .addValues(tunIface, tunUid, SET_DEFAULT, TAG_NONE, 4983L, 10L, 1801L, 12L, 0L) + .addValues(tunIface, tunUid, SET_FOREGROUND, TAG_NONE, 0L, 0L, 0L, 0L, 0L) // Tag entries - .addValues(tunIface, 10120, SET_DEFAULT, testTag1, METERED_NO, ROAMING_NO, 21691L, 41L, - 13820L, 51L, 0L) - .addValues(tunIface, 10120, SET_FOREGROUND, testTag1, METERED_NO, ROAMING_NO, 1281L, 2L, - 665L, 2L, 0L) + .addValues(tunIface, 10120, SET_DEFAULT, testTag1, 21691L, 41L, 13820L, 51L, 0L) + .addValues(tunIface, 10120, SET_FOREGROUND, testTag1, 1281L, 2L, 665L, 2L, 0L) // Irrelevant entries - .addValues(TEST_IFACE, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 1685L, 5L, - 2070L, 6L, 0L) + .addValues(TEST_IFACE, 10100, SET_DEFAULT, TAG_NONE, 1685L, 5L, 2070L, 6L, 0L) // Underlying Iface entries - .addValues(underlyingIface, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 5178L, - 8L, 2139L, 11L, 0L) - .addValues(underlyingIface, 10100, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO, 0L, - 0L, 0L, 0L, 0L) - .addValues(underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, - 149873L, 287L, 59217L /* smaller than sum(tun0) */, - 299L /* smaller than sum(tun0) */, 0L) - .addValues(underlyingIface, tunUid, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO, - 0L, 0L, 0L, 0L, 0L); + .addValues(underlyingIface, 10100, SET_DEFAULT, TAG_NONE, 5178L, 8L, 2139L, 11L, 0L) + .addValues(underlyingIface, 10100, SET_FOREGROUND, TAG_NONE, 0L, 0L, 0L, 0L, 0L) + .addValues(underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, 149873L, 287L, + 59217L /* smaller than sum(tun0) */, 299L /* smaller than sum(tun0) */, 0L) + .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, METERED_NO, ROAMING_NO, + assertValues(delta, 0, tunIface, 10100, SET_DEFAULT, TAG_NONE, ROAMING_NO, 39605L, 46L, 12259L, 55L, 0L); - assertValues(delta, 1, tunIface, 10100, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO, - 0L, 0L, 0L, 0L, 0L); - assertValues(delta, 2, tunIface, 10120, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, + assertValues(delta, 1, tunIface, 10100, SET_FOREGROUND, TAG_NONE, ROAMING_NO, 0L, 0L, + 0L, 0L, 0L); + assertValues(delta, 2, tunIface, 10120, SET_DEFAULT, TAG_NONE, ROAMING_NO, 72667L, 197L, 43909L, 241L, 0L); - assertValues(delta, 3, tunIface, 10120, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO, + assertValues(delta, 3, tunIface, 10120, SET_FOREGROUND, TAG_NONE, ROAMING_NO, 9297L, 17L, 4128L, 21L, 0L); - assertValues(delta, 4, tunIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, + assertValues(delta, 4, tunIface, tunUid, SET_DEFAULT, TAG_NONE, ROAMING_NO, 4983L, 10L, 1801L, 12L, 0L); - assertValues(delta, 5, tunIface, tunUid, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO, - 0L, 0L, 0L, 0L, 0L); - assertValues(delta, 6, tunIface, 10120, SET_DEFAULT, testTag1, METERED_NO, ROAMING_NO, + assertValues(delta, 5, tunIface, tunUid, SET_FOREGROUND, TAG_NONE, ROAMING_NO, 0L, 0L, + 0L, 0L, 0L); + assertValues(delta, 6, tunIface, 10120, SET_DEFAULT, testTag1, ROAMING_NO, 21691L, 41L, 13820L, 51L, 0L); - assertValues(delta, 7, tunIface, 10120, SET_FOREGROUND, testTag1, METERED_NO, ROAMING_NO, - 1281L, 2L, 665L, 2L, 0L); - assertValues(delta, 8, TEST_IFACE, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, - 1685L, 5L, 2070L, 6L, 0L); + assertValues(delta, 7, tunIface, 10120, SET_FOREGROUND, testTag1, ROAMING_NO, 1281L, + 2L, 665L, 2L, 0L); + assertValues(delta, 8, TEST_IFACE, 10100, SET_DEFAULT, TAG_NONE, ROAMING_NO, 1685L, 5L, + 2070L, 6L, 0L); // Existing underlying Iface entries are updated - assertValues(delta, 9, underlyingIface, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, - ROAMING_NO, 44783L, 54L, 14178L, 62L, 0L); - assertValues(delta, 10, underlyingIface, 10100, SET_FOREGROUND, TAG_NONE, METERED_NO, - ROAMING_NO, 0L, 0L, 0L, 0L, 0L); + assertValues(delta, 9, underlyingIface, 10100, SET_DEFAULT, TAG_NONE, ROAMING_NO, + 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, METERED_NO, - ROAMING_NO, 28304L, 27L, 1L, 2L, 0L); - assertValues(delta, 12, underlyingIface, tunUid, SET_FOREGROUND, TAG_NONE, METERED_NO, - ROAMING_NO, 0L, 0L, 0L, 0L, 0L); + assertValues(delta, 11, underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, ROAMING_NO, + 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, METERED_NO, - ROAMING_NO, 72667L, 197L, 43123L, 227L, 0L); - assertContains(delta, underlyingIface, 10120, SET_FOREGROUND, TAG_NONE, METERED_NO, - ROAMING_NO, 9297L, 17L, 4054, 19L, 0L); - assertContains(delta, underlyingIface, 10120, SET_DEFAULT, testTag1, METERED_NO, - ROAMING_NO, 21691L, 41L, 13572L, 48L, 0L); - assertContains(delta, underlyingIface, 10120, SET_FOREGROUND, testTag1, METERED_NO, - ROAMING_NO, 1281L, 2L, 653L, 1L, 0L); + assertContains(delta, underlyingIface, 10120, SET_DEFAULT, TAG_NONE, ROAMING_NO, + 72667L, 197L, 41872L, 219L, 0L); + assertContains(delta, underlyingIface, 10120, SET_FOREGROUND, TAG_NONE, ROAMING_NO, + 9297L, 17L, 3936, 19L, 0L); + assertContains(delta, underlyingIface, 10120, SET_DEFAULT, testTag1, ROAMING_NO, + 21691L, 41L, 13179L, 46L, 0L); + assertContains(delta, underlyingIface, 10120, SET_FOREGROUND, testTag1, ROAMING_NO, + 1281L, 2L, 634L, 1L, 0L); // New entries are added for debug purpose - assertContains(delta, underlyingIface, 10100, SET_DBG_VPN_IN, TAG_NONE, METERED_NO, - ROAMING_NO, 39605L, 46L, 12039, 51, 0); - assertContains(delta, underlyingIface, 10120, SET_DBG_VPN_IN, TAG_NONE, METERED_NO, - ROAMING_NO, 81964, 214, 47177, 246, 0); - assertContains(delta, underlyingIface, tunUid, SET_DBG_VPN_OUT, TAG_NONE, METERED_ALL, - ROAMING_ALL, 121569, 260, 59216, 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, METERED_NO, ROAMING_NO, 50000L, 25L, - 100000L, 50L, 0L) - .addValues(tunIface, 20100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 500L, 2L, - 200L, 5L, 0L) - // VPN package resends data through the tunnel (with exaggerated overhead) - .addValues(tunIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 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, METERED_NO, ROAMING_NO, 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, METERED_NO, ROAMING_NO, - 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, METERED_NO, ROAMING_NO, - 50000L, 25L, 100000L, 50L, 0L); - assertValues(delta, 1, tunIface, 20100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, - 500L, 2L, 200L, 5L, 0L); - assertValues(delta, 2, tunIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, - 240000L, 100L, 120000L, 60L, 0L); + assertContains(delta, underlyingIface, 10100, SET_DBG_VPN_IN, TAG_NONE, ROAMING_NO, + 39605L, 46L, 11690, 49, 0); + assertContains(delta, underlyingIface, 10120, SET_DBG_VPN_IN, TAG_NONE, ROAMING_NO, + 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, + 126552, 270, 59215, 297, 0); - // Existing underlying Iface entries are updated - assertValues(delta, 3, underlyingIface, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, - ROAMING_NO, 51000L, 35L, 102000L, 70L, 0L); - - // VPN underlying Iface entries are updated - assertValues(delta, 4, underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO, - 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, METERED_NO, - ROAMING_NO, 500L, 2L, 200L, 5L, 0L); - - // New entries are added for debug purpose - assertContains(delta, underlyingIface, 10100, SET_DBG_VPN_IN, TAG_NONE, METERED_NO, - ROAMING_NO, 50000L, 25L, 100000L, 50L, 0L); - assertContains(delta, underlyingIface, 20100, SET_DBG_VPN_IN, TAG_NONE, METERED_NO, - ROAMING_NO, 500, 2L, 200L, 5L, 0L); - assertContains(delta, underlyingIface, tunUid, SET_DBG_VPN_OUT, TAG_NONE, METERED_ALL, - ROAMING_ALL, 50500L, 27L, 100200L, 55, 0); } private static void assertContains(NetworkStats stats, String iface, int uid, int set, - int tag, int metered, int roaming, long rxBytes, long rxPackets, long txBytes, - long txPackets, long operations) { - int index = stats.findIndex(iface, uid, set, tag, metered, roaming); + int tag, int roaming, long rxBytes, long rxPackets, long txBytes, long txPackets, + long operations) { + int index = stats.findIndex(iface, uid, set, tag, roaming); assertTrue(index != -1); - assertValues(stats, index, iface, uid, set, tag, metered, roaming, + assertValues(stats, index, iface, uid, set, tag, roaming, rxBytes, rxPackets, txBytes, txPackets, operations); } private static void assertValues(NetworkStats stats, int index, String iface, int uid, int set, - int tag, int metered, int roaming, long rxBytes, long rxPackets, long txBytes, - long txPackets, long operations) { + int tag, int roaming, long rxBytes, long rxPackets, long txBytes, long txPackets, + long operations) { final NetworkStats.Entry entry = stats.getValues(index, null); - assertValues(entry, iface, uid, set, tag, metered, roaming); + assertValues(entry, iface, uid, set, tag, roaming); assertValues(entry, rxBytes, rxPackets, txBytes, txPackets, operations); } private static void assertValues( - NetworkStats.Entry entry, String iface, int uid, int set, int tag, int metered, - int roaming) { + NetworkStats.Entry entry, String iface, int uid, int set, int tag, int roaming) { assertEquals(iface, entry.iface); assertEquals(uid, entry.uid); assertEquals(set, entry.set); assertEquals(tag, entry.tag); - assertEquals(metered, entry.metered); assertEquals(roaming, entry.roaming); } 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/coretests/src/com/android/internal/net/NetworkStatsFactoryTest.java b/core/tests/coretests/src/com/android/internal/net/NetworkStatsFactoryTest.java index 7f13abc6d2c5..327f3fda3f34 100644 --- a/core/tests/coretests/src/com/android/internal/net/NetworkStatsFactoryTest.java +++ b/core/tests/coretests/src/com/android/internal/net/NetworkStatsFactoryTest.java @@ -16,7 +16,6 @@ package com.android.internal.net; -import static android.net.NetworkStats.METERED_NO; import static android.net.NetworkStats.ROAMING_NO; import static android.net.NetworkStats.SET_ALL; import static android.net.NetworkStats.SET_DEFAULT; @@ -102,14 +101,12 @@ public class NetworkStatsFactoryTest extends AndroidTestCase { final NetworkStats stats = mFactory.readNetworkStatsDetail(); assertEquals(70, stats.size()); - assertStatsEntry(stats, "rmnet1", 10021, SET_DEFAULT, 0x30100000, 219110L, 578L, 227423L, - 676L); + assertStatsEntry(stats, "rmnet1", 10021, SET_DEFAULT, 0x30100000, 219110L, 578L, 227423L, 676L); assertStatsEntry(stats, "rmnet1", 10021, SET_FOREGROUND, 0x30100000, 742L, 3L, 1265L, 3L); } public void testNetworkStatsSingle() throws Exception { - stageFile(R.raw.xt_qtaguid_iface_typical, - new File(mTestProc, "net/xt_qtaguid/iface_stat_all")); + stageFile(R.raw.xt_qtaguid_iface_typical, new File(mTestProc, "net/xt_qtaguid/iface_stat_all")); final NetworkStats stats = mFactory.readNetworkStatsSummaryDev(); assertEquals(6, stats.size()); @@ -125,8 +122,7 @@ public class NetworkStatsFactoryTest extends AndroidTestCase { final NetworkStats stats = mFactory.readNetworkStatsSummaryXt(); assertEquals(3, stats.size()); assertStatsEntry(stats, "rmnet0", UID_ALL, SET_ALL, TAG_NONE, 6824L, 16L, 5692L, 10L); - assertStatsEntry(stats, "rmnet1", UID_ALL, SET_ALL, TAG_NONE, 11153922L, 8051L, 190226L, - 2468L); + assertStatsEntry(stats, "rmnet1", UID_ALL, SET_ALL, TAG_NONE, 11153922L, 8051L, 190226L, 2468L); assertStatsEntry(stats, "rmnet2", UID_ALL, SET_ALL, TAG_NONE, 4968L, 35L, 3081L, 39L); } @@ -161,7 +157,7 @@ public class NetworkStatsFactoryTest extends AndroidTestCase { private static void assertStatsEntry(NetworkStats stats, String iface, int uid, int set, int tag, long rxBytes, long txBytes) { - final int i = stats.findIndex(iface, uid, set, tag, METERED_NO, ROAMING_NO); + final int i = stats.findIndex(iface, uid, set, tag, ROAMING_NO); final NetworkStats.Entry entry = stats.getValues(i, null); assertEquals("unexpected rxBytes", rxBytes, entry.rxBytes); assertEquals("unexpected txBytes", txBytes, entry.txBytes); @@ -169,7 +165,7 @@ public class NetworkStatsFactoryTest extends AndroidTestCase { private static void assertStatsEntry(NetworkStats stats, String iface, int uid, int set, int tag, long rxBytes, long rxPackets, long txBytes, long txPackets) { - final int i = stats.findIndex(iface, uid, set, tag, METERED_NO, ROAMING_NO); + final int i = stats.findIndex(iface, uid, set, tag, ROAMING_NO); final NetworkStats.Entry entry = stats.getValues(i, null); assertEquals("unexpected rxBytes", rxBytes, entry.rxBytes); assertEquals("unexpected rxPackets", rxPackets, entry.rxPackets); 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/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java index adc59de87f23..d55b230fffc7 100644 --- a/services/core/java/com/android/server/BluetoothManagerService.java +++ b/services/core/java/com/android/server/BluetoothManagerService.java @@ -751,8 +751,9 @@ class BluetoothManagerService extends IBluetoothManager.Stub { mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH ADMIN permission"); - if (!isEnabled() && mPermissionReviewRequired) { - startConsentUi(packageName, callingUid, BluetoothAdapter.ACTION_REQUEST_ENABLE); + if (!isEnabled() && mPermissionReviewRequired + && startConsentUiIfNeeded(packageName, callingUid, + BluetoothAdapter.ACTION_REQUEST_ENABLE)) { return false; } } @@ -786,8 +787,9 @@ class BluetoothManagerService extends IBluetoothManager.Stub { mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH ADMIN permission"); - if (isEnabled() && mPermissionReviewRequired) { - startConsentUi(packageName, callingUid, BluetoothAdapter.ACTION_REQUEST_DISABLE); + if (isEnabled() && mPermissionReviewRequired + && startConsentUiIfNeeded(packageName, callingUid, + BluetoothAdapter.ACTION_REQUEST_DISABLE)) { return false; } } @@ -807,8 +809,8 @@ class BluetoothManagerService extends IBluetoothManager.Stub { return true; } - private void startConsentUi(String packageName, int callingUid, String intentAction) - throws RemoteException { + private boolean startConsentUiIfNeeded(String packageName, + int callingUid, String intentAction) throws RemoteException { try { // Validate the package only if we are going to use it ApplicationInfo applicationInfo = mContext.getPackageManager() @@ -820,12 +822,16 @@ class BluetoothManagerService extends IBluetoothManager.Stub { + " not in uid " + callingUid); } - // Permission review mode, trigger a user prompt - Intent intent = new Intent(intentAction); - mContext.startActivity(intent); + // Legacy apps in permission review mode trigger a user prompt + if (applicationInfo.targetSdkVersion < Build.VERSION_CODES.M) { + Intent intent = new Intent(intentAction); + mContext.startActivity(intent); + return true; + } } catch (PackageManager.NameNotFoundException e) { throw new RemoteException(e.getMessage()); } + return false; } public void unbindAndFinish() { diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 66f5c4d4ba71..9dc5f10786d4 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -1804,14 +1804,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; @@ -2257,19 +2254,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) { @@ -2290,12 +2279,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: @@ -2605,28 +2588,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) { @@ -2720,7 +2689,7 @@ public class ConnectivityService extends IConnectivityManager.Stub } } } - callCallbackForRequest(nri, null, whichCallback, 0); + callCallbackForRequest(nri, null, ConnectivityManager.CALLBACK_RELEASED, 0); } @Override @@ -2957,11 +2926,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; @@ -5322,7 +5286,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/DeviceIdleController.java b/services/core/java/com/android/server/DeviceIdleController.java index 97f913e69d95..4405c1b6135a 100644 --- a/services/core/java/com/android/server/DeviceIdleController.java +++ b/services/core/java/com/android/server/DeviceIdleController.java @@ -49,6 +49,7 @@ import android.os.Bundle; import android.os.Environment; import android.os.FileUtils; import android.os.Handler; +import android.os.IBinder; import android.os.IDeviceIdleController; import android.os.IMaintenanceActivityListener; import android.os.Looper; @@ -1237,7 +1238,7 @@ public class DeviceIdleController extends SystemService } } - public class LocalService { + public final class LocalService { public void addPowerSaveTempWhitelistAppDirect(int appId, long duration, boolean sync, String reason) { addPowerSaveTempWhitelistAppDirectInternal(0, appId, duration, sync, reason); diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index ae1aef650ba4..10a538863c25 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -369,7 +369,7 @@ public final class ActiveServices { // we do not start the service and launch a review activity if the calling app // is in the foreground passing it a pending intent to start the service when // review is completed. - if (mAm.mPermissionReviewRequired || Build.PERMISSIONS_REVIEW_REQUIRED) { + if (Build.PERMISSIONS_REVIEW_REQUIRED) { if (!requestStartTargetPermissionsReviewIfNeededLocked(r, callingPackage, callingUid, service, callerFg, userId)) { return null; @@ -913,7 +913,7 @@ public final class ActiveServices { // we schedule binding to the service but do not start its process, then // we launch a review activity to which is passed a callback to invoke // when done to start the bound service's process to completing the binding. - if (mAm.mPermissionReviewRequired || Build.PERMISSIONS_REVIEW_REQUIRED) { + if (Build.PERMISSIONS_REVIEW_REQUIRED) { if (mAm.getPackageManagerInternalLocked().isPermissionsReviewRequired( s.packageName, s.userId)) { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index bc0390119a1d..a89dbb6c0cfa 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -1575,8 +1575,6 @@ public final class ActivityManagerService extends ActivityManagerNative // being called for multiwindow assist in a single session. private int mViSessionId = 1000; - final boolean mPermissionReviewRequired; - final class KillHandler extends Handler { static final int KILL_PROCESS_GROUP_MSG = 4000; @@ -2624,9 +2622,6 @@ public final class ActivityManagerService extends ActivityManagerNative Slog.i(TAG, "Memory class: " + ActivityManager.staticGetMemoryClass()); - mPermissionReviewRequired = mContext.getResources().getBoolean( - com.android.internal.R.bool.config_permissionReviewRequired); - mHandlerThread = new ServiceThread(TAG, android.os.Process.THREAD_PRIORITY_FOREGROUND, false /*allowIo*/); mHandlerThread.start(); @@ -10839,7 +10834,7 @@ public final class ActivityManagerService extends ActivityManagerNative // If permissions need a review before any of the app components can run, // we return no provider and launch a review activity if the calling app // is in the foreground. - if (mPermissionReviewRequired || Build.PERMISSIONS_REVIEW_REQUIRED) { + if (Build.PERMISSIONS_REVIEW_REQUIRED) { if (!requestTargetProviderPermissionsReviewIfNeededLocked(cpi, r, userId)) { return null; } diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index 907394e39b14..115971f6fffc 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -416,8 +416,7 @@ class ActivityStarter { // If permissions need a review before any of the app components can run, we // launch the review activity and pass a pending intent to start the activity // we are to launching now after the review is completed. - if ((mService.mPermissionReviewRequired - || Build.PERMISSIONS_REVIEW_REQUIRED) && aInfo != null) { + if (Build.PERMISSIONS_REVIEW_REQUIRED && aInfo != null) { if (mService.getPackageManagerInternalLocked().isPermissionsReviewRequired( aInfo.packageName, userId)) { IIntentSender target = mService.getIntentSenderLocked( diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java index ea901ce28953..362a3479a6bf 100644 --- a/services/core/java/com/android/server/am/BroadcastQueue.java +++ b/services/core/java/com/android/server/am/BroadcastQueue.java @@ -626,7 +626,7 @@ public final class BroadcastQueue { // the broadcast and if the calling app is in the foreground and the broadcast is // explicit we launch the review UI passing it a pending intent to send the skipped // broadcast. - if (mService.mPermissionReviewRequired || Build.PERMISSIONS_REVIEW_REQUIRED) { + if (Build.PERMISSIONS_REVIEW_REQUIRED) { if (!requestStartTargetPermissionsReviewIfNeededLocked(r, filter.packageName, filter.owningUserId)) { r.delivery[index] = BroadcastRecord.DELIVERY_SKIPPED; @@ -1132,8 +1132,7 @@ public final class BroadcastQueue { // the broadcast and if the calling app is in the foreground and the broadcast is // explicit we launch the review UI passing it a pending intent to send the skipped // broadcast. - if ((mService.mPermissionReviewRequired - || Build.PERMISSIONS_REVIEW_REQUIRED) && !skip) { + if (Build.PERMISSIONS_REVIEW_REQUIRED && !skip) { if (!requestStartTargetPermissionsReviewIfNeededLocked(r, info.activityInfo.packageName, UserHandle.getUserId( info.activityInfo.applicationInfo.uid))) { 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/NetdEventListenerService.java b/services/core/java/com/android/server/connectivity/NetdEventListenerService.java index f8638c544e8e..4b175d7a5af8 100644 --- a/services/core/java/com/android/server/connectivity/NetdEventListenerService.java +++ b/services/core/java/com/android/server/connectivity/NetdEventListenerService.java @@ -24,7 +24,6 @@ import android.net.NetworkRequest; import android.net.metrics.DnsEvent; import android.net.metrics.INetdEventListener; import android.net.metrics.IpConnectivityLog; -import android.os.RemoteException; import android.util.Log; import com.android.internal.annotations.GuardedBy; @@ -45,7 +44,7 @@ public class NetdEventListenerService extends INetdEventListener.Stub { public static final String SERVICE_NAME = "netd_listener"; private static final String TAG = NetdEventListenerService.class.getSimpleName(); - private static final boolean DBG = false; + private static final boolean DBG = true; private static final boolean VDBG = false; // TODO: read this constant from system property @@ -87,7 +86,7 @@ public class NetdEventListenerService extends INetdEventListener.Stub { byte[] returnCodes = Arrays.copyOf(mReturnCodes, mEventCount); int[] latenciesMs = Arrays.copyOf(mLatenciesMs, mEventCount); mMetricsLog.log(new DnsEvent(mNetId, eventTypes, returnCodes, latenciesMs)); - maybeLog("Logging %d results for netId %d", mEventCount, mNetId); + maybeLog(String.format("Logging %d results for netId %d", mEventCount, mNetId)); mEventCount = 0; } @@ -137,9 +136,9 @@ public class NetdEventListenerService extends INetdEventListener.Stub { // Called concurrently by multiple binder threads. // This method must not block or perform long-running operations. public synchronized void onDnsEvent(int netId, int eventType, int returnCode, int latencyMs, - String hostname, String[] ipAddresses, int ipAddressesCount, int uid) - throws RemoteException { - maybeVerboseLog("onDnsEvent(%d, %d, %d, %dms)", netId, eventType, returnCode, latencyMs); + String hostname, String[] ipAddresses, int ipAddressesCount, int uid) { + maybeVerboseLog(String.format("onDnsEvent(%d, %d, %d, %d)", + netId, eventType, returnCode, latencyMs)); DnsEventBatch batch = mEventBatches.get(netId); if (batch == null) { @@ -152,9 +151,9 @@ public class NetdEventListenerService extends INetdEventListener.Stub { @Override // Called concurrently by multiple binder threads. // This method must not block or perform long-running operations. - public synchronized void onConnectEvent(int netId, int error, int latencyMs, String ipAddr, int port, - int uid) throws RemoteException { - maybeVerboseLog("onConnectEvent(%d, %d, %dms)", netId, error, latencyMs); + public synchronized void onConnectEvent(int netId, int latencyMs, String ipAddr, int port, + int uid) { + maybeVerboseLog(String.format("onConnectEvent(%d, %d)", netId, latencyMs)); } public synchronized void dump(PrintWriter writer) { @@ -167,11 +166,11 @@ public class NetdEventListenerService extends INetdEventListener.Stub { pw.decreaseIndent(); } - private static void maybeLog(String s, Object... args) { - if (DBG) Log.d(TAG, String.format(s, args)); + private static void maybeLog(String s) { + if (DBG) Log.d(TAG, s); } - private static void maybeVerboseLog(String s, Object... args) { - if (VDBG) Log.d(TAG, String.format(s, args)); + private static void maybeVerboseLog(String s) { + if (VDBG) Log.d(TAG, s); } } diff --git a/services/core/java/com/android/server/connectivity/NetworkMonitor.java b/services/core/java/com/android/server/connectivity/NetworkMonitor.java index ea2cf5fb4a7e..6eb89facca76 100644 --- a/services/core/java/com/android/server/connectivity/NetworkMonitor.java +++ b/services/core/java/com/android/server/connectivity/NetworkMonitor.java @@ -96,24 +96,6 @@ public class NetworkMonitor extends StateMachine { private static final int SOCKET_TIMEOUT_MS = 10000; private static final int PROBE_TIMEOUT_MS = 3000; - static enum EvaluationResult { - VALIDATED(true), - CAPTIVE_PORTAL(false); - final boolean isValidated; - EvaluationResult(boolean isValidated) { - this.isValidated = isValidated; - } - } - - static enum ValidationStage { - FIRST_VALIDATION(true), - REVALIDATION(false); - final boolean isFirstValidation; - ValidationStage(boolean isFirstValidation) { - this.isFirstValidation = isFirstValidation; - } - } - public static final String ACTION_NETWORK_CONDITIONS_MEASURED = "android.net.conn.NETWORK_CONDITIONS_MEASURED"; public static final String EXTRA_CONNECTIVITY_TYPE = "extra_connectivity_type"; @@ -229,12 +211,8 @@ public class NetworkMonitor extends StateMachine { private final NetworkRequest mDefaultRequest; private final IpConnectivityLog mMetricsLog; - @VisibleForTesting - protected boolean mIsCaptivePortalCheckEnabled; - + private boolean mIsCaptivePortalCheckEnabled; private boolean mUseHttps; - // The total number of captive portal detection attempts for this NetworkMonitor instance. - private int mValidations = 0; // Set if the user explicitly selected "Do not use this network" in captive portal sign-in app. private boolean mUserDoesNotWant = false; @@ -287,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; @@ -309,10 +286,6 @@ public class NetworkMonitor extends StateMachine { return validationLogs.readOnlyLocalLog(); } - private ValidationStage validationStage() { - return 0 == mValidations ? ValidationStage.FIRST_VALIDATION : ValidationStage.REVALIDATION; - } - // DefaultState is the parent of all States. It exists only to handle CMD_* messages but // does not entail any real state (hence no enter() or exit() routines). private class DefaultState extends State { @@ -389,11 +362,9 @@ public class NetworkMonitor extends StateMachine { private class ValidatedState extends State { @Override public void enter() { - maybeLogEvaluationResult( - networkEventType(validationStage(), EvaluationResult.VALIDATED)); + maybeLogEvaluationResult(NetworkEvent.NETWORK_VALIDATED); mConnectivityServiceHandler.sendMessage(obtainMessage(EVENT_NETWORK_TESTED, NETWORK_TEST_RESULT_VALID, mNetworkAgentInfo.network.netId, null)); - mValidations++; } @Override @@ -609,8 +580,7 @@ public class NetworkMonitor extends StateMachine { @Override public void enter() { - maybeLogEvaluationResult( - networkEventType(validationStage(), EvaluationResult.CAPTIVE_PORTAL)); + maybeLogEvaluationResult(NetworkEvent.NETWORK_CAPTIVE_PORTAL_FOUND); // Don't annoy user with sign-in notifications. if (mDontDisplaySigninNotification) return; // Create a CustomIntentReceiver that sends us a @@ -630,7 +600,6 @@ public class NetworkMonitor extends StateMachine { // Retest for captive portal occasionally. sendMessageDelayed(CMD_CAPTIVE_PORTAL_RECHECK, 0 /* no UID */, CAPTIVE_PORTAL_REEVALUATE_DELAY_MS); - mValidations++; } @Override @@ -663,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; @@ -706,13 +672,48 @@ public class NetworkMonitor extends StateMachine { long startTime = SystemClock.elapsedRealtime(); - final CaptivePortalProbeResult result; + // Pre-resolve the captive portal server host so we can log it. + // Only do this if HttpURLConnection is about to, to avoid any potentially + // unnecessary resolution. + String hostToResolve = null; + if (pacUrl != null) { + hostToResolve = pacUrl.getHost(); + } else if (proxyInfo != null) { + hostToResolve = proxyInfo.getHost(); + } else { + hostToResolve = httpUrl.getHost(); + } + + if (!TextUtils.isEmpty(hostToResolve)) { + String probeName = ValidationProbeEvent.getProbeName(ValidationProbeEvent.PROBE_DNS); + final Stopwatch dnsTimer = new Stopwatch().start(); + int dnsResult; + long dnsLatency; + try { + InetAddress[] addresses = mNetworkAgentInfo.network.getAllByName(hostToResolve); + dnsResult = ValidationProbeEvent.DNS_SUCCESS; + dnsLatency = dnsTimer.stop(); + final StringBuffer connectInfo = new StringBuffer(", " + hostToResolve + "="); + for (InetAddress address : addresses) { + connectInfo.append(address.getHostAddress()); + if (address != addresses[addresses.length-1]) connectInfo.append(","); + } + validationLog(probeName + " OK " + dnsLatency + "ms" + connectInfo); + } catch (UnknownHostException e) { + dnsResult = ValidationProbeEvent.DNS_FAILURE; + dnsLatency = dnsTimer.stop(); + validationLog(probeName + " FAIL " + dnsLatency + "ms, " + hostToResolve); + } + logValidationProbe(dnsLatency, ValidationProbeEvent.PROBE_DNS, dnsResult); + } + + CaptivePortalProbeResult result; if (pacUrl != null) { - result = sendDnsAndHttpProbes(null, pacUrl, ValidationProbeEvent.PROBE_PAC); + result = sendHttpProbe(pacUrl, ValidationProbeEvent.PROBE_PAC); } else if (mUseHttps) { - result = sendParallelHttpProbes(proxyInfo, httpsUrl, httpUrl, fallbackUrl); + result = sendParallelHttpProbes(httpsUrl, httpUrl, fallbackUrl); } else { - result = sendDnsAndHttpProbes(proxyInfo, httpUrl, ValidationProbeEvent.PROBE_HTTP); + result = sendHttpProbe(httpUrl, ValidationProbeEvent.PROBE_HTTP); } long endTime = SystemClock.elapsedRealtime(); @@ -725,50 +726,8 @@ public class NetworkMonitor extends StateMachine { } /** - * Do a DNS resolution and URL fetch on a known web server to see if we get the data we expect. - * @return a CaptivePortalProbeResult inferred from the HTTP response. - */ - private CaptivePortalProbeResult sendDnsAndHttpProbes(ProxyInfo proxy, URL url, int probeType) { - // Pre-resolve the captive portal server host so we can log it. - // Only do this if HttpURLConnection is about to, to avoid any potentially - // unnecessary resolution. - final String host = (proxy != null) ? proxy.getHost() : url.getHost(); - sendDnsProbe(host); - return sendHttpProbe(url, probeType); - } - - /** Do a DNS resolution of the given server. */ - private void sendDnsProbe(String host) { - if (TextUtils.isEmpty(host)) { - return; - } - - final String name = ValidationProbeEvent.getProbeName(ValidationProbeEvent.PROBE_DNS); - final Stopwatch watch = new Stopwatch().start(); - int result; - String connectInfo; - try { - InetAddress[] addresses = mNetworkAgentInfo.network.getAllByName(host); - result = ValidationProbeEvent.DNS_SUCCESS; - StringBuffer buffer = new StringBuffer(host).append("="); - for (InetAddress address : addresses) { - buffer.append(address.getHostAddress()); - if (address != addresses[addresses.length-1]) buffer.append(","); - } - connectInfo = buffer.toString(); - } catch (UnknownHostException e) { - result = ValidationProbeEvent.DNS_FAILURE; - connectInfo = host; - } - final long latency = watch.stop(); - String resultString = (ValidationProbeEvent.DNS_SUCCESS == result) ? "OK" : "FAIL"; - validationLog(String.format("%s %s %dms, %s", name, resultString, latency, connectInfo)); - logValidationProbe(latency, ValidationProbeEvent.PROBE_DNS, result); - } - - /** - * Do a URL fetch on a known web server to see if we get the data we expect. - * @return a CaptivePortalProbeResult inferred from the HTTP response. + * Do a URL fetch on a known server to see if we get the data we expect. + * Returns HTTP response code. */ @VisibleForTesting protected CaptivePortalProbeResult sendHttpProbe(URL url, int probeType) { @@ -835,7 +794,7 @@ public class NetworkMonitor extends StateMachine { } private CaptivePortalProbeResult sendParallelHttpProbes( - ProxyInfo proxy, URL httpsUrl, URL httpUrl, URL fallbackUrl) { + URL httpsUrl, URL httpUrl, URL fallbackUrl) { // Number of probes to wait for. If a probe completes with a conclusive answer // it shortcuts the latch immediately by forcing the count to 0. final CountDownLatch latch = new CountDownLatch(2); @@ -855,10 +814,9 @@ public class NetworkMonitor extends StateMachine { @Override public void run() { if (mIsHttps) { - mResult = - sendDnsAndHttpProbes(proxy, httpsUrl, ValidationProbeEvent.PROBE_HTTPS); + mResult = sendHttpProbe(httpsUrl, ValidationProbeEvent.PROBE_HTTPS); } else { - mResult = sendDnsAndHttpProbes(proxy, httpUrl, ValidationProbeEvent.PROBE_HTTP); + mResult = sendHttpProbe(httpUrl, ValidationProbeEvent.PROBE_HTTP); } if ((mIsHttps && mResult.isSuccessful()) || (!mIsHttps && mResult.isPortal())) { // Stop waiting immediately if https succeeds or if http finds a portal. @@ -1009,22 +967,6 @@ public class NetworkMonitor extends StateMachine { mMetricsLog.log(new NetworkEvent(mNetId, evtype)); } - private int networkEventType(ValidationStage s, EvaluationResult r) { - if (s.isFirstValidation) { - if (r.isValidated) { - return NetworkEvent.NETWORK_FIRST_VALIDATION_SUCCESS; - } else { - return NetworkEvent.NETWORK_FIRST_VALIDATION_PORTAL_FOUND; - } - } else { - if (r.isValidated) { - return NetworkEvent.NETWORK_REVALIDATION_SUCCESS; - } else { - return NetworkEvent.NETWORK_REVALIDATION_PORTAL_FOUND; - } - } - } - private void maybeLogEvaluationResult(int evtype) { if (mEvaluationTimer.isRunning()) { mMetricsLog.log(new NetworkEvent(mNetId, evtype, mEvaluationTimer.stop())); @@ -1033,8 +975,6 @@ public class NetworkMonitor extends StateMachine { } private void logValidationProbe(long durationMs, int probeType, int probeResult) { - probeType = - ValidationProbeEvent.makeProbeType(probeType, validationStage().isFirstValidation); mMetricsLog.log(new ValidationProbeEvent(mNetId, durationMs, probeType, probeResult)); } } 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/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index afc6247d88cc..ede3bda5bea2 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -27,8 +27,6 @@ import android.annotation.Nullable; import android.annotation.UserIdInt; import android.app.AppGlobals; import android.app.AppOpsManager; -import android.app.Notification; -import android.app.NotificationManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.ComponentName; @@ -78,7 +76,6 @@ import android.text.TextUtils; import android.util.ArraySet; import android.util.Log; -import com.android.internal.R; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.net.LegacyVpnInfo; @@ -244,14 +241,12 @@ public class Vpn { /** * Update current state, dispaching event to listeners. */ - @VisibleForTesting - protected void updateState(DetailedState detailedState, String reason) { + private void updateState(DetailedState detailedState, String reason) { if (LOGD) Log.d(TAG, "setting state=" + detailedState + ", reason=" + reason); mNetworkInfo.setDetailedState(detailedState, reason, null); if (mNetworkAgent != null) { mNetworkAgent.sendNetworkInfo(mNetworkInfo); } - updateAlwaysOnNotification(detailedState); } /** @@ -285,10 +280,7 @@ public class Vpn { } mLockdown = (mAlwaysOn && lockdown); - if (isCurrentPreparedPackage(packageName)) { - updateAlwaysOnNotification(mNetworkInfo.getDetailedState()); - } else { - // Prepare this app. The notification will update as a side-effect of updateState(). + if (!isCurrentPreparedPackage(packageName)) { prepareInternal(packageName); } maybeRegisterPackageChangeReceiverLocked(packageName); @@ -690,19 +682,22 @@ public class Vpn { } } - private void agentDisconnect(NetworkAgent networkAgent) { + private void agentDisconnect(NetworkInfo networkInfo, NetworkAgent networkAgent) { + networkInfo.setIsAvailable(false); + networkInfo.setDetailedState(DetailedState.DISCONNECTED, null, null); if (networkAgent != null) { - NetworkInfo networkInfo = new NetworkInfo(mNetworkInfo); - networkInfo.setIsAvailable(false); - networkInfo.setDetailedState(DetailedState.DISCONNECTED, null, null); networkAgent.sendNetworkInfo(networkInfo); } } + private void agentDisconnect(NetworkAgent networkAgent) { + NetworkInfo networkInfo = new NetworkInfo(mNetworkInfo); + agentDisconnect(networkInfo, networkAgent); + } + private void agentDisconnect() { if (mNetworkInfo.isConnected()) { - mNetworkInfo.setIsAvailable(false); - updateState(DetailedState.DISCONNECTED, "agentDisconnect"); + agentDisconnect(mNetworkInfo, mNetworkAgent); mNetworkAgent = null; } } @@ -1255,43 +1250,6 @@ public class Vpn { } } - private void updateAlwaysOnNotification(DetailedState networkState) { - final boolean visible = (mAlwaysOn && networkState != DetailedState.CONNECTED); - updateAlwaysOnNotificationInternal(visible); - } - - @VisibleForTesting - protected void updateAlwaysOnNotificationInternal(boolean visible) { - final UserHandle user = UserHandle.of(mUserHandle); - final long token = Binder.clearCallingIdentity(); - try { - final NotificationManager notificationManager = NotificationManager.from(mContext); - if (!visible) { - notificationManager.cancelAsUser(TAG, 0, user); - return; - } - final Intent intent = new Intent(Settings.ACTION_VPN_SETTINGS); - final PendingIntent configIntent = PendingIntent.getActivityAsUser( - mContext, /* request */ 0, intent, - PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT, - null, user); - final Notification.Builder builder = new Notification.Builder(mContext) - .setDefaults(0) - .setSmallIcon(R.drawable.vpn_connected) - .setContentTitle(mContext.getString(R.string.vpn_lockdown_disconnected)) - .setContentText(mContext.getString(R.string.vpn_lockdown_config)) - .setContentIntent(configIntent) - .setCategory(Notification.CATEGORY_SYSTEM) - .setPriority(Notification.PRIORITY_LOW) - .setVisibility(Notification.VISIBILITY_PUBLIC) - .setOngoing(true) - .setColor(mContext.getColor(R.color.system_notification_accent_color)); - notificationManager.notifyAsUser(TAG, 0, builder.build(), user); - } finally { - Binder.restoreCallingIdentity(token); - } - } - private native int jniCreate(int mtu); private native String jniGetName(int tun); private native int jniSetAddresses(String interfaze, String addresses); 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/java/com/android/server/net/NetworkIdentitySet.java b/services/core/java/com/android/server/net/NetworkIdentitySet.java index c48f43058fca..959a82329001 100644 --- a/services/core/java/com/android/server/net/NetworkIdentitySet.java +++ b/services/core/java/com/android/server/net/NetworkIdentitySet.java @@ -91,19 +91,6 @@ public class NetworkIdentitySet extends HashSet<NetworkIdentity> implements } } - /** @return whether any {@link NetworkIdentity} in this set is considered metered. */ - public boolean isAnyMemberMetered() { - if (isEmpty()) { - return false; - } - for (NetworkIdentity ident : this) { - if (ident.getMetered()) { - return true; - } - } - return false; - } - /** @return whether any {@link NetworkIdentity} in this set is considered roaming. */ public boolean isAnyMemberRoaming() { if (isEmpty()) { diff --git a/services/core/java/com/android/server/net/NetworkStatsCollection.java b/services/core/java/com/android/server/net/NetworkStatsCollection.java index c45b4169f575..673dd8fbbd66 100644 --- a/services/core/java/com/android/server/net/NetworkStatsCollection.java +++ b/services/core/java/com/android/server/net/NetworkStatsCollection.java @@ -17,8 +17,6 @@ package com.android.server.net; import static android.net.NetworkStats.IFACE_ALL; -import static android.net.NetworkStats.METERED_NO; -import static android.net.NetworkStats.METERED_YES; import static android.net.NetworkStats.ROAMING_NO; import static android.net.NetworkStats.ROAMING_YES; import static android.net.NetworkStats.SET_ALL; @@ -244,7 +242,6 @@ public class NetworkStatsCollection implements FileRotator.Reader { entry.uid = key.uid; entry.set = key.set; entry.tag = key.tag; - entry.metered = key.ident.isAnyMemberMetered() ? METERED_YES : METERED_NO; entry.roaming = key.ident.isAnyMemberRoaming() ? ROAMING_YES : ROAMING_NO; entry.rxBytes = historyEntry.rxBytes; entry.rxPackets = historyEntry.rxPackets; diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 614230c273dd..3a3d43791ecf 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -1143,8 +1143,6 @@ public class PackageManagerService extends IPackageManager.Stub { final @NonNull String mServicesSystemSharedLibraryPackageName; final @NonNull String mSharedSystemSharedLibraryPackageName; - final boolean mPermissionReviewRequired; - private final PackageUsage mPackageUsage = new PackageUsage(); private final CompilerStats mCompilerStats = new CompilerStats(); @@ -2075,10 +2073,6 @@ public class PackageManagerService extends IPackageManager.Stub { } mContext = context; - - mPermissionReviewRequired = context.getResources().getBoolean( - R.bool.config_permissionReviewRequired); - mFactoryTest = factoryTest; mOnlyCore = onlyCore; mMetrics = new DisplayMetrics(); @@ -4036,7 +4030,7 @@ public class PackageManagerService extends IPackageManager.Stub { // their permissions as always granted runtime ones since we need // to keep the review required permission flag per user while an // install permission's state is shared across all users. - if ((mPermissionReviewRequired || Build.PERMISSIONS_REVIEW_REQUIRED) + if (Build.PERMISSIONS_REVIEW_REQUIRED && pkg.applicationInfo.targetSdkVersion < Build.VERSION_CODES.M && bp.isRuntime()) { return; @@ -4147,7 +4141,7 @@ public class PackageManagerService extends IPackageManager.Stub { // their permissions as always granted runtime ones since we need // to keep the review required permission flag per user while an // install permission's state is shared across all users. - if ((mPermissionReviewRequired || Build.PERMISSIONS_REVIEW_REQUIRED) + if (Build.PERMISSIONS_REVIEW_REQUIRED && pkg.applicationInfo.targetSdkVersion < Build.VERSION_CODES.M && bp.isRuntime()) { return; @@ -10033,8 +10027,7 @@ public class PackageManagerService extends IPackageManager.Stub { // their permissions as always granted runtime ones since we need // to keep the review required permission flag per user while an // install permission's state is shared across all users. - if (!appSupportsRuntimePermissions && !mPermissionReviewRequired - && !Build.PERMISSIONS_REVIEW_REQUIRED) { + if (!appSupportsRuntimePermissions && !Build.PERMISSIONS_REVIEW_REQUIRED) { // For legacy apps dangerous permissions are install time ones. grant = GRANT_INSTALL; } else if (origPermissions.hasInstallPermission(bp.name)) { @@ -10120,7 +10113,7 @@ public class PackageManagerService extends IPackageManager.Stub { changedRuntimePermissionUserIds, userId); } // If the app supports runtime permissions no need for a review. - if ((mPermissionReviewRequired || Build.PERMISSIONS_REVIEW_REQUIRED) + if (Build.PERMISSIONS_REVIEW_REQUIRED && appSupportsRuntimePermissions && (flags & PackageManager .FLAG_PERMISSION_REVIEW_REQUIRED) != 0) { @@ -10129,8 +10122,7 @@ public class PackageManagerService extends IPackageManager.Stub { changedRuntimePermissionUserIds = ArrayUtils.appendInt( changedRuntimePermissionUserIds, userId); } - } else if ((mPermissionReviewRequired - || Build.PERMISSIONS_REVIEW_REQUIRED) + } else if (Build.PERMISSIONS_REVIEW_REQUIRED && !appSupportsRuntimePermissions) { // For legacy apps that need a permission review, every new // runtime permission is granted but it is pending a review. @@ -16725,7 +16717,7 @@ public class PackageManagerService extends IPackageManager.Stub { // If permission review is enabled and this is a legacy app, mark the // permission as requiring a review as this is the initial state. int flags = 0; - if ((mPermissionReviewRequired || Build.PERMISSIONS_REVIEW_REQUIRED) + if (Build.PERMISSIONS_REVIEW_REQUIRED && ps.pkg.applicationInfo.targetSdkVersion < Build.VERSION_CODES.M) { flags |= FLAG_PERMISSION_REVIEW_REQUIRED; } @@ -20623,7 +20615,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); // permissions to keep per user flag state whether review is needed. // Hence, if a new user is added we have to propagate dangerous // permission grants for these legacy apps. - if (mPermissionReviewRequired || Build.PERMISSIONS_REVIEW_REQUIRED) { + if (Build.PERMISSIONS_REVIEW_REQUIRED) { updatePermissionsLPw(null, null, UPDATE_PERMISSIONS_ALL | UPDATE_PERMISSIONS_REPLACE_ALL); } @@ -21077,7 +21069,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); public boolean isPermissionsReviewRequired(String packageName, int userId) { synchronized (mPackages) { // If we do not support permission review, done. - if (!mPermissionReviewRequired && !Build.PERMISSIONS_REVIEW_REQUIRED) { + if (!Build.PERMISSIONS_REVIEW_REQUIRED) { return false; } 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 83001df58023..4c7545240c23 100644 --- a/services/net/java/android/net/apf/ApfFilter.java +++ b/services/net/java/android/net/apf/ApfFilter.java @@ -194,10 +194,8 @@ public class ApfFilter { { (byte) 0xff, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }; private static final int ICMP6_TYPE_OFFSET = ETH_HEADER_LEN + IPV6_HEADER_LEN; - private static final int ICMP6_ROUTER_SOLICITATION = 133; - private static final int ICMP6_ROUTER_ADVERTISEMENT = 134; - private static final int ICMP6_NEIGHBOR_SOLICITATION = 135; private static final int ICMP6_NEIGHBOR_ANNOUNCEMENT = 136; + private static final int ICMP6_ROUTER_ADVERTISEMENT = 134; // NOTE: this must be added to the IPv4 header length in IPV4_HEADER_SIZE_MEMORY_SLOT private static final int UDP_DESTINATION_PORT_OFFSET = ETH_HEADER_LEN + 2; @@ -285,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 = @@ -370,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 "???"; } @@ -380,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++) { @@ -403,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); } @@ -411,7 +403,7 @@ public class ApfFilter { rdnssOptionToString(sb, i); } return sb.toString(); - } catch (BufferUnderflowException|IndexOutOfBoundsException e) { + } catch (BufferUnderflowException | IndexOutOfBoundsException e) { return "<Malformed RA>"; } } @@ -444,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"); } @@ -478,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: @@ -523,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); @@ -564,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); @@ -807,8 +795,6 @@ public class ApfFilter { // if it's multicast and we're dropping multicast: // drop // pass - // if it's ICMPv6 RS to any: - // drop // if it's ICMPv6 NA to ff02::1: // drop @@ -833,12 +819,10 @@ public class ApfFilter { // Add unsolicited multicast neighbor announcements filter String skipUnsolicitedMulticastNALabel = "skipUnsolicitedMulticastNA"; + // If not neighbor announcements, skip unsolicited multicast NA filter gen.addLoad8(Register.R0, ICMP6_TYPE_OFFSET); - // Drop all router solicitations (b/32833400) - gen.addJumpIfR0Equals(ICMP6_ROUTER_SOLICITATION, gen.DROP_LABEL); - // If not neighbor announcements, skip filter. gen.addJumpIfR0NotEquals(ICMP6_NEIGHBOR_ANNOUNCEMENT, skipUnsolicitedMulticastNALabel); - // If to ff02::1, drop. + // If to ff02::1, drop // TODO: Drop only if they don't contain the address of on-link neighbours. gen.addLoadImmediate(Register.R0, IPV6_DEST_ADDR_OFFSET); gen.addJumpIfBytesNotEqual(Register.R0, IPV6_ALL_NODES_ADDRESS, @@ -858,7 +842,6 @@ public class ApfFilter { * <li>Pass all non-ICMPv6 IPv6 packets, * <li>Pass all non-IPv4 and non-IPv6 packets, * <li>Drop IPv6 ICMPv6 NAs to ff02::1. - * <li>Drop IPv6 ICMPv6 RSs. * <li>Let execution continue off the end of the program for IPv6 ICMPv6 packets. This allows * insertion of RA filters here, or if there aren't any, just passes the packets. * </ul> @@ -942,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(); @@ -989,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? @@ -1029,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. @@ -1168,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 2187c571d7ba..3183930b08ce 100644 --- a/services/tests/servicestests/Android.mk +++ b/services/tests/servicestests/Android.mk @@ -12,12 +12,12 @@ LOCAL_MODULE_TAGS := tests LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_STATIC_JAVA_LIBRARIES := \ - easymocklib \ frameworks-base-testutils \ services.core \ 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 f89603052213..6d42cce2e502 100644 --- a/tests/net/java/android/net/ConnectivityMetricsLoggerTest.java +++ b/services/tests/servicestests/src/android/net/ConnectivityMetricsLoggerTest.java @@ -18,7 +18,6 @@ package android.net; import android.os.Bundle; import android.os.Parcel; -import android.test.suitebuilder.annotation.SmallTest; import java.util.List; import junit.framework.TestCase; import org.mockito.ArgumentCaptor; @@ -50,7 +49,6 @@ public class ConnectivityMetricsLoggerTest extends TestCase { mLog = new ConnectivityMetricsLogger(mService); } - @SmallTest public void testLogEvents() throws Exception { mLog.logEvent(1, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV); mLog.logEvent(2, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV); @@ -62,7 +60,6 @@ public class ConnectivityMetricsLoggerTest extends TestCase { assertEventsEqual(expectedEvent(3), gotEvents.get(2)); } - @SmallTest public void testLogEventTriggerThrottling() throws Exception { when(mService.logEvent(any())).thenReturn(1234L); @@ -73,7 +70,6 @@ public class ConnectivityMetricsLoggerTest extends TestCase { assertEventsEqual(expectedEvent(1), gotEvents.get(0)); } - @SmallTest public void testLogEventFails() throws Exception { when(mService.logEvent(any())).thenReturn(-1L); // Error. @@ -84,7 +80,6 @@ public class ConnectivityMetricsLoggerTest extends TestCase { assertEventsEqual(expectedEvent(1), gotEvents.get(0)); } - @SmallTest public void testLogEventWhenThrottling() throws Exception { when(mService.logEvent(any())).thenReturn(Long.MAX_VALUE); // Throttled @@ -97,7 +92,6 @@ public class ConnectivityMetricsLoggerTest extends TestCase { assertEventsEqual(expectedEvent(1), gotEvents.get(0)); } - @SmallTest public void testLogEventRecoverFromThrottling() throws Exception { final long throttleTimeout = System.currentTimeMillis() + 10; when(mService.logEvent(any())).thenReturn(throttleTimeout, 0L); 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 ff6175427ce7..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,11 +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 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; @@ -54,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; @@ -75,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. @@ -154,7 +153,7 @@ public class ApfTest extends AndroidTestCase { * generating bytecode for that program and running it through the * interpreter to verify it functions correctly. */ - @SmallTest + @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 @@ -562,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. */ - @SmallTest + @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", @@ -661,13 +660,9 @@ public class ApfTest extends AndroidTestCase { // The IPv6 all nodes address ff02::1 private static final byte[] IPV6_ALL_NODES_ADDRESS = { (byte) 0xff, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }; - private static final byte[] IPV6_ALL_ROUTERS_ADDRESS = - { (byte) 0xff, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2 }; private static final int ICMP6_TYPE_OFFSET = ETH_HEADER_LEN + IPV6_HEADER_LEN; - private static final int ICMP6_ROUTER_SOLICITATION = 133; private static final int ICMP6_ROUTER_ADVERTISEMENT = 134; - private static final int ICMP6_NEIGHBOR_SOLICITATION = 135; private static final int ICMP6_NEIGHBOR_ANNOUNCEMENT = 136; private static final int ICMP6_RA_HEADER_LEN = 16; @@ -724,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}; - @SmallTest + @LargeTest public void testApfFilterIPv4() throws Exception { MockIpManagerCallback ipManagerCallback = new MockIpManagerCallback(); LinkAddress link = new LinkAddress(InetAddress.getByAddress(MOCK_IPV4_ADDR), 19); @@ -779,7 +774,7 @@ public class ApfTest extends AndroidTestCase { apfFilter.shutdown(); } - @SmallTest + @LargeTest public void testApfFilterIPv6() throws Exception { MockIpManagerCallback ipManagerCallback = new MockIpManagerCallback(); ApfFilter apfFilter = new TestApfFilter(ipManagerCallback, ALLOW_MULTICAST, mLog); @@ -802,16 +797,10 @@ public class ApfTest extends AndroidTestCase { put(packet, IPV6_DEST_ADDR_OFFSET, IPV6_ALL_NODES_ADDRESS); assertDrop(program, packet.array()); - // Verify ICMPv6 RS to any is dropped - packet.put(ICMP6_TYPE_OFFSET, (byte)ICMP6_ROUTER_SOLICITATION); - assertDrop(program, packet.array()); - put(packet, IPV6_DEST_ADDR_OFFSET, IPV6_ALL_ROUTERS_ADDRESS); - assertDrop(program, packet.array()); - apfFilter.shutdown(); } - @SmallTest + @LargeTest public void testApfFilterMulticast() throws Exception { final byte[] unicastIpv4Addr = {(byte)192,0,2,63}; final byte[] broadcastIpv4Addr = {(byte)192,0,2,(byte)255}; @@ -921,7 +910,7 @@ public class ApfTest extends AndroidTestCase { assertDrop(program, garpReply()); } - @SmallTest + @LargeTest public void testApfFilterArp() throws Exception { MockIpManagerCallback ipManagerCallback = new MockIpManagerCallback(); ApfFilter apfFilter = new TestApfFilter(ipManagerCallback, ALLOW_MULTICAST, mLog); @@ -1040,7 +1029,7 @@ public class ApfTest extends AndroidTestCase { ipManagerCallback.assertNoProgramUpdate(); } - @SmallTest + @LargeTest public void testApfFilterRa() throws Exception { MockIpManagerCallback ipManagerCallback = new MockIpManagerCallback(); TestApfFilter apfFilter = new TestApfFilter(ipManagerCallback, DROP_MULTICAST, mLog); @@ -1157,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. @@ -1213,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 d79c312a9edd..bc8baa12a45b 100644 --- a/tests/net/java/android/net/dhcp/DhcpPacketTest.java +++ b/services/tests/servicestests/src/android/net/dhcp/DhcpPacketTest.java @@ -473,7 +473,6 @@ public class DhcpPacketTest extends TestCase { assertEquals(Integer.toHexString(expected), Integer.toHexString(got)); } - @SmallTest public void testTruncatedOfferPackets() throws Exception { final byte[] packet = HexDump.hexStringToByteArray( // IP header. @@ -507,7 +506,6 @@ public class DhcpPacketTest extends TestCase { } } - @SmallTest public void testRandomPackets() throws Exception { final int maxRandomPacketSize = 512; final Random r = new Random(); diff --git a/tests/net/java/android/net/netlink/NetlinkErrorMessageTest.java b/services/tests/servicestests/src/android/net/netlink/NetlinkErrorMessageTest.java index 5deba27d80dc..e677475f5907 100644 --- a/tests/net/java/android/net/netlink/NetlinkErrorMessageTest.java +++ b/services/tests/servicestests/src/android/net/netlink/NetlinkErrorMessageTest.java @@ -24,7 +24,6 @@ import android.net.netlink.NetlinkConstants; import android.net.netlink.NetlinkErrorMessage; import android.net.netlink.NetlinkMessage; import android.net.netlink.StructNlMsgErr; -import android.test.suitebuilder.annotation.SmallTest; import android.util.Log; import java.nio.ByteBuffer; import java.nio.ByteOrder; @@ -54,7 +53,6 @@ public class NetlinkErrorMessageTest extends TestCase { public static final byte[] NLM_ERROR_OK = HexEncoding.decode(NLM_ERROR_OK_HEX.toCharArray(), false); - @SmallTest public void testParseNlmErrorOk() { final ByteBuffer byteBuffer = ByteBuffer.wrap(NLM_ERROR_OK); byteBuffer.order(ByteOrder.LITTLE_ENDIAN); // For testing. diff --git a/tests/net/java/android/net/netlink/NetlinkSocketTest.java b/services/tests/servicestests/src/android/net/netlink/NetlinkSocketTest.java index 78b3b704e786..c599fe3e5b76 100644 --- a/tests/net/java/android/net/netlink/NetlinkSocketTest.java +++ b/services/tests/servicestests/src/android/net/netlink/NetlinkSocketTest.java @@ -20,7 +20,6 @@ import android.net.netlink.NetlinkSocket; import android.net.netlink.RtNetlinkNeighborMessage; import android.net.netlink.StructNdMsg; import android.net.netlink.StructNlMsgHdr; -import android.test.suitebuilder.annotation.SmallTest; import android.system.ErrnoException; import android.system.NetlinkSocketAddress; import android.system.OsConstants; @@ -34,7 +33,6 @@ import junit.framework.TestCase; public class NetlinkSocketTest extends TestCase { private final String TAG = "NetlinkSocketTest"; - @SmallTest public void testBasicWorkingGetNeighborsQuery() throws Exception { NetlinkSocket s = new NetlinkSocket(OsConstants.NETLINK_ROUTE); assertNotNull(s); @@ -93,7 +91,6 @@ public class NetlinkSocketTest extends TestCase { s.close(); } - @SmallTest public void testRepeatedCloseCallsAreQuiet() throws Exception { // Create a working NetlinkSocket. NetlinkSocket s = new NetlinkSocket(OsConstants.NETLINK_ROUTE); diff --git a/tests/net/java/android/net/netlink/RtNetlinkNeighborMessageTest.java b/services/tests/servicestests/src/android/net/netlink/RtNetlinkNeighborMessageTest.java index 029758eb6e5b..19ee00036b61 100644 --- a/tests/net/java/android/net/netlink/RtNetlinkNeighborMessageTest.java +++ b/services/tests/servicestests/src/android/net/netlink/RtNetlinkNeighborMessageTest.java @@ -21,13 +21,12 @@ import android.net.netlink.NetlinkMessage; import android.net.netlink.RtNetlinkNeighborMessage; import android.net.netlink.StructNdMsg; import android.net.netlink.StructNlMsgHdr; -import android.test.suitebuilder.annotation.SmallTest; import android.system.OsConstants; import android.util.Log; import libcore.util.HexEncoding; -import java.net.Inet4Address; import java.net.InetAddress; +import java.net.Inet4Address; import java.net.UnknownHostException; import java.nio.ByteBuffer; import java.nio.ByteOrder; @@ -136,7 +135,6 @@ public class RtNetlinkNeighborMessageTest extends TestCase { public static final byte[] RTM_GETNEIGH_RESPONSE = HexEncoding.decode(RTM_GETNEIGH_RESPONSE_HEX.replaceAll(" ", "").toCharArray(), false); - @SmallTest public void testParseRtmDelNeigh() { final ByteBuffer byteBuffer = ByteBuffer.wrap(RTM_DELNEIGH); byteBuffer.order(ByteOrder.LITTLE_ENDIAN); // For testing. @@ -163,7 +161,6 @@ public class RtNetlinkNeighborMessageTest extends TestCase { assertEquals(InetAddress.parseNumericAddress("192.168.159.254"), destination); } - @SmallTest public void testParseRtmNewNeigh() { final ByteBuffer byteBuffer = ByteBuffer.wrap(RTM_NEWNEIGH); byteBuffer.order(ByteOrder.LITTLE_ENDIAN); // For testing. @@ -190,7 +187,6 @@ public class RtNetlinkNeighborMessageTest extends TestCase { assertEquals(InetAddress.parseNumericAddress("fe80::86c9:b2ff:fe6a:ed4b"), destination); } - @SmallTest public void testParseRtmGetNeighResponse() { final ByteBuffer byteBuffer = ByteBuffer.wrap(RTM_GETNEIGH_RESPONSE); byteBuffer.order(ByteOrder.LITTLE_ENDIAN); // For testing. @@ -215,7 +211,6 @@ public class RtNetlinkNeighborMessageTest extends TestCase { assertEquals(14, messageCount); } - @SmallTest public void testCreateRtmNewNeighMessage() { final int seqNo = 2635; final int ifIndex = 14; 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 d62c30da583d..4af1cf1a0df8 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java @@ -68,15 +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; @@ -90,7 +89,6 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.function.BooleanSupplier; /** * Tests for {@link ConnectivityService}. @@ -195,7 +193,6 @@ public class ConnectivityServiceTest extends AndroidTestCase { } // Tests that IdleableHandlerThread works as expected. - @SmallTest public void testIdleableHandlerThread() { final int attempts = 50; // Causes the test to take about 200ms on bullhead-eng. @@ -218,21 +215,8 @@ public class ConnectivityServiceTest extends AndroidTestCase { mService.waitForIdle(); assertEquals(i, mCm.getNetworkCapabilities(n).getSignalStrength()); } - } - - @SmallTest - @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()) { @@ -252,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; @@ -308,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. @@ -397,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() { @@ -408,10 +391,6 @@ public class ConnectivityServiceTest extends AndroidTestCase { return new Network(mNetworkAgent.netId); } - public ConditionVariable getPreventReconnectReceived() { - return mPreventReconnectReceived; - } - public ConditionVariable getDisconnectedCV() { return mDisconnected; } @@ -618,13 +597,12 @@ public class ConnectivityServiceTest extends AndroidTestCase { @Override protected CaptivePortalProbeResult isCaptivePortal() { - if (!mIsCaptivePortalCheckEnabled) { return new CaptivePortalProbeResult(204); } return new CaptivePortalProbeResult(gen204ProbeResult, gen204ProbeRedirectUrl, null); } } private class WrappedAvoidBadWifiTracker extends AvoidBadWifiTracker { - public volatile boolean configRestrictsAvoidBadWifi; + public boolean configRestrictsAvoidBadWifi; public WrappedAvoidBadWifiTracker(Context c, Handler h, Runnable r) { super(c, h, r); @@ -729,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(); } } @@ -762,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 { @@ -841,7 +819,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { return cv; } - @SmallTest + @LargeTest public void testLingering() throws Exception { verifyNoNetwork(); mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); @@ -881,7 +859,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { verifyNoNetwork(); } - @SmallTest + @LargeTest public void testValidatedCellularOutscoresUnvalidatedWiFi() throws Exception { // Test bringing up unvalidated WiFi mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); @@ -916,7 +894,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { verifyNoNetwork(); } - @SmallTest + @LargeTest public void testUnvalidatedWifiOutscoresUnvalidatedCellular() throws Exception { // Test bringing up unvalidated cellular. mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); @@ -942,7 +920,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { verifyNoNetwork(); } - @SmallTest + @LargeTest public void testUnlingeringDoesNotValidate() throws Exception { // Test bringing up unvalidated WiFi. mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); @@ -970,7 +948,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { NET_CAPABILITY_VALIDATED)); } - @SmallTest + @LargeTest public void testCellularOutscoresWeakWifi() throws Exception { // Test bringing up validated cellular. mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); @@ -996,7 +974,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { verifyActiveNetwork(TRANSPORT_WIFI); } - @SmallTest + @LargeTest public void testReapingNetwork() throws Exception { // Test bringing up WiFi without NET_CAPABILITY_INTERNET. // Expect it to be torn down immediately because it satisfies no requests. @@ -1029,7 +1007,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { waitFor(cv); } - @SmallTest + @LargeTest public void testCellularFallback() throws Exception { // Test bringing up validated cellular. mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); @@ -1067,7 +1045,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { verifyActiveNetwork(TRANSPORT_WIFI); } - @SmallTest + @LargeTest public void testWiFiFallback() throws Exception { // Test bringing up unvalidated WiFi. mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); @@ -1099,8 +1077,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { NETWORK_CAPABILITIES, LINK_PROPERTIES, LOSING, - LOST, - UNAVAILABLE + LOST } /** @@ -1141,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 */); } @@ -1194,7 +1166,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { } } - @SmallTest + @LargeTest public void testStateChangeNetworkCallbacks() throws Exception { final TestNetworkCallback genericNetworkCallback = new TestNetworkCallback(); final TestNetworkCallback wifiNetworkCallback = new TestNetworkCallback(); @@ -1577,7 +1549,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { handlerThread.quit(); } - @SmallTest + @LargeTest public void testNetworkFactoryRequests() throws Exception { tryNetworkFactoryRequests(NET_CAPABILITY_MMS); tryNetworkFactoryRequests(NET_CAPABILITY_SUPL); @@ -1597,7 +1569,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { // Skipping VALIDATED and CAPTIVE_PORTAL as they're disallowed. } - @SmallTest + @LargeTest public void testNoMutableNetworkRequests() throws Exception { PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, new Intent("a"), 0); NetworkRequest.Builder builder = new NetworkRequest.Builder(); @@ -1622,7 +1594,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { } catch (IllegalArgumentException expected) {} } - @SmallTest + @LargeTest public void testMMSonWiFi() throws Exception { // Test bringing up cellular without MMS NetworkRequest gets reaped mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); @@ -1657,7 +1629,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { verifyActiveNetwork(TRANSPORT_WIFI); } - @SmallTest + @LargeTest public void testMMSonCell() throws Exception { // Test bringing up cellular without MMS mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); @@ -1683,7 +1655,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { verifyActiveNetwork(TRANSPORT_CELLULAR); } - @SmallTest + @LargeTest public void testCaptivePortal() { final TestNetworkCallback captivePortalCallback = new TestNetworkCallback(); final NetworkRequest captivePortalRequest = new NetworkRequest.Builder() @@ -1733,47 +1705,6 @@ public class ConnectivityServiceTest extends AndroidTestCase { } @SmallTest - 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; @@ -1803,7 +1734,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { execptionCalled); } - @SmallTest + @LargeTest public void testRegisterDefaultNetworkCallback() throws Exception { final TestNetworkCallback defaultNetworkCallback = new TestNetworkCallback(); mCm.registerDefaultNetworkCallback(defaultNetworkCallback); @@ -1864,7 +1795,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { } } - @SmallTest + @LargeTest public void testRequestCallbackUpdates() throws Exception { // File a network request for mobile. final TestNetworkCallback cellNetworkCallback = new TestRequestUpdateCallback(); @@ -1913,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); @@ -1999,7 +1925,6 @@ public class ConnectivityServiceTest extends AndroidTestCase { @SmallTest public void testRequestBenchmark() throws Exception { - // TODO: turn this unit test into a real benchmarking test. // Benchmarks connecting and switching performance in the presence of a large number of // NetworkRequests. // 1. File NUM_REQUESTS requests. @@ -2013,80 +1938,61 @@ public class ConnectivityServiceTest extends AndroidTestCase { final CountDownLatch availableLatch = new CountDownLatch(NUM_REQUESTS); final CountDownLatch losingLatch = new CountDownLatch(NUM_REQUESTS); + final int REGISTER_TIME_LIMIT_MS = 100; + long startTime = System.currentTimeMillis(); for (int i = 0; i < NUM_REQUESTS; i++) { callbacks[i] = new NetworkCallback() { @Override public void onAvailable(Network n) { availableLatch.countDown(); } @Override public void onLosing(Network n, int t) { losingLatch.countDown(); } }; + mCm.registerNetworkCallback(request, callbacks[i]); } + long timeTaken = System.currentTimeMillis() - startTime; + String msg = String.format("Register %d callbacks: %dms, acceptable %dms", + NUM_REQUESTS, timeTaken, REGISTER_TIME_LIMIT_MS); + Log.d(TAG, msg); + assertTrue(msg, timeTaken < REGISTER_TIME_LIMIT_MS); - final int REGISTER_TIME_LIMIT_MS = 180; - assertTimeLimit("Registering callbacks", REGISTER_TIME_LIMIT_MS, () -> { - for (NetworkCallback cb : callbacks) { - mCm.registerNetworkCallback(request, cb); - } - }); - - final int CONNECT_TIME_LIMIT_MS = 40; + final int CONNECT_TIME_LIMIT_MS = 30; mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); // Don't request that the network validate, because otherwise connect() will block until // the network gets NET_CAPABILITY_VALIDATED, after all the callbacks below have fired, // and we won't actually measure anything. mCellNetworkAgent.connect(false); - - long onAvailableDispatchingDuration = durationOf(() -> { - if (!awaitLatch(availableLatch, CONNECT_TIME_LIMIT_MS)) { - fail(String.format("Only dispatched %d/%d onAvailable callbacks in %dms", - NUM_REQUESTS - availableLatch.getCount(), NUM_REQUESTS, - CONNECT_TIME_LIMIT_MS)); - } - }); + startTime = System.currentTimeMillis(); + if (!availableLatch.await(CONNECT_TIME_LIMIT_MS, TimeUnit.MILLISECONDS)) { + fail(String.format("Only dispatched %d/%d onAvailable callbacks in %dms", + NUM_REQUESTS - availableLatch.getCount(), NUM_REQUESTS, + CONNECT_TIME_LIMIT_MS)); + } + timeTaken = System.currentTimeMillis() - startTime; Log.d(TAG, String.format("Connect, %d callbacks: %dms, acceptable %dms", - NUM_REQUESTS, onAvailableDispatchingDuration, CONNECT_TIME_LIMIT_MS)); + NUM_REQUESTS, timeTaken, CONNECT_TIME_LIMIT_MS)); - final int SWITCH_TIME_LIMIT_MS = 40; + final int SWITCH_TIME_LIMIT_MS = 30; mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); // Give wifi a high enough score that we'll linger cell when wifi comes up. mWiFiNetworkAgent.adjustScore(40); mWiFiNetworkAgent.connect(false); - - long onLostDispatchingDuration = durationOf(() -> { - if (!awaitLatch(losingLatch, SWITCH_TIME_LIMIT_MS)) { - fail(String.format("Only dispatched %d/%d onLosing callbacks in %dms", - NUM_REQUESTS - losingLatch.getCount(), NUM_REQUESTS, SWITCH_TIME_LIMIT_MS)); - } - }); + startTime = System.currentTimeMillis(); + if (!losingLatch.await(SWITCH_TIME_LIMIT_MS, TimeUnit.MILLISECONDS)) { + fail(String.format("Only dispatched %d/%d onLosing callbacks in %dms", + NUM_REQUESTS - losingLatch.getCount(), NUM_REQUESTS, SWITCH_TIME_LIMIT_MS)); + } + timeTaken = System.currentTimeMillis() - startTime; Log.d(TAG, String.format("Linger, %d callbacks: %dms, acceptable %dms", - NUM_REQUESTS, onLostDispatchingDuration, SWITCH_TIME_LIMIT_MS)); + NUM_REQUESTS, timeTaken, SWITCH_TIME_LIMIT_MS)); final int UNREGISTER_TIME_LIMIT_MS = 10; - assertTimeLimit("Unregistering callbacks", UNREGISTER_TIME_LIMIT_MS, () -> { - for (NetworkCallback cb : callbacks) { - mCm.unregisterNetworkCallback(cb); - } - }); - } - - private long durationOf(Runnable fn) { - long startTime = SystemClock.elapsedRealtime(); - fn.run(); - return SystemClock.elapsedRealtime() - startTime; - } - - private void assertTimeLimit(String descr, long timeLimit, Runnable fn) { - long timeTaken = durationOf(fn); - String msg = String.format("%s: took %dms, limit was %dms", descr, timeTaken, timeLimit); + startTime = System.currentTimeMillis(); + for (int i = 0; i < NUM_REQUESTS; i++) { + mCm.unregisterNetworkCallback(callbacks[i]); + } + timeTaken = System.currentTimeMillis() - startTime; + msg = String.format("Unregister %d callbacks: %dms, acceptable %dms", + NUM_REQUESTS, timeTaken, UNREGISTER_TIME_LIMIT_MS); Log.d(TAG, msg); - assertTrue(msg, timeTaken <= timeLimit); - } - - private boolean awaitLatch(CountDownLatch l, long timeoutMs) { - try { - if (l.await(timeoutMs, TimeUnit.MILLISECONDS)) { - return true; - } - } catch (InterruptedException e) {} - return false; + assertTrue(msg, timeTaken < UNREGISTER_TIME_LIMIT_MS); } @SmallTest @@ -2167,7 +2073,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { tracker.reevaluate(); mService.waitForIdle(); String msg = String.format("config=false, setting=%s", values[i]); - assertEventuallyTrue(() -> mService.avoidBadWifi(), 50); + assertTrue(msg, mService.avoidBadWifi()); assertFalse(msg, tracker.shouldNotifyWifiUnvalidated()); } @@ -2176,19 +2082,19 @@ public class ConnectivityServiceTest extends AndroidTestCase { Settings.Global.putInt(cr, settingName, 0); tracker.reevaluate(); mService.waitForIdle(); - assertEventuallyTrue(() -> !mService.avoidBadWifi(), 50); + assertFalse(mService.avoidBadWifi()); assertFalse(tracker.shouldNotifyWifiUnvalidated()); Settings.Global.putInt(cr, settingName, 1); tracker.reevaluate(); mService.waitForIdle(); - assertEventuallyTrue(() -> mService.avoidBadWifi(), 50); + assertTrue(mService.avoidBadWifi()); assertFalse(tracker.shouldNotifyWifiUnvalidated()); Settings.Global.putString(cr, settingName, null); tracker.reevaluate(); mService.waitForIdle(); - assertEventuallyTrue(() -> !mService.avoidBadWifi(), 50); + assertFalse(mService.avoidBadWifi()); assertTrue(tracker.shouldNotifyWifiUnvalidated()); } @@ -2315,107 +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(); - } - - public void assertEventuallyTrue(BooleanSupplier fn, long maxWaitingTimeMs) throws Exception { - long start = SystemClock.elapsedRealtime(); - while (SystemClock.elapsedRealtime() <= start + maxWaitingTimeMs) { - if (fn.getAsBoolean()) { - return; - } - Thread.sleep(10); - } - assertTrue(fn.getAsBoolean()); - } - private static class TestKeepaliveCallback extends PacketKeepaliveCallback { public static enum CallbackType { ON_STARTED, ON_STOPPED, ON_ERROR }; @@ -2505,7 +2310,6 @@ public class ConnectivityServiceTest extends AndroidTestCase { return mWiFiNetworkAgent.getNetwork(); } - @SmallTest public void testPacketKeepalives() throws Exception { InetAddress myIPv4 = InetAddress.getByName("192.0.2.129"); InetAddress notMyIPv4 = InetAddress.getByName("192.0.2.35"); @@ -2821,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 a545af96da70..1a943a36c085 100644 --- a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java @@ -16,12 +16,17 @@ package com.android.server; +import static android.content.Intent.ACTION_UID_REMOVED; +import static android.content.Intent.EXTRA_UID; import static android.net.ConnectivityManager.CONNECTIVITY_ACTION; import static android.net.ConnectivityManager.TYPE_WIFI; +import static android.net.NetworkPolicy.CYCLE_NONE; import static android.net.NetworkPolicy.LIMIT_DISABLED; import static android.net.NetworkPolicy.WARNING_DISABLED; import static android.net.NetworkPolicyManager.POLICY_NONE; import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND; +import static android.net.NetworkPolicyManager.RULE_ALLOW_ALL; +import static android.net.NetworkPolicyManager.RULE_REJECT_METERED; import static android.net.NetworkPolicyManager.computeLastCycleBoundary; import static android.net.NetworkPolicyManager.computeNextCycleBoundary; import static android.net.TrafficStats.KB_IN_BYTES; @@ -29,42 +34,28 @@ import static android.net.TrafficStats.MB_IN_BYTES; import static android.text.format.DateUtils.DAY_IN_MILLIS; import static android.text.format.DateUtils.MINUTE_IN_MILLIS; import static android.text.format.Time.TIMEZONE_UTC; - import static com.android.server.net.NetworkPolicyManagerService.TYPE_LIMIT; import static com.android.server.net.NetworkPolicyManagerService.TYPE_LIMIT_SNOOZED; import static com.android.server.net.NetworkPolicyManagerService.TYPE_WARNING; +import static org.easymock.EasyMock.anyInt; +import static org.easymock.EasyMock.anyLong; +import static org.easymock.EasyMock.aryEq; +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 static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -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.anyBoolean; -import static org.mockito.Matchers.anyInt; -import static org.mockito.Matchers.anyLong; -import static org.mockito.Matchers.anyString; -import static org.mockito.Matchers.eq; -import static org.mockito.Matchers.isA; -import static org.mockito.Mockito.atLeastOnce; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import android.app.ActivityManager; import android.app.IActivityManager; import android.app.INotificationManager; -import android.app.IUidObserver; +import android.app.IProcessObserver; import android.app.Notification; -import android.app.usage.UsageStatsManagerInternal; -import android.content.Context; import android.content.Intent; -import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.Signature; +import android.net.ConnectivityManager; import android.net.IConnectivityManager; import android.net.INetworkManagementEventObserver; import android.net.INetworkPolicyListener; @@ -78,48 +69,39 @@ import android.net.NetworkStats; import android.net.NetworkTemplate; import android.os.Binder; import android.os.INetworkManagementService; -import android.os.PowerManagerInternal; +import android.os.MessageQueue.IdleHandler; import android.os.UserHandle; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; +import android.test.AndroidTestCase; +import android.test.mock.MockPackageManager; +import android.test.suitebuilder.annotation.LargeTest; +import android.test.suitebuilder.annotation.Suppress; import android.text.format.Time; -import android.util.Log; import android.util.TrustedTime; -import com.android.internal.util.test.BroadcastInterceptingContext; -import com.android.server.net.NetworkPolicyManagerInternal; import com.android.server.net.NetworkPolicyManagerService; - -import libcore.io.IoUtils; - import com.google.common.util.concurrent.AbstractFuture; -import org.junit.After; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; +import org.easymock.Capture; +import org.easymock.EasyMock; +import org.easymock.IAnswer; import java.io.File; -import java.util.ArrayList; +import java.util.Calendar; import java.util.LinkedHashSet; -import java.util.List; -import java.util.concurrent.CountDownLatch; +import java.util.TimeZone; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import java.util.logging.Handler; + +import libcore.io.IoUtils; /** * Tests for {@link NetworkPolicyManagerService}. */ -@RunWith(AndroidJUnit4.class) -public class NetworkPolicyManagerServiceTest { +@LargeTest +public class NetworkPolicyManagerServiceTest extends AndroidTestCase { private static final String TAG = "NetworkPolicyManagerServiceTest"; private static final long TEST_START = 1194220800000L; @@ -131,19 +113,19 @@ public class NetworkPolicyManagerServiceTest { private BroadcastInterceptingContext mServiceContext; private File mPolicyDir; - private @Mock IActivityManager mActivityManager; - private @Mock INetworkStatsService mStatsService; - private @Mock INetworkManagementService mNetworkManager; - private @Mock TrustedTime mTime; - private @Mock IConnectivityManager mConnManager; - private @Mock INotificationManager mNotifManager; - private @Mock PackageManager mPackageManager; + private IActivityManager mActivityManager; + private INetworkStatsService mStatsService; + private INetworkManagementService mNetworkManager; + private INetworkPolicyListener mPolicyListener; + private TrustedTime mTime; + private IConnectivityManager mConnManager; + private INotificationManager mNotifManager; - private IUidObserver mUidObserver; + private NetworkPolicyManagerService mService; + private IProcessObserver mProcessObserver; private INetworkManagementEventObserver mNetworkObserver; - private NetworkPolicyListenerAnswer mPolicyListener; - private NetworkPolicyManagerService mService; + private Binder mStubBinder = new Binder(); private long mStartTime; private long mElapsedRealtime; @@ -156,30 +138,39 @@ public class NetworkPolicyManagerServiceTest { private static final int UID_A = UserHandle.getUid(USER_ID, APP_ID_A); private static final int UID_B = UserHandle.getUid(USER_ID, APP_ID_B); - private static final String PKG_NAME_A = "name.is.A,pkg.A"; - - @BeforeClass - public static void registerLocalServices() { - addLocalServiceMock(PowerManagerInternal.class); - addLocalServiceMock(DeviceIdleController.LocalService.class); - final UsageStatsManagerInternal usageStats = - addLocalServiceMock(UsageStatsManagerInternal.class); - when(usageStats.getIdleUidsForUser(anyInt())).thenReturn(new int[]{}); - } + private static final int PID_1 = 400; + private static final int PID_2 = 401; + private static final int PID_3 = 402; - @Before - public void callSystemReady() throws Exception { - MockitoAnnotations.initMocks(this); - - final Context context = InstrumentationRegistry.getContext(); + public void _setUp() throws Exception { + super.setUp(); setCurrentTimeMillis(TEST_START); // intercept various broadcasts, and pretend that uids have packages - mServiceContext = new BroadcastInterceptingContext(context) { + mServiceContext = new BroadcastInterceptingContext(getContext()) { @Override public PackageManager getPackageManager() { - return mPackageManager; + return new MockPackageManager() { + @Override + public String[] getPackagesForUid(int uid) { + return new String[] { "com.example" }; + } + + @Override + public PackageInfo getPackageInfo(String packageName, int flags) { + final PackageInfo info = new PackageInfo(); + final Signature signature; + if ("android".equals(packageName)) { + signature = new Signature("F00D"); + } else { + signature = new Signature("DEAD"); + } + info.signatures = new Signature[] { signature }; + return info; + } + + }; } @Override @@ -188,112 +179,229 @@ public class NetworkPolicyManagerServiceTest { } }; - mPolicyDir = context.getFilesDir(); + mPolicyDir = getContext().getFilesDir(); if (mPolicyDir.exists()) { IoUtils.deleteContents(mPolicyDir); } - doAnswer(new Answer<Void>() { - - @Override - public Void answer(InvocationOnMock invocation) throws Throwable { - mUidObserver = (IUidObserver) invocation.getArguments()[0]; - Log.d(TAG, "set mUidObserver to " + mUidObserver); - return null; - } - }).when(mActivityManager).registerUidObserver(any(), anyInt()); + mActivityManager = createMock(IActivityManager.class); + mStatsService = createMock(INetworkStatsService.class); + mNetworkManager = createMock(INetworkManagementService.class); + mPolicyListener = createMock(INetworkPolicyListener.class); + mTime = createMock(TrustedTime.class); + mConnManager = createMock(IConnectivityManager.class); + mNotifManager = createMock(INotificationManager.class); - mService = new NetworkPolicyManagerService(mServiceContext, mActivityManager, mStatsService, - mNetworkManager, mTime, mPolicyDir, true); + mService = new NetworkPolicyManagerService(mServiceContext, mActivityManager, + mStatsService, mNetworkManager, mTime, mPolicyDir, true); mService.bindConnectivityManager(mConnManager); mService.bindNotificationManager(mNotifManager); - mPolicyListener = new NetworkPolicyListenerAnswer(mService); - // Sets some common expectations. - when(mPackageManager.getPackageInfo(anyString(), anyInt())).thenAnswer( - new Answer<PackageInfo>() { + // RemoteCallbackList needs a binder to use as key + expect(mPolicyListener.asBinder()).andReturn(mStubBinder).atLeastOnce(); + replay(); + mService.registerListener(mPolicyListener); + verifyAndReset(); - @Override - public PackageInfo answer(InvocationOnMock invocation) throws Throwable { - final String packageName = (String) invocation.getArguments()[0]; - final PackageInfo info = new PackageInfo(); - final Signature signature; - if ("android".equals(packageName)) { - signature = new Signature("F00D"); - } else { - signature = new Signature("DEAD"); - } - info.signatures = new Signature[] { - signature - }; - return info; - } - }); - when(mPackageManager.getApplicationInfoAsUser(anyString(), anyInt(), anyInt())) - .thenReturn(new ApplicationInfo()); - when(mPackageManager.getPackagesForUid(UID_A)).thenReturn(new String[] {PKG_NAME_A}); - when(mNetworkManager.isBandwidthControlEnabled()).thenReturn(true); + // catch IProcessObserver during systemReady() + final Capture<IProcessObserver> processObserver = new Capture<IProcessObserver>(); + mActivityManager.registerProcessObserver(capture(processObserver)); + expectLastCall().atLeastOnce(); + + // catch INetworkManagementEventObserver during systemReady() + final Capture<INetworkManagementEventObserver> networkObserver = new Capture< + INetworkManagementEventObserver>(); + mNetworkManager.registerObserver(capture(networkObserver)); + expectLastCall().atLeastOnce(); + + expect(mNetworkManager.isBandwidthControlEnabled()).andReturn(true).atLeastOnce(); expectCurrentTime(); - // Prepare NPMS. + replay(); mService.systemReady(); + verifyAndReset(); - // catch INetworkManagementEventObserver during systemReady() - ArgumentCaptor<INetworkManagementEventObserver> networkObserver = - ArgumentCaptor.forClass(INetworkManagementEventObserver.class); - verify(mNetworkManager).registerObserver(networkObserver.capture()); + mProcessObserver = processObserver.getValue(); mNetworkObserver = networkObserver.getValue(); + } - @After - public void removeFiles() throws Exception { + public void _tearDown() throws Exception { for (File file : mPolicyDir.listFiles()) { file.delete(); } - } - @After - public void unregisterLocalServices() throws Exception { - // Registered by NetworkPolicyManagerService's constructor. - LocalServices.removeServiceForTest(NetworkPolicyManagerInternal.class); - } + mServiceContext = null; + mPolicyDir = null; - // NOTE: testPolicyChangeTriggersListener() and testUidForeground() are too superficial, they - // don't check for side-effects (like calls to NetworkManagementService) neither cover all - // different modes (Data Saver, Battery Saver, Doze, App idle, etc...). - // These scenarios are extensively tested on CTS' HostsideRestrictBackgroundNetworkTests. + mActivityManager = null; + mStatsService = null; + mPolicyListener = null; + mTime = null; - @Test - public void testPolicyChangeTriggersListener() throws Exception { - mPolicyListener.expect().onRestrictBackgroundBlacklistChanged(anyInt(), anyBoolean()); + mService = null; + mProcessObserver = null; + + super.tearDown(); + } + @Suppress + public void testPolicyChangeTriggersBroadcast() throws Exception { mService.setUidPolicy(APP_ID_A, POLICY_NONE); + + // change background policy and expect broadcast + final Future<Intent> backgroundChanged = mServiceContext.nextBroadcastIntent( + ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_CHANGED); + mService.setUidPolicy(APP_ID_A, POLICY_REJECT_METERED_BACKGROUND); - mPolicyListener.waitAndVerify().onRestrictBackgroundBlacklistChanged(APP_ID_A, true); + backgroundChanged.get(); } - @Test - public void testUidForeground() throws Exception { - // push all uids into background - mUidObserver.onUidStateChanged(UID_A, ActivityManager.PROCESS_STATE_SERVICE); - mUidObserver.onUidStateChanged(UID_B, ActivityManager.PROCESS_STATE_SERVICE); + @Suppress + public void testPidForegroundCombined() throws Exception { + IdleFuture idle; + + // push all uid into background + idle = expectIdle(); + mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, false); + mProcessObserver.onForegroundActivitiesChanged(PID_2, UID_A, false); + mProcessObserver.onForegroundActivitiesChanged(PID_3, UID_B, false); + idle.get(); assertFalse(mService.isUidForeground(UID_A)); assertFalse(mService.isUidForeground(UID_B)); - // push one of the uids into foreground - mUidObserver.onUidStateChanged(UID_A, ActivityManager.PROCESS_STATE_TOP); + // push one of the shared pids into foreground + idle = expectIdle(); + mProcessObserver.onForegroundActivitiesChanged(PID_2, UID_A, true); + idle.get(); assertTrue(mService.isUidForeground(UID_A)); assertFalse(mService.isUidForeground(UID_B)); // and swap another uid into foreground - mUidObserver.onUidStateChanged(UID_A, ActivityManager.PROCESS_STATE_SERVICE); - mUidObserver.onUidStateChanged(UID_B, ActivityManager.PROCESS_STATE_TOP); + idle = expectIdle(); + mProcessObserver.onForegroundActivitiesChanged(PID_2, UID_A, false); + mProcessObserver.onForegroundActivitiesChanged(PID_3, UID_B, true); + idle.get(); assertFalse(mService.isUidForeground(UID_A)); assertTrue(mService.isUidForeground(UID_B)); + + // push both pid into foreground + idle = expectIdle(); + mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, true); + mProcessObserver.onForegroundActivitiesChanged(PID_2, UID_A, true); + idle.get(); + assertTrue(mService.isUidForeground(UID_A)); + + // pull one out, should still be foreground + idle = expectIdle(); + mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, false); + idle.get(); + assertTrue(mService.isUidForeground(UID_A)); + + // pull final pid out, should now be background + idle = expectIdle(); + mProcessObserver.onForegroundActivitiesChanged(PID_2, UID_A, false); + idle.get(); + assertFalse(mService.isUidForeground(UID_A)); + } + + @Suppress + public void testPolicyNone() throws Exception { + Future<Void> future; + + expectSetUidMeteredNetworkBlacklist(UID_A, false); + expectSetUidForeground(UID_A, true); + future = expectRulesChanged(UID_A, RULE_ALLOW_ALL); + replay(); + mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, true); + future.get(); + verifyAndReset(); + + // POLICY_NONE should RULE_ALLOW in foreground + expectSetUidMeteredNetworkBlacklist(UID_A, false); + expectSetUidForeground(UID_A, true); + future = expectRulesChanged(UID_A, RULE_ALLOW_ALL); + replay(); + mService.setUidPolicy(APP_ID_A, POLICY_NONE); + future.get(); + verifyAndReset(); + + // POLICY_NONE should RULE_ALLOW in background + expectSetUidMeteredNetworkBlacklist(UID_A, false); + expectSetUidForeground(UID_A, false); + future = expectRulesChanged(UID_A, RULE_ALLOW_ALL); + replay(); + mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, false); + future.get(); + verifyAndReset(); + } + + @Suppress + public void testPolicyReject() throws Exception { + Future<Void> future; + + // POLICY_REJECT should RULE_ALLOW in background + expectSetUidMeteredNetworkBlacklist(UID_A, true); + expectSetUidForeground(UID_A, false); + future = expectRulesChanged(UID_A, RULE_REJECT_METERED); + replay(); + mService.setUidPolicy(APP_ID_A, POLICY_REJECT_METERED_BACKGROUND); + future.get(); + verifyAndReset(); + + // POLICY_REJECT should RULE_ALLOW in foreground + expectSetUidMeteredNetworkBlacklist(UID_A, false); + expectSetUidForeground(UID_A, true); + future = expectRulesChanged(UID_A, RULE_ALLOW_ALL); + replay(); + mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, true); + future.get(); + verifyAndReset(); + + // POLICY_REJECT should RULE_REJECT in background + expectSetUidMeteredNetworkBlacklist(UID_A, true); + expectSetUidForeground(UID_A, false); + future = expectRulesChanged(UID_A, RULE_REJECT_METERED); + replay(); + mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, false); + future.get(); + verifyAndReset(); + } + + @Suppress + public void testPolicyRejectAddRemove() throws Exception { + Future<Void> future; + + // POLICY_NONE should have RULE_ALLOW in background + expectSetUidMeteredNetworkBlacklist(UID_A, false); + expectSetUidForeground(UID_A, false); + future = expectRulesChanged(UID_A, RULE_ALLOW_ALL); + replay(); + mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, false); + mService.setUidPolicy(APP_ID_A, POLICY_NONE); + future.get(); + verifyAndReset(); + + // adding POLICY_REJECT should cause RULE_REJECT + expectSetUidMeteredNetworkBlacklist(UID_A, true); + expectSetUidForeground(UID_A, false); + future = expectRulesChanged(UID_A, RULE_REJECT_METERED); + replay(); + mService.setUidPolicy(APP_ID_A, POLICY_REJECT_METERED_BACKGROUND); + future.get(); + verifyAndReset(); + + // removing POLICY_REJECT should return us to RULE_ALLOW + expectSetUidMeteredNetworkBlacklist(UID_A, false); + expectSetUidForeground(UID_A, false); + future = expectRulesChanged(UID_A, RULE_ALLOW_ALL); + replay(); + mService.setUidPolicy(APP_ID_A, POLICY_NONE); + future.get(); + verifyAndReset(); } - @Test public void testLastCycleBoundaryThisMonth() throws Exception { // assume cycle day of "5th", which should be in same month final long currentTime = parseTime("2007-11-14T00:00:00.000Z"); @@ -305,7 +413,6 @@ public class NetworkPolicyManagerServiceTest { assertTimeEquals(expectedCycle, actualCycle); } - @Test public void testLastCycleBoundaryLastMonth() throws Exception { // assume cycle day of "20th", which should be in last month final long currentTime = parseTime("2007-11-14T00:00:00.000Z"); @@ -317,7 +424,6 @@ public class NetworkPolicyManagerServiceTest { assertTimeEquals(expectedCycle, actualCycle); } - @Test public void testLastCycleBoundaryThisMonthFebruary() throws Exception { // assume cycle day of "30th" in february; should go to january final long currentTime = parseTime("2007-02-14T00:00:00.000Z"); @@ -329,7 +435,6 @@ public class NetworkPolicyManagerServiceTest { assertTimeEquals(expectedCycle, actualCycle); } - @Test public void testLastCycleBoundaryLastMonthFebruary() throws Exception { // assume cycle day of "30th" in february, which should clamp final long currentTime = parseTime("2007-03-14T00:00:00.000Z"); @@ -341,7 +446,6 @@ public class NetworkPolicyManagerServiceTest { assertTimeEquals(expectedCycle, actualCycle); } - @Test public void testCycleBoundaryLeapYear() throws Exception { final NetworkPolicy policy = new NetworkPolicy( sTemplateWifi, 29, TIMEZONE_UTC, 1024L, 1024L, false); @@ -365,7 +469,6 @@ public class NetworkPolicyManagerServiceTest { computeNextCycleBoundary(parseTime("2007-03-14T00:00:00.000Z"), policy)); } - @Test public void testNextCycleTimezoneAfterUtc() throws Exception { // US/Central is UTC-6 final NetworkPolicy policy = new NetworkPolicy( @@ -374,7 +477,6 @@ public class NetworkPolicyManagerServiceTest { computeNextCycleBoundary(parseTime("2012-01-05T00:00:00.000Z"), policy)); } - @Test public void testNextCycleTimezoneBeforeUtc() throws Exception { // Israel is UTC+2 final NetworkPolicy policy = new NetworkPolicy( @@ -383,7 +485,6 @@ public class NetworkPolicyManagerServiceTest { computeNextCycleBoundary(parseTime("2012-01-05T00:00:00.000Z"), policy)); } - @Test public void testNextCycleSane() throws Exception { final NetworkPolicy policy = new NetworkPolicy( sTemplateWifi, 31, TIMEZONE_UTC, WARNING_DISABLED, LIMIT_DISABLED, false); @@ -399,7 +500,6 @@ public class NetworkPolicyManagerServiceTest { } } - @Test public void testLastCycleSane() throws Exception { final NetworkPolicy policy = new NetworkPolicy( sTemplateWifi, 31, TIMEZONE_UTC, WARNING_DISABLED, LIMIT_DISABLED, false); @@ -415,7 +515,6 @@ public class NetworkPolicyManagerServiceTest { } } - @Test public void testCycleTodayJanuary() throws Exception { final NetworkPolicy policy = new NetworkPolicy( sTemplateWifi, 14, "US/Pacific", 1024L, 1024L, false); @@ -435,7 +534,6 @@ public class NetworkPolicyManagerServiceTest { computeLastCycleBoundary(parseTime("2013-01-14T15:11:00.000-08:00"), policy)); } - @Test public void testLastCycleBoundaryDST() throws Exception { final long currentTime = parseTime("1989-01-02T07:30:00.000"); final long expectedCycle = parseTime("1988-12-03T02:00:00.000Z"); @@ -446,7 +544,6 @@ public class NetworkPolicyManagerServiceTest { assertTimeEquals(expectedCycle, actualCycle); } - @Test public void testLastCycleBoundaryJanuaryDST() throws Exception { final long currentTime = parseTime("1989-01-26T21:00:00.000Z"); final long expectedCycle = parseTime("1989-01-01T01:59:59.000Z"); @@ -457,10 +554,11 @@ public class NetworkPolicyManagerServiceTest { assertTimeEquals(expectedCycle, actualCycle); } - @Test + @Suppress public void testNetworkPolicyAppliedCycleLastMonth() throws Exception { NetworkState[] state = null; NetworkStats stats = null; + Future<Void> future; final long TIME_FEB_15 = 1171497600000L; final long TIME_MAR_10 = 1173484800000L; @@ -471,40 +569,75 @@ public class NetworkPolicyManagerServiceTest { // first, pretend that wifi network comes online. no policy active, // which means we shouldn't push limit to interface. state = new NetworkState[] { buildWifi() }; - when(mConnManager.getAllNetworkState()).thenReturn(state); + expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce(); expectCurrentTime(); + expectClearNotifications(); + expectAdvisePersistThreshold(); + future = expectMeteredIfacesChanged(); - mPolicyListener.expect().onMeteredIfacesChanged(any()); + replay(); mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION)); - mPolicyListener.waitAndVerify().onMeteredIfacesChanged(any()); + future.get(); + verifyAndReset(); // now change cycle to be on 15th, and test in early march, to verify we // pick cycle day in previous month. - when(mConnManager.getAllNetworkState()).thenReturn(state); + expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce(); expectCurrentTime(); // pretend that 512 bytes total have happened stats = new NetworkStats(getElapsedRealtime(), 1) .addIfaceValues(TEST_IFACE, 256L, 2L, 256L, 2L); - when(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15, TIME_MAR_10)) - .thenReturn(stats.getTotalBytes()); + expect(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15, TIME_MAR_10)) + .andReturn(stats.getTotalBytes()).atLeastOnce(); + expectPolicyDataEnable(TYPE_WIFI, true); - mPolicyListener.expect().onMeteredIfacesChanged(any()); + // TODO: consider making strongly ordered mock + expectRemoveInterfaceQuota(TEST_IFACE); + expectSetInterfaceQuota(TEST_IFACE, (2 * MB_IN_BYTES) - 512); + + expectClearNotifications(); + expectAdvisePersistThreshold(); + future = expectMeteredIfacesChanged(TEST_IFACE); + + replay(); setNetworkPolicies(new NetworkPolicy( sTemplateWifi, CYCLE_DAY, TIMEZONE_UTC, 1 * MB_IN_BYTES, 2 * MB_IN_BYTES, false)); - mPolicyListener.waitAndVerify().onMeteredIfacesChanged(eq(new String[]{TEST_IFACE})); + future.get(); + verifyAndReset(); + } - // TODO: consider making strongly ordered mock - verifyPolicyDataEnable(TYPE_WIFI, true); - verifyRemoveInterfaceQuota(TEST_IFACE); - verifySetInterfaceQuota(TEST_IFACE, (2 * MB_IN_BYTES) - 512); + @Suppress + public void testUidRemovedPolicyCleared() throws Exception { + Future<Void> future; + + // POLICY_REJECT should RULE_REJECT in background + expectSetUidMeteredNetworkBlacklist(UID_A, true); + expectSetUidForeground(UID_A, false); + future = expectRulesChanged(UID_A, RULE_REJECT_METERED); + replay(); + mService.setUidPolicy(APP_ID_A, POLICY_REJECT_METERED_BACKGROUND); + future.get(); + verifyAndReset(); + + // uninstall should clear RULE_REJECT + expectSetUidMeteredNetworkBlacklist(UID_A, false); + expectSetUidForeground(UID_A, false); + future = expectRulesChanged(UID_A, RULE_ALLOW_ALL); + replay(); + final Intent intent = new Intent(ACTION_UID_REMOVED); + intent.putExtra(EXTRA_UID, UID_A); + mServiceContext.sendBroadcast(intent); + future.get(); + verifyAndReset(); } - @Test + @Suppress public void testOverWarningLimitNotification() throws Exception { NetworkState[] state = null; NetworkStats stats = null; - Future<String> tagFuture = null; + Future<Void> future; + Future<String> tagFuture; final long TIME_FEB_15 = 1171497600000L; final long TIME_MAR_10 = 1173484800000L; @@ -519,15 +652,20 @@ public class NetworkPolicyManagerServiceTest { { expectCurrentTime(); - when(mConnManager.getAllNetworkState()).thenReturn(state); - when(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15, - currentTimeMillis())).thenReturn(stats.getTotalBytes()); + expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce(); + expect(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15, currentTimeMillis())) + .andReturn(stats.getTotalBytes()).atLeastOnce(); + expectPolicyDataEnable(TYPE_WIFI, true); + + expectClearNotifications(); + expectAdvisePersistThreshold(); + future = expectMeteredIfacesChanged(); - mPolicyListener.expect().onMeteredIfacesChanged(any()); + replay(); setNetworkPolicies(new NetworkPolicy(sTemplateWifi, CYCLE_DAY, TIMEZONE_UTC, 1 * MB_IN_BYTES, 2 * MB_IN_BYTES, false)); - mPolicyListener.waitAndVerify().onMeteredIfacesChanged(any()); - verifyPolicyDataEnable(TYPE_WIFI, true); + future.get(); + verifyAndReset(); } // bring up wifi network @@ -538,17 +676,22 @@ public class NetworkPolicyManagerServiceTest { { expectCurrentTime(); - when(mConnManager.getAllNetworkState()).thenReturn(state); - when(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15, - currentTimeMillis())).thenReturn(stats.getTotalBytes()); + expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce(); + expect(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15, currentTimeMillis())) + .andReturn(stats.getTotalBytes()).atLeastOnce(); + expectPolicyDataEnable(TYPE_WIFI, true); - mPolicyListener.expect().onMeteredIfacesChanged(any()); - mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION)); - mPolicyListener.waitAndVerify().onMeteredIfacesChanged(eq(new String[]{TEST_IFACE})); + expectRemoveInterfaceQuota(TEST_IFACE); + expectSetInterfaceQuota(TEST_IFACE, 2 * MB_IN_BYTES); + + expectClearNotifications(); + expectAdvisePersistThreshold(); + future = expectMeteredIfacesChanged(TEST_IFACE); - verifyPolicyDataEnable(TYPE_WIFI, true); - verifyRemoveInterfaceQuota(TEST_IFACE); - verifySetInterfaceQuota(TEST_IFACE, 2 * MB_IN_BYTES); + replay(); + mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION)); + future.get(); + verifyAndReset(); } // go over warning, which should kick notification @@ -558,15 +701,18 @@ public class NetworkPolicyManagerServiceTest { { expectCurrentTime(); - when(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15, - currentTimeMillis())).thenReturn(stats.getTotalBytes()); + expect(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15, currentTimeMillis())) + .andReturn(stats.getTotalBytes()).atLeastOnce(); + expectPolicyDataEnable(TYPE_WIFI, true); + + expectForceUpdate(); + expectClearNotifications(); tagFuture = expectEnqueueNotification(); + replay(); mNetworkObserver.limitReached(null, TEST_IFACE); - assertNotificationType(TYPE_WARNING, tagFuture.get()); - verifyPolicyDataEnable(TYPE_WIFI, true); - + verifyAndReset(); } // go over limit, which should kick notification and dialog @@ -576,14 +722,18 @@ public class NetworkPolicyManagerServiceTest { { expectCurrentTime(); - when(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15, - currentTimeMillis())).thenReturn(stats.getTotalBytes()); + expect(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15, currentTimeMillis())) + .andReturn(stats.getTotalBytes()).atLeastOnce(); + expectPolicyDataEnable(TYPE_WIFI, false); + + expectForceUpdate(); + expectClearNotifications(); tagFuture = expectEnqueueNotification(); + replay(); mNetworkObserver.limitReached(null, TEST_IFACE); - assertNotificationType(TYPE_LIMIT, tagFuture.get()); - verifyPolicyDataEnable(TYPE_WIFI, false); + verifyAndReset(); } // now snooze policy, which should remove quota @@ -591,28 +741,35 @@ public class NetworkPolicyManagerServiceTest { { expectCurrentTime(); - when(mConnManager.getAllNetworkState()).thenReturn(state); - when(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15, - currentTimeMillis())).thenReturn(stats.getTotalBytes()); + expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce(); + expect(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15, currentTimeMillis())) + .andReturn(stats.getTotalBytes()).atLeastOnce(); + expectPolicyDataEnable(TYPE_WIFI, true); + + // snoozed interface still has high quota so background data is + // still restricted. + expectRemoveInterfaceQuota(TEST_IFACE); + expectSetInterfaceQuota(TEST_IFACE, Long.MAX_VALUE); + expectAdvisePersistThreshold(); + expectMeteredIfacesChanged(TEST_IFACE); + + future = expectClearNotifications(); tagFuture = expectEnqueueNotification(); - mPolicyListener.expect().onMeteredIfacesChanged(any()); + replay(); mService.snoozeLimit(sTemplateWifi); - mPolicyListener.waitAndVerify().onMeteredIfacesChanged(eq(new String[]{TEST_IFACE})); - assertNotificationType(TYPE_LIMIT_SNOOZED, tagFuture.get()); - // snoozed interface still has high quota so background data is - // still restricted. - verifyRemoveInterfaceQuota(TEST_IFACE); - verifySetInterfaceQuota(TEST_IFACE, Long.MAX_VALUE); - verifyPolicyDataEnable(TYPE_WIFI, true); + future.get(); + verifyAndReset(); } } - @Test + @Suppress public void testMeteredNetworkWithoutLimit() throws Exception { NetworkState[] state = null; NetworkStats stats = null; + Future<Void> future; + Future<String> tagFuture; final long TIME_FEB_15 = 1171497600000L; final long TIME_MAR_10 = 1173484800000L; @@ -627,19 +784,24 @@ public class NetworkPolicyManagerServiceTest { { expectCurrentTime(); - when(mConnManager.getAllNetworkState()).thenReturn(state); - when(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15, - currentTimeMillis())).thenReturn(stats.getTotalBytes()); + expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce(); + expect(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15, currentTimeMillis())) + .andReturn(stats.getTotalBytes()).atLeastOnce(); + expectPolicyDataEnable(TYPE_WIFI, true); + + expectRemoveInterfaceQuota(TEST_IFACE); + expectSetInterfaceQuota(TEST_IFACE, Long.MAX_VALUE); - mPolicyListener.expect().onMeteredIfacesChanged(any()); + expectClearNotifications(); + expectAdvisePersistThreshold(); + future = expectMeteredIfacesChanged(TEST_IFACE); + + replay(); setNetworkPolicies(new NetworkPolicy( sTemplateWifi, CYCLE_DAY, TIMEZONE_UTC, WARNING_DISABLED, LIMIT_DISABLED, true)); - mPolicyListener.waitAndVerify().onMeteredIfacesChanged(eq(new String[]{TEST_IFACE})); - - verifyPolicyDataEnable(TYPE_WIFI, true); - verifyRemoveInterfaceQuota(TEST_IFACE); - verifySetInterfaceQuota(TEST_IFACE, Long.MAX_VALUE); + future.get(); + verifyAndReset(); } } @@ -662,36 +824,87 @@ public class NetworkPolicyManagerServiceTest { } 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 expectForceUpdate() throws Exception { + mStatsService.forceUpdate(); + expectLastCall().atLeastOnce(); + } + + private Future<Void> expectClearNotifications() throws Exception { + final FutureAnswer future = new FutureAnswer(); + mNotifManager.cancelNotificationWithTag( + isA(String.class), isA(String.class), anyInt(), anyInt()); + expectLastCall().andAnswer(future).anyTimes(); + return future; } private Future<String> expectEnqueueNotification() throws Exception { - final FutureAnswer<String> futureAnswer = new FutureAnswer<String>(2); - doAnswer(futureAnswer).when(mNotifManager).enqueueNotificationWithTag( - anyString(), anyString(), anyString() /* capture here (index 2)*/, - anyInt(), isA(Notification.class), isA(int[].class), anyInt()); - return futureAnswer; + final FutureCapture<String> tag = new FutureCapture<String>(); + mNotifManager.enqueueNotificationWithTag(isA(String.class), isA(String.class), + capture(tag.capture), anyInt(), + isA(Notification.class), isA(int[].class), UserHandle.myUserId()); + return tag; + } + + private void expectSetInterfaceQuota(String iface, long quotaBytes) throws Exception { + mNetworkManager.setInterfaceQuota(iface, quotaBytes); + expectLastCall().atLeastOnce(); + } + + private void expectRemoveInterfaceQuota(String iface) throws Exception { + mNetworkManager.removeInterfaceQuota(iface); + expectLastCall().atLeastOnce(); + } + + private void expectSetInterfaceAlert(String iface, long alertBytes) throws Exception { + mNetworkManager.setInterfaceAlert(iface, alertBytes); + expectLastCall().atLeastOnce(); + } + + private void expectRemoveInterfaceAlert(String iface) throws Exception { + mNetworkManager.removeInterfaceAlert(iface); + expectLastCall().atLeastOnce(); + } + + private void expectSetUidMeteredNetworkBlacklist(int uid, boolean rejectOnQuotaInterfaces) + throws Exception { + mNetworkManager.setUidMeteredNetworkBlacklist(uid, rejectOnQuotaInterfaces); + expectLastCall().atLeastOnce(); + } + + private void expectSetUidForeground(int uid, boolean uidForeground) throws Exception { + mStatsService.setUidForeground(uid, uidForeground); + expectLastCall().atLeastOnce(); } - private void verifySetInterfaceQuota(String iface, long quotaBytes) throws Exception { - verify(mNetworkManager, atLeastOnce()).setInterfaceQuota(iface, quotaBytes); + private Future<Void> expectRulesChanged(int uid, int policy) throws Exception { + final FutureAnswer future = new FutureAnswer(); + mPolicyListener.onUidRulesChanged(eq(uid), eq(policy)); + expectLastCall().andAnswer(future); + return future; } - private void verifyRemoveInterfaceQuota(String iface) throws Exception { - verify(mNetworkManager, atLeastOnce()).removeInterfaceQuota(iface); + private Future<Void> expectMeteredIfacesChanged(String... ifaces) throws Exception { + final FutureAnswer future = new FutureAnswer(); + mPolicyListener.onMeteredIfacesChanged(aryEq(ifaces)); + expectLastCall().andAnswer(future); + return future; } - private Future<Void> verifyPolicyDataEnable(int type, boolean enabled) throws Exception { + private Future<Void> expectPolicyDataEnable(int type, boolean enabled) throws Exception { // TODO: bring back this test return null; } - private void verifyAdvisePersistThreshold() throws Exception { - verify(mStatsService).advisePersistThreshold(anyLong()); + private void expectAdvisePersistThreshold() throws Exception { + mStatsService.advisePersistThreshold(anyLong()); + expectLastCall().anyTimes(); } private static class TestAbstractFuture<T> extends AbstractFuture<T> { @@ -705,21 +918,50 @@ public class NetworkPolicyManagerServiceTest { } } - private static class FutureAnswer<T> extends TestAbstractFuture<T> implements Answer<Void> { - private final int index; + private static class FutureAnswer extends TestAbstractFuture<Void> implements IAnswer<Void> { + @Override + public Void answer() { + set(null); + return null; + } + } + + private static class FutureCapture<T> extends TestAbstractFuture<T> { + public Capture<T> capture = new Capture<T>() { + @Override + public void setValue(T value) { + super.setValue(value); + set(value); + } + }; + } - FutureAnswer(int index) { - this.index = index; + private static class IdleFuture extends AbstractFuture<Void> implements IdleHandler { + @Override + public Void get() throws InterruptedException, ExecutionException { + try { + return get(5, TimeUnit.SECONDS); + } catch (TimeoutException e) { + throw new RuntimeException(e); + } } + @Override - public Void answer(InvocationOnMock invocation) throws Throwable { - @SuppressWarnings("unchecked") - T captured = (T) invocation.getArguments()[index]; - set(captured); - return null; + public boolean queueIdle() { + set(null); + return false; } } + /** + * Wait until {@link #mService} internal {@link Handler} is idle. + */ + private IdleFuture expectIdle() { + final IdleFuture future = new IdleFuture(); + mService.addIdleHandler(future); + return future; + } + private static void assertTimeEquals(long expected, long actual) { if (expected != actual) { fail("expected " + formatTime(expected) + " but was actually " + formatTime(actual)); @@ -747,7 +989,7 @@ public class NetworkPolicyManagerServiceTest { } private static void assertNotificationType(int expected, String actualTag) { - assertEquals("notification type mismatch for '" + actualTag +"'", + assertEquals( Integer.toString(expected), actualTag.substring(actualTag.lastIndexOf(':') + 1)); } @@ -768,59 +1010,15 @@ public class NetworkPolicyManagerServiceTest { mElapsedRealtime += duration; } - /** - * Creates a mock and registers it to {@link LocalServices}. - */ - private static <T> T addLocalServiceMock(Class<T> clazz) { - final T mock = mock(clazz); - LocalServices.addService(clazz, mock); - return mock; + private void replay() { + EasyMock.replay(mActivityManager, mStatsService, mPolicyListener, mNetworkManager, mTime, + mConnManager, mNotifManager); } - /** - * Custom Mockito answer used to verify async {@link INetworkPolicyListener} calls. - * - * <p>Typical usage: - * <pre><code> - * mPolicyListener.expect().someCallback(any()); - * // do something on objects under test - * mPolicyListener.waitAndVerify().someCallback(eq(expectedValue)); - * </code></pre> - */ - final class NetworkPolicyListenerAnswer implements Answer<Void> { - private CountDownLatch latch; - private final INetworkPolicyListener listener; - - NetworkPolicyListenerAnswer(NetworkPolicyManagerService service) { - this.listener = mock(INetworkPolicyListener.class); - // RemoteCallbackList needs a binder to use as key - when(listener.asBinder()).thenReturn(new Binder()); - service.registerListener(listener); - } - - @Override - public Void answer(InvocationOnMock invocation) throws Throwable { - Log.d(TAG,"counting down on answer: " + invocation); - latch.countDown(); - return null; - } - - INetworkPolicyListener expect() { - assertNull("expect() called before waitAndVerify()", latch); - latch = new CountDownLatch(1); - return doAnswer(this).when(listener); - } - - INetworkPolicyListener waitAndVerify() { - assertNotNull("waitAndVerify() called before expect()", latch); - try { - assertTrue("callback not called in 5 seconds", latch.await(5, TimeUnit.SECONDS)); - } catch (InterruptedException e) { - fail("Thread interrupted before callback called"); - } finally { - latch = null; - } - return verify(listener, atLeastOnce()); - } + private void verifyAndReset() { + EasyMock.verify(mActivityManager, mStatsService, mPolicyListener, mNetworkManager, mTime, + mConnManager, mNotifManager); + EasyMock.reset(mActivityManager, mStatsService, mPolicyListener, mNetworkManager, mTime, + mConnManager, mNotifManager); } } 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 77956be66c9e..bce5787ed9a5 100644 --- a/tests/net/java/com/android/server/connectivity/LingerMonitorTest.java +++ b/services/tests/servicestests/src/com/android/server/connectivity/LingerMonitorTest.java @@ -24,7 +24,6 @@ import android.net.Network; import android.net.NetworkCapabilities; import android.net.NetworkInfo; import android.net.NetworkMisc; -import android.test.suitebuilder.annotation.SmallTest; import android.text.format.DateUtils; import com.android.internal.R; import com.android.server.ConnectivityService; @@ -71,7 +70,6 @@ public class LingerMonitorTest extends TestCase { mMonitor = new TestableLingerMonitor(mCtx, mNotifier, HIGH_DAILY_LIMIT, HIGH_RATE_LIMIT); } - @SmallTest public void testTransitions() { setNotificationSwitch(transition(WIFI, CELLULAR)); NetworkAgentInfo nai1 = wifiNai(100); @@ -81,7 +79,6 @@ public class LingerMonitorTest extends TestCase { assertFalse(mMonitor.isNotificationEnabled(nai2, nai1)); } - @SmallTest public void testNotificationOnLinger() { setNotificationSwitch(transition(WIFI, CELLULAR)); setNotificationType(LingerMonitor.NOTIFY_TYPE_NOTIFICATION); @@ -92,7 +89,6 @@ public class LingerMonitorTest extends TestCase { verifyNotification(from, to); } - @SmallTest public void testToastOnLinger() { setNotificationSwitch(transition(WIFI, CELLULAR)); setNotificationType(LingerMonitor.NOTIFY_TYPE_TOAST); @@ -103,7 +99,6 @@ public class LingerMonitorTest extends TestCase { verifyToast(from, to); } - @SmallTest public void testNotificationClearedAfterDisconnect() { setNotificationSwitch(transition(WIFI, CELLULAR)); setNotificationType(LingerMonitor.NOTIFY_TYPE_NOTIFICATION); @@ -117,7 +112,6 @@ public class LingerMonitorTest extends TestCase { verify(mNotifier, times(1)).clearNotification(100); } - @SmallTest public void testNotificationClearedAfterSwitchingBack() { setNotificationSwitch(transition(WIFI, CELLULAR)); setNotificationType(LingerMonitor.NOTIFY_TYPE_NOTIFICATION); @@ -131,7 +125,6 @@ public class LingerMonitorTest extends TestCase { verify(mNotifier, times(1)).clearNotification(100); } - @SmallTest public void testUniqueToast() { setNotificationSwitch(transition(WIFI, CELLULAR)); setNotificationType(LingerMonitor.NOTIFY_TYPE_TOAST); @@ -149,7 +142,6 @@ public class LingerMonitorTest extends TestCase { verifyNoNotifications(); } - @SmallTest public void testMultipleNotifications() { setNotificationSwitch(transition(WIFI, CELLULAR)); setNotificationType(LingerMonitor.NOTIFY_TYPE_NOTIFICATION); @@ -168,7 +160,6 @@ public class LingerMonitorTest extends TestCase { verifyNotification(wifi2, cell); } - @SmallTest public void testRateLimiting() throws InterruptedException { mMonitor = new TestableLingerMonitor(mCtx, mNotifier, HIGH_DAILY_LIMIT, LOW_RATE_LIMIT); @@ -194,7 +185,6 @@ public class LingerMonitorTest extends TestCase { verifyNoNotifications(); } - @SmallTest public void testDailyLimiting() throws InterruptedException { mMonitor = new TestableLingerMonitor(mCtx, mNotifier, LOW_DAILY_LIMIT, HIGH_RATE_LIMIT); @@ -221,7 +211,6 @@ public class LingerMonitorTest extends TestCase { verifyNoNotifications(); } - @SmallTest public void testUniqueNotification() { setNotificationSwitch(transition(WIFI, CELLULAR)); setNotificationType(LingerMonitor.NOTIFY_TYPE_NOTIFICATION); @@ -238,7 +227,6 @@ public class LingerMonitorTest extends TestCase { verifyNotification(from, to); } - @SmallTest public void testIgnoreNeverValidatedNetworks() { setNotificationType(LingerMonitor.NOTIFY_TYPE_TOAST); setNotificationSwitch(transition(WIFI, CELLULAR)); @@ -250,7 +238,6 @@ public class LingerMonitorTest extends TestCase { verifyNoNotifications(); } - @SmallTest public void testIgnoreCurrentlyValidatedNetworks() { setNotificationType(LingerMonitor.NOTIFY_TYPE_TOAST); setNotificationSwitch(transition(WIFI, CELLULAR)); @@ -262,7 +249,6 @@ public class LingerMonitorTest extends TestCase { verifyNoNotifications(); } - @SmallTest public void testNoNotificationType() { setNotificationType(LingerMonitor.NOTIFY_TYPE_TOAST); setNotificationSwitch(); @@ -273,7 +259,6 @@ public class LingerMonitorTest extends TestCase { verifyNoNotifications(); } - @SmallTest public void testNoTransitionToNotify() { setNotificationType(LingerMonitor.NOTIFY_TYPE_NONE); setNotificationSwitch(transition(WIFI, CELLULAR)); @@ -284,7 +269,6 @@ public class LingerMonitorTest extends TestCase { verifyNoNotifications(); } - @SmallTest public void testDifferentTransitionToNotify() { setNotificationType(LingerMonitor.NOTIFY_TYPE_TOAST); setNotificationSwitch(transition(CELLULAR, WIFI)); diff --git a/tests/net/java/com/android/server/connectivity/MetricsLoggerServiceTest.java b/services/tests/servicestests/src/com/android/server/connectivity/MetricsLoggerServiceTest.java index 5981f48e7ccd..5f84ea1bfd96 100644 --- a/tests/net/java/com/android/server/connectivity/MetricsLoggerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/connectivity/MetricsLoggerServiceTest.java @@ -20,7 +20,6 @@ import android.content.Context; import android.net.ConnectivityMetricsEvent; import android.os.Bundle; import android.os.RemoteException; -import android.test.suitebuilder.annotation.SmallTest; import static android.net.ConnectivityMetricsEvent.Reference; import junit.framework.TestCase; @@ -68,14 +67,12 @@ public class MetricsLoggerServiceTest extends TestCase { mService.onStart(); } - @SmallTest public void testGetNoEvents() throws Exception { Reference r = new Reference(0); assertArrayEquals(NO_EVENTS, mService.mBinder.getEvents(r)); assertEquals(0, r.getValue()); } - @SmallTest public void testLogAndGetEvents() throws Exception { mService.mBinder.logEvents(EVENTS); @@ -88,7 +85,6 @@ public class MetricsLoggerServiceTest extends TestCase { assertEquals(N_EVENTS, r.getValue()); } - @SmallTest public void testLogOneByOne() throws Exception { for (ConnectivityMetricsEvent ev : EVENTS) { mService.mBinder.logEvent(ev); @@ -103,7 +99,6 @@ public class MetricsLoggerServiceTest extends TestCase { assertEquals(N_EVENTS, r.getValue()); } - @SmallTest public void testInterleavedLogAndGet() throws Exception { mService.mBinder.logEvents(Arrays.copyOfRange(EVENTS, 0, 3)); @@ -122,7 +117,6 @@ public class MetricsLoggerServiceTest extends TestCase { assertEquals(N_EVENTS, r.getValue()); } - @SmallTest public void testMultipleGetAll() throws Exception { mService.mBinder.logEvents(Arrays.copyOf(EVENTS, 3)); @@ -137,7 +131,6 @@ public class MetricsLoggerServiceTest extends TestCase { assertEquals(N_EVENTS, r2.getValue()); } - @SmallTest public void testLogAndDumpConcurrently() throws Exception { for (int i = 0; i < 50; i++) { mContext = null; 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 2bb62bbdcf59..9e2fd6231ba9 100644 --- a/tests/net/java/com/android/server/connectivity/NetdEventListenerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/connectivity/NetdEventListenerServiceTest.java @@ -22,8 +22,6 @@ import android.net.Network; import android.net.metrics.DnsEvent; import android.net.metrics.INetdEventListener; import android.net.metrics.IpConnectivityLog; -import android.os.RemoteException; -import android.test.suitebuilder.annotation.SmallTest; import junit.framework.TestCase; import org.junit.Before; @@ -84,7 +82,6 @@ public class NetdEventListenerServiceTest extends TestCase { verify(mCm, times(1)).registerNetworkCallback(any(), mCallbackCaptor.capture()); } - @SmallTest public void testOneBatch() throws Exception { log(105, LATENCIES); log(106, Arrays.copyOf(LATENCIES, BATCH_SIZE - 1)); // one lookup short of a batch event @@ -99,7 +96,6 @@ public class NetdEventListenerServiceTest extends TestCase { new DnsEvent(106, EVENT_TYPES, RETURN_CODES, LATENCIES)); } - @SmallTest public void testSeveralBatches() throws Exception { log(105, LATENCIES); log(106, LATENCIES); @@ -113,7 +109,6 @@ public class NetdEventListenerServiceTest extends TestCase { new DnsEvent(107, EVENT_TYPES, RETURN_CODES, LATENCIES)); } - @SmallTest public void testBatchAndNetworkLost() throws Exception { byte[] eventTypes = Arrays.copyOf(EVENT_TYPES, 20); byte[] returnCodes = Arrays.copyOf(RETURN_CODES, 20); @@ -130,7 +125,6 @@ public class NetdEventListenerServiceTest extends TestCase { new DnsEvent(105, EVENT_TYPES, RETURN_CODES, LATENCIES)); } - @SmallTest public void testConcurrentBatchesAndDumps() throws Exception { final long stop = System.currentTimeMillis() + 100; final PrintWriter pw = new PrintWriter(new FileOutputStream("/dev/null")); @@ -152,7 +146,6 @@ public class NetdEventListenerServiceTest extends TestCase { new DnsEvent(107, EVENT_TYPES, RETURN_CODES, LATENCIES)); } - @SmallTest public void testConcurrentBatchesAndNetworkLoss() throws Exception { logAsync(105, LATENCIES); Thread.sleep(10L); @@ -164,13 +157,9 @@ public class NetdEventListenerServiceTest extends TestCase { } void log(int netId, int[] latencies) { - try { - for (int l : latencies) { - mNetdEventListenerService.onDnsEvent(netId, EVENT_TYPE, RETURN_CODE, l, null, null, - 0, 0); - } - } catch (RemoteException re) { - throw re.rethrowFromSystemServer(); + for (int l : latencies) { + mNetdEventListenerService.onDnsEvent(netId, EVENT_TYPE, RETURN_CODE, l, null, null, 0, + 0); } } 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 b51b2771db16..5d8b843bbc17 100644 --- a/tests/net/java/com/android/server/connectivity/VpnTest.java +++ b/services/tests/servicestests/src/com/android/server/connectivity/VpnTest.java @@ -25,11 +25,9 @@ import static org.mockito.Mockito.*; import android.annotation.UserIdInt; import android.app.AppOpsManager; -import android.app.NotificationManager; import android.content.Context; import android.content.pm.PackageManager; import android.content.pm.UserInfo; -import android.net.NetworkInfo.DetailedState; import android.net.UidRange; import android.os.INetworkManagementService; import android.os.Looper; @@ -45,8 +43,6 @@ import java.util.Arrays; import java.util.Map; import java.util.Set; -import org.mockito.ArgumentCaptor; -import org.mockito.InOrder; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @@ -92,18 +88,14 @@ public class VpnTest extends AndroidTestCase { @Mock private PackageManager mPackageManager; @Mock private INetworkManagementService mNetService; @Mock private AppOpsManager mAppOps; - @Mock private NotificationManager mNotificationManager; @Override public void setUp() throws Exception { MockitoAnnotations.initMocks(this); when(mContext.getPackageManager()).thenReturn(mPackageManager); setMockedPackages(mPackages); - when(mContext.getPackageName()).thenReturn(Vpn.class.getPackage().getName()); when(mContext.getSystemService(eq(Context.USER_SERVICE))).thenReturn(mUserManager); when(mContext.getSystemService(eq(Context.APP_OPS_SERVICE))).thenReturn(mAppOps); - when(mContext.getSystemService(eq(Context.NOTIFICATION_SERVICE))) - .thenReturn(mNotificationManager); doNothing().when(mNetService).registerObserver(any()); } @@ -111,7 +103,7 @@ public class VpnTest extends AndroidTestCase { public void testRestrictedProfilesAreAddedToVpn() { setMockedUsers(primaryUser, secondaryUser, restrictedProfileA, restrictedProfileB); - final Vpn vpn = spyVpn(primaryUser.id); + final Vpn vpn = new MockVpn(primaryUser.id); final Set<UidRange> ranges = vpn.createUserAndRestrictedProfilesRanges(primaryUser.id, null, null); @@ -125,7 +117,7 @@ public class VpnTest extends AndroidTestCase { public void testManagedProfilesAreNotAddedToVpn() { setMockedUsers(primaryUser, managedProfileA); - final Vpn vpn = spyVpn(primaryUser.id); + final Vpn vpn = new MockVpn(primaryUser.id); final Set<UidRange> ranges = vpn.createUserAndRestrictedProfilesRanges(primaryUser.id, null, null); @@ -138,7 +130,7 @@ public class VpnTest extends AndroidTestCase { public void testAddUserToVpnOnlyAddsOneUser() { setMockedUsers(primaryUser, restrictedProfileA, managedProfileA); - final Vpn vpn = spyVpn(primaryUser.id); + final Vpn vpn = new MockVpn(primaryUser.id); final Set<UidRange> ranges = new ArraySet<>(); vpn.addUserToRanges(ranges, primaryUser.id, null, null); @@ -149,7 +141,7 @@ public class VpnTest extends AndroidTestCase { @SmallTest public void testUidWhiteAndBlacklist() throws Exception { - final Vpn vpn = spyVpn(primaryUser.id); + final Vpn vpn = new MockVpn(primaryUser.id); final UidRange user = UidRange.createForUser(primaryUser.id); final String[] packages = {PKGS[0], PKGS[1], PKGS[2]}; @@ -174,15 +166,15 @@ public class VpnTest extends AndroidTestCase { @SmallTest public void testLockdownChangingPackage() throws Exception { - final Vpn vpn = spyVpn(primaryUser.id); + final MockVpn vpn = new MockVpn(primaryUser.id); final UidRange user = UidRange.createForUser(primaryUser.id); // Default state. - assertUnblocked(vpn, user.start + PKG_UIDS[0], user.start + PKG_UIDS[1], user.start + PKG_UIDS[2], user.start + PKG_UIDS[3]); + vpn.assertUnblocked(user.start + PKG_UIDS[0], user.start + PKG_UIDS[1], user.start + PKG_UIDS[2], user.start + PKG_UIDS[3]); // Set always-on without lockdown. assertTrue(vpn.setAlwaysOnPackage(PKGS[1], false)); - assertUnblocked(vpn, user.start + PKG_UIDS[0], user.start + PKG_UIDS[1], user.start + PKG_UIDS[2], user.start + PKG_UIDS[3]); + vpn.assertUnblocked(user.start + PKG_UIDS[0], user.start + PKG_UIDS[1], user.start + PKG_UIDS[2], user.start + PKG_UIDS[3]); // Set always-on with lockdown. assertTrue(vpn.setAlwaysOnPackage(PKGS[1], true)); @@ -190,8 +182,8 @@ public class VpnTest extends AndroidTestCase { new UidRange(user.start, user.start + PKG_UIDS[1] - 1), new UidRange(user.start + PKG_UIDS[1] + 1, user.stop) })); - assertBlocked(vpn, user.start + PKG_UIDS[0], user.start + PKG_UIDS[2], user.start + PKG_UIDS[3]); - assertUnblocked(vpn, user.start + PKG_UIDS[1]); + vpn.assertBlocked(user.start + PKG_UIDS[0], user.start + PKG_UIDS[2], user.start + PKG_UIDS[3]); + vpn.assertUnblocked(user.start + PKG_UIDS[1]); // Switch to another app. assertTrue(vpn.setAlwaysOnPackage(PKGS[3], true)); @@ -203,13 +195,13 @@ public class VpnTest extends AndroidTestCase { new UidRange(user.start, user.start + PKG_UIDS[3] - 1), new UidRange(user.start + PKG_UIDS[3] + 1, user.stop) })); - assertBlocked(vpn, user.start + PKG_UIDS[0], user.start + PKG_UIDS[1], user.start + PKG_UIDS[2]); - assertUnblocked(vpn, user.start + PKG_UIDS[3]); + vpn.assertBlocked(user.start + PKG_UIDS[0], user.start + PKG_UIDS[1], user.start + PKG_UIDS[2]); + vpn.assertUnblocked(user.start + PKG_UIDS[3]); } @SmallTest public void testLockdownAddingAProfile() throws Exception { - final Vpn vpn = spyVpn(primaryUser.id); + final MockVpn vpn = new MockVpn(primaryUser.id); setMockedUsers(primaryUser); // Make a copy of the restricted profile, as we're going to mark it deleted halfway through. @@ -228,7 +220,7 @@ public class VpnTest extends AndroidTestCase { })); // Verify restricted user isn't affected at first. - assertUnblocked(vpn, profile.start + PKG_UIDS[0]); + vpn.assertUnblocked(profile.start + PKG_UIDS[0]); // Add the restricted user. setMockedUsers(primaryUser, tempProfile); @@ -247,53 +239,24 @@ public class VpnTest extends AndroidTestCase { })); } - @SmallTest - public void testNotificationShownForAlwaysOnApp() { - final Vpn vpn = spyVpn(primaryUser.id); - final InOrder order = inOrder(vpn); - setMockedUsers(primaryUser); - - // Don't show a notification for regular disconnected states. - vpn.updateState(DetailedState.DISCONNECTED, TAG); - order.verify(vpn).updateAlwaysOnNotificationInternal(false); - - // Start showing a notification for disconnected once always-on. - vpn.setAlwaysOnPackage(PKGS[0], false); - order.verify(vpn).updateAlwaysOnNotificationInternal(true); - - // Stop showing the notification once connected. - vpn.updateState(DetailedState.CONNECTED, TAG); - order.verify(vpn).updateAlwaysOnNotificationInternal(false); - - // Show the notification if we disconnect again. - vpn.updateState(DetailedState.DISCONNECTED, TAG); - order.verify(vpn).updateAlwaysOnNotificationInternal(true); - - // Notification should be cleared after unsetting always-on package. - vpn.setAlwaysOnPackage(null, false); - order.verify(vpn).updateAlwaysOnNotificationInternal(false); - } - /** - * Mock some methods of vpn object. + * A subclass of {@link Vpn} with some of the fields pre-mocked. */ - private Vpn spyVpn(@UserIdInt int userId) { - final Vpn vpn = spy(new Vpn(Looper.myLooper(), mContext, mNetService, userId)); - - // Block calls to the NotificationManager or PendingIntent#getActivity. - doNothing().when(vpn).updateAlwaysOnNotificationInternal(anyBoolean()); - return vpn; - } + private class MockVpn extends Vpn { + public MockVpn(@UserIdInt int userId) { + super(Looper.myLooper(), mContext, mNetService, userId); + } - private static void assertBlocked(Vpn vpn, int... uids) { - for (int uid : uids) { - assertTrue("Uid " + uid + " should be blocked", vpn.isBlockingUid(uid)); + public void assertBlocked(int... uids) { + for (int uid : uids) { + assertTrue("Uid " + uid + " should be blocked", isBlockingUid(uid)); + } } - } - private static void assertUnblocked(Vpn vpn, int... uids) { - for (int uid : uids) { - assertFalse("Uid " + uid + " should not be blocked", vpn.isBlockingUid(uid)); + public void assertUnblocked(int... uids) { + for (int uid : uids) { + assertFalse("Uid " + uid + " should not be blocked", isBlockingUid(uid)); + } } } 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/NetworkStatsObserversTest.java b/services/tests/servicestests/src/com/android/server/net/NetworkStatsObserversTest.java index 5eee7b948cd0..21560acbf3bb 100644 --- a/services/tests/servicestests/src/com/android/server/net/NetworkStatsObserversTest.java +++ b/services/tests/servicestests/src/com/android/server/net/NetworkStatsObserversTest.java @@ -25,7 +25,6 @@ import static org.mockito.Matchers.isA; import static org.mockito.Mockito.when; import static android.net.NetworkStats.SET_DEFAULT; -import static android.net.NetworkStats.METERED_NO; import static android.net.NetworkStats.ROAMING_NO; import static android.net.NetworkStats.TAG_NONE; import static android.net.NetworkTemplate.buildTemplateMobileAll; @@ -337,7 +336,7 @@ public class NetworkStatsObserversTest extends TestCase { // Baseline NetworkStats xtSnapshot = null; NetworkStats uidSnapshot = new NetworkStats(TEST_START, 2 /* initialSize */) - .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, + .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO, BASE_BYTES, 2L, BASE_BYTES, 2L, 0L); mStatsObservers.updateStats( xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, @@ -345,7 +344,7 @@ public class NetworkStatsObserversTest extends TestCase { // Delta uidSnapshot = new NetworkStats(TEST_START + 2 * MINUTE_IN_MILLIS, 2 /* initialSize */) - .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, + .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO, BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L); mStatsObservers.updateStats( xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, @@ -375,7 +374,7 @@ public class NetworkStatsObserversTest extends TestCase { // Baseline NetworkStats xtSnapshot = null; NetworkStats uidSnapshot = new NetworkStats(TEST_START, 2 /* initialSize */) - .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, + .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO, BASE_BYTES, 2L, BASE_BYTES, 2L, 0L); mStatsObservers.updateStats( xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, @@ -383,7 +382,7 @@ public class NetworkStatsObserversTest extends TestCase { // Delta uidSnapshot = new NetworkStats(TEST_START + 2 * MINUTE_IN_MILLIS, 2 /* initialSize */) - .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, + .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO, BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L); mStatsObservers.updateStats( xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, @@ -413,7 +412,7 @@ public class NetworkStatsObserversTest extends TestCase { // Baseline NetworkStats xtSnapshot = null; NetworkStats uidSnapshot = new NetworkStats(TEST_START, 2 /* initialSize */) - .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, + .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO, BASE_BYTES, 2L, BASE_BYTES, 2L, 0L); mStatsObservers.updateStats( xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, @@ -421,7 +420,7 @@ public class NetworkStatsObserversTest extends TestCase { // Delta uidSnapshot = new NetworkStats(TEST_START + 2 * MINUTE_IN_MILLIS, 2 /* initialSize */) - .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, + .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO, BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L); mStatsObservers.updateStats( xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, @@ -451,17 +450,16 @@ public class NetworkStatsObserversTest extends TestCase { // Baseline NetworkStats xtSnapshot = null; NetworkStats uidSnapshot = new NetworkStats(TEST_START, 2 /* initialSize */) - .addValues(TEST_IFACE, UID_ANOTHER_USER, SET_DEFAULT, TAG_NONE, METERED_NO, - ROAMING_NO, BASE_BYTES, 2L, BASE_BYTES, 2L, 0L); + .addValues(TEST_IFACE, UID_ANOTHER_USER, SET_DEFAULT, TAG_NONE, ROAMING_NO, + BASE_BYTES, 2L, BASE_BYTES, 2L, 0L); mStatsObservers.updateStats( xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, VPN_INFO, TEST_START); // Delta uidSnapshot = new NetworkStats(TEST_START + 2 * MINUTE_IN_MILLIS, 2 /* initialSize */) - .addValues(TEST_IFACE, UID_ANOTHER_USER, SET_DEFAULT, TAG_NONE, METERED_NO, - ROAMING_NO, BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, - 2L, 0L); + .addValues(TEST_IFACE, UID_ANOTHER_USER, SET_DEFAULT, TAG_NONE, ROAMING_NO, + BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L); mStatsObservers.updateStats( xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, VPN_INFO, TEST_START); 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 728eb734c52e..94c6711da9ae 100644 --- a/services/tests/servicestests/src/com/android/server/net/NetworkStatsServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/net/NetworkStatsServiceTest.java @@ -22,9 +22,6 @@ import static android.net.ConnectivityManager.TYPE_MOBILE; import static android.net.ConnectivityManager.TYPE_WIFI; import static android.net.ConnectivityManager.TYPE_WIMAX; import static android.net.NetworkStats.IFACE_ALL; -import static android.net.NetworkStats.METERED_ALL; -import static android.net.NetworkStats.METERED_NO; -import static android.net.NetworkStats.METERED_YES; import static android.net.NetworkStats.ROAMING_ALL; import static android.net.NetworkStats.ROAMING_NO; import static android.net.NetworkStats.ROAMING_YES; @@ -43,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; @@ -66,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; @@ -84,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; @@ -115,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"; @@ -146,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; @@ -159,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"); @@ -193,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); @@ -220,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. @@ -231,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); @@ -246,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. @@ -260,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); @@ -278,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); @@ -298,28 +308,33 @@ 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 assertNetworkTotal(sTemplateWifi, 1024L, 8L, 2048L, 16L, 0); assertUidTotal(sTemplateWifi, UID_RED, 1024L, 8L, 512L, 4L, 10); - assertUidTotal(sTemplateWifi, UID_RED, SET_DEFAULT, METERED_NO, ROAMING_NO, 512L, 4L, 256L, - 2L, 4); - assertUidTotal(sTemplateWifi, UID_RED, SET_FOREGROUND, METERED_NO, ROAMING_NO, 512L, 4L, - 256L, 2L, 6); + assertUidTotal(sTemplateWifi, UID_RED, SET_DEFAULT, ROAMING_NO, 512L, 4L, 256L, 2L, 4); + 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 @@ -328,22 +343,30 @@ 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); - assertUidTotal(sTemplateWifi, UID_RED, SET_DEFAULT, METERED_NO, ROAMING_NO, 512L, 4L, 256L, - 2L, 4); - assertUidTotal(sTemplateWifi, UID_RED, SET_FOREGROUND, METERED_NO, ROAMING_NO, 512L, 4L, - 256L, 2L, 6); + assertUidTotal(sTemplateWifi, UID_RED, SET_DEFAULT, ROAMING_NO, 512L, 4L, 256L, 2L, 4); + 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; @@ -356,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); @@ -368,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 @@ -375,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. @@ -383,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 @@ -390,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(); @@ -401,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); @@ -416,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 @@ -425,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. @@ -439,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); @@ -456,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 @@ -470,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(); @@ -481,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); @@ -497,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 @@ -506,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. @@ -519,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); @@ -532,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(); @@ -543,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); @@ -556,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); @@ -573,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); @@ -589,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(); @@ -605,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); @@ -619,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); @@ -637,29 +702,33 @@ 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 NetworkStats stats = mSession.getSummaryForAllUid( sTemplateWifi, Long.MIN_VALUE, Long.MAX_VALUE, true); assertEquals(3, stats.size()); - assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 50L, - 5L, 50L, 5L, 1); - assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, METERED_NO, ROAMING_NO, 10L, - 1L, 10L, 1L, 1); - assertValues(stats, IFACE_ALL, UID_BLUE, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, - 2048L, 16L, 1024L, 8L, 0); + assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO, 50L, 5L, + 50L, 5L, 1); + assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_NO, 10L, 1L, 10L, + 1L, 1); + assertValues(stats, IFACE_ALL, UID_BLUE, SET_DEFAULT, TAG_NONE, ROAMING_NO, 2048L, 16L, + 1024L, 8L, 0); // now verify that recent history only contains one uid final long currentTime = currentTimeMillis(); stats = mSession.getSummaryForAllUid( sTemplateWifi, currentTime - HOUR_IN_MILLIS, currentTime, true); assertEquals(1, stats.size()); - assertValues(stats, IFACE_ALL, UID_BLUE, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, - 1024L, 8L, 512L, 4L, 0); + 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(); @@ -667,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); @@ -680,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); @@ -698,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 @@ -710,59 +787,18 @@ public class NetworkStatsServiceTest { final NetworkStats stats = mSession.getSummaryForAllUid( sTemplateWifi, Long.MIN_VALUE, Long.MAX_VALUE, true); assertEquals(4, stats.size()); - assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 128L, - 2L, 128L, 2L, 1); - assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, METERED_NO, ROAMING_NO, 64L, - 1L, 64L, 1L, 1); - assertValues(stats, IFACE_ALL, UID_RED, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO, - 32L, 2L, 32L, 2L, 1); - assertValues(stats, IFACE_ALL, UID_RED, SET_FOREGROUND, 0xFAAD, METERED_NO, ROAMING_NO, 1L, - 1L, 1L, 1L, 1); - } - - @Test - public void testMetered() throws Exception { - // pretend that network comes online - expectCurrentTime(); - expectDefaultSettings(); - expectNetworkState(buildWifiState(true /* isMetered */)); - expectNetworkStatsSummary(buildEmptyStats()); - expectNetworkStatsUidDetail(buildEmptyStats()); - expectBandwidthControlCheck(); - - mService.forceUpdateIfaces(); - - - // create some initial traffic - incrementCurrentTime(HOUR_IN_MILLIS); - expectCurrentTime(); - expectDefaultSettings(); - expectNetworkStatsSummary(buildEmptyStats()); - // Note that all traffic from NetworkManagementService is tagged as METERED_NO and - // ROAMING_NO, because metered and roaming isn't tracked at that layer. We layer it - // on top by inspecting the iface properties. - expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1) - .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 128L, - 2L, 128L, 2L, 0L) - .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, METERED_NO, ROAMING_NO, 64L, - 1L, 64L, 1L, 0L)); - mService.incrementOperationCount(UID_RED, 0xF00D, 1); - - forcePollAndWaitForIdle(); - - // verify service recorded history - assertUidTotal(sTemplateWifi, UID_RED, 128L, 2L, 128L, 2L, 1); - // verify entire history present - final NetworkStats stats = mSession.getSummaryForAllUid( - sTemplateWifi, Long.MIN_VALUE, Long.MAX_VALUE, true); - assertEquals(2, stats.size()); - assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO, - 128L, 2L, 128L, 2L, 1); - assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, METERED_YES, ROAMING_NO, 64L, - 1L, 64L, 1L, 1); + assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO, 128L, 2L, + 128L, 2L, 1); + assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_NO, 64L, 1L, 64L, + 1L, 1); + assertValues(stats, IFACE_ALL, UID_RED, SET_FOREGROUND, TAG_NONE, ROAMING_NO, 32L, 2L, + 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(); @@ -770,24 +806,29 @@ 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); expectCurrentTime(); expectDefaultSettings(); expectNetworkStatsSummary(buildEmptyStats()); - // Note that all traffic from NetworkManagementService is tagged as METERED_NO and - // ROAMING_NO, because metered and roaming isn't tracked at that layer. We layer it - // on top by inspecting the iface properties. + // Note that all traffic from NetworkManagementService is tagged as ROAMING_NO, because + // roaming isn't tracked at that layer. We layer it on top by inspecting the iface + // properties. expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1) - .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, METERED_ALL, ROAMING_NO, - 128L, 2L, 128L, 2L, 0L) - .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, METERED_ALL, ROAMING_NO, 64L, - 1L, 64L, 1L, 0L)); + .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO, 128L, 2L, + 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 @@ -797,13 +838,14 @@ public class NetworkStatsServiceTest { final NetworkStats stats = mSession.getSummaryForAllUid( sTemplateImsi1, Long.MIN_VALUE, Long.MAX_VALUE, true); assertEquals(2, stats.size()); - assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, METERED_ALL, ROAMING_YES, - 128L, 2L, 128L, 2L, 0); - assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, METERED_ALL, ROAMING_YES, 64L, - 1L, 64L, 1L, 0); + assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_YES, 128L, 2L, + 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(); @@ -811,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); @@ -827,20 +871,22 @@ public class NetworkStatsServiceTest { .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 128L, 2L, 128L, 2L, 0L); final String[] tetherIfacePairs = new String[] { TEST_IFACE, "wlan0" }; final NetworkStats tetherStats = new NetworkStats(getElapsedRealtime(), 1) - .addValues(TEST_IFACE, UID_TETHERING, SET_DEFAULT, TAG_NONE, 1920L, 14L, 384L, 2L, - 0L); + .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. @@ -849,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( @@ -865,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 @@ -886,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 @@ -900,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 @@ -916,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)); @@ -928,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); @@ -938,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 @@ -971,18 +1034,18 @@ public class NetworkStatsServiceTest { // verify summary API final NetworkStats stats = mSession.getSummaryForNetwork(template, start, end); - assertValues(stats, IFACE_ALL, UID_ALL, SET_DEFAULT, TAG_NONE, METERED_ALL, ROAMING_NO, - rxBytes, rxPackets, txBytes, txPackets, operations); + assertValues(stats, IFACE_ALL, UID_ALL, SET_DEFAULT, TAG_NONE, ROAMING_NO, rxBytes, + rxPackets, txBytes, txPackets, operations); } private void assertUidTotal(NetworkTemplate template, int uid, long rxBytes, long rxPackets, long txBytes, long txPackets, int operations) throws Exception { - assertUidTotal(template, uid, SET_ALL, METERED_ALL, ROAMING_ALL, rxBytes, rxPackets, - txBytes, txPackets, operations); + assertUidTotal(template, uid, SET_ALL, ROAMING_ALL, rxBytes, rxPackets, txBytes, txPackets, + operations); } - private void assertUidTotal(NetworkTemplate template, int uid, int set, int metered, - int roaming, long rxBytes, long rxPackets, long txBytes, long txPackets, int operations) + private void assertUidTotal(NetworkTemplate template, int uid, int set, int roaming, + long rxBytes, long rxPackets, long txBytes, long txPackets, int operations) throws Exception { // verify history API final NetworkStatsHistory history = mSession.getHistoryForUid( @@ -993,35 +1056,38 @@ public class NetworkStatsServiceTest { // verify summary API final NetworkStats stats = mSession.getSummaryForAllUid( template, Long.MIN_VALUE, Long.MAX_VALUE, false); - assertValues(stats, IFACE_ALL, uid, set, TAG_NONE, metered, roaming, rxBytes, rxPackets, - txBytes, txPackets, operations); + assertValues(stats, IFACE_ALL, uid, set, TAG_NONE, roaming, rxBytes, rxPackets, txBytes, + txPackets, operations); } 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 { @@ -1031,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 { @@ -1043,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) { @@ -1082,8 +1154,8 @@ public class NetworkStatsServiceTest { } private static void assertValues(NetworkStats stats, String iface, int uid, int set, - int tag, int metered, int roaming, long rxBytes, long rxPackets, long txBytes, - long txPackets, int operations) { + int tag, int roaming, long rxBytes, long rxPackets, long txBytes, long txPackets, + int operations) { final NetworkStats.Entry entry = new NetworkStats.Entry(); List<Integer> sets = new ArrayList<>(); if (set == SET_DEFAULT || set == SET_ALL) { @@ -1101,21 +1173,11 @@ public class NetworkStatsServiceTest { roamings.add(ROAMING_YES); } - List<Integer> meterings = new ArrayList<>(); - if (metered == METERED_NO || metered == METERED_ALL) { - meterings.add(METERED_NO); - } - if (metered == METERED_YES || metered == METERED_ALL) { - meterings.add(METERED_YES); - } - for (int s : sets) { for (int r : roamings) { - for (int m : meterings) { - final int i = stats.findIndex(iface, uid, s, tag, m, r); - if (i != -1) { - entry.add(stats.getValues(i, null)); - } + final int i = stats.findIndex(iface, uid, s, tag, r); + if (i != -1) { + entry.add(stats.getValues(i, null)); } } } @@ -1138,19 +1200,11 @@ public class NetworkStatsServiceTest { } private static NetworkState buildWifiState() { - return buildWifiState(false); - } - - private static NetworkState buildWifiState(boolean isMetered) { final NetworkInfo info = new NetworkInfo(TYPE_WIFI, 0, null, null); info.setDetailedState(DetailedState.CONNECTED, null, null); final LinkProperties prop = new LinkProperties(); prop.setInterfaceName(TEST_IFACE); - final NetworkCapabilities capabilities = new NetworkCapabilities(); - if (!isMetered) { - capabilities.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); - } - 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) { @@ -1164,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) { @@ -1173,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() { @@ -1197,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) |