16a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN/* 26a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN * Copyright (C) 2018 The Android Open Source Project 36a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN * 46a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN * Licensed under the Apache License, Version 2.0 (the "License"); 56a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN * you may not use this file except in compliance with the License. 66a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN * You may obtain a copy of the License at 76a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN * 86a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN * http://www.apache.org/licenses/LICENSE-2.0 96a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN * 106a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN * Unless required by applicable law or agreed to in writing, software 116a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN * distributed under the License is distributed on an "AS IS" BASIS, 126a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN * See the License for the specific language governing permissions and 146a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN * limitations under the License. 156a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN */ 166a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 176a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANpackage com.android.server.connectivity; 186a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 196a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport static android.content.Intent.ACTION_CONFIGURATION_CHANGED; 206a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET; 216a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING; 226a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; 236a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport static android.net.NetworkPolicy.LIMIT_DISABLED; 246a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport static android.net.NetworkPolicy.SNOOZE_NEVER; 256a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport static android.net.NetworkPolicy.WARNING_DISABLED; 266a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport static android.provider.Settings.Global.NETWORK_DEFAULT_DAILY_MULTIPATH_QUOTA_BYTES; 276a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 286a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport static com.android.server.net.NetworkPolicyManagerInternal.QUOTA_TYPE_MULTIPATH; 296a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport static com.android.server.net.NetworkPolicyManagerService.OPPORTUNISTIC_QUOTA_UNKNOWN; 306a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 316a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport static junit.framework.TestCase.assertEquals; 326a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport static junit.framework.TestCase.assertNotNull; 336a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 346a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport static org.mockito.ArgumentMatchers.any; 356a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport static org.mockito.ArgumentMatchers.anyInt; 366a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport static org.mockito.ArgumentMatchers.argThat; 376a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport static org.mockito.ArgumentMatchers.eq; 386a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport static org.mockito.Mockito.times; 396a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport static org.mockito.Mockito.verify; 406a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport static org.mockito.Mockito.when; 416a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 426a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport android.app.usage.NetworkStatsManager; 436a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport android.content.BroadcastReceiver; 446a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport android.content.Context; 456a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport android.content.Intent; 466a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport android.content.pm.ApplicationInfo; 476a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport android.content.res.Resources; 486a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport android.net.ConnectivityManager; 496a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport android.net.Network; 506a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport android.net.NetworkCapabilities; 516a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport android.net.NetworkPolicy; 526a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport android.net.NetworkPolicyManager; 536a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport android.net.NetworkTemplate; 546a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport android.net.StringNetworkSpecifier; 556a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport android.os.Handler; 566a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport android.provider.Settings; 576a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport android.support.test.filters.SmallTest; 586a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport android.support.test.runner.AndroidJUnit4; 596a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport android.telephony.TelephonyManager; 606a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport android.test.mock.MockContentResolver; 616a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport android.util.DataUnit; 626a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport android.util.RecurrenceRule; 636a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 646a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport com.android.internal.R; 656a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport com.android.internal.util.test.FakeSettingsProvider; 666a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport com.android.server.LocalServices; 676a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport com.android.server.net.NetworkPolicyManagerInternal; 686a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport com.android.server.net.NetworkStatsManagerInternal; 696a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 706a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport org.junit.After; 716a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport org.junit.Before; 726a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport org.junit.Test; 736a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport org.junit.runner.RunWith; 746a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport org.mockito.ArgumentCaptor; 756a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport org.mockito.Mock; 766a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport org.mockito.Mockito; 776a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport org.mockito.MockitoAnnotations; 786a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 796a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport java.time.Clock; 806a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport java.time.Instant; 816a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport java.time.Period; 826a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport java.time.ZoneId; 836a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport java.time.ZonedDateTime; 846a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANimport java.time.temporal.ChronoUnit; 856a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 866a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN@RunWith(AndroidJUnit4.class) 876a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN@SmallTest 886a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VANpublic class MultipathPolicyTrackerTest { 896a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN private static final Network TEST_NETWORK = new Network(123); 906a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN private static final int POLICY_SNOOZED = -100; 916a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 926a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN @Mock private Context mContext; 936a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN @Mock private Resources mResources; 946a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN @Mock private Handler mHandler; 956a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN @Mock private MultipathPolicyTracker.Dependencies mDeps; 966a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN @Mock private Clock mClock; 976a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN @Mock private ConnectivityManager mCM; 986a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN @Mock private NetworkPolicyManager mNPM; 996a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN @Mock private NetworkStatsManager mStatsManager; 1006a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN @Mock private NetworkPolicyManagerInternal mNPMI; 1016a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN @Mock private NetworkStatsManagerInternal mNetworkStatsManagerInternal; 1026a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN @Mock private TelephonyManager mTelephonyManager; 1036a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN private MockContentResolver mContentResolver; 1046a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 1056a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN private ArgumentCaptor<BroadcastReceiver> mConfigChangeReceiverCaptor; 1066a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 1076a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN private MultipathPolicyTracker mTracker; 1086a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 1096a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN private Clock mPreviousRecurrenceRuleClock; 1106a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN private boolean mRecurrenceRuleClockMocked; 1116a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 1126a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN private <T> void mockService(String serviceName, Class<T> serviceClass, T service) { 1136a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN when(mContext.getSystemServiceName(serviceClass)).thenReturn(serviceName); 1146a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN when(mContext.getSystemService(serviceName)).thenReturn(service); 1156a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN } 1166a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 1176a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN @Before 1186a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN public void setUp() { 1196a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN MockitoAnnotations.initMocks(this); 1206a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 1216a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN mPreviousRecurrenceRuleClock = RecurrenceRule.sClock; 1226a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN RecurrenceRule.sClock = mClock; 1236a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN mRecurrenceRuleClockMocked = true; 1246a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 1256a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN mConfigChangeReceiverCaptor = ArgumentCaptor.forClass(BroadcastReceiver.class); 1266a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 1276a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN when(mContext.getResources()).thenReturn(mResources); 1286a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN when(mContext.getApplicationInfo()).thenReturn(new ApplicationInfo()); 1296a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN when(mContext.registerReceiverAsUser(mConfigChangeReceiverCaptor.capture(), 1306a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN any(), argThat(f -> f.hasAction(ACTION_CONFIGURATION_CHANGED)), any(), any())) 1316a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN .thenReturn(null); 1326a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 1336a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN when(mDeps.getClock()).thenReturn(mClock); 1346a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 1356a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager); 1366a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 1376a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN mContentResolver = Mockito.spy(new MockContentResolver(mContext)); 1386a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider()); 1396a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN Settings.Global.clearProviderForTest(); 1406a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN when(mContext.getContentResolver()).thenReturn(mContentResolver); 1416a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 1426a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN mockService(Context.CONNECTIVITY_SERVICE, ConnectivityManager.class, mCM); 1436a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN mockService(Context.NETWORK_POLICY_SERVICE, NetworkPolicyManager.class, mNPM); 1446a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN mockService(Context.NETWORK_STATS_SERVICE, NetworkStatsManager.class, mStatsManager); 1456a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN mockService(Context.TELEPHONY_SERVICE, TelephonyManager.class, mTelephonyManager); 1466a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 1476a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN LocalServices.removeServiceForTest(NetworkPolicyManagerInternal.class); 1486a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN LocalServices.addService(NetworkPolicyManagerInternal.class, mNPMI); 1496a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 1506a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN LocalServices.removeServiceForTest(NetworkStatsManagerInternal.class); 1516a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN LocalServices.addService(NetworkStatsManagerInternal.class, mNetworkStatsManagerInternal); 1526a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 1536a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN mTracker = new MultipathPolicyTracker(mContext, mHandler, mDeps); 1546a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN } 1556a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 1566a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN @After 1576a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN public void tearDown() { 1586a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN // Avoid setting static clock to null (which should normally not be the case) 1596a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN // if MockitoAnnotations.initMocks threw an exception 1606a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN if (mRecurrenceRuleClockMocked) { 1616a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN RecurrenceRule.sClock = mPreviousRecurrenceRuleClock; 1626a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN } 1636a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN mRecurrenceRuleClockMocked = false; 1646a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN } 1656a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 1666a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN private void setDefaultQuotaGlobalSetting(long setting) { 1676a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN Settings.Global.putInt(mContentResolver, NETWORK_DEFAULT_DAILY_MULTIPATH_QUOTA_BYTES, 1686a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN (int) setting); 1696a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN } 1706a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 1716a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN private void testGetMultipathPreference( 1726a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN long usedBytesToday, long subscriptionQuota, long policyWarning, long policyLimit, 1736a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN long defaultGlobalSetting, long defaultResSetting, boolean roaming) { 1746a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 1756a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN // TODO: tests should not use ZoneId.systemDefault() once code handles TZ correctly. 1766a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN final ZonedDateTime now = ZonedDateTime.ofInstant( 1776a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN Instant.parse("2017-04-02T10:11:12Z"), ZoneId.systemDefault()); 1786a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN final ZonedDateTime startOfDay = now.truncatedTo(ChronoUnit.DAYS); 1796a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN when(mClock.millis()).thenReturn(now.toInstant().toEpochMilli()); 1806a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN when(mClock.instant()).thenReturn(now.toInstant()); 1816a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN when(mClock.getZone()).thenReturn(ZoneId.systemDefault()); 1826a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 1836a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN // Setup plan quota 1846a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN when(mNPMI.getSubscriptionOpportunisticQuota(TEST_NETWORK, QUOTA_TYPE_MULTIPATH)) 1856a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN .thenReturn(subscriptionQuota); 1866a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 1876a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN // Setup user policy warning / limit 1886a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN if (policyWarning != WARNING_DISABLED || policyLimit != LIMIT_DISABLED) { 1896a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN final Instant recurrenceStart = Instant.parse("2017-04-01T00:00:00Z"); 1906a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN final RecurrenceRule recurrenceRule = new RecurrenceRule( 1916a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN ZonedDateTime.ofInstant( 1926a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN recurrenceStart, 1936a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN ZoneId.systemDefault()), 1946a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN null /* end */, 1956a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN Period.ofMonths(1)); 1966a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN final boolean snoozeWarning = policyWarning == POLICY_SNOOZED; 1976a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN final boolean snoozeLimit = policyLimit == POLICY_SNOOZED; 1986a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN when(mNPM.getNetworkPolicies()).thenReturn(new NetworkPolicy[] { 1996a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN new NetworkPolicy( 2006a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN NetworkTemplate.buildTemplateMobileWildcard(), 2016a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN recurrenceRule, 2026a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN snoozeWarning ? 0 : policyWarning, 2036a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN snoozeLimit ? 0 : policyLimit, 2046a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN snoozeWarning ? recurrenceStart.toEpochMilli() + 1 : SNOOZE_NEVER, 2056a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN snoozeLimit ? recurrenceStart.toEpochMilli() + 1 : SNOOZE_NEVER, 2066a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN SNOOZE_NEVER, 2076a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN true /* metered */, 2086a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN false /* inferred */) 2096a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN }); 2106a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN } else { 2116a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN when(mNPM.getNetworkPolicies()).thenReturn(new NetworkPolicy[0]); 2126a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN } 2136a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 2146a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN // Setup default quota in settings and resources 2156a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN if (defaultGlobalSetting > 0) { 2166a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN setDefaultQuotaGlobalSetting(defaultGlobalSetting); 2176a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN } 2186a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN when(mResources.getInteger(R.integer.config_networkDefaultDailyMultipathQuotaBytes)) 2196a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN .thenReturn((int) defaultResSetting); 2206a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 2216a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN when(mNetworkStatsManagerInternal.getNetworkTotalBytes( 2226a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN any(), 2236a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN eq(startOfDay.toInstant().toEpochMilli()), 2246a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN eq(now.toInstant().toEpochMilli()))).thenReturn(usedBytesToday); 2256a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 2266a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN ArgumentCaptor<ConnectivityManager.NetworkCallback> networkCallback = 2276a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN ArgumentCaptor.forClass(ConnectivityManager.NetworkCallback.class); 2286a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN mTracker.start(); 2296a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN verify(mCM).registerNetworkCallback(any(), networkCallback.capture(), any()); 2306a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 2316a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN // Simulate callback after capability changes 2326a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN final NetworkCapabilities capabilities = new NetworkCapabilities() 2336a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN .addCapability(NET_CAPABILITY_INTERNET) 2346a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN .addTransportType(TRANSPORT_CELLULAR) 2356a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN .setNetworkSpecifier(new StringNetworkSpecifier("234")); 2366a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN if (!roaming) { 2376a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN capabilities.addCapability(NET_CAPABILITY_NOT_ROAMING); 2386a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN } 2396a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN networkCallback.getValue().onCapabilitiesChanged( 2406a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN TEST_NETWORK, 2416a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN capabilities); 2426a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN } 2436a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 2446a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN @Test 2456a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN public void testGetMultipathPreference_SubscriptionQuota() { 2466a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN testGetMultipathPreference( 2476a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN DataUnit.MEGABYTES.toBytes(2) /* usedBytesToday */, 2486a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN DataUnit.MEGABYTES.toBytes(14) /* subscriptionQuota */, 2496a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN DataUnit.MEGABYTES.toBytes(100) /* policyWarning */, 2506a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN LIMIT_DISABLED, 2516a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN DataUnit.MEGABYTES.toBytes(12) /* defaultGlobalSetting */, 2526a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 2_500_000 /* defaultResSetting */, 2536a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN false /* roaming */); 2546a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 2556a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN verify(mStatsManager, times(1)).registerUsageCallback( 2566a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN any(), anyInt(), eq(DataUnit.MEGABYTES.toBytes(12)), any(), any()); 2576a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN } 2586a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 2596a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN @Test 2606a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN public void testGetMultipathPreference_UserWarningQuota() { 2616a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN testGetMultipathPreference( 2626a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN DataUnit.MEGABYTES.toBytes(7) /* usedBytesToday */, 2636a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN OPPORTUNISTIC_QUOTA_UNKNOWN, 2646a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN // 29 days from Apr. 2nd to May 1st 2656a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN DataUnit.MEGABYTES.toBytes(15 * 29 * 20) /* policyWarning */, 2666a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN LIMIT_DISABLED, 2676a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN DataUnit.MEGABYTES.toBytes(12) /* defaultGlobalSetting */, 2686a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 2_500_000 /* defaultResSetting */, 2696a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN false /* roaming */); 2706a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 2716a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN // Daily budget should be 15MB (5% of daily quota), 7MB used today: callback set for 8MB 2726a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN verify(mStatsManager, times(1)).registerUsageCallback( 2736a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN any(), anyInt(), eq(DataUnit.MEGABYTES.toBytes(8)), any(), any()); 2746a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN } 2756a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 2766a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN @Test 2776a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN public void testGetMultipathPreference_SnoozedWarningQuota() { 2786a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN testGetMultipathPreference( 2796a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN DataUnit.MEGABYTES.toBytes(7) /* usedBytesToday */, 2806a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN OPPORTUNISTIC_QUOTA_UNKNOWN, 2816a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN // 29 days from Apr. 2nd to May 1st 2826a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN POLICY_SNOOZED /* policyWarning */, 2836a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN DataUnit.MEGABYTES.toBytes(15 * 29 * 20) /* policyLimit */, 2846a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN DataUnit.MEGABYTES.toBytes(12) /* defaultGlobalSetting */, 2856a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 2_500_000 /* defaultResSetting */, 2866a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN false /* roaming */); 2876a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 2886a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN // Daily budget should be 15MB (5% of daily quota), 7MB used today: callback set for 8MB 2896a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN verify(mStatsManager, times(1)).registerUsageCallback( 2906a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN any(), anyInt(), eq(DataUnit.MEGABYTES.toBytes(8)), any(), any()); 2916a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN } 2926a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 2936a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN @Test 2946a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN public void testGetMultipathPreference_SnoozedBothQuota() { 2956a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN testGetMultipathPreference( 2966a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN DataUnit.MEGABYTES.toBytes(7) /* usedBytesToday */, 2976a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN OPPORTUNISTIC_QUOTA_UNKNOWN, 2986a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN // 29 days from Apr. 2nd to May 1st 2996a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN POLICY_SNOOZED /* policyWarning */, 3006a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN POLICY_SNOOZED /* policyLimit */, 3016a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN DataUnit.MEGABYTES.toBytes(12) /* defaultGlobalSetting */, 3026a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 2_500_000 /* defaultResSetting */, 3036a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN false /* roaming */); 3046a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 3056a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN // Default global setting should be used: 12 - 7 = 5 3066a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN verify(mStatsManager, times(1)).registerUsageCallback( 3076a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN any(), anyInt(), eq(DataUnit.MEGABYTES.toBytes(5)), any(), any()); 3086a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN } 3096a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 3106a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN @Test 3116a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN public void testGetMultipathPreference_SettingChanged() { 3126a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN testGetMultipathPreference( 3136a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN DataUnit.MEGABYTES.toBytes(2) /* usedBytesToday */, 3146a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN OPPORTUNISTIC_QUOTA_UNKNOWN, 3156a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN WARNING_DISABLED, 3166a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN LIMIT_DISABLED, 3176a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN -1 /* defaultGlobalSetting */, 3186a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN DataUnit.MEGABYTES.toBytes(10) /* defaultResSetting */, 3196a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN false /* roaming */); 3206a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 3216a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN verify(mStatsManager, times(1)).registerUsageCallback( 3226a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN any(), anyInt(), eq(DataUnit.MEGABYTES.toBytes(8)), any(), any()); 3236a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 3246a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN // Update setting 3256a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN setDefaultQuotaGlobalSetting(DataUnit.MEGABYTES.toBytes(14)); 3266a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN mTracker.mSettingsObserver.onChange( 3276a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN false, Settings.Global.getUriFor(NETWORK_DEFAULT_DAILY_MULTIPATH_QUOTA_BYTES)); 3286a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 3296a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN // Callback must have been re-registered with new setting 3306a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN verify(mStatsManager, times(1)).unregisterUsageCallback(any()); 3316a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN verify(mStatsManager, times(1)).registerUsageCallback( 3326a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN any(), anyInt(), eq(DataUnit.MEGABYTES.toBytes(12)), any(), any()); 3336a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN } 3346a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 3356a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN @Test 3366a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN public void testGetMultipathPreference_ResourceChanged() { 3376a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN testGetMultipathPreference( 3386a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN DataUnit.MEGABYTES.toBytes(2) /* usedBytesToday */, 3396a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN OPPORTUNISTIC_QUOTA_UNKNOWN, 3406a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN WARNING_DISABLED, 3416a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN LIMIT_DISABLED, 3426a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN -1 /* defaultGlobalSetting */, 3436a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN DataUnit.MEGABYTES.toBytes(14) /* defaultResSetting */, 3446a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN false /* roaming */); 3456a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 3466a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN verify(mStatsManager, times(1)).registerUsageCallback( 3476a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN any(), anyInt(), eq(DataUnit.MEGABYTES.toBytes(12)), any(), any()); 3486a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 3496a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN when(mResources.getInteger(R.integer.config_networkDefaultDailyMultipathQuotaBytes)) 3506a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN .thenReturn((int) DataUnit.MEGABYTES.toBytes(16)); 3516a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 3526a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN final BroadcastReceiver configChangeReceiver = mConfigChangeReceiverCaptor.getValue(); 3536a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN assertNotNull(configChangeReceiver); 3546a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN configChangeReceiver.onReceive(mContext, new Intent()); 3556a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN 3566a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN // Uses the new setting (16 - 2 = 14MB) 3576a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN verify(mStatsManager, times(1)).registerUsageCallback( 3586a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN any(), anyInt(), eq(DataUnit.MEGABYTES.toBytes(14)), any(), any()); 3596a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN } 3606a7a5a1c3b11cc229a75fa6390f5769b323d0c23Remi NGUYEN VAN} 361