Define NOT_ROAMING network capability.
The "roaming" state of a network really belongs on NetworkCapabilities instead of being published through NetworkInfo.isRoaming(). One major reason is to support developers creating NetworkRequests for a non-roaming network. Watch for any capability changes that network statistics are interested in (either metered or roaming) and notify it to perform an update pass; fixes bug where we previously only triggered on roaming changes. Fix bug in VPNs where metered/roaming capabilities of underlying networks weren't being propagated; this was probably preventing some jobs from running over unmetered networks, and causing other jobs to run over roaming networks! Also passes along link bandwidth information from underlying networks, and propegates any changes to underlying networks. Fix race condition by reading prevNc inside lock. Utility methods correctly calculate min/max link bandwidth values. Test: bit FrameworksNetTests:android.net.,com.android.server.net.,com.android.server.connectivity.,com.android.server.ConnectivityServiceTest Bug: 68397798, 16207332 Change-Id: I3e1a6544c902bf3a79356b72d3616af1fd2b0f49
This commit is contained in:
@@ -16,6 +16,7 @@
|
||||
|
||||
package android.net;
|
||||
|
||||
import static android.net.NetworkCapabilities.LINK_BANDWIDTH_UNSPECIFIED;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_CBS;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_EIMS;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
|
||||
@@ -26,13 +27,12 @@ import static android.net.NetworkCapabilities.RESTRICTED_CAPABILITIES;
|
||||
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
|
||||
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
|
||||
import static android.net.NetworkCapabilities.UNRESTRICTED_CAPABILITIES;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertNotEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
|
||||
import android.net.NetworkCapabilities;
|
||||
import android.support.test.runner.AndroidJUnit4;
|
||||
import android.test.suitebuilder.annotation.SmallTest;
|
||||
|
||||
@@ -159,4 +159,25 @@ public class NetworkCapabilitiesTest {
|
||||
assertNotEquals("", nc1.describeImmutableDifferences(nc2));
|
||||
assertEquals("", nc1.describeImmutableDifferences(nc1));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLinkBandwidthUtils() {
|
||||
assertEquals(LINK_BANDWIDTH_UNSPECIFIED, NetworkCapabilities
|
||||
.minBandwidth(LINK_BANDWIDTH_UNSPECIFIED, LINK_BANDWIDTH_UNSPECIFIED));
|
||||
assertEquals(10, NetworkCapabilities
|
||||
.minBandwidth(LINK_BANDWIDTH_UNSPECIFIED, 10));
|
||||
assertEquals(10, NetworkCapabilities
|
||||
.minBandwidth(10, LINK_BANDWIDTH_UNSPECIFIED));
|
||||
assertEquals(10, NetworkCapabilities
|
||||
.minBandwidth(10, 20));
|
||||
|
||||
assertEquals(LINK_BANDWIDTH_UNSPECIFIED, NetworkCapabilities
|
||||
.maxBandwidth(LINK_BANDWIDTH_UNSPECIFIED, LINK_BANDWIDTH_UNSPECIFIED));
|
||||
assertEquals(10, NetworkCapabilities
|
||||
.maxBandwidth(LINK_BANDWIDTH_UNSPECIFIED, 10));
|
||||
assertEquals(10, NetworkCapabilities
|
||||
.maxBandwidth(10, LINK_BANDWIDTH_UNSPECIFIED));
|
||||
assertEquals(20, NetworkCapabilities
|
||||
.maxBandwidth(10, 20));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,21 +23,44 @@ import static android.net.ConnectivityManager.TYPE_MOBILE_FOTA;
|
||||
import static android.net.ConnectivityManager.TYPE_MOBILE_MMS;
|
||||
import static android.net.ConnectivityManager.TYPE_NONE;
|
||||
import static android.net.ConnectivityManager.TYPE_WIFI;
|
||||
import static android.net.ConnectivityManager.getNetworkTypeName;
|
||||
import static android.net.NetworkCapabilities.*;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_CBS;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_DUN;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_EIMS;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_FOREGROUND;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_FOTA;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_IA;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_IMS;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_MMS;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VPN;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_RCS;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_SUPL;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_TRUSTED;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_WIFI_P2P;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_XCAP;
|
||||
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
|
||||
import static android.net.NetworkCapabilities.TRANSPORT_ETHERNET;
|
||||
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
|
||||
import static android.net.NetworkCapabilities.TRANSPORT_WIFI_AWARE;
|
||||
|
||||
import static com.android.internal.util.TestUtils.waitForIdleHandler;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertNull;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.junit.Assert.fail;
|
||||
import static com.android.internal.util.TestUtils.waitForIdleHandler;
|
||||
import static org.mockito.Mockito.anyBoolean;
|
||||
import static org.mockito.Mockito.anyInt;
|
||||
import static org.mockito.Mockito.eq;
|
||||
import static org.mockito.Mockito.atLeastOnce;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.reset;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.app.NotificationManager;
|
||||
@@ -45,7 +68,6 @@ import android.app.PendingIntent;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.content.ContextWrapper;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.res.Resources;
|
||||
@@ -64,7 +86,6 @@ import android.net.MatchAllNetworkSpecifier;
|
||||
import android.net.Network;
|
||||
import android.net.NetworkAgent;
|
||||
import android.net.NetworkCapabilities;
|
||||
import android.net.NetworkConfig;
|
||||
import android.net.NetworkFactory;
|
||||
import android.net.NetworkInfo;
|
||||
import android.net.NetworkInfo.DetailedState;
|
||||
@@ -79,13 +100,9 @@ import android.net.util.MultinetworkPolicyTracker;
|
||||
import android.os.ConditionVariable;
|
||||
import android.os.Handler;
|
||||
import android.os.HandlerThread;
|
||||
import android.os.IBinder;
|
||||
import android.os.INetworkManagementService;
|
||||
import android.os.Looper;
|
||||
import android.os.Message;
|
||||
import android.os.MessageQueue;
|
||||
import android.os.Messenger;
|
||||
import android.os.MessageQueue.IdleHandler;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.os.Process;
|
||||
@@ -96,10 +113,8 @@ import android.support.test.InstrumentationRegistry;
|
||||
import android.support.test.filters.SmallTest;
|
||||
import android.support.test.runner.AndroidJUnit4;
|
||||
import android.test.mock.MockContentResolver;
|
||||
import android.text.TextUtils;
|
||||
import android.util.ArraySet;
|
||||
import android.util.Log;
|
||||
import android.util.LogPrinter;
|
||||
|
||||
import com.android.internal.util.WakeupMessage;
|
||||
import com.android.internal.util.test.BroadcastInterceptingContext;
|
||||
@@ -109,7 +124,6 @@ import com.android.server.connectivity.IpConnectivityMetrics;
|
||||
import com.android.server.connectivity.MockableSystemProperties;
|
||||
import com.android.server.connectivity.NetworkAgentInfo;
|
||||
import com.android.server.connectivity.NetworkMonitor;
|
||||
import com.android.server.connectivity.NetworkMonitor.CaptivePortalProbeResult;
|
||||
import com.android.server.net.NetworkPinner;
|
||||
import com.android.server.net.NetworkPolicyManagerInternal;
|
||||
|
||||
@@ -160,6 +174,7 @@ public class ConnectivityServiceTest {
|
||||
|
||||
@Mock IpConnectivityMetrics.Logger mMetricsService;
|
||||
@Mock DefaultNetworkMetrics mDefaultNetworkMetrics;
|
||||
@Mock INetworkStatsService mStatsService;
|
||||
|
||||
// This class exists to test bindProcessToNetwork and getBoundNetworkForProcess. These methods
|
||||
// do not go through ConnectivityService but talk to netd directly, so they don't automatically
|
||||
@@ -858,7 +873,7 @@ public class ConnectivityServiceTest {
|
||||
NetworkPolicyManagerInternal.class, mock(NetworkPolicyManagerInternal.class));
|
||||
mService = new WrappedConnectivityService(mServiceContext,
|
||||
mock(INetworkManagementService.class),
|
||||
mock(INetworkStatsService.class),
|
||||
mStatsService,
|
||||
mock(INetworkPolicyManager.class),
|
||||
mock(IpConnectivityLog.class));
|
||||
|
||||
@@ -3440,6 +3455,40 @@ public class ConnectivityServiceTest {
|
||||
mCm.unregisterNetworkCallback(networkCallback);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testStatsIfacesChanged() throws Exception {
|
||||
mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
|
||||
|
||||
// Simple connection should have updated ifaces
|
||||
mCellNetworkAgent.connect(false);
|
||||
waitForIdle();
|
||||
verify(mStatsService, atLeastOnce()).forceUpdateIfaces();
|
||||
reset(mStatsService);
|
||||
|
||||
// Metered change should update ifaces
|
||||
mCellNetworkAgent.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
|
||||
waitForIdle();
|
||||
verify(mStatsService, atLeastOnce()).forceUpdateIfaces();
|
||||
reset(mStatsService);
|
||||
|
||||
mCellNetworkAgent.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
|
||||
waitForIdle();
|
||||
verify(mStatsService, atLeastOnce()).forceUpdateIfaces();
|
||||
reset(mStatsService);
|
||||
|
||||
// Captive portal change shouldn't update ifaces
|
||||
mCellNetworkAgent.addCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL);
|
||||
waitForIdle();
|
||||
verify(mStatsService, never()).forceUpdateIfaces();
|
||||
reset(mStatsService);
|
||||
|
||||
// Roaming change should update ifaces
|
||||
mCellNetworkAgent.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING);
|
||||
waitForIdle();
|
||||
verify(mStatsService, atLeastOnce()).forceUpdateIfaces();
|
||||
reset(mStatsService);
|
||||
}
|
||||
|
||||
private void checkDirectlyConnectedRoutes(Object callbackObj,
|
||||
Collection<LinkAddress> linkAddresses, Collection<RouteInfo> otherRoutes) {
|
||||
assertTrue(callbackObj instanceof LinkProperties);
|
||||
|
||||
@@ -20,11 +20,30 @@ import static android.content.pm.UserInfo.FLAG_ADMIN;
|
||||
import static android.content.pm.UserInfo.FLAG_MANAGED_PROFILE;
|
||||
import static android.content.pm.UserInfo.FLAG_PRIMARY;
|
||||
import static android.content.pm.UserInfo.FLAG_RESTRICTED;
|
||||
import static android.net.NetworkCapabilities.LINK_BANDWIDTH_UNSPECIFIED;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING;
|
||||
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
|
||||
import static android.net.NetworkCapabilities.TRANSPORT_VPN;
|
||||
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.mockito.AdditionalMatchers.*;
|
||||
import static org.mockito.Mockito.*;
|
||||
import static org.mockito.AdditionalMatchers.aryEq;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||
import static org.mockito.ArgumentMatchers.anyInt;
|
||||
import static org.mockito.ArgumentMatchers.anyString;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.atLeastOnce;
|
||||
import static org.mockito.Mockito.doAnswer;
|
||||
import static org.mockito.Mockito.doNothing;
|
||||
import static org.mockito.Mockito.inOrder;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.annotation.UserIdInt;
|
||||
import android.app.AppOpsManager;
|
||||
@@ -36,6 +55,9 @@ import android.content.pm.ResolveInfo;
|
||||
import android.content.pm.ServiceInfo;
|
||||
import android.content.pm.UserInfo;
|
||||
import android.content.res.Resources;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.net.Network;
|
||||
import android.net.NetworkCapabilities;
|
||||
import android.net.NetworkInfo.DetailedState;
|
||||
import android.net.UidRange;
|
||||
import android.net.VpnService;
|
||||
@@ -45,17 +67,17 @@ import android.os.INetworkManagementService;
|
||||
import android.os.Looper;
|
||||
import android.os.UserHandle;
|
||||
import android.os.UserManager;
|
||||
import android.support.test.runner.AndroidJUnit4;
|
||||
import android.support.test.filters.SmallTest;
|
||||
import android.support.test.runner.AndroidJUnit4;
|
||||
import android.util.ArrayMap;
|
||||
import android.util.ArraySet;
|
||||
|
||||
import com.android.internal.R;
|
||||
import com.android.internal.net.VpnConfig;
|
||||
|
||||
import org.junit.runner.RunWith;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Answers;
|
||||
import org.mockito.InOrder;
|
||||
import org.mockito.Mock;
|
||||
@@ -64,6 +86,7 @@ import org.mockito.MockitoAnnotations;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
@@ -114,6 +137,7 @@ public class VpnTest {
|
||||
@Mock private AppOpsManager mAppOps;
|
||||
@Mock private NotificationManager mNotificationManager;
|
||||
@Mock private Vpn.SystemServices mSystemServices;
|
||||
@Mock private ConnectivityManager mConnectivityManager;
|
||||
|
||||
@Before
|
||||
public void setUp() throws Exception {
|
||||
@@ -127,6 +151,8 @@ public class VpnTest {
|
||||
when(mContext.getSystemService(eq(Context.APP_OPS_SERVICE))).thenReturn(mAppOps);
|
||||
when(mContext.getSystemService(eq(Context.NOTIFICATION_SERVICE)))
|
||||
.thenReturn(mNotificationManager);
|
||||
when(mContext.getSystemService(eq(Context.CONNECTIVITY_SERVICE)))
|
||||
.thenReturn(mConnectivityManager);
|
||||
when(mContext.getString(R.string.config_customVpnAlwaysOnDisconnectedDialogComponent))
|
||||
.thenReturn(Resources.getSystem().getString(
|
||||
R.string.config_customVpnAlwaysOnDisconnectedDialogComponent));
|
||||
@@ -397,6 +423,66 @@ public class VpnTest {
|
||||
order.verify(mNotificationManager).cancelAsUser(anyString(), anyInt(), eq(userHandle));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCapabilities() {
|
||||
final Vpn vpn = createVpn(primaryUser.id);
|
||||
setMockedUsers(primaryUser);
|
||||
|
||||
final Network mobile = new Network(1);
|
||||
final Network wifi = new Network(2);
|
||||
|
||||
final Map<Network, NetworkCapabilities> networks = new HashMap<>();
|
||||
networks.put(mobile, new NetworkCapabilities()
|
||||
.addTransportType(TRANSPORT_CELLULAR)
|
||||
.addCapability(NET_CAPABILITY_INTERNET)
|
||||
.addCapability(NET_CAPABILITY_NOT_METERED)
|
||||
.setLinkDownstreamBandwidthKbps(10));
|
||||
networks.put(wifi, new NetworkCapabilities()
|
||||
.addTransportType(TRANSPORT_WIFI)
|
||||
.addCapability(NET_CAPABILITY_INTERNET)
|
||||
.addCapability(NET_CAPABILITY_NOT_ROAMING)
|
||||
.setLinkUpstreamBandwidthKbps(20));
|
||||
setMockedNetworks(networks);
|
||||
|
||||
final NetworkCapabilities caps = new NetworkCapabilities();
|
||||
|
||||
Vpn.updateCapabilities(mConnectivityManager, new Network[] { }, caps);
|
||||
assertTrue(caps.hasTransport(TRANSPORT_VPN));
|
||||
assertFalse(caps.hasTransport(TRANSPORT_CELLULAR));
|
||||
assertFalse(caps.hasTransport(TRANSPORT_WIFI));
|
||||
assertEquals(LINK_BANDWIDTH_UNSPECIFIED, caps.getLinkDownstreamBandwidthKbps());
|
||||
assertEquals(LINK_BANDWIDTH_UNSPECIFIED, caps.getLinkUpstreamBandwidthKbps());
|
||||
assertFalse(caps.hasCapability(NET_CAPABILITY_NOT_METERED));
|
||||
assertTrue(caps.hasCapability(NET_CAPABILITY_NOT_ROAMING));
|
||||
|
||||
Vpn.updateCapabilities(mConnectivityManager, new Network[] { mobile }, caps);
|
||||
assertTrue(caps.hasTransport(TRANSPORT_VPN));
|
||||
assertTrue(caps.hasTransport(TRANSPORT_CELLULAR));
|
||||
assertFalse(caps.hasTransport(TRANSPORT_WIFI));
|
||||
assertEquals(10, caps.getLinkDownstreamBandwidthKbps());
|
||||
assertEquals(LINK_BANDWIDTH_UNSPECIFIED, caps.getLinkUpstreamBandwidthKbps());
|
||||
assertTrue(caps.hasCapability(NET_CAPABILITY_NOT_METERED));
|
||||
assertFalse(caps.hasCapability(NET_CAPABILITY_NOT_ROAMING));
|
||||
|
||||
Vpn.updateCapabilities(mConnectivityManager, new Network[] { wifi }, caps);
|
||||
assertTrue(caps.hasTransport(TRANSPORT_VPN));
|
||||
assertFalse(caps.hasTransport(TRANSPORT_CELLULAR));
|
||||
assertTrue(caps.hasTransport(TRANSPORT_WIFI));
|
||||
assertEquals(LINK_BANDWIDTH_UNSPECIFIED, caps.getLinkDownstreamBandwidthKbps());
|
||||
assertEquals(20, caps.getLinkUpstreamBandwidthKbps());
|
||||
assertFalse(caps.hasCapability(NET_CAPABILITY_NOT_METERED));
|
||||
assertTrue(caps.hasCapability(NET_CAPABILITY_NOT_ROAMING));
|
||||
|
||||
Vpn.updateCapabilities(mConnectivityManager, new Network[] { mobile, wifi }, caps);
|
||||
assertTrue(caps.hasTransport(TRANSPORT_VPN));
|
||||
assertTrue(caps.hasTransport(TRANSPORT_CELLULAR));
|
||||
assertTrue(caps.hasTransport(TRANSPORT_WIFI));
|
||||
assertEquals(10, caps.getLinkDownstreamBandwidthKbps());
|
||||
assertEquals(20, caps.getLinkUpstreamBandwidthKbps());
|
||||
assertFalse(caps.hasCapability(NET_CAPABILITY_NOT_METERED));
|
||||
assertFalse(caps.hasCapability(NET_CAPABILITY_NOT_ROAMING));
|
||||
}
|
||||
|
||||
/**
|
||||
* Mock some methods of vpn object.
|
||||
*/
|
||||
@@ -463,4 +549,11 @@ public class VpnTest {
|
||||
} catch (Exception e) {
|
||||
}
|
||||
}
|
||||
|
||||
private void setMockedNetworks(final Map<Network, NetworkCapabilities> networks) {
|
||||
doAnswer(invocation -> {
|
||||
final Network network = (Network) invocation.getArguments()[0];
|
||||
return networks.get(network);
|
||||
}).when(mConnectivityManager).getNetworkCapabilities(any());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1169,9 +1169,8 @@ public class NetworkStatsServiceTest {
|
||||
final LinkProperties prop = new LinkProperties();
|
||||
prop.setInterfaceName(TEST_IFACE);
|
||||
final NetworkCapabilities capabilities = new NetworkCapabilities();
|
||||
if (!isMetered) {
|
||||
capabilities.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
|
||||
}
|
||||
capabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED, !isMetered);
|
||||
capabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING, true);
|
||||
return new NetworkState(info, prop, capabilities, null, null, TEST_SSID);
|
||||
}
|
||||
|
||||
@@ -1187,6 +1186,8 @@ public class NetworkStatsServiceTest {
|
||||
final LinkProperties prop = new LinkProperties();
|
||||
prop.setInterfaceName(TEST_IFACE);
|
||||
final NetworkCapabilities capabilities = new NetworkCapabilities();
|
||||
capabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED, false);
|
||||
capabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING, !isRoaming);
|
||||
return new NetworkState(info, prop, capabilities, null, subscriberId, null);
|
||||
}
|
||||
|
||||
@@ -1196,6 +1197,8 @@ public class NetworkStatsServiceTest {
|
||||
final LinkProperties prop = new LinkProperties();
|
||||
prop.setInterfaceName(iface);
|
||||
final NetworkCapabilities capabilities = new NetworkCapabilities();
|
||||
capabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED, false);
|
||||
capabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING, true);
|
||||
return new NetworkState(info, prop, capabilities, null, null, null);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user