Add unit test for MultipathPolicyTracker

This CL adds unit test to test onThresholdReached event
would unregister and re-register usage callback.

Test: MultipathPolicyTrackerTest#testOnThresholdReached
Bug: 233733267
Change-Id: I6e43ae93055009d91b0795a4466f2c02f4403c0a
Merged-In: I6e43ae93055009d91b0795a4466f2c02f4403c0a
  (pure cherry-picked from ag/18579049)
This commit is contained in:
Junyu Lai 2022-05-25 10:26:05 +08:00
commit 207b125a20

View file

@ -27,6 +27,7 @@ import static android.provider.Settings.Global.NETWORK_DEFAULT_DAILY_MULTIPATH_Q
import static com.android.server.net.NetworkPolicyManagerInternal.QUOTA_TYPE_MULTIPATH;
import static com.android.server.net.NetworkPolicyManagerService.OPPORTUNISTIC_QUOTA_UNKNOWN;
import static com.android.testutils.DevSdkIgnoreRuleKt.SC_V2;
import static org.junit.Assert.assertNotNull;
import static org.mockito.ArgumentMatchers.any;
@ -184,7 +185,7 @@ public class MultipathPolicyTrackerTest {
(int) setting);
}
private void testGetMultipathPreference(
private void prepareGetMultipathPreferenceTest(
long usedBytesToday, long subscriptionQuota, long policyWarning, long policyLimit,
long defaultGlobalSetting, long defaultResSetting, boolean roaming) {
@ -286,7 +287,7 @@ public class MultipathPolicyTrackerTest {
@Test
public void testGetMultipathPreference_SubscriptionQuota() {
testGetMultipathPreference(
prepareGetMultipathPreferenceTest(
DataUnit.MEGABYTES.toBytes(2) /* usedBytesToday */,
DataUnit.MEGABYTES.toBytes(14) /* subscriptionQuota */,
DataUnit.MEGABYTES.toBytes(100) /* policyWarning */,
@ -301,7 +302,7 @@ public class MultipathPolicyTrackerTest {
@Test
public void testGetMultipathPreference_UserWarningQuota() {
testGetMultipathPreference(
prepareGetMultipathPreferenceTest(
DataUnit.MEGABYTES.toBytes(7) /* usedBytesToday */,
OPPORTUNISTIC_QUOTA_UNKNOWN,
// Remaining days are 29 days from Apr. 2nd to May 1st.
@ -320,7 +321,7 @@ public class MultipathPolicyTrackerTest {
@Test
public void testGetMultipathPreference_SnoozedWarningQuota() {
testGetMultipathPreference(
prepareGetMultipathPreferenceTest(
DataUnit.MEGABYTES.toBytes(7) /* usedBytesToday */,
OPPORTUNISTIC_QUOTA_UNKNOWN,
POLICY_SNOOZED /* policyWarning */,
@ -339,7 +340,7 @@ public class MultipathPolicyTrackerTest {
@Test
public void testGetMultipathPreference_SnoozedBothQuota() {
testGetMultipathPreference(
prepareGetMultipathPreferenceTest(
DataUnit.MEGABYTES.toBytes(7) /* usedBytesToday */,
OPPORTUNISTIC_QUOTA_UNKNOWN,
// 29 days from Apr. 2nd to May 1st
@ -356,7 +357,7 @@ public class MultipathPolicyTrackerTest {
@Test
public void testGetMultipathPreference_SettingChanged() {
testGetMultipathPreference(
prepareGetMultipathPreferenceTest(
DataUnit.MEGABYTES.toBytes(2) /* usedBytesToday */,
OPPORTUNISTIC_QUOTA_UNKNOWN,
WARNING_DISABLED,
@ -381,7 +382,7 @@ public class MultipathPolicyTrackerTest {
@Test
public void testGetMultipathPreference_ResourceChanged() {
testGetMultipathPreference(
prepareGetMultipathPreferenceTest(
DataUnit.MEGABYTES.toBytes(2) /* usedBytesToday */,
OPPORTUNISTIC_QUOTA_UNKNOWN,
WARNING_DISABLED,
@ -404,4 +405,45 @@ public class MultipathPolicyTrackerTest {
verify(mStatsManager, times(1)).registerUsageCallback(
any(), eq(DataUnit.MEGABYTES.toBytes(14)), any(), any());
}
@DevSdkIgnoreRule.IgnoreUpTo(SC_V2)
@Test
public void testOnThresholdReached() {
prepareGetMultipathPreferenceTest(
DataUnit.MEGABYTES.toBytes(2) /* usedBytesToday */,
DataUnit.MEGABYTES.toBytes(14) /* subscriptionQuota */,
DataUnit.MEGABYTES.toBytes(100) /* policyWarning */,
LIMIT_DISABLED,
DataUnit.MEGABYTES.toBytes(12) /* defaultGlobalSetting */,
2_500_000 /* defaultResSetting */,
false /* roaming */);
final ArgumentCaptor<NetworkStatsManager.UsageCallback> usageCallbackCaptor =
ArgumentCaptor.forClass(NetworkStatsManager.UsageCallback.class);
final ArgumentCaptor<NetworkTemplate> networkTemplateCaptor =
ArgumentCaptor.forClass(NetworkTemplate.class);
// Verify the callback is registered with quota - used = 14 - 2 = 12MB.
verify(mStatsManager, times(1)).registerUsageCallback(
networkTemplateCaptor.capture(), eq(DataUnit.MEGABYTES.toBytes(12)), any(),
usageCallbackCaptor.capture());
// Capture arguments for later use.
final NetworkStatsManager.UsageCallback usageCallback = usageCallbackCaptor.getValue();
final NetworkTemplate template = networkTemplateCaptor.getValue();
assertNotNull(usageCallback);
assertNotNull(template);
// Decrease quota from 14 to 11, and trigger the event.
// TODO: Mock daily and monthly used bytes instead of changing subscription to simulate
// remaining quota changed.
when(mNPMI.getSubscriptionOpportunisticQuota(TEST_NETWORK, QUOTA_TYPE_MULTIPATH))
.thenReturn(DataUnit.MEGABYTES.toBytes(11));
usageCallback.onThresholdReached(template);
// Callback must have been re-registered with new remaining quota = 11 - 2 = 9MB.
verify(mStatsManager, times(1))
.unregisterUsageCallback(eq(usageCallback));
verify(mStatsManager, times(1)).registerUsageCallback(
eq(template), eq(DataUnit.MEGABYTES.toBytes(9)), any(), eq(usageCallback));
}
}