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