[SP18.4] Add unit test for polling network stats in OffloadController

Test: atest OffloadControllerTest
Bug: 149467454
Change-Id: I9b9c9c096a2366aaf383d5c2d567db6682f02dad
Merged-In: I9b9c9c096a2366aaf383d5c2d567db6682f02dad
(cherry-picked from aosp/1295347)
This commit is contained in:
junyulai
2020-04-24 19:29:27 +08:00
parent b7011d2265
commit 14722baf0d
2 changed files with 61 additions and 2 deletions

View File

@@ -77,7 +77,8 @@ public class OffloadController {
private static final boolean DBG = false; private static final boolean DBG = false;
private static final String ANYIP = "0.0.0.0"; private static final String ANYIP = "0.0.0.0";
private static final ForwardedStats EMPTY_STATS = new ForwardedStats(); private static final ForwardedStats EMPTY_STATS = new ForwardedStats();
private static final int DEFAULT_PERFORM_POLL_INTERVAL_MS = 5000; @VisibleForTesting
static final int DEFAULT_PERFORM_POLL_INTERVAL_MS = 5000;
@VisibleForTesting @VisibleForTesting
enum StatsType { enum StatsType {

View File

@@ -26,6 +26,7 @@ import static android.net.NetworkStats.UID_TETHERING;
import static android.net.RouteInfo.RTN_UNICAST; import static android.net.RouteInfo.RTN_UNICAST;
import static android.provider.Settings.Global.TETHER_OFFLOAD_DISABLED; import static android.provider.Settings.Global.TETHER_OFFLOAD_DISABLED;
import static com.android.networkstack.tethering.OffloadController.DEFAULT_PERFORM_POLL_INTERVAL_MS;
import static com.android.networkstack.tethering.OffloadController.StatsType.STATS_PER_IFACE; import static com.android.networkstack.tethering.OffloadController.StatsType.STATS_PER_IFACE;
import static com.android.networkstack.tethering.OffloadController.StatsType.STATS_PER_UID; import static com.android.networkstack.tethering.OffloadController.StatsType.STATS_PER_UID;
import static com.android.networkstack.tethering.OffloadHardwareInterface.ForwardedStats; import static com.android.networkstack.tethering.OffloadHardwareInterface.ForwardedStats;
@@ -45,6 +46,7 @@ import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.verifyNoMoreInteractions;
@@ -61,6 +63,7 @@ import android.net.LinkProperties;
import android.net.NetworkStats; import android.net.NetworkStats;
import android.net.NetworkStats.Entry; import android.net.NetworkStats.Entry;
import android.net.RouteInfo; import android.net.RouteInfo;
import android.net.netstats.provider.NetworkStatsProvider;
import android.net.util.SharedLog; import android.net.util.SharedLog;
import android.os.Handler; import android.os.Handler;
import android.os.test.TestLooper; import android.os.test.TestLooper;
@@ -118,7 +121,7 @@ public class OffloadControllerTest {
private OffloadController.Dependencies mDeps = new OffloadController.Dependencies() { private OffloadController.Dependencies mDeps = new OffloadController.Dependencies() {
@Override @Override
int getPerformPollInterval() { int getPerformPollInterval() {
return 0; return -1; // Disabled.
} }
}; };
@@ -149,6 +152,15 @@ public class OffloadControllerTest {
Settings.Global.putInt(mContentResolver, TETHER_OFFLOAD_DISABLED, 0); Settings.Global.putInt(mContentResolver, TETHER_OFFLOAD_DISABLED, 0);
} }
private void setOffloadPollInterval(int interval) {
mDeps = new OffloadController.Dependencies() {
@Override
int getPerformPollInterval() {
return interval;
}
};
}
private void waitForIdle() { private void waitForIdle() {
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
} }
@@ -769,4 +781,50 @@ public class OffloadControllerTest {
verifyNoMoreInteractions(mHardware); verifyNoMoreInteractions(mHardware);
} }
@Test
public void testOnSetAlert() throws Exception {
setupFunctioningHardwareInterface();
enableOffload();
setOffloadPollInterval(DEFAULT_PERFORM_POLL_INTERVAL_MS);
final OffloadController offload = makeOffloadController();
offload.start();
// Initialize with fake eth upstream.
final String ethernetIface = "eth1";
InOrder inOrder = inOrder(mHardware);
final LinkProperties lp = new LinkProperties();
lp.setInterfaceName(ethernetIface);
offload.setUpstreamLinkProperties(lp);
// Previous upstream was null, so no stats are fetched.
inOrder.verify(mHardware, never()).getForwardedStats(any());
// Verify that set quota to 0 will immediately triggers an callback.
mTetherStatsProvider.onSetAlert(0);
waitForIdle();
mTetherStatsProviderCb.expectNotifyAlertReached();
// Verify that notifyAlertReached never fired if quota is not yet reached.
when(mHardware.getForwardedStats(eq(ethernetIface))).thenReturn(
new ForwardedStats(0, 0));
mTetherStatsProvider.onSetAlert(100);
mTestLooper.moveTimeForward(DEFAULT_PERFORM_POLL_INTERVAL_MS);
waitForIdle();
mTetherStatsProviderCb.assertNoCallback();
// Verify that notifyAlertReached fired when quota is reached.
when(mHardware.getForwardedStats(eq(ethernetIface))).thenReturn(
new ForwardedStats(50, 50));
mTestLooper.moveTimeForward(DEFAULT_PERFORM_POLL_INTERVAL_MS);
waitForIdle();
mTetherStatsProviderCb.expectNotifyAlertReached();
// Verify that set quota with UNLIMITED won't trigger any callback, and won't fetch
// any stats since the polling is stopped.
reset(mHardware);
mTetherStatsProvider.onSetAlert(NetworkStatsProvider.QUOTA_UNLIMITED);
mTestLooper.moveTimeForward(DEFAULT_PERFORM_POLL_INTERVAL_MS);
waitForIdle();
mTetherStatsProviderCb.assertNoCallback();
verify(mHardware, never()).getForwardedStats(any());
}
} }