Merge "[SP18.6] Make offload controller poll interval configurable" am: 10c8c21777

Change-Id: I30ad758e9c36f39eea7851237ca5ba008d3d9d4d
This commit is contained in:
Junyu Lai
2020-05-05 10:17:49 +00:00
committed by Automerger Merge Worker
3 changed files with 30 additions and 25 deletions

View File

@@ -26,6 +26,8 @@ import static android.net.NetworkStats.UID_TETHERING;
import static android.net.netstats.provider.NetworkStatsProvider.QUOTA_UNLIMITED; import static android.net.netstats.provider.NetworkStatsProvider.QUOTA_UNLIMITED;
import static android.provider.Settings.Global.TETHER_OFFLOAD_DISABLED; import static android.provider.Settings.Global.TETHER_OFFLOAD_DISABLED;
import static com.android.networkstack.tethering.TetheringConfiguration.DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.app.usage.NetworkStatsManager; import android.app.usage.NetworkStatsManager;
@@ -77,8 +79,6 @@ 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();
@VisibleForTesting
static final int DEFAULT_PERFORM_POLL_INTERVAL_MS = 5000;
@VisibleForTesting @VisibleForTesting
enum StatsType { enum StatsType {
@@ -135,11 +135,9 @@ public class OffloadController {
private final Dependencies mDeps; private final Dependencies mDeps;
// TODO: Put more parameters in constructor into dependency object. // TODO: Put more parameters in constructor into dependency object.
static class Dependencies { interface Dependencies {
int getPerformPollInterval() { @NonNull
// TODO: Consider make this configurable. TetheringConfiguration getTetherConfig();
return DEFAULT_PERFORM_POLL_INTERVAL_MS;
}
} }
public OffloadController(Handler h, OffloadHardwareInterface hwi, public OffloadController(Handler h, OffloadHardwareInterface hwi,
@@ -453,12 +451,16 @@ public class OffloadController {
if (mHandler.hasCallbacks(mScheduledPollingTask)) { if (mHandler.hasCallbacks(mScheduledPollingTask)) {
mHandler.removeCallbacks(mScheduledPollingTask); mHandler.removeCallbacks(mScheduledPollingTask);
} }
mHandler.postDelayed(mScheduledPollingTask, mDeps.getPerformPollInterval()); mHandler.postDelayed(mScheduledPollingTask,
mDeps.getTetherConfig().getOffloadPollInterval());
} }
private boolean isPollingStatsNeeded() { private boolean isPollingStatsNeeded() {
return started() && mRemainingAlertQuota > 0 return started() && mRemainingAlertQuota > 0
&& !TextUtils.isEmpty(currentUpstreamInterface()); && !TextUtils.isEmpty(currentUpstreamInterface())
&& mDeps.getTetherConfig() != null
&& mDeps.getTetherConfig().getOffloadPollInterval()
>= DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS;
} }
private boolean maybeUpdateDataLimit(String iface) { private boolean maybeUpdateDataLimit(String iface) {

View File

@@ -273,7 +273,13 @@ public class Tethering {
mHandler = mTetherMasterSM.getHandler(); mHandler = mTetherMasterSM.getHandler();
mOffloadController = new OffloadController(mHandler, mOffloadController = new OffloadController(mHandler,
mDeps.getOffloadHardwareInterface(mHandler, mLog), mContext.getContentResolver(), mDeps.getOffloadHardwareInterface(mHandler, mLog), mContext.getContentResolver(),
statsManager, mLog, new OffloadController.Dependencies()); statsManager, mLog, new OffloadController.Dependencies() {
@Override
public TetheringConfiguration getTetherConfig() {
return mConfig;
}
});
mUpstreamNetworkMonitor = mDeps.getUpstreamNetworkMonitor(mContext, mTetherMasterSM, mLog, mUpstreamNetworkMonitor = mDeps.getUpstreamNetworkMonitor(mContext, mTetherMasterSM, mLog,
TetherMasterSM.EVENT_UPSTREAM_CALLBACK); TetherMasterSM.EVENT_UPSTREAM_CALLBACK);
mForwardedDownstreams = new LinkedHashSet<>(); mForwardedDownstreams = new LinkedHashSet<>();

View File

@@ -26,10 +26,10 @@ 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;
import static com.android.networkstack.tethering.TetheringConfiguration.DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS;
import static com.android.testutils.MiscAssertsKt.assertContainsAll; import static com.android.testutils.MiscAssertsKt.assertContainsAll;
import static com.android.testutils.MiscAssertsKt.assertThrows; import static com.android.testutils.MiscAssertsKt.assertThrows;
import static com.android.testutils.NetworkStatsUtilsKt.assertNetworkStatsEquals; import static com.android.testutils.NetworkStatsUtilsKt.assertNetworkStatsEquals;
@@ -109,6 +109,7 @@ public class OffloadControllerTest {
@Mock private ApplicationInfo mApplicationInfo; @Mock private ApplicationInfo mApplicationInfo;
@Mock private Context mContext; @Mock private Context mContext;
@Mock private NetworkStatsManager mStatsManager; @Mock private NetworkStatsManager mStatsManager;
@Mock private TetheringConfiguration mTetherConfig;
// Late init since methods must be called by the thread that created this object. // Late init since methods must be called by the thread that created this object.
private TestableNetworkStatsProviderCbBinder mTetherStatsProviderCb; private TestableNetworkStatsProviderCbBinder mTetherStatsProviderCb;
private OffloadController.OffloadTetheringStatsProvider mTetherStatsProvider; private OffloadController.OffloadTetheringStatsProvider mTetherStatsProvider;
@@ -120,8 +121,8 @@ public class OffloadControllerTest {
private final TestLooper mTestLooper = new TestLooper(); private final TestLooper mTestLooper = new TestLooper();
private OffloadController.Dependencies mDeps = new OffloadController.Dependencies() { private OffloadController.Dependencies mDeps = new OffloadController.Dependencies() {
@Override @Override
int getPerformPollInterval() { public TetheringConfiguration getTetherConfig() {
return -1; // Disabled. return mTetherConfig;
} }
}; };
@@ -133,6 +134,7 @@ public class OffloadControllerTest {
mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider()); mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider());
when(mContext.getContentResolver()).thenReturn(mContentResolver); when(mContext.getContentResolver()).thenReturn(mContentResolver);
FakeSettingsProvider.clearSettingsProvider(); FakeSettingsProvider.clearSettingsProvider();
when(mTetherConfig.getOffloadPollInterval()).thenReturn(-1); // Disabled.
} }
@After public void tearDown() throws Exception { @After public void tearDown() throws Exception {
@@ -153,12 +155,7 @@ public class OffloadControllerTest {
} }
private void setOffloadPollInterval(int interval) { private void setOffloadPollInterval(int interval) {
mDeps = new OffloadController.Dependencies() { when(mTetherConfig.getOffloadPollInterval()).thenReturn(interval);
@Override
int getPerformPollInterval() {
return interval;
}
};
} }
private void waitForIdle() { private void waitForIdle() {
@@ -785,7 +782,7 @@ public class OffloadControllerTest {
public void testOnSetAlert() throws Exception { public void testOnSetAlert() throws Exception {
setupFunctioningHardwareInterface(); setupFunctioningHardwareInterface();
enableOffload(); enableOffload();
setOffloadPollInterval(DEFAULT_PERFORM_POLL_INTERVAL_MS); setOffloadPollInterval(DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS);
final OffloadController offload = makeOffloadController(); final OffloadController offload = makeOffloadController();
offload.start(); offload.start();
@@ -807,14 +804,14 @@ public class OffloadControllerTest {
when(mHardware.getForwardedStats(eq(ethernetIface))).thenReturn( when(mHardware.getForwardedStats(eq(ethernetIface))).thenReturn(
new ForwardedStats(0, 0)); new ForwardedStats(0, 0));
mTetherStatsProvider.onSetAlert(100); mTetherStatsProvider.onSetAlert(100);
mTestLooper.moveTimeForward(DEFAULT_PERFORM_POLL_INTERVAL_MS); mTestLooper.moveTimeForward(DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS);
waitForIdle(); waitForIdle();
mTetherStatsProviderCb.assertNoCallback(); mTetherStatsProviderCb.assertNoCallback();
// Verify that notifyAlertReached fired when quota is reached. // Verify that notifyAlertReached fired when quota is reached.
when(mHardware.getForwardedStats(eq(ethernetIface))).thenReturn( when(mHardware.getForwardedStats(eq(ethernetIface))).thenReturn(
new ForwardedStats(50, 50)); new ForwardedStats(50, 50));
mTestLooper.moveTimeForward(DEFAULT_PERFORM_POLL_INTERVAL_MS); mTestLooper.moveTimeForward(DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS);
waitForIdle(); waitForIdle();
mTetherStatsProviderCb.expectNotifyAlertReached(); mTetherStatsProviderCb.expectNotifyAlertReached();
@@ -822,7 +819,7 @@ public class OffloadControllerTest {
// any stats since the polling is stopped. // any stats since the polling is stopped.
reset(mHardware); reset(mHardware);
mTetherStatsProvider.onSetAlert(NetworkStatsProvider.QUOTA_UNLIMITED); mTetherStatsProvider.onSetAlert(NetworkStatsProvider.QUOTA_UNLIMITED);
mTestLooper.moveTimeForward(DEFAULT_PERFORM_POLL_INTERVAL_MS); mTestLooper.moveTimeForward(DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS);
waitForIdle(); waitForIdle();
mTetherStatsProviderCb.assertNoCallback(); mTetherStatsProviderCb.assertNoCallback();
verify(mHardware, never()).getForwardedStats(any()); verify(mHardware, never()).getForwardedStats(any());