Merge "[SP18.6] Make offload controller poll interval configurable" am: 10c8c21777 am: 6848610485
Change-Id: Iab4a5f883a8357c23375633c16059b38d74b9e9b
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
@@ -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<>();
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
Reference in New Issue
Block a user