Merge "Fix ConnDiags Test for invoke-after-validate and unregister CBs." am: 58af3db73e

Original change: https://android-review.googlesource.com/c/platform/cts/+/1320277

Change-Id: I6bb3f71a4d919026d768c7e443afeb30cd928998
This commit is contained in:
Cody Kesting
2020-06-25 15:54:12 +00:00
committed by Automerger Merge Worker

View File

@@ -36,6 +36,7 @@ import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
import static android.net.NetworkCapabilities.TRANSPORT_TEST; import static android.net.NetworkCapabilities.TRANSPORT_TEST;
import static android.net.cts.util.CtsNetUtils.TestNetworkCallback; import static android.net.cts.util.CtsNetUtils.TestNetworkCallback;
import static com.android.compatibility.common.util.SystemUtil.callWithShellPermissionIdentity;
import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity; import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
@@ -63,6 +64,7 @@ import android.net.TestNetworkManager;
import android.os.Binder; import android.os.Binder;
import android.os.Build; import android.os.Build;
import android.os.IBinder; import android.os.IBinder;
import android.os.ParcelFileDescriptor;
import android.os.PersistableBundle; import android.os.PersistableBundle;
import android.os.Process; import android.os.Process;
import android.platform.test.annotations.AppModeFull; import android.platform.test.annotations.AppModeFull;
@@ -85,6 +87,8 @@ import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import java.security.MessageDigest; import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@@ -114,10 +118,6 @@ public class ConnectivityDiagnosticsManagerTest {
private static final String SHA_256 = "SHA-256"; private static final String SHA_256 = "SHA-256";
// Callback used to keep TestNetworks up when there are no other outstanding NetworkRequests
// for it.
private static final TestNetworkCallback TEST_NETWORK_CALLBACK = new TestNetworkCallback();
private static final NetworkRequest CELLULAR_NETWORK_REQUEST = private static final NetworkRequest CELLULAR_NETWORK_REQUEST =
new NetworkRequest.Builder().addTransportType(TRANSPORT_CELLULAR).build(); new NetworkRequest.Builder().addTransportType(TRANSPORT_CELLULAR).build();
@@ -129,7 +129,14 @@ public class ConnectivityDiagnosticsManagerTest {
private CarrierConfigManager mCarrierConfigManager; private CarrierConfigManager mCarrierConfigManager;
private PackageManager mPackageManager; private PackageManager mPackageManager;
private TelephonyManager mTelephonyManager; private TelephonyManager mTelephonyManager;
// Callback used to keep TestNetworks up when there are no other outstanding NetworkRequests
// for it.
private TestNetworkCallback mTestNetworkCallback;
private Network mTestNetwork; private Network mTestNetwork;
private ParcelFileDescriptor mTestNetworkFD;
private List<TestConnectivityDiagnosticsCallback> mRegisteredCallbacks;
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
@@ -140,27 +147,40 @@ public class ConnectivityDiagnosticsManagerTest {
mPackageManager = mContext.getPackageManager(); mPackageManager = mContext.getPackageManager();
mTelephonyManager = mContext.getSystemService(TelephonyManager.class); mTelephonyManager = mContext.getSystemService(TelephonyManager.class);
mConnectivityManager.requestNetwork(TEST_NETWORK_REQUEST, TEST_NETWORK_CALLBACK); mTestNetworkCallback = new TestNetworkCallback();
mConnectivityManager.requestNetwork(TEST_NETWORK_REQUEST, mTestNetworkCallback);
mRegisteredCallbacks = new ArrayList<>();
} }
@After @After
public void tearDown() throws Exception { public void tearDown() throws Exception {
mConnectivityManager.unregisterNetworkCallback(TEST_NETWORK_CALLBACK); mConnectivityManager.unregisterNetworkCallback(mTestNetworkCallback);
if (mTestNetwork != null) { if (mTestNetwork != null) {
runWithShellPermissionIdentity(() -> { runWithShellPermissionIdentity(() -> {
final TestNetworkManager tnm = mContext.getSystemService(TestNetworkManager.class); final TestNetworkManager tnm = mContext.getSystemService(TestNetworkManager.class);
tnm.teardownTestNetwork(mTestNetwork); tnm.teardownTestNetwork(mTestNetwork);
}); });
mTestNetwork = null;
}
if (mTestNetworkFD != null) {
mTestNetworkFD.close();
mTestNetworkFD = null;
}
for (TestConnectivityDiagnosticsCallback cb : mRegisteredCallbacks) {
mCdm.unregisterConnectivityDiagnosticsCallback(cb);
} }
} }
@Test @Test
public void testRegisterConnectivityDiagnosticsCallback() throws Exception { public void testRegisterConnectivityDiagnosticsCallback() throws Exception {
mTestNetwork = setUpTestNetwork(); mTestNetworkFD = setUpTestNetwork().getFileDescriptor();
mTestNetwork = mTestNetworkCallback.waitForAvailable();
final TestConnectivityDiagnosticsCallback cb = new TestConnectivityDiagnosticsCallback(); final TestConnectivityDiagnosticsCallback cb =
mCdm.registerConnectivityDiagnosticsCallback(TEST_NETWORK_REQUEST, INLINE_EXECUTOR, cb); createAndRegisterConnectivityDiagnosticsCallback(TEST_NETWORK_REQUEST);
final String interfaceName = final String interfaceName =
mConnectivityManager.getLinkProperties(mTestNetwork).getInterfaceName(); mConnectivityManager.getLinkProperties(mTestNetwork).getInterfaceName();
@@ -185,17 +205,15 @@ public class ConnectivityDiagnosticsManagerTest {
new IntentFilter(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED)); new IntentFilter(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED));
final TestNetworkCallback testNetworkCallback = new TestNetworkCallback(); final TestNetworkCallback testNetworkCallback = new TestNetworkCallback();
final TestConnectivityDiagnosticsCallback connDiagsCallback =
new TestConnectivityDiagnosticsCallback();
try { try {
doBroadcastCarrierConfigsAndVerifyOnConnectivityReportAvailable( doBroadcastCarrierConfigsAndVerifyOnConnectivityReportAvailable(
subId, carrierConfigReceiver, testNetworkCallback, connDiagsCallback); subId, carrierConfigReceiver, testNetworkCallback);
} finally { } finally {
runWithShellPermissionIdentity( runWithShellPermissionIdentity(
() -> mCarrierConfigManager.overrideConfig(subId, null), () -> mCarrierConfigManager.overrideConfig(subId, null),
android.Manifest.permission.MODIFY_PHONE_STATE); android.Manifest.permission.MODIFY_PHONE_STATE);
mConnectivityManager.unregisterNetworkCallback(testNetworkCallback); mConnectivityManager.unregisterNetworkCallback(testNetworkCallback);
mCdm.unregisterConnectivityDiagnosticsCallback(connDiagsCallback);
mContext.unregisterReceiver(carrierConfigReceiver); mContext.unregisterReceiver(carrierConfigReceiver);
} }
} }
@@ -212,8 +230,7 @@ public class ConnectivityDiagnosticsManagerTest {
private void doBroadcastCarrierConfigsAndVerifyOnConnectivityReportAvailable( private void doBroadcastCarrierConfigsAndVerifyOnConnectivityReportAvailable(
int subId, int subId,
@NonNull CarrierConfigReceiver carrierConfigReceiver, @NonNull CarrierConfigReceiver carrierConfigReceiver,
@NonNull TestNetworkCallback testNetworkCallback, @NonNull TestNetworkCallback testNetworkCallback)
@NonNull TestConnectivityDiagnosticsCallback connDiagsCallback)
throws Exception { throws Exception {
final PersistableBundle carrierConfigs = new PersistableBundle(); final PersistableBundle carrierConfigs = new PersistableBundle();
carrierConfigs.putStringArray( carrierConfigs.putStringArray(
@@ -251,8 +268,8 @@ public class ConnectivityDiagnosticsManagerTest {
// detministically wait for, use Thread#sleep here. // detministically wait for, use Thread#sleep here.
Thread.sleep(500); Thread.sleep(500);
mCdm.registerConnectivityDiagnosticsCallback( final TestConnectivityDiagnosticsCallback connDiagsCallback =
CELLULAR_NETWORK_REQUEST, INLINE_EXECUTOR, connDiagsCallback); createAndRegisterConnectivityDiagnosticsCallback(CELLULAR_NETWORK_REQUEST);
final String interfaceName = final String interfaceName =
mConnectivityManager.getLinkProperties(network).getInterfaceName(); mConnectivityManager.getLinkProperties(network).getInterfaceName();
@@ -263,8 +280,8 @@ public class ConnectivityDiagnosticsManagerTest {
@Test @Test
public void testRegisterDuplicateConnectivityDiagnosticsCallback() { public void testRegisterDuplicateConnectivityDiagnosticsCallback() {
final TestConnectivityDiagnosticsCallback cb = new TestConnectivityDiagnosticsCallback(); final TestConnectivityDiagnosticsCallback cb =
mCdm.registerConnectivityDiagnosticsCallback(TEST_NETWORK_REQUEST, INLINE_EXECUTOR, cb); createAndRegisterConnectivityDiagnosticsCallback(TEST_NETWORK_REQUEST);
try { try {
mCdm.registerConnectivityDiagnosticsCallback(TEST_NETWORK_REQUEST, INLINE_EXECUTOR, cb); mCdm.registerConnectivityDiagnosticsCallback(TEST_NETWORK_REQUEST, INLINE_EXECUTOR, cb);
@@ -288,10 +305,11 @@ public class ConnectivityDiagnosticsManagerTest {
@Test @Test
public void testOnConnectivityReportAvailable() throws Exception { public void testOnConnectivityReportAvailable() throws Exception {
mTestNetwork = setUpTestNetwork(); final TestConnectivityDiagnosticsCallback cb =
createAndRegisterConnectivityDiagnosticsCallback(TEST_NETWORK_REQUEST);
final TestConnectivityDiagnosticsCallback cb = new TestConnectivityDiagnosticsCallback(); mTestNetworkFD = setUpTestNetwork().getFileDescriptor();
mCdm.registerConnectivityDiagnosticsCallback(TEST_NETWORK_REQUEST, INLINE_EXECUTOR, cb); mTestNetwork = mTestNetworkCallback.waitForAvailable();
final String interfaceName = final String interfaceName =
mConnectivityManager.getLinkProperties(mTestNetwork).getInterfaceName(); mConnectivityManager.getLinkProperties(mTestNetwork).getInterfaceName();
@@ -339,10 +357,11 @@ public class ConnectivityDiagnosticsManagerTest {
long timestampMillis, long timestampMillis,
@NonNull PersistableBundle extras) @NonNull PersistableBundle extras)
throws Exception { throws Exception {
mTestNetwork = setUpTestNetwork(); mTestNetworkFD = setUpTestNetwork().getFileDescriptor();
mTestNetwork = mTestNetworkCallback.waitForAvailable();
final TestConnectivityDiagnosticsCallback cb = new TestConnectivityDiagnosticsCallback(); final TestConnectivityDiagnosticsCallback cb =
mCdm.registerConnectivityDiagnosticsCallback(TEST_NETWORK_REQUEST, INLINE_EXECUTOR, cb); createAndRegisterConnectivityDiagnosticsCallback(TEST_NETWORK_REQUEST);
final String interfaceName = final String interfaceName =
mConnectivityManager.getLinkProperties(mTestNetwork).getInterfaceName(); mConnectivityManager.getLinkProperties(mTestNetwork).getInterfaceName();
@@ -370,10 +389,11 @@ public class ConnectivityDiagnosticsManagerTest {
} }
private void verifyOnNetworkConnectivityReported(boolean hasConnectivity) throws Exception { private void verifyOnNetworkConnectivityReported(boolean hasConnectivity) throws Exception {
mTestNetwork = setUpTestNetwork(); mTestNetworkFD = setUpTestNetwork().getFileDescriptor();
mTestNetwork = mTestNetworkCallback.waitForAvailable();
final TestConnectivityDiagnosticsCallback cb = new TestConnectivityDiagnosticsCallback(); final TestConnectivityDiagnosticsCallback cb =
mCdm.registerConnectivityDiagnosticsCallback(TEST_NETWORK_REQUEST, INLINE_EXECUTOR, cb); createAndRegisterConnectivityDiagnosticsCallback(TEST_NETWORK_REQUEST);
// onConnectivityReportAvailable always invoked when the test network is established // onConnectivityReportAvailable always invoked when the test network is established
final String interfaceName = final String interfaceName =
@@ -394,17 +414,12 @@ public class ConnectivityDiagnosticsManagerTest {
cb.assertNoCallback(); cb.assertNoCallback();
} }
@NonNull private TestConnectivityDiagnosticsCallback createAndRegisterConnectivityDiagnosticsCallback(
private Network waitForConnectivityServiceIdleAndGetNetwork() throws InterruptedException { NetworkRequest request) {
// Get a new Network. This requires going through the ConnectivityService thread. Once it final TestConnectivityDiagnosticsCallback cb = new TestConnectivityDiagnosticsCallback();
// completes, all previously enqueued messages on the ConnectivityService main Handler have mCdm.registerConnectivityDiagnosticsCallback(request, INLINE_EXECUTOR, cb);
// completed. mRegisteredCallbacks.add(cb);
final TestNetworkCallback callback = new TestNetworkCallback(); return cb;
mConnectivityManager.requestNetwork(TEST_NETWORK_REQUEST, callback);
final Network network = callback.waitForAvailable();
mConnectivityManager.unregisterNetworkCallback(callback);
assertNotNull(network);
return network;
} }
/** /**
@@ -412,16 +427,16 @@ public class ConnectivityDiagnosticsManagerTest {
* to the Network being validated. * to the Network being validated.
*/ */
@NonNull @NonNull
private Network setUpTestNetwork() throws Exception { private TestNetworkInterface setUpTestNetwork() throws Exception {
final int[] administratorUids = new int[] {Process.myUid()}; final int[] administratorUids = new int[] {Process.myUid()};
runWithShellPermissionIdentity( return callWithShellPermissionIdentity(
() -> { () -> {
final TestNetworkManager tnm = final TestNetworkManager tnm =
mContext.getSystemService(TestNetworkManager.class); mContext.getSystemService(TestNetworkManager.class);
final TestNetworkInterface tni = tnm.createTunInterface(new LinkAddress[0]); final TestNetworkInterface tni = tnm.createTunInterface(new LinkAddress[0]);
tnm.setupTestNetwork(tni.getInterfaceName(), administratorUids, BINDER); tnm.setupTestNetwork(tni.getInterfaceName(), administratorUids, BINDER);
return tni;
}); });
return waitForConnectivityServiceIdleAndGetNetwork();
} }
private static class TestConnectivityDiagnosticsCallback private static class TestConnectivityDiagnosticsCallback