From 2225648d47a5936a42cfb644641709afc96552f8 Mon Sep 17 00:00:00 2001 From: Cody Kesting Date: Mon, 3 May 2021 15:18:08 -0700 Subject: [PATCH] Notify policy listeners when VCN subIds change. This CL updates VcnManagementService to notify policy listeners when the subIds for any VCN instances change. This is necessary to ensure that NetworkFactories properly update their Networks in the event that a Network comes up under an existing VCN are properly marked as VCN-managed. Bug: 187112989 Test: atest FrameworksVcnTests CtsVcnTestCases Change-Id: Iecab1226119c8fd876131c381647267f18339db2 --- .../android/server/VcnManagementService.java | 20 +++++++++++++++ .../server/VcnManagementServiceTest.java | 25 +++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/services/core/java/com/android/server/VcnManagementService.java b/services/core/java/com/android/server/VcnManagementService.java index 45eb77453dbd9..29c26e0158034 100644 --- a/services/core/java/com/android/server/VcnManagementService.java +++ b/services/core/java/com/android/server/VcnManagementService.java @@ -87,6 +87,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Objects; +import java.util.Set; import java.util.concurrent.TimeUnit; /** @@ -431,6 +432,7 @@ public class VcnManagementService extends IVcnManagementService.Stub { public void onNewSnapshot(@NonNull TelephonySubscriptionSnapshot snapshot) { // Startup VCN instances synchronized (mLock) { + final TelephonySubscriptionSnapshot oldSnapshot = mLastSnapshot; mLastSnapshot = snapshot; // Start any VCN instances as necessary @@ -478,10 +480,28 @@ public class VcnManagementService extends IVcnManagementService.Stub { entry.getValue().updateSubscriptionSnapshot(mLastSnapshot); } } + + final Map> oldSubGrpMappings = + getSubGroupToSubIdMappings(oldSnapshot); + final Map> currSubGrpMappings = + getSubGroupToSubIdMappings(mLastSnapshot); + if (!currSubGrpMappings.equals(oldSubGrpMappings)) { + notifyAllPolicyListenersLocked(); + } } } } + @GuardedBy("mLock") + private Map> getSubGroupToSubIdMappings( + @NonNull TelephonySubscriptionSnapshot snapshot) { + final Map> subGrpMappings = new ArrayMap<>(); + for (ParcelUuid subGrp : mVcns.keySet()) { + subGrpMappings.put(subGrp, snapshot.getAllSubIdsInGroup(subGrp)); + } + return subGrpMappings; + } + @GuardedBy("mLock") private void stopVcnLocked(@NonNull ParcelUuid uuidToTeardown) { final Vcn vcnToTeardown = mVcns.remove(uuidToTeardown); diff --git a/tests/vcn/java/com/android/server/VcnManagementServiceTest.java b/tests/vcn/java/com/android/server/VcnManagementServiceTest.java index aa4b5f8e208fc..9ecd82ff6bcbb 100644 --- a/tests/vcn/java/com/android/server/VcnManagementServiceTest.java +++ b/tests/vcn/java/com/android/server/VcnManagementServiceTest.java @@ -77,6 +77,7 @@ import android.os.test.TestLooper; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; +import android.util.ArraySet; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; @@ -98,6 +99,7 @@ import java.io.FileNotFoundException; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import java.util.UUID; @@ -326,6 +328,17 @@ public class VcnManagementServiceTest { return subIdToGroupMap.get(invocation.getArgument(0)); }).when(snapshot).getGroupForSubId(anyInt()); + doAnswer(invocation -> { + final ParcelUuid subGrp = invocation.getArgument(0); + final Set subIds = new ArraySet<>(); + for (Entry entry : subIdToGroupMap.entrySet()) { + if (entry.getValue().equals(subGrp)) { + subIds.add(entry.getKey()); + } + } + return subIds; + }).when(snapshot).getAllSubIdsInGroup(any()); + final TelephonySubscriptionTrackerCallback cb = getTelephonySubscriptionTrackerCallback(); cb.onNewSnapshot(snapshot); @@ -914,6 +927,18 @@ public class VcnManagementServiceTest { verify(mMockPolicyListener).onPolicyChanged(); } + @Test + public void testVcnSubIdChangeUpdatesPolicyListener() throws Exception { + startAndGetVcnInstance(TEST_UUID_2); + mVcnMgmtSvc.addVcnUnderlyingNetworkPolicyListener(mMockPolicyListener); + + triggerSubscriptionTrackerCbAndGetSnapshot( + Collections.singleton(TEST_UUID_2), + Collections.singletonMap(TEST_SUBSCRIPTION_ID, TEST_UUID_2)); + + verify(mMockPolicyListener).onPolicyChanged(); + } + private void triggerVcnSafeMode( @NonNull ParcelUuid subGroup, @NonNull TelephonySubscriptionSnapshot snapshot,