From 82cdf67a198191d53196270d02ddb37f6be62b18 Mon Sep 17 00:00:00 2001 From: Yang Sun Date: Tue, 11 Mar 2025 07:28:55 +0000 Subject: [PATCH] Fix flaky tests of route propagation from netdata to tun interface in ThreadIntegrationTest Wait for route to be added/removed from link properties in the tests instead of checking immediately, as it takes time for the change to propagate from ot. Bug: 401815392 Change-Id: Ie95f4beaa370514d31875b9f2e926762a38bc99e --- .../net/thread/ThreadIntegrationTest.java | 42 ++++++++++++------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/thread/tests/integration/src/android/net/thread/ThreadIntegrationTest.java b/thread/tests/integration/src/android/net/thread/ThreadIntegrationTest.java index 7a5895fed1..63dfaea5bf 100644 --- a/thread/tests/integration/src/android/net/thread/ThreadIntegrationTest.java +++ b/thread/tests/integration/src/android/net/thread/ThreadIntegrationTest.java @@ -95,6 +95,9 @@ public class ThreadIntegrationTest { // The maximum time for changes to be propagated to netdata. private static final Duration NET_DATA_UPDATE_TIMEOUT = Duration.ofSeconds(1); + // The maximum time for changes in netdata to be propagated to link properties. + private static final Duration LINK_PROPERTIES_UPDATE_TIMEOUT = Duration.ofSeconds(1); + private static final Duration NETWORK_CALLBACK_TIMEOUT = Duration.ofSeconds(10); // A valid Thread Active Operational Dataset generated from OpenThread CLI "dataset init new". @@ -303,7 +306,6 @@ public class ThreadIntegrationTest { @Test public void addPrefixToNetData_routeIsAddedToTunInterface() throws Exception { - ConnectivityManager cm = mContext.getSystemService(ConnectivityManager.class); mController.joinAndWait(DEFAULT_DATASET); // Ftd child doesn't have the ability to add a prefix, so let BR itself add a prefix. @@ -316,15 +318,11 @@ public class ThreadIntegrationTest { }, NET_DATA_UPDATE_TIMEOUT); - LinkProperties lp = cm.getLinkProperties(getThreadNetwork(CALLBACK_TIMEOUT)); - assertThat(lp).isNotNull(); - assertThat(lp.getRoutes().stream().anyMatch(r -> r.matches(TEST_NO_SLAAC_PREFIX_ADDRESS))) - .isTrue(); + assertRouteAddedOrRemovedInLinkProperties(true /* isAdded */, TEST_NO_SLAAC_PREFIX_ADDRESS); } @Test public void removePrefixFromNetData_routeIsRemovedFromTunInterface() throws Exception { - ConnectivityManager cm = mContext.getSystemService(ConnectivityManager.class); mController.joinAndWait(DEFAULT_DATASET); mOtCtl.executeCommand("prefix add " + TEST_NO_SLAAC_PREFIX + " pros med"); mOtCtl.executeCommand("netdata register"); @@ -338,15 +336,12 @@ public class ThreadIntegrationTest { }, NET_DATA_UPDATE_TIMEOUT); - LinkProperties lp = cm.getLinkProperties(getThreadNetwork(CALLBACK_TIMEOUT)); - assertThat(lp).isNotNull(); - assertThat(lp.getRoutes().stream().anyMatch(r -> r.matches(TEST_NO_SLAAC_PREFIX_ADDRESS))) - .isFalse(); + assertRouteAddedOrRemovedInLinkProperties( + false /* isAdded */, TEST_NO_SLAAC_PREFIX_ADDRESS); } @Test public void toggleThreadNetwork_routeFromPreviousNetDataIsRemoved() throws Exception { - ConnectivityManager cm = mContext.getSystemService(ConnectivityManager.class); mController.joinAndWait(DEFAULT_DATASET); mOtCtl.executeCommand("prefix add " + TEST_NO_SLAAC_PREFIX + " pros med"); mOtCtl.executeCommand("netdata register"); @@ -355,10 +350,8 @@ public class ThreadIntegrationTest { mOtCtl.factoryReset(); mController.joinAndWait(DEFAULT_DATASET); - LinkProperties lp = cm.getLinkProperties(getThreadNetwork(CALLBACK_TIMEOUT)); - assertThat(lp).isNotNull(); - assertThat(lp.getRoutes().stream().anyMatch(r -> r.matches(TEST_NO_SLAAC_PREFIX_ADDRESS))) - .isFalse(); + assertRouteAddedOrRemovedInLinkProperties( + false /* isAdded */, TEST_NO_SLAAC_PREFIX_ADDRESS); } @Test @@ -446,4 +439,23 @@ public class ThreadIntegrationTest { private void assertTunInterfaceMemberOfGroup(Inet6Address address) throws Exception { waitFor(() -> isInMulticastGroup(TUN_IF_NAME, address), TUN_ADDR_UPDATE_TIMEOUT); } + + private void assertRouteAddedOrRemovedInLinkProperties(boolean isAdded, InetAddress addr) + throws Exception { + ConnectivityManager cm = mContext.getSystemService(ConnectivityManager.class); + + waitFor( + () -> { + try { + LinkProperties lp = + cm.getLinkProperties(getThreadNetwork(CALLBACK_TIMEOUT)); + return lp != null + && isAdded + == lp.getRoutes().stream().anyMatch(r -> r.matches(addr)); + } catch (Exception e) { + return false; + } + }, + LINK_PROPERTIES_UPDATE_TIMEOUT); + } }