[SP21] Address comments for API council review about aosp/1172143

Test: atest FrameworksNetTests ImsPhoneCallTrackerTest
Test: atest TetheringTests NetworkStackTests
Test: m doc-comment-check-docs
Fix: 148552904

Change-Id: I141393f229e772d2eb9f7c156849e379bd71b845
Merged-In: I141393f229e772d2eb9f7c156849e379bd71b845
(cherry picked from aosp/1253717)
This commit is contained in:
junyulai
2020-03-06 14:50:48 +08:00
committed by Junyu Lai
parent 677a3b5e92
commit 4aa86b782b
2 changed files with 54 additions and 53 deletions

View File

@@ -39,8 +39,7 @@ import android.net.RouteInfo;
import android.net.netlink.ConntrackMessage; import android.net.netlink.ConntrackMessage;
import android.net.netlink.NetlinkConstants; import android.net.netlink.NetlinkConstants;
import android.net.netlink.NetlinkSocket; import android.net.netlink.NetlinkSocket;
import android.net.netstats.provider.AbstractNetworkStatsProvider; import android.net.netstats.provider.NetworkStatsProvider;
import android.net.netstats.provider.NetworkStatsProviderCallback;
import android.net.util.SharedLog; import android.net.util.SharedLog;
import android.os.Handler; import android.os.Handler;
import android.provider.Settings; import android.provider.Settings;
@@ -89,8 +88,8 @@ public class OffloadController {
private final Handler mHandler; private final Handler mHandler;
private final OffloadHardwareInterface mHwInterface; private final OffloadHardwareInterface mHwInterface;
private final ContentResolver mContentResolver; private final ContentResolver mContentResolver;
private final @NonNull OffloadTetheringStatsProvider mStatsProvider; @Nullable
private final @Nullable NetworkStatsProviderCallback mStatsProviderCb; private final OffloadTetheringStatsProvider mStatsProvider;
private final SharedLog mLog; private final SharedLog mLog;
private final HashMap<String, LinkProperties> mDownstreams; private final HashMap<String, LinkProperties> mDownstreams;
private boolean mConfigInitialized; private boolean mConfigInitialized;
@@ -124,19 +123,18 @@ public class OffloadController {
mHandler = h; mHandler = h;
mHwInterface = hwi; mHwInterface = hwi;
mContentResolver = contentResolver; mContentResolver = contentResolver;
mStatsProvider = new OffloadTetheringStatsProvider();
mLog = log.forSubComponent(TAG); mLog = log.forSubComponent(TAG);
mDownstreams = new HashMap<>(); mDownstreams = new HashMap<>();
mExemptPrefixes = new HashSet<>(); mExemptPrefixes = new HashSet<>();
mLastLocalPrefixStrs = new HashSet<>(); mLastLocalPrefixStrs = new HashSet<>();
NetworkStatsProviderCallback providerCallback = null; OffloadTetheringStatsProvider provider = new OffloadTetheringStatsProvider();
try { try {
providerCallback = nsm.registerNetworkStatsProvider( nsm.registerNetworkStatsProvider(getClass().getSimpleName(), provider);
getClass().getSimpleName(), mStatsProvider);
} catch (RuntimeException e) { } catch (RuntimeException e) {
Log.wtf(TAG, "Cannot register offload stats provider: " + e); Log.wtf(TAG, "Cannot register offload stats provider: " + e);
provider = null;
} }
mStatsProviderCb = providerCallback; mStatsProvider = provider;
} }
/** Start hardware offload. */ /** Start hardware offload. */
@@ -185,7 +183,7 @@ public class OffloadController {
// and we need to synchronize stats and limits between // and we need to synchronize stats and limits between
// software and hardware forwarding. // software and hardware forwarding.
updateStatsForAllUpstreams(); updateStatsForAllUpstreams();
mStatsProvider.pushTetherStats(); if (mStatsProvider != null) mStatsProvider.pushTetherStats();
} }
@Override @Override
@@ -198,7 +196,7 @@ public class OffloadController {
// limits set take into account any software tethering // limits set take into account any software tethering
// traffic that has been happening in the meantime. // traffic that has been happening in the meantime.
updateStatsForAllUpstreams(); updateStatsForAllUpstreams();
mStatsProvider.pushTetherStats(); if (mStatsProvider != null) mStatsProvider.pushTetherStats();
// [2] (Re)Push all state. // [2] (Re)Push all state.
computeAndPushLocalPrefixes(UpdateType.FORCE); computeAndPushLocalPrefixes(UpdateType.FORCE);
pushAllDownstreamState(); pushAllDownstreamState();
@@ -217,10 +215,12 @@ public class OffloadController {
// TODO: rev the HAL so that it provides an interface name. // TODO: rev the HAL so that it provides an interface name.
updateStatsForCurrentUpstream(); updateStatsForCurrentUpstream();
if (mStatsProvider != null) {
mStatsProvider.pushTetherStats(); mStatsProvider.pushTetherStats();
// Push stats to service does not cause the service react to it immediately. // Push stats to service does not cause the service react to it
// Inform the service about limit reached. // immediately. Inform the service about limit reached.
if (mStatsProviderCb != null) mStatsProviderCb.onLimitReached(); mStatsProvider.notifyLimitReached();
}
} }
@Override @Override
@@ -263,13 +263,17 @@ public class OffloadController {
} }
@VisibleForTesting @VisibleForTesting
class OffloadTetheringStatsProvider extends AbstractNetworkStatsProvider { class OffloadTetheringStatsProvider extends NetworkStatsProvider {
// These stats must only ever be touched on the handler thread. // These stats must only ever be touched on the handler thread.
@NonNull @NonNull
private NetworkStats mIfaceStats = new NetworkStats(0L, 0); private NetworkStats mIfaceStats = new NetworkStats(0L, 0);
@NonNull @NonNull
private NetworkStats mUidStats = new NetworkStats(0L, 0); private NetworkStats mUidStats = new NetworkStats(0L, 0);
/**
* A helper function that collect tether stats from local hashmap. Note that this does not
* invoke binder call.
*/
@VisibleForTesting @VisibleForTesting
@NonNull @NonNull
NetworkStats getTetherStats(@NonNull StatsType how) { NetworkStats getTetherStats(@NonNull StatsType how) {
@@ -287,7 +291,7 @@ public class OffloadController {
} }
@Override @Override
public void setLimit(String iface, long quotaBytes) { public void onSetLimit(String iface, long quotaBytes) {
// Listen for all iface is necessary since upstream might be changed after limit // Listen for all iface is necessary since upstream might be changed after limit
// is set. // is set.
mHandler.post(() -> { mHandler.post(() -> {
@@ -315,13 +319,12 @@ public class OffloadController {
*/ */
public void pushTetherStats() { public void pushTetherStats() {
// TODO: remove the accumulated stats and report the diff from HAL directly. // TODO: remove the accumulated stats and report the diff from HAL directly.
if (null == mStatsProviderCb) return;
final NetworkStats ifaceDiff = final NetworkStats ifaceDiff =
getTetherStats(StatsType.STATS_PER_IFACE).subtract(mIfaceStats); getTetherStats(StatsType.STATS_PER_IFACE).subtract(mIfaceStats);
final NetworkStats uidDiff = final NetworkStats uidDiff =
getTetherStats(StatsType.STATS_PER_UID).subtract(mUidStats); getTetherStats(StatsType.STATS_PER_UID).subtract(mUidStats);
try { try {
mStatsProviderCb.onStatsUpdated(0 /* token */, ifaceDiff, uidDiff); notifyStatsUpdated(0 /* token */, ifaceDiff, uidDiff);
mIfaceStats = mIfaceStats.add(ifaceDiff); mIfaceStats = mIfaceStats.add(ifaceDiff);
mUidStats = mUidStats.add(uidDiff); mUidStats = mUidStats.add(uidDiff);
} catch (RuntimeException e) { } catch (RuntimeException e) {
@@ -330,7 +333,7 @@ public class OffloadController {
} }
@Override @Override
public void requestStatsUpdate(int token) { public void onRequestStatsUpdate(int token) {
// Do not attempt to update stats by querying the offload HAL // Do not attempt to update stats by querying the offload HAL
// synchronously from a different thread than the Handler thread. http://b/64771555. // synchronously from a different thread than the Handler thread. http://b/64771555.
mHandler.post(() -> { mHandler.post(() -> {
@@ -340,7 +343,7 @@ public class OffloadController {
} }
@Override @Override
public void setAlert(long quotaBytes) { public void onSetAlert(long quotaBytes) {
// TODO: Ask offload HAL to notify alert without stopping traffic. // TODO: Ask offload HAL to notify alert without stopping traffic.
} }
} }

View File

@@ -33,6 +33,8 @@ 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.orderInsensitiveEquals; import static com.android.testutils.NetworkStatsUtilsKt.orderInsensitiveEquals;
import static junit.framework.Assert.assertNotNull;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyInt;
@@ -61,8 +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.AbstractNetworkStatsProvider; import android.net.netstats.provider.INetworkStatsProviderCallback;
import android.net.netstats.provider.NetworkStatsProviderCallback;
import android.net.util.SharedLog; import android.net.util.SharedLog;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
@@ -108,12 +109,10 @@ 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 NetworkStatsProviderCallback mTetherStatsProviderCb; @Mock private INetworkStatsProviderCallback mTetherStatsProviderCb;
private OffloadController.OffloadTetheringStatsProvider mTetherStatsProvider;
private final ArgumentCaptor<ArrayList> mStringArrayCaptor = private final ArgumentCaptor<ArrayList> mStringArrayCaptor =
ArgumentCaptor.forClass(ArrayList.class); ArgumentCaptor.forClass(ArrayList.class);
private final ArgumentCaptor<OffloadController.OffloadTetheringStatsProvider>
mTetherStatsProviderCaptor =
ArgumentCaptor.forClass(OffloadController.OffloadTetheringStatsProvider.class);
private final ArgumentCaptor<OffloadHardwareInterface.ControlCallback> mControlCallbackCaptor = private final ArgumentCaptor<OffloadHardwareInterface.ControlCallback> mControlCallbackCaptor =
ArgumentCaptor.forClass(OffloadHardwareInterface.ControlCallback.class); ArgumentCaptor.forClass(OffloadHardwareInterface.ControlCallback.class);
private MockContentResolver mContentResolver; private MockContentResolver mContentResolver;
@@ -126,8 +125,6 @@ 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(mStatsManager.registerNetworkStatsProvider(anyString(), any()))
.thenReturn(mTetherStatsProviderCb);
} }
@After public void tearDown() throws Exception { @After public void tearDown() throws Exception {
@@ -154,8 +151,14 @@ public class OffloadControllerTest {
private OffloadController makeOffloadController() throws Exception { private OffloadController makeOffloadController() throws Exception {
OffloadController offload = new OffloadController(new Handler(Looper.getMainLooper()), OffloadController offload = new OffloadController(new Handler(Looper.getMainLooper()),
mHardware, mContentResolver, mStatsManager, new SharedLog("test")); mHardware, mContentResolver, mStatsManager, new SharedLog("test"));
final ArgumentCaptor<OffloadController.OffloadTetheringStatsProvider>
tetherStatsProviderCaptor =
ArgumentCaptor.forClass(OffloadController.OffloadTetheringStatsProvider.class);
verify(mStatsManager).registerNetworkStatsProvider(anyString(), verify(mStatsManager).registerNetworkStatsProvider(anyString(),
mTetherStatsProviderCaptor.capture()); tetherStatsProviderCaptor.capture());
mTetherStatsProvider = tetherStatsProviderCaptor.getValue();
assertNotNull(mTetherStatsProvider);
mTetherStatsProvider.setProviderCallbackBinder(mTetherStatsProviderCb);
return offload; return offload;
} }
@@ -413,9 +416,6 @@ public class OffloadControllerTest {
final OffloadController offload = makeOffloadController(); final OffloadController offload = makeOffloadController();
offload.start(); offload.start();
final OffloadController.OffloadTetheringStatsProvider provider =
mTetherStatsProviderCaptor.getValue();
final String ethernetIface = "eth1"; final String ethernetIface = "eth1";
final String mobileIface = "rmnet_data0"; final String mobileIface = "rmnet_data0";
@@ -443,8 +443,8 @@ public class OffloadControllerTest {
inOrder.verify(mHardware, times(1)).getForwardedStats(eq(mobileIface)); inOrder.verify(mHardware, times(1)).getForwardedStats(eq(mobileIface));
// Verify that the fetched stats are stored. // Verify that the fetched stats are stored.
final NetworkStats ifaceStats = provider.getTetherStats(STATS_PER_IFACE); final NetworkStats ifaceStats = mTetherStatsProvider.getTetherStats(STATS_PER_IFACE);
final NetworkStats uidStats = provider.getTetherStats(STATS_PER_UID); final NetworkStats uidStats = mTetherStatsProvider.getTetherStats(STATS_PER_UID);
final NetworkStats expectedIfaceStats = new NetworkStats(0L, 2) final NetworkStats expectedIfaceStats = new NetworkStats(0L, 2)
.addValues(buildTestEntry(STATS_PER_IFACE, mobileIface, 999, 99999)) .addValues(buildTestEntry(STATS_PER_IFACE, mobileIface, 999, 99999))
.addValues(buildTestEntry(STATS_PER_IFACE, ethernetIface, 12345, 54321)); .addValues(buildTestEntry(STATS_PER_IFACE, ethernetIface, 12345, 54321));
@@ -462,13 +462,12 @@ public class OffloadControllerTest {
NetworkStats.class); NetworkStats.class);
// Force pushing stats update to verify the stats reported. // Force pushing stats update to verify the stats reported.
provider.pushTetherStats(); mTetherStatsProvider.pushTetherStats();
verify(mTetherStatsProviderCb, times(1)).onStatsUpdated(anyInt(), verify(mTetherStatsProviderCb, times(1))
ifaceStatsCaptor.capture(), uidStatsCaptor.capture()); .notifyStatsUpdated(anyInt(), ifaceStatsCaptor.capture(), uidStatsCaptor.capture());
assertTrue(orderInsensitiveEquals(expectedIfaceStats, ifaceStatsCaptor.getValue())); assertTrue(orderInsensitiveEquals(expectedIfaceStats, ifaceStatsCaptor.getValue()));
assertTrue(orderInsensitiveEquals(expectedUidStats, uidStatsCaptor.getValue())); assertTrue(orderInsensitiveEquals(expectedUidStats, uidStatsCaptor.getValue()));
when(mHardware.getForwardedStats(eq(ethernetIface))).thenReturn( when(mHardware.getForwardedStats(eq(ethernetIface))).thenReturn(
new ForwardedStats(100000, 100000)); new ForwardedStats(100000, 100000));
offload.setUpstreamLinkProperties(null); offload.setUpstreamLinkProperties(null);
@@ -483,8 +482,8 @@ public class OffloadControllerTest {
inOrder.verifyNoMoreInteractions(); inOrder.verifyNoMoreInteractions();
// Verify that the stored stats is accumulated. // Verify that the stored stats is accumulated.
final NetworkStats ifaceStatsAccu = provider.getTetherStats(STATS_PER_IFACE); final NetworkStats ifaceStatsAccu = mTetherStatsProvider.getTetherStats(STATS_PER_IFACE);
final NetworkStats uidStatsAccu = provider.getTetherStats(STATS_PER_UID); final NetworkStats uidStatsAccu = mTetherStatsProvider.getTetherStats(STATS_PER_UID);
final NetworkStats expectedIfaceStatsAccu = new NetworkStats(0L, 2) final NetworkStats expectedIfaceStatsAccu = new NetworkStats(0L, 2)
.addValues(buildTestEntry(STATS_PER_IFACE, mobileIface, 999, 99999)) .addValues(buildTestEntry(STATS_PER_IFACE, mobileIface, 999, 99999))
.addValues(buildTestEntry(STATS_PER_IFACE, ethernetIface, 112345, 154321)); .addValues(buildTestEntry(STATS_PER_IFACE, ethernetIface, 112345, 154321));
@@ -498,7 +497,7 @@ public class OffloadControllerTest {
// Verify that only diff of stats is reported. // Verify that only diff of stats is reported.
reset(mTetherStatsProviderCb); reset(mTetherStatsProviderCb);
provider.pushTetherStats(); mTetherStatsProvider.pushTetherStats();
final NetworkStats expectedIfaceStatsDiff = new NetworkStats(0L, 2) final NetworkStats expectedIfaceStatsDiff = new NetworkStats(0L, 2)
.addValues(buildTestEntry(STATS_PER_IFACE, mobileIface, 0, 0)) .addValues(buildTestEntry(STATS_PER_IFACE, mobileIface, 0, 0))
.addValues(buildTestEntry(STATS_PER_IFACE, ethernetIface, 100000, 100000)); .addValues(buildTestEntry(STATS_PER_IFACE, ethernetIface, 100000, 100000));
@@ -506,8 +505,8 @@ public class OffloadControllerTest {
final NetworkStats expectedUidStatsDiff = new NetworkStats(0L, 2) final NetworkStats expectedUidStatsDiff = new NetworkStats(0L, 2)
.addValues(buildTestEntry(STATS_PER_UID, mobileIface, 0, 0)) .addValues(buildTestEntry(STATS_PER_UID, mobileIface, 0, 0))
.addValues(buildTestEntry(STATS_PER_UID, ethernetIface, 100000, 100000)); .addValues(buildTestEntry(STATS_PER_UID, ethernetIface, 100000, 100000));
verify(mTetherStatsProviderCb, times(1)).onStatsUpdated(anyInt(), verify(mTetherStatsProviderCb, times(1))
ifaceStatsCaptor.capture(), uidStatsCaptor.capture()); .notifyStatsUpdated(anyInt(), ifaceStatsCaptor.capture(), uidStatsCaptor.capture());
assertTrue(orderInsensitiveEquals(expectedIfaceStatsDiff, ifaceStatsCaptor.getValue())); assertTrue(orderInsensitiveEquals(expectedIfaceStatsDiff, ifaceStatsCaptor.getValue()));
assertTrue(orderInsensitiveEquals(expectedUidStatsDiff, uidStatsCaptor.getValue())); assertTrue(orderInsensitiveEquals(expectedUidStatsDiff, uidStatsCaptor.getValue()));
} }
@@ -529,19 +528,18 @@ public class OffloadControllerTest {
lp.setInterfaceName(ethernetIface); lp.setInterfaceName(ethernetIface);
offload.setUpstreamLinkProperties(lp); offload.setUpstreamLinkProperties(lp);
AbstractNetworkStatsProvider provider = mTetherStatsProviderCaptor.getValue();
final InOrder inOrder = inOrder(mHardware); final InOrder inOrder = inOrder(mHardware);
when(mHardware.setUpstreamParameters(any(), any(), any(), any())).thenReturn(true); when(mHardware.setUpstreamParameters(any(), any(), any(), any())).thenReturn(true);
when(mHardware.setDataLimit(anyString(), anyLong())).thenReturn(true); when(mHardware.setDataLimit(anyString(), anyLong())).thenReturn(true);
// Applying an interface quota to the current upstream immediately sends it to the hardware. // Applying an interface quota to the current upstream immediately sends it to the hardware.
provider.setLimit(ethernetIface, ethernetLimit); mTetherStatsProvider.onSetLimit(ethernetIface, ethernetLimit);
waitForIdle(); waitForIdle();
inOrder.verify(mHardware).setDataLimit(ethernetIface, ethernetLimit); inOrder.verify(mHardware).setDataLimit(ethernetIface, ethernetLimit);
inOrder.verifyNoMoreInteractions(); inOrder.verifyNoMoreInteractions();
// Applying an interface quota to another upstream does not take any immediate action. // Applying an interface quota to another upstream does not take any immediate action.
provider.setLimit(mobileIface, mobileLimit); mTetherStatsProvider.onSetLimit(mobileIface, mobileLimit);
waitForIdle(); waitForIdle();
inOrder.verify(mHardware, never()).setDataLimit(anyString(), anyLong()); inOrder.verify(mHardware, never()).setDataLimit(anyString(), anyLong());
@@ -554,7 +552,7 @@ public class OffloadControllerTest {
// Setting a limit of ITetheringStatsProvider.QUOTA_UNLIMITED causes the limit to be set // Setting a limit of ITetheringStatsProvider.QUOTA_UNLIMITED causes the limit to be set
// to Long.MAX_VALUE. // to Long.MAX_VALUE.
provider.setLimit(mobileIface, ITetheringStatsProvider.QUOTA_UNLIMITED); mTetherStatsProvider.onSetLimit(mobileIface, ITetheringStatsProvider.QUOTA_UNLIMITED);
waitForIdle(); waitForIdle();
inOrder.verify(mHardware).setDataLimit(mobileIface, Long.MAX_VALUE); inOrder.verify(mHardware).setDataLimit(mobileIface, Long.MAX_VALUE);
@@ -562,7 +560,7 @@ public class OffloadControllerTest {
when(mHardware.setUpstreamParameters(any(), any(), any(), any())).thenReturn(false); when(mHardware.setUpstreamParameters(any(), any(), any(), any())).thenReturn(false);
lp.setInterfaceName(ethernetIface); lp.setInterfaceName(ethernetIface);
offload.setUpstreamLinkProperties(lp); offload.setUpstreamLinkProperties(lp);
provider.setLimit(mobileIface, mobileLimit); mTetherStatsProvider.onSetLimit(mobileIface, mobileLimit);
waitForIdle(); waitForIdle();
inOrder.verify(mHardware, never()).setDataLimit(anyString(), anyLong()); inOrder.verify(mHardware, never()).setDataLimit(anyString(), anyLong());
@@ -571,7 +569,7 @@ public class OffloadControllerTest {
when(mHardware.setDataLimit(anyString(), anyLong())).thenReturn(false); when(mHardware.setDataLimit(anyString(), anyLong())).thenReturn(false);
lp.setInterfaceName(mobileIface); lp.setInterfaceName(mobileIface);
offload.setUpstreamLinkProperties(lp); offload.setUpstreamLinkProperties(lp);
provider.setLimit(mobileIface, mobileLimit); mTetherStatsProvider.onSetLimit(mobileIface, mobileLimit);
waitForIdle(); waitForIdle();
inOrder.verify(mHardware).getForwardedStats(ethernetIface); inOrder.verify(mHardware).getForwardedStats(ethernetIface);
inOrder.verify(mHardware).stopOffloadControl(); inOrder.verify(mHardware).stopOffloadControl();
@@ -587,7 +585,7 @@ public class OffloadControllerTest {
OffloadHardwareInterface.ControlCallback callback = mControlCallbackCaptor.getValue(); OffloadHardwareInterface.ControlCallback callback = mControlCallbackCaptor.getValue();
callback.onStoppedLimitReached(); callback.onStoppedLimitReached();
verify(mTetherStatsProviderCb, times(1)).onStatsUpdated(anyInt(), any(), any()); verify(mTetherStatsProviderCb, times(1)).notifyStatsUpdated(anyInt(), any(), any());
} }
@Test @Test
@@ -691,7 +689,7 @@ public class OffloadControllerTest {
verify(mHardware, times(1)).getForwardedStats(eq(RMNET0)); verify(mHardware, times(1)).getForwardedStats(eq(RMNET0));
verify(mHardware, times(1)).getForwardedStats(eq(WLAN0)); verify(mHardware, times(1)).getForwardedStats(eq(WLAN0));
// TODO: verify the exact stats reported. // TODO: verify the exact stats reported.
verify(mTetherStatsProviderCb, times(1)).onStatsUpdated(anyInt(), any(), any()); verify(mTetherStatsProviderCb, times(1)).notifyStatsUpdated(anyInt(), any(), any());
verifyNoMoreInteractions(mTetherStatsProviderCb); verifyNoMoreInteractions(mTetherStatsProviderCb);
verifyNoMoreInteractions(mHardware); verifyNoMoreInteractions(mHardware);
} }
@@ -756,7 +754,7 @@ public class OffloadControllerTest {
// Verify forwarded stats behaviour. // Verify forwarded stats behaviour.
verify(mHardware, times(1)).getForwardedStats(eq(RMNET0)); verify(mHardware, times(1)).getForwardedStats(eq(RMNET0));
verify(mHardware, times(1)).getForwardedStats(eq(WLAN0)); verify(mHardware, times(1)).getForwardedStats(eq(WLAN0));
verify(mTetherStatsProviderCb, times(1)).onStatsUpdated(anyInt(), any(), any()); verify(mTetherStatsProviderCb, times(1)).notifyStatsUpdated(anyInt(), any(), any());
verifyNoMoreInteractions(mTetherStatsProviderCb); verifyNoMoreInteractions(mTetherStatsProviderCb);
// TODO: verify local prefixes and downstreams are also pushed to the HAL. // TODO: verify local prefixes and downstreams are also pushed to the HAL.