diff --git a/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java b/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java index 4329a83c2c..fe448da65b 100644 --- a/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java +++ b/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java @@ -2828,6 +2828,19 @@ public class ConnectivityManagerTest { }); } + /** + * The networks used in this test are real networks and as such they can see seemingly random + * updates of their capabilities or link properties as conditions change, e.g. the network + * loses validation or IPv4 shows up. Many tests should simply treat these callbacks as + * spurious. + */ + private void assertNoCallbackExceptCapOrLpChange( + @NonNull final TestableNetworkCallback cb) { + cb.assertNoCallbackThat(NO_CALLBACK_TIMEOUT_MS, + c -> !(c instanceof CallbackEntry.CapabilitiesChanged + || c instanceof CallbackEntry.LinkPropertiesChanged)); + } + @AppModeFull(reason = "Cannot get WifiManager in instant app mode") @Test public void testMobileDataPreferredUids() throws Exception { @@ -2860,8 +2873,7 @@ public class ConnectivityManagerTest { // CtsNetTestCases uid is not listed in MOBILE_DATA_PREFERRED_UIDS setting, so the // per-app default network should be same as system default network. waitForAvailable(systemDefaultCb, wifiNetwork); - defaultTrackingCb.eventuallyExpect(CallbackEntry.AVAILABLE, NETWORK_CALLBACK_TIMEOUT_MS, - entry -> wifiNetwork.equals(entry.getNetwork())); + waitForAvailable(defaultTrackingCb, wifiNetwork); // Active network for CtsNetTestCases uid should be wifi now. assertEquals(wifiNetwork, mCm.getActiveNetwork()); @@ -2871,10 +2883,10 @@ public class ConnectivityManagerTest { newMobileDataPreferredUids.add(uid); ConnectivitySettingsManager.setMobileDataPreferredUids( mContext, newMobileDataPreferredUids); - defaultTrackingCb.eventuallyExpect(CallbackEntry.AVAILABLE, NETWORK_CALLBACK_TIMEOUT_MS, - entry -> cellNetwork.equals(entry.getNetwork())); - // System default network doesn't change. - systemDefaultCb.assertNoCallback(); + waitForAvailable(defaultTrackingCb, cellNetwork); + // No change for system default network. Expect no callback except CapabilitiesChanged + // or LinkPropertiesChanged which may be triggered randomly from wifi network. + assertNoCallbackExceptCapOrLpChange(systemDefaultCb); // Active network for CtsNetTestCases uid should change to cell, too. assertEquals(cellNetwork, mCm.getActiveNetwork()); @@ -2883,10 +2895,10 @@ public class ConnectivityManagerTest { newMobileDataPreferredUids.remove(uid); ConnectivitySettingsManager.setMobileDataPreferredUids( mContext, newMobileDataPreferredUids); - defaultTrackingCb.eventuallyExpect(CallbackEntry.AVAILABLE, NETWORK_CALLBACK_TIMEOUT_MS, - entry -> wifiNetwork.equals(entry.getNetwork())); - // System default network still doesn't change. - systemDefaultCb.assertNoCallback(); + waitForAvailable(defaultTrackingCb, wifiNetwork); + // No change for system default network. Expect no callback except CapabilitiesChanged + // or LinkPropertiesChanged which may be triggered randomly from wifi network. + assertNoCallbackExceptCapOrLpChange(systemDefaultCb); // Active network for CtsNetTestCases uid should change back to wifi. assertEquals(wifiNetwork, mCm.getActiveNetwork()); } finally {