Add CTS for getAllNetworkStateSnapshots

Test: atest CtsNetTestCases:android.net.cts.ConnectivityManagerTest#testGetAllNetworkStateSnapshots --rerun-until-failure 100
Test: atest
CtsNetTestCasesLatestSdk:android.net.cts.ConnectivityManagerTest on R
device
Bug: 188140631

Merged-In: I573b009bd05bbc0c855aaa6e20cb8ebde6729936
Change-Id: I573b009bd05bbc0c855aaa6e20cb8ebde6729936
  (cherry-picked from ag/14598438)
This commit is contained in:
junyulai
2021-05-14 19:44:57 +08:00
committed by Junyu Lai
parent eaaacb0d47
commit cfefdea403

View File

@@ -74,9 +74,11 @@ import static com.android.testutils.TestPermissionUtil.runAsShell;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertNull; import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThrows;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail; import static org.junit.Assert.fail;
import static org.junit.Assume.assumeTrue; import static org.junit.Assume.assumeTrue;
@@ -107,9 +109,12 @@ import android.net.NetworkInfo;
import android.net.NetworkInfo.DetailedState; import android.net.NetworkInfo.DetailedState;
import android.net.NetworkInfo.State; import android.net.NetworkInfo.State;
import android.net.NetworkRequest; import android.net.NetworkRequest;
import android.net.NetworkSpecifier;
import android.net.NetworkStateSnapshot;
import android.net.NetworkUtils; import android.net.NetworkUtils;
import android.net.ProxyInfo; import android.net.ProxyInfo;
import android.net.SocketKeepalive; import android.net.SocketKeepalive;
import android.net.TelephonyNetworkSpecifier;
import android.net.TestNetworkInterface; import android.net.TestNetworkInterface;
import android.net.TestNetworkManager; import android.net.TestNetworkManager;
import android.net.TetheringManager; import android.net.TetheringManager;
@@ -128,6 +133,7 @@ import android.os.UserHandle;
import android.os.VintfRuntimeInfo; import android.os.VintfRuntimeInfo;
import android.platform.test.annotations.AppModeFull; import android.platform.test.annotations.AppModeFull;
import android.provider.Settings; import android.provider.Settings;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.ArraySet; import android.util.ArraySet;
@@ -178,6 +184,7 @@ import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
@@ -439,6 +446,68 @@ public class ConnectivityManagerTest {
} }
} }
private String getSubscriberIdForCellNetwork(Network cellNetwork) {
final NetworkCapabilities cellCaps = mCm.getNetworkCapabilities(cellNetwork);
final NetworkSpecifier specifier = cellCaps.getNetworkSpecifier();
assertTrue(specifier instanceof TelephonyNetworkSpecifier);
// Get subscription from Telephony network specifier.
final int subId = ((TelephonyNetworkSpecifier) specifier).getSubscriptionId();
assertNotEquals(SubscriptionManager.INVALID_SUBSCRIPTION_ID, subId);
// Get subscriber Id from telephony manager.
final TelephonyManager tm = mContext.getSystemService(TelephonyManager.class);
return runWithShellPermissionIdentity(() -> tm.getSubscriberId(subId),
android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE);
}
@DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.R)
@Test
public void testGetAllNetworkStateSnapshots()
throws InterruptedException {
// Make sure cell is active to retrieve IMSI for verification in later step.
final Network cellNetwork = mCtsNetUtils.connectToCell();
final String subscriberId = getSubscriberIdForCellNetwork(cellNetwork);
assertFalse(TextUtils.isEmpty(subscriberId));
// Verify the API cannot be called without proper permission.
assertThrows(SecurityException.class, () -> mCm.getAllNetworkStateSnapshots());
// Get all networks, verify the result of getAllNetworkStateSnapshots matches the result
// got from other APIs.
final Network[] networks = mCm.getAllNetworks();
assertGreaterOrEqual(networks.length, 1);
final List<NetworkStateSnapshot> snapshots = runWithShellPermissionIdentity(
() -> mCm.getAllNetworkStateSnapshots(), NETWORK_SETTINGS);
assertEquals(networks.length, snapshots.size());
for (final Network network : networks) {
// Can't use a lambda because it will cause the test to crash on R with
// NoClassDefFoundError.
NetworkStateSnapshot snapshot = null;
for (NetworkStateSnapshot item : snapshots) {
if (item.getNetwork().equals(network)) {
snapshot = item;
break;
}
}
assertNotNull(snapshot);
final NetworkCapabilities caps =
Objects.requireNonNull(mCm.getNetworkCapabilities(network));
// Redact specifier of the capabilities of the snapshot before comparing since
// the result returned from getNetworkCapabilities always get redacted.
final NetworkSpecifier redactedSnapshotCapSpecifier =
snapshot.getNetworkCapabilities().getNetworkSpecifier().redact();
assertEquals("", caps.describeImmutableDifferences(
snapshot.getNetworkCapabilities()
.setNetworkSpecifier(redactedSnapshotCapSpecifier)));
assertEquals(mCm.getLinkProperties(network), snapshot.getLinkProperties());
assertEquals(mCm.getNetworkInfo(network).getType(), snapshot.getLegacyType());
if (network.equals(cellNetwork)) {
assertEquals(subscriberId, snapshot.getSubscriberId());
}
}
}
/** /**
* Tests that connections can be opened on WiFi and cellphone networks, * Tests that connections can be opened on WiFi and cellphone networks,
* and that they are made from different IP addresses. * and that they are made from different IP addresses.