From 84dfa9f104928506ef2887c1533e4325b8108df2 Mon Sep 17 00:00:00 2001 From: Chalard Jean Date: Mon, 30 Jan 2023 11:23:20 +0900 Subject: [PATCH] Introduce a flag for using the carrier service changed callbacks. Test: CarrierPrivilegeAuthenticatorTest Change-Id: Ia28c6abca67866c1de953cb61953a0d2882cd7e2 --- .../android/server/ConnectivityService.java | 2 +- .../CarrierPrivilegeAuthenticator.java | 13 ++++++--- .../connectivity/ConnectivityFlags.java | 4 +++ .../server/ConnectivityServiceTest.java | 16 ++++++++++- .../CarrierPrivilegeAuthenticatorTest.java | 27 +++++++++++++------ .../server/connectivityservice/base/CSTest.kt | 8 +++--- 6 files changed, 54 insertions(+), 16 deletions(-) diff --git a/service/src/com/android/server/ConnectivityService.java b/service/src/com/android/server/ConnectivityService.java index f888da526c..b3f0b2c7fa 100755 --- a/service/src/com/android/server/ConnectivityService.java +++ b/service/src/com/android/server/ConnectivityService.java @@ -1427,7 +1427,7 @@ public class ConnectivityService extends IConnectivityManager.Stub public CarrierPrivilegeAuthenticator makeCarrierPrivilegeAuthenticator( @NonNull final Context context, @NonNull final TelephonyManager tm) { if (isAtLeastT()) { - return new CarrierPrivilegeAuthenticator(context, tm); + return new CarrierPrivilegeAuthenticator(context, this, tm); } else { return null; } diff --git a/service/src/com/android/server/connectivity/CarrierPrivilegeAuthenticator.java b/service/src/com/android/server/connectivity/CarrierPrivilegeAuthenticator.java index 88aa329885..27c9126b17 100644 --- a/service/src/com/android/server/connectivity/CarrierPrivilegeAuthenticator.java +++ b/service/src/com/android/server/connectivity/CarrierPrivilegeAuthenticator.java @@ -16,9 +16,10 @@ package com.android.server.connectivity; -import static android.net.NetworkCapabilities.NET_CAPABILITY_CBS; import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; +import static com.android.server.connectivity.ConnectivityFlags.CARRIER_SERVICE_CHANGED_USE_CALLBACK; + import android.annotation.NonNull; import android.content.BroadcastReceiver; import android.content.Context; @@ -44,6 +45,7 @@ import com.android.networkstack.apishim.TelephonyManagerShimImpl; import com.android.networkstack.apishim.common.TelephonyManagerShim; import com.android.networkstack.apishim.common.TelephonyManagerShim.CarrierPrivilegesListenerShim; import com.android.networkstack.apishim.common.UnsupportedApiLevelException; +import com.android.server.ConnectivityService; import java.util.ArrayList; import java.util.List; @@ -73,8 +75,10 @@ public class CarrierPrivilegeAuthenticator extends BroadcastReceiver { @NonNull private final List mCarrierPrivilegesChangedListeners = new ArrayList<>(); + private final boolean mUseCallbacksForServiceChanged; public CarrierPrivilegeAuthenticator(@NonNull final Context c, + @NonNull final ConnectivityService.Dependencies deps, @NonNull final TelephonyManager t, @NonNull final TelephonyManagerShim telephonyManagerShim) { mContext = c; @@ -82,7 +86,9 @@ public class CarrierPrivilegeAuthenticator extends BroadcastReceiver { mTelephonyManagerShim = telephonyManagerShim; mThread = new HandlerThread(TAG); mThread.start(); - mHandler = new Handler(mThread.getLooper()) {}; + mHandler = new Handler(mThread.getLooper()); + mUseCallbacksForServiceChanged = deps.isFeatureEnabled( + c, CARRIER_SERVICE_CHANGED_USE_CALLBACK); synchronized (mLock) { mModemCount = mTelephonyManager.getActiveModemCount(); registerForCarrierChanges(); @@ -91,8 +97,9 @@ public class CarrierPrivilegeAuthenticator extends BroadcastReceiver { } public CarrierPrivilegeAuthenticator(@NonNull final Context c, + @NonNull final ConnectivityService.Dependencies deps, @NonNull final TelephonyManager t) { - this(c, t, TelephonyManagerShimImpl.newInstance(t)); + this(c, deps, t, TelephonyManagerShimImpl.newInstance(t)); } /** diff --git a/service/src/com/android/server/connectivity/ConnectivityFlags.java b/service/src/com/android/server/connectivity/ConnectivityFlags.java index 9039a14f86..5aac8f1e4c 100644 --- a/service/src/com/android/server/connectivity/ConnectivityFlags.java +++ b/service/src/com/android/server/connectivity/ConnectivityFlags.java @@ -33,6 +33,10 @@ public final class ConnectivityFlags { public static final String NO_REMATCH_ALL_REQUESTS_ON_REGISTER = "no_rematch_all_requests_on_register"; + @VisibleForTesting + public static final String CARRIER_SERVICE_CHANGED_USE_CALLBACK = + "carrier_service_changed_use_callback_version"; + private boolean mNoRematchAllRequestsOnRegister; /** diff --git a/tests/unit/java/com/android/server/ConnectivityServiceTest.java b/tests/unit/java/com/android/server/ConnectivityServiceTest.java index 2fccdcb9a4..569709d024 100755 --- a/tests/unit/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/unit/java/com/android/server/ConnectivityServiceTest.java @@ -30,6 +30,7 @@ import static android.Manifest.permission.NETWORK_SETTINGS; import static android.Manifest.permission.NETWORK_SETUP_WIZARD; import static android.Manifest.permission.NETWORK_STACK; import static android.Manifest.permission.PACKET_KEEPALIVE_OFFLOAD; +import static android.Manifest.permission.READ_DEVICE_CONFIG; import static android.app.ActivityManager.UidFrozenStateChangedCallback.UID_FROZEN_STATE_FROZEN; import static android.app.ActivityManager.UidFrozenStateChangedCallback.UID_FROZEN_STATE_UNFROZEN; import static android.app.PendingIntent.FLAG_IMMUTABLE; @@ -152,6 +153,7 @@ import static android.os.Process.INVALID_UID; import static android.system.OsConstants.IPPROTO_TCP; import static com.android.server.ConnectivityService.DELAY_DESTROY_FROZEN_SOCKETS_VERSION; +import static com.android.net.module.util.DeviceConfigUtils.TETHERING_MODULE_NAME; import static com.android.server.ConnectivityService.KEY_DESTROY_FROZEN_SOCKETS_VERSION; import static com.android.server.ConnectivityService.MAX_NETWORK_REQUESTS_PER_SYSTEM_UID; import static com.android.server.ConnectivityService.PREFERENCE_ORDER_MOBILE_DATA_PREFERERRED; @@ -250,6 +252,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ApplicationInfo; +import android.content.pm.ModuleInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; @@ -1903,6 +1906,7 @@ public class ConnectivityServiceTest { mServiceContext.setPermission(CONTROL_OEM_PAID_NETWORK_PREFERENCE, PERMISSION_GRANTED); mServiceContext.setPermission(PACKET_KEEPALIVE_OFFLOAD, PERMISSION_GRANTED); mServiceContext.setPermission(CONNECTIVITY_USE_RESTRICTED_NETWORKS, PERMISSION_GRANTED); + mServiceContext.setPermission(READ_DEVICE_CONFIG, PERMISSION_GRANTED); mAlarmManagerThread = new HandlerThread("TestAlarmManager"); mAlarmManagerThread.start(); @@ -2058,7 +2062,8 @@ public class ConnectivityServiceTest { @Override public CarrierPrivilegeAuthenticator makeCarrierPrivilegeAuthenticator( - @NonNull final Context context, @NonNull final TelephonyManager tm) { + @NonNull final Context context, + @NonNull final TelephonyManager tm) { return mDeps.isAtLeastT() ? mCarrierPrivilegeAuthenticator : null; } @@ -2150,6 +2155,7 @@ public class ConnectivityServiceTest { public boolean isFeatureEnabled(Context context, String name) { switch (name) { case ConnectivityFlags.NO_REMATCH_ALL_REQUESTS_ON_REGISTER: + case ConnectivityFlags.CARRIER_SERVICE_CHANGED_USE_CALLBACK: return true; case KEY_DESTROY_FROZEN_SOCKETS_VERSION: return true; @@ -2404,6 +2410,7 @@ public class ConnectivityServiceTest { final String myPackageName = mContext.getPackageName(); final PackageInfo myPackageInfo = mContext.getPackageManager().getPackageInfo( myPackageName, PackageManager.GET_PERMISSIONS); + myPackageInfo.setLongVersionCode(9_999_999L); doReturn(new String[] {myPackageName}).when(mPackageManager) .getPackagesForUid(Binder.getCallingUid()); doReturn(myPackageInfo).when(mPackageManager).getPackageInfoAsUser( @@ -2415,6 +2422,13 @@ public class ConnectivityServiceTest { buildPackageInfo(/* SYSTEM */ false, VPN_UID) })).when(mPackageManager).getInstalledPackagesAsUser(eq(GET_PERMISSIONS), anyInt()); + final ModuleInfo moduleInfo = new ModuleInfo(); + moduleInfo.setPackageName(TETHERING_MODULE_NAME); + doReturn(moduleInfo).when(mPackageManager) + .getModuleInfo(TETHERING_MODULE_NAME, PackageManager.MODULE_APEX_NAME); + doReturn(myPackageInfo).when(mPackageManager) + .getPackageInfo(TETHERING_MODULE_NAME, PackageManager.MATCH_APEX); + // Create a fake always-on VPN package. final int userId = UserHandle.getCallingUserId(); final ApplicationInfo applicationInfo = new ApplicationInfo(); diff --git a/tests/unit/java/com/android/server/connectivity/CarrierPrivilegeAuthenticatorTest.java b/tests/unit/java/com/android/server/connectivity/CarrierPrivilegeAuthenticatorTest.java index 3849e49dfe..1ca321030e 100644 --- a/tests/unit/java/com/android/server/connectivity/CarrierPrivilegeAuthenticatorTest.java +++ b/tests/unit/java/com/android/server/connectivity/CarrierPrivilegeAuthenticatorTest.java @@ -20,6 +20,8 @@ import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; import static android.net.NetworkCapabilities.TRANSPORT_WIFI; import static android.telephony.TelephonyManager.ACTION_MULTI_SIM_CONFIG_CHANGED; +import static com.android.server.connectivity.ConnectivityFlags.CARRIER_SERVICE_CHANGED_USE_CALLBACK; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -49,14 +51,17 @@ import com.android.net.module.util.CollectionUtils; import com.android.networkstack.apishim.TelephonyManagerShimImpl; import com.android.networkstack.apishim.common.TelephonyManagerShim.CarrierPrivilegesListenerShim; import com.android.networkstack.apishim.common.UnsupportedApiLevelException; +import com.android.server.ConnectivityService; import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo; import com.android.testutils.DevSdkIgnoreRunner; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; import org.mockito.ArgumentCaptor; +import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.Map; @@ -82,8 +87,9 @@ public class CarrierPrivilegeAuthenticatorTest { public class TestCarrierPrivilegeAuthenticator extends CarrierPrivilegeAuthenticator { TestCarrierPrivilegeAuthenticator(@NonNull final Context c, + @NonNull final ConnectivityService.Dependencies deps, @NonNull final TelephonyManager t) { - super(c, t, mTelephonyManagerShim); + super(c, deps, t, mTelephonyManagerShim); } @Override protected int getSlotIndex(int subId) { @@ -92,15 +98,20 @@ public class CarrierPrivilegeAuthenticatorTest { } } - public CarrierPrivilegeAuthenticatorTest() { + /** Parameters to test both using callbacks or the old broadcast */ + @Parameterized.Parameters + public static Collection shouldUseCallbacks() { + return Arrays.asList(true, false); + } + + public CarrierPrivilegeAuthenticatorTest(final boolean useCallbacks) throws Exception { mContext = mock(Context.class); mTelephonyManager = mock(TelephonyManager.class); mTelephonyManagerShim = mock(TelephonyManagerShimImpl.class); mPackageManager = mock(PackageManager.class); - } - - @Before - public void setUp() throws Exception { + final ConnectivityService.Dependencies deps = mock(ConnectivityService.Dependencies.class); + doReturn(useCallbacks).when(deps).isFeatureEnabled(any() /* context */, + eq(CARRIER_SERVICE_CHANGED_USE_CALLBACK)); doReturn(SUBSCRIPTION_COUNT).when(mTelephonyManager).getActiveModemCount(); doReturn(mTestPkg).when(mTelephonyManagerShim) .getCarrierServicePackageNameForLogicalSlot(anyInt()); @@ -109,7 +120,7 @@ public class CarrierPrivilegeAuthenticatorTest { applicationInfo.uid = mCarrierConfigPkgUid; doReturn(applicationInfo).when(mPackageManager).getApplicationInfo(eq(mTestPkg), anyInt()); mCarrierPrivilegeAuthenticator = - new TestCarrierPrivilegeAuthenticator(mContext, mTelephonyManager); + new TestCarrierPrivilegeAuthenticator(mContext, deps, mTelephonyManager); } private IntentFilter getIntentFilter() { diff --git a/tests/unit/java/com/android/server/connectivityservice/base/CSTest.kt b/tests/unit/java/com/android/server/connectivityservice/base/CSTest.kt index 68613a673c..be9a608a82 100644 --- a/tests/unit/java/com/android/server/connectivityservice/base/CSTest.kt +++ b/tests/unit/java/com/android/server/connectivityservice/base/CSTest.kt @@ -71,7 +71,7 @@ open class CSTest { init { if (!SdkLevel.isAtLeastS()) { throw UnsupportedApiLevelException("CSTest subclasses must be annotated to only " + - "run on S+, e.g. @DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.R)"); + "run on S+, e.g. @DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.R)") } } @@ -130,8 +130,10 @@ open class CSTest { override fun makeHandlerThread() = csHandlerThread override fun makeProxyTracker(context: Context, connServiceHandler: Handler) = proxyTracker - override fun makeCarrierPrivilegeAuthenticator(context: Context, tm: TelephonyManager) = - if (SdkLevel.isAtLeastT()) mock() else null + override fun makeCarrierPrivilegeAuthenticator( + context: Context, + tm: TelephonyManager + ) = if (SdkLevel.isAtLeastT()) mock() else null private inner class AOOKTDeps(c: Context) : AutomaticOnOffKeepaliveTracker.Dependencies(c) { override fun isTetheringFeatureNotChickenedOut(name: String): Boolean {