From 0fd959b9cd128f2a145ee0904198865d4486b693 Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Mon, 15 Feb 2021 09:36:55 +0900 Subject: [PATCH] BroadcastInterceptingContext: use passed-in broadcast Handler. Currently, BroadcastInterceptingContext always runs broadcast receivers on the thread that called sendBroadcast. This means: 1. Receivers might run on the wrong thread, making the test less realistic. 2. If any receiver checks what thread it's running on, then either the check needs to be modified or deleted, or the test must call sendBroadcast on the thread that the receiver expects to run on. The latter is impossible when there is more than one receiver that needs to run on more than one thread. This CL adds a setUseRegisteredHandlers method that allows tests to say that they want each receiver to run on the Handler specified at registration time. This CL also enables the new mode for ConnectivityServiceTest, and resolves a TODO to re-enable a disabled thread check. The new mode cannot be enabled by default because it would break most of the tests. All the below tests pass except for the car bluetooth test testAutoConnectAdapterOff_returnsImmediately which was already failing. Bug: 173331190 Test: atest CarInputServiceTest BluetoothProfileDeviceManagerTest Test: atest NetworkPolicyManagerServiceTest Test: atest ConnectivityServiceTest Test: atest TetheringTest TetheringNotificationUpdaterTest Test: atest VersionedBroadcastListenerTest EntitlementManagerTest Test: atest TetheringConfigurationTest Test: atest CachedDeviceStateServiceTest Test: atest EmergencyAffordanceServiceTest Change-Id: I3303bb14516f07a55d82a16b59c111ab3f8b0389 --- .../core/java/com/android/server/ConnectivityService.java | 4 +--- .../java/com/android/server/ConnectivityServiceTest.java | 7 +++---- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 65b670bcc4..4b9fed220d 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -4987,9 +4987,7 @@ public class ConnectivityService extends IConnectivityManager.Stub private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - // TODO: make BroadcastInterceptingContext use the Handler passed in to registerReceiver - // and put this back. - // ensureRunningOnConnectivityServiceThread(); + ensureRunningOnConnectivityServiceThread(); final String action = intent.getAction(); final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL); diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 3c4abde380..abe06c543a 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -1300,10 +1300,8 @@ public class ConnectivityServiceTest { } private void processBroadcastForVpn(Intent intent) { - // The BroadcastReceiver for this broadcast checks it is being run on the handler thread. - final Handler handler = new Handler(mVMSHandlerThread.getLooper()); - handler.post(() -> mServiceContext.sendBroadcast(intent)); - HandlerUtils.waitForIdle(handler, TIMEOUT_MS); + mServiceContext.sendBroadcast(intent); + HandlerUtils.waitForIdle(mVMSHandlerThread, TIMEOUT_MS); waitForIdle(); } @@ -1430,6 +1428,7 @@ public class ConnectivityServiceTest { FakeSettingsProvider.clearSettingsProvider(); mServiceContext = new MockContext(InstrumentationRegistry.getContext(), new FakeSettingsProvider()); + mServiceContext.setUseRegisteredHandlers(true); LocalServices.removeServiceForTest(NetworkPolicyManagerInternal.class); LocalServices.addService( NetworkPolicyManagerInternal.class, mock(NetworkPolicyManagerInternal.class));