blob: 5eee7b948cd0c30ccbffc8e520de416fafec7b35 [file] [log] [blame]
Antonio Cansadocd42acd2016-02-17 13:03:38 -08001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.server.net;
18
19import static android.net.ConnectivityManager.TYPE_MOBILE;
20import static android.net.ConnectivityManager.TYPE_WIFI;
21import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
22import static org.mockito.Matchers.any;
23import static org.mockito.Matchers.anyInt;
24import static org.mockito.Matchers.isA;
25import static org.mockito.Mockito.when;
26
27import static android.net.NetworkStats.SET_DEFAULT;
Stephen Chenc926b732016-10-21 12:44:26 -070028import static android.net.NetworkStats.METERED_NO;
Jeff Davidson1f7e05e2016-03-10 13:21:38 -080029import static android.net.NetworkStats.ROAMING_NO;
Antonio Cansadocd42acd2016-02-17 13:03:38 -080030import static android.net.NetworkStats.TAG_NONE;
31import static android.net.NetworkTemplate.buildTemplateMobileAll;
32import static android.net.NetworkTemplate.buildTemplateWifiWildcard;
33import static android.net.TrafficStats.MB_IN_BYTES;
34import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
35
36import android.app.usage.NetworkStatsManager;
37import android.net.DataUsageRequest;
38import android.net.NetworkIdentity;
39import android.net.NetworkStats;
40import android.net.NetworkTemplate;
41import android.os.Handler;
42import android.os.HandlerThread;
43import android.os.IBinder;
44import android.os.Process;
45
46import android.os.ConditionVariable;
47import android.os.Looper;
48import android.os.Messenger;
49import android.os.Message;
50import android.os.UserHandle;
51import android.telephony.TelephonyManager;
52import android.util.ArrayMap;
53
54import com.android.internal.net.VpnInfo;
55import com.android.server.net.NetworkStatsService;
56import com.android.server.net.NetworkStatsServiceTest.IdleableHandlerThread;
57import com.android.server.net.NetworkStatsServiceTest.LatchedHandler;
58
59import java.util.ArrayList;
Antonio Cansado6965c182016-03-30 11:37:18 -070060import java.util.Objects;
Antonio Cansadocd42acd2016-02-17 13:03:38 -080061import java.util.List;
62
63import junit.framework.TestCase;
64
65import org.mockito.Mock;
66import org.mockito.Mockito;
67import org.mockito.MockitoAnnotations;
68
69/**
70 * Tests for {@link NetworkStatsObservers}.
71 */
72public class NetworkStatsObserversTest extends TestCase {
73 private static final String TEST_IFACE = "test0";
74 private static final String TEST_IFACE2 = "test1";
75 private static final long TEST_START = 1194220800000L;
76
77 private static final String IMSI_1 = "310004";
78 private static final String IMSI_2 = "310260";
79 private static final String TEST_SSID = "AndroidAP";
80
81 private static NetworkTemplate sTemplateWifi = buildTemplateWifiWildcard();
82 private static NetworkTemplate sTemplateImsi1 = buildTemplateMobileAll(IMSI_1);
83 private static NetworkTemplate sTemplateImsi2 = buildTemplateMobileAll(IMSI_2);
84
85 private static final int UID_RED = UserHandle.PER_USER_RANGE + 1;
86 private static final int UID_BLUE = UserHandle.PER_USER_RANGE + 2;
87 private static final int UID_GREEN = UserHandle.PER_USER_RANGE + 3;
88 private static final int UID_ANOTHER_USER = 2 * UserHandle.PER_USER_RANGE + 4;
89
90 private static final long WAIT_TIMEOUT = 500; // 1/2 sec
91 private static final long THRESHOLD_BYTES = 2 * MB_IN_BYTES;
92 private static final long BASE_BYTES = 7 * MB_IN_BYTES;
93 private static final int INVALID_TYPE = -1;
94
Antonio Cansadocd42acd2016-02-17 13:03:38 -080095 private static final VpnInfo[] VPN_INFO = new VpnInfo[0];
96
97 private long mElapsedRealtime;
98
99 private IdleableHandlerThread mObserverHandlerThread;
100 private Handler mObserverNoopHandler;
101
102 private LatchedHandler mHandler;
103 private ConditionVariable mCv;
104
105 private NetworkStatsObservers mStatsObservers;
106 private Messenger mMessenger;
107 private ArrayMap<String, NetworkIdentitySet> mActiveIfaces;
108 private ArrayMap<String, NetworkIdentitySet> mActiveUidIfaces;
109
110 @Mock private IBinder mockBinder;
111
112 @Override
113 public void setUp() throws Exception {
114 super.setUp();
115 MockitoAnnotations.initMocks(this);
116
117 mObserverHandlerThread = new IdleableHandlerThread("HandlerThread");
118 mObserverHandlerThread.start();
119 final Looper observerLooper = mObserverHandlerThread.getLooper();
120 mStatsObservers = new NetworkStatsObservers() {
121 @Override
122 protected Looper getHandlerLooperLocked() {
123 return observerLooper;
124 }
125 };
126
127 mCv = new ConditionVariable();
128 mHandler = new LatchedHandler(Looper.getMainLooper(), mCv);
129 mMessenger = new Messenger(mHandler);
130
131 mActiveIfaces = new ArrayMap<>();
132 mActiveUidIfaces = new ArrayMap<>();
133 }
134
135 public void testRegister_thresholdTooLow_setsDefaultThreshold() throws Exception {
136 long thresholdTooLowBytes = 1L;
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800137 DataUsageRequest inputRequest = new DataUsageRequest(
Antonio Cansado6965c182016-03-30 11:37:18 -0700138 DataUsageRequest.REQUEST_ID_UNSET, sTemplateWifi, thresholdTooLowBytes);
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800139
140 DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
141 Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
142 assertTrue(request.requestId > 0);
Antonio Cansado6965c182016-03-30 11:37:18 -0700143 assertTrue(Objects.equals(sTemplateWifi, request.template));
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800144 assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
145 }
146
147 public void testRegister_highThreshold_accepted() throws Exception {
148 long highThresholdBytes = 2 * THRESHOLD_BYTES;
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800149 DataUsageRequest inputRequest = new DataUsageRequest(
Antonio Cansado6965c182016-03-30 11:37:18 -0700150 DataUsageRequest.REQUEST_ID_UNSET, sTemplateWifi, highThresholdBytes);
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800151
152 DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
153 Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
154 assertTrue(request.requestId > 0);
Antonio Cansado6965c182016-03-30 11:37:18 -0700155 assertTrue(Objects.equals(sTemplateWifi, request.template));
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800156 assertEquals(highThresholdBytes, request.thresholdInBytes);
157 }
158
159 public void testRegister_twoRequests_twoIds() throws Exception {
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800160 DataUsageRequest inputRequest = new DataUsageRequest(
Antonio Cansado6965c182016-03-30 11:37:18 -0700161 DataUsageRequest.REQUEST_ID_UNSET, sTemplateWifi, THRESHOLD_BYTES);
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800162
163 DataUsageRequest request1 = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
164 Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
165 assertTrue(request1.requestId > 0);
Antonio Cansado6965c182016-03-30 11:37:18 -0700166 assertTrue(Objects.equals(sTemplateWifi, request1.template));
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800167 assertEquals(THRESHOLD_BYTES, request1.thresholdInBytes);
168
169 DataUsageRequest request2 = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
170 Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
171 assertTrue(request2.requestId > request1.requestId);
Antonio Cansado6965c182016-03-30 11:37:18 -0700172 assertTrue(Objects.equals(sTemplateWifi, request2.template));
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800173 assertEquals(THRESHOLD_BYTES, request2.thresholdInBytes);
174 }
175
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800176 public void testUnregister_unknownRequest_noop() throws Exception {
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800177 DataUsageRequest unknownRequest = new DataUsageRequest(
Antonio Cansado6965c182016-03-30 11:37:18 -0700178 123456 /* id */, sTemplateWifi, THRESHOLD_BYTES);
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800179
180 mStatsObservers.unregister(unknownRequest, UID_RED);
181 }
182
183 public void testUnregister_knownRequest_releasesCaller() throws Exception {
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800184 DataUsageRequest inputRequest = new DataUsageRequest(
Antonio Cansado6965c182016-03-30 11:37:18 -0700185 DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800186
187 DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
188 Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
189 assertTrue(request.requestId > 0);
Antonio Cansado6965c182016-03-30 11:37:18 -0700190 assertTrue(Objects.equals(sTemplateImsi1, request.template));
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800191 assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
192 Mockito.verify(mockBinder).linkToDeath(any(IBinder.DeathRecipient.class), anyInt());
193
194 mStatsObservers.unregister(request, Process.SYSTEM_UID);
195 waitForObserverToIdle();
196
197 Mockito.verify(mockBinder).unlinkToDeath(any(IBinder.DeathRecipient.class), anyInt());
198 }
199
200 public void testUnregister_knownRequest_invalidUid_doesNotUnregister() throws Exception {
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800201 DataUsageRequest inputRequest = new DataUsageRequest(
Antonio Cansado6965c182016-03-30 11:37:18 -0700202 DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800203
204 DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
205 UID_RED, NetworkStatsAccess.Level.DEVICE);
206 assertTrue(request.requestId > 0);
Antonio Cansado6965c182016-03-30 11:37:18 -0700207 assertTrue(Objects.equals(sTemplateImsi1, request.template));
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800208 assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
209 Mockito.verify(mockBinder).linkToDeath(any(IBinder.DeathRecipient.class), anyInt());
210
211 mStatsObservers.unregister(request, UID_BLUE);
212 waitForObserverToIdle();
213
214 Mockito.verifyZeroInteractions(mockBinder);
215 }
216
217 public void testUpdateStats_initialSample_doesNotNotify() throws Exception {
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800218 DataUsageRequest inputRequest = new DataUsageRequest(
Antonio Cansado6965c182016-03-30 11:37:18 -0700219 DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800220
221 DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
222 Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
223 assertTrue(request.requestId > 0);
Antonio Cansado6965c182016-03-30 11:37:18 -0700224 assertTrue(Objects.equals(sTemplateImsi1, request.template));
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800225 assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
226
227 NetworkIdentitySet identSet = new NetworkIdentitySet();
228 identSet.add(new NetworkIdentity(
229 TYPE_MOBILE, TelephonyManager.NETWORK_TYPE_UNKNOWN,
Jack Yu66a6be32016-03-30 11:14:39 -0700230 IMSI_1, null /* networkId */, false /* roaming */, true /* metered */));
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800231 mActiveIfaces.put(TEST_IFACE, identSet);
232
233 // Baseline
234 NetworkStats xtSnapshot = new NetworkStats(TEST_START, 1 /* initialSize */)
235 .addIfaceValues(TEST_IFACE, BASE_BYTES, 8L, BASE_BYTES, 16L);
236 NetworkStats uidSnapshot = null;
237
238 mStatsObservers.updateStats(
239 xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
240 VPN_INFO, TEST_START);
241 waitForObserverToIdle();
242
243 assertTrue(mCv.block(WAIT_TIMEOUT));
244 assertEquals(INVALID_TYPE, mHandler.mLastMessageType);
245 }
246
247 public void testUpdateStats_belowThreshold_doesNotNotify() throws Exception {
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800248 DataUsageRequest inputRequest = new DataUsageRequest(
Antonio Cansado6965c182016-03-30 11:37:18 -0700249 DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800250
251 DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
252 Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
253 assertTrue(request.requestId > 0);
Antonio Cansado6965c182016-03-30 11:37:18 -0700254 assertTrue(Objects.equals(sTemplateImsi1, request.template));
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800255 assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
256
257 NetworkIdentitySet identSet = new NetworkIdentitySet();
258 identSet.add(new NetworkIdentity(
259 TYPE_MOBILE, TelephonyManager.NETWORK_TYPE_UNKNOWN,
Jack Yu66a6be32016-03-30 11:14:39 -0700260 IMSI_1, null /* networkId */, false /* roaming */, true /* metered */));
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800261 mActiveIfaces.put(TEST_IFACE, identSet);
262
263 // Baseline
264 NetworkStats xtSnapshot = new NetworkStats(TEST_START, 1 /* initialSize */)
265 .addIfaceValues(TEST_IFACE, BASE_BYTES, 8L, BASE_BYTES, 16L);
266 NetworkStats uidSnapshot = null;
267 mStatsObservers.updateStats(
268 xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
269 VPN_INFO, TEST_START);
270
271 // Delta
272 xtSnapshot = new NetworkStats(TEST_START, 1 /* initialSize */)
273 .addIfaceValues(TEST_IFACE, BASE_BYTES + 1024L, 10L, BASE_BYTES + 2048L, 20L);
274 mStatsObservers.updateStats(
275 xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
276 VPN_INFO, TEST_START);
277 waitForObserverToIdle();
278
279 assertTrue(mCv.block(WAIT_TIMEOUT));
280 mCv.block(WAIT_TIMEOUT);
281 assertEquals(INVALID_TYPE, mHandler.mLastMessageType);
282 }
283
Antonio Cansado6965c182016-03-30 11:37:18 -0700284 public void testUpdateStats_deviceAccess_notifies() throws Exception {
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800285 DataUsageRequest inputRequest = new DataUsageRequest(
Antonio Cansado6965c182016-03-30 11:37:18 -0700286 DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800287
288 DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
289 Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
290 assertTrue(request.requestId > 0);
Antonio Cansado6965c182016-03-30 11:37:18 -0700291 assertTrue(Objects.equals(sTemplateImsi1, request.template));
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800292 assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
293
294 NetworkIdentitySet identSet = new NetworkIdentitySet();
295 identSet.add(new NetworkIdentity(
296 TYPE_MOBILE, TelephonyManager.NETWORK_TYPE_UNKNOWN,
Jack Yu66a6be32016-03-30 11:14:39 -0700297 IMSI_1, null /* networkId */, false /* roaming */, true /* metered */));
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800298 mActiveIfaces.put(TEST_IFACE, identSet);
299
300 // Baseline
301 NetworkStats xtSnapshot = new NetworkStats(TEST_START, 1 /* initialSize */)
302 .addIfaceValues(TEST_IFACE, BASE_BYTES, 8L, BASE_BYTES, 16L);
303 NetworkStats uidSnapshot = null;
304 mStatsObservers.updateStats(
305 xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
306 VPN_INFO, TEST_START);
307
308 // Delta
309 xtSnapshot = new NetworkStats(TEST_START + MINUTE_IN_MILLIS, 1 /* initialSize */)
310 .addIfaceValues(TEST_IFACE, BASE_BYTES + THRESHOLD_BYTES, 12L,
311 BASE_BYTES + THRESHOLD_BYTES, 22L);
312 mStatsObservers.updateStats(
313 xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
314 VPN_INFO, TEST_START);
315 waitForObserverToIdle();
316
317 assertTrue(mCv.block(WAIT_TIMEOUT));
318 assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, mHandler.mLastMessageType);
319 }
320
Antonio Cansado6965c182016-03-30 11:37:18 -0700321 public void testUpdateStats_defaultAccess_notifiesSameUid() throws Exception {
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800322 DataUsageRequest inputRequest = new DataUsageRequest(
Antonio Cansado6965c182016-03-30 11:37:18 -0700323 DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800324
325 DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
326 UID_RED, NetworkStatsAccess.Level.DEFAULT);
327 assertTrue(request.requestId > 0);
Antonio Cansado6965c182016-03-30 11:37:18 -0700328 assertTrue(Objects.equals(sTemplateImsi1, request.template));
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800329 assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
330
331 NetworkIdentitySet identSet = new NetworkIdentitySet();
332 identSet.add(new NetworkIdentity(
333 TYPE_MOBILE, TelephonyManager.NETWORK_TYPE_UNKNOWN,
Jack Yu66a6be32016-03-30 11:14:39 -0700334 IMSI_1, null /* networkId */, false /* roaming */, true /* metered */));
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800335 mActiveUidIfaces.put(TEST_IFACE, identSet);
336
337 // Baseline
338 NetworkStats xtSnapshot = null;
339 NetworkStats uidSnapshot = new NetworkStats(TEST_START, 2 /* initialSize */)
Stephen Chenc926b732016-10-21 12:44:26 -0700340 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800341 BASE_BYTES, 2L, BASE_BYTES, 2L, 0L);
342 mStatsObservers.updateStats(
343 xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
344 VPN_INFO, TEST_START);
345
346 // Delta
Antonio Cansado6965c182016-03-30 11:37:18 -0700347 uidSnapshot = new NetworkStats(TEST_START + 2 * MINUTE_IN_MILLIS, 2 /* initialSize */)
Stephen Chenc926b732016-10-21 12:44:26 -0700348 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800349 BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L);
350 mStatsObservers.updateStats(
351 xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
352 VPN_INFO, TEST_START);
353 waitForObserverToIdle();
354
355 assertTrue(mCv.block(WAIT_TIMEOUT));
356 assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, mHandler.mLastMessageType);
357 }
358
Antonio Cansado6965c182016-03-30 11:37:18 -0700359 public void testUpdateStats_defaultAccess_usageOtherUid_doesNotNotify() throws Exception {
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800360 DataUsageRequest inputRequest = new DataUsageRequest(
Antonio Cansado6965c182016-03-30 11:37:18 -0700361 DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800362
363 DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
364 UID_BLUE, NetworkStatsAccess.Level.DEFAULT);
365 assertTrue(request.requestId > 0);
Antonio Cansado6965c182016-03-30 11:37:18 -0700366 assertTrue(Objects.equals(sTemplateImsi1, request.template));
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800367 assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
368
369 NetworkIdentitySet identSet = new NetworkIdentitySet();
370 identSet.add(new NetworkIdentity(
371 TYPE_MOBILE, TelephonyManager.NETWORK_TYPE_UNKNOWN,
Jack Yu66a6be32016-03-30 11:14:39 -0700372 IMSI_1, null /* networkId */, false /* roaming */, true /* metered */));
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800373 mActiveUidIfaces.put(TEST_IFACE, identSet);
374
375 // Baseline
376 NetworkStats xtSnapshot = null;
377 NetworkStats uidSnapshot = new NetworkStats(TEST_START, 2 /* initialSize */)
Stephen Chenc926b732016-10-21 12:44:26 -0700378 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800379 BASE_BYTES, 2L, BASE_BYTES, 2L, 0L);
380 mStatsObservers.updateStats(
381 xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
382 VPN_INFO, TEST_START);
383
384 // Delta
Antonio Cansado6965c182016-03-30 11:37:18 -0700385 uidSnapshot = new NetworkStats(TEST_START + 2 * MINUTE_IN_MILLIS, 2 /* initialSize */)
Stephen Chenc926b732016-10-21 12:44:26 -0700386 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800387 BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L);
388 mStatsObservers.updateStats(
389 xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
390 VPN_INFO, TEST_START);
391 waitForObserverToIdle();
392
393 assertTrue(mCv.block(WAIT_TIMEOUT));
394 assertEquals(INVALID_TYPE, mHandler.mLastMessageType);
395 }
396
397 public void testUpdateStats_userAccess_usageSameUser_notifies() throws Exception {
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800398 DataUsageRequest inputRequest = new DataUsageRequest(
Antonio Cansado6965c182016-03-30 11:37:18 -0700399 DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800400
401 DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
402 UID_BLUE, NetworkStatsAccess.Level.USER);
403 assertTrue(request.requestId > 0);
Antonio Cansado6965c182016-03-30 11:37:18 -0700404 assertTrue(Objects.equals(sTemplateImsi1, request.template));
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800405 assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
406
407 NetworkIdentitySet identSet = new NetworkIdentitySet();
408 identSet.add(new NetworkIdentity(
409 TYPE_MOBILE, TelephonyManager.NETWORK_TYPE_UNKNOWN,
Jack Yu66a6be32016-03-30 11:14:39 -0700410 IMSI_1, null /* networkId */, false /* roaming */, true /* metered */));
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800411 mActiveUidIfaces.put(TEST_IFACE, identSet);
412
413 // Baseline
414 NetworkStats xtSnapshot = null;
415 NetworkStats uidSnapshot = new NetworkStats(TEST_START, 2 /* initialSize */)
Stephen Chenc926b732016-10-21 12:44:26 -0700416 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800417 BASE_BYTES, 2L, BASE_BYTES, 2L, 0L);
418 mStatsObservers.updateStats(
419 xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
420 VPN_INFO, TEST_START);
421
422 // Delta
Antonio Cansado6965c182016-03-30 11:37:18 -0700423 uidSnapshot = new NetworkStats(TEST_START + 2 * MINUTE_IN_MILLIS, 2 /* initialSize */)
Stephen Chenc926b732016-10-21 12:44:26 -0700424 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800425 BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L);
426 mStatsObservers.updateStats(
427 xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
428 VPN_INFO, TEST_START);
429 waitForObserverToIdle();
430
431 assertTrue(mCv.block(WAIT_TIMEOUT));
432 assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, mHandler.mLastMessageType);
433 }
434
435 public void testUpdateStats_userAccess_usageAnotherUser_doesNotNotify() throws Exception {
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800436 DataUsageRequest inputRequest = new DataUsageRequest(
Antonio Cansado6965c182016-03-30 11:37:18 -0700437 DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800438
439 DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
440 UID_RED, NetworkStatsAccess.Level.USER);
441 assertTrue(request.requestId > 0);
Antonio Cansado6965c182016-03-30 11:37:18 -0700442 assertTrue(Objects.equals(sTemplateImsi1, request.template));
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800443 assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
444
445 NetworkIdentitySet identSet = new NetworkIdentitySet();
446 identSet.add(new NetworkIdentity(
447 TYPE_MOBILE, TelephonyManager.NETWORK_TYPE_UNKNOWN,
Jack Yu66a6be32016-03-30 11:14:39 -0700448 IMSI_1, null /* networkId */, false /* roaming */, true /* metered */));
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800449 mActiveUidIfaces.put(TEST_IFACE, identSet);
450
451 // Baseline
452 NetworkStats xtSnapshot = null;
453 NetworkStats uidSnapshot = new NetworkStats(TEST_START, 2 /* initialSize */)
Stephen Chenc926b732016-10-21 12:44:26 -0700454 .addValues(TEST_IFACE, UID_ANOTHER_USER, SET_DEFAULT, TAG_NONE, METERED_NO,
455 ROAMING_NO, BASE_BYTES, 2L, BASE_BYTES, 2L, 0L);
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800456 mStatsObservers.updateStats(
457 xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
458 VPN_INFO, TEST_START);
459
460 // Delta
Antonio Cansado6965c182016-03-30 11:37:18 -0700461 uidSnapshot = new NetworkStats(TEST_START + 2 * MINUTE_IN_MILLIS, 2 /* initialSize */)
Stephen Chenc926b732016-10-21 12:44:26 -0700462 .addValues(TEST_IFACE, UID_ANOTHER_USER, SET_DEFAULT, TAG_NONE, METERED_NO,
463 ROAMING_NO, BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES,
464 2L, 0L);
Antonio Cansadocd42acd2016-02-17 13:03:38 -0800465 mStatsObservers.updateStats(
466 xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
467 VPN_INFO, TEST_START);
468 waitForObserverToIdle();
469
470 assertTrue(mCv.block(WAIT_TIMEOUT));
471 assertEquals(INVALID_TYPE, mHandler.mLastMessageType);
472 }
473
474 private void waitForObserverToIdle() {
475 // Send dummy message to make sure that any previous message has been handled
476 mHandler.sendMessage(mHandler.obtainMessage(-1));
477 mObserverHandlerThread.waitForIdle(WAIT_TIMEOUT);
478 }
479}