From c344c9fb9c9300ce475e4a2bc2ddbaf23c30cb4e Mon Sep 17 00:00:00 2001 From: paulhu Date: Thu, 2 Sep 2021 06:06:59 +0000 Subject: [PATCH] Specify which callback is unexpected in testMobileDataPreferredUids This test is flaky due to assertNoCallback(). Because this method expects no any callback received but the wifi network may update its capabilities during testing and trigger onCapabilitiesChanged() to cause test failed. Thus, these callbacks should be ignored in the tests. Replace the assertNoCallback to assertNoCallbackThat with callback type specified to deflake tests. Also align the available callback verification in the test to avoid confusion. Fix: 198367703 Test: atest android.net.cts.ConnectivityManagerTest\ --iterations 20 Change-Id: Ifde5e9730823c3b6f32590cc436cc4ba11d2b36e --- .../net/cts/ConnectivityManagerTest.java | 32 +++++++++++++------ 1 file changed, 22 insertions(+), 10 deletions(-) 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 {