From a449374772ef9e8f2ee701fd5bea4f2f2069224d Mon Sep 17 00:00:00 2001 From: Handa Wang Date: Fri, 29 Mar 2024 05:42:37 +0000 Subject: [PATCH] [Thread] discover and resolve the meshcop service only on test network The test case is flaky because the service is unexpectedly discovered after it's already unregistered. Probably this is due to that on the WiFi interface NsdManager somehow didn't hear the goodbye PTR for the service so it can still 'discover' the service. Limiting the discovery on test network may help avoid the flake because test network is cleaner. Bug: 331878313 Test: https://android-build.corp.google.com/builds/abtd/run/L17400030002839695 Change-Id: Icc09aae00cd90f64428387b97dbd9743140641e5 --- .../cts/ThreadNetworkControllerTest.java | 18 ++++++++++++++---- .../thread/utils/TapTestNetworkTracker.java | 10 ++++++++-- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/thread/tests/cts/src/android/net/thread/cts/ThreadNetworkControllerTest.java b/thread/tests/cts/src/android/net/thread/cts/ThreadNetworkControllerTest.java index 0591c8709e..9a81388c7f 100644 --- a/thread/tests/cts/src/android/net/thread/cts/ThreadNetworkControllerTest.java +++ b/thread/tests/cts/src/android/net/thread/cts/ThreadNetworkControllerTest.java @@ -864,11 +864,12 @@ public class ThreadNetworkControllerTest { @Test public void meshcopService_threadDisabled_notDiscovered() throws Exception { setUpTestNetwork(); - CompletableFuture serviceLostFuture = new CompletableFuture<>(); NsdManager.DiscoveryListener listener = discoverForServiceLost(MESHCOP_SERVICE_TYPE, serviceLostFuture); + setEnabledAndWait(mController, false); + try { serviceLostFuture.get(SERVICE_LOST_TIMEOUT_MILLIS, MILLISECONDS); } catch (InterruptedException | ExecutionException | TimeoutException ignored) { @@ -877,7 +878,6 @@ public class ThreadNetworkControllerTest { } finally { mNsdManager.stopServiceDiscovery(listener); } - assertThrows( TimeoutException.class, () -> discoverService(MESHCOP_SERVICE_TYPE, SERVICE_LOST_TIMEOUT_MILLIS)); @@ -1112,7 +1112,12 @@ public class ThreadNetworkControllerTest { serviceInfoFuture.complete(serviceInfo); } }; - mNsdManager.discoverServices(serviceType, NsdManager.PROTOCOL_DNS_SD, listener); + mNsdManager.discoverServices( + serviceType, + NsdManager.PROTOCOL_DNS_SD, + mTestNetworkTracker.getNetwork(), + mExecutor, + listener); try { serviceInfoFuture.get(timeoutMilliseconds, MILLISECONDS); } finally { @@ -1131,7 +1136,12 @@ public class ThreadNetworkControllerTest { serviceInfoFuture.complete(serviceInfo); } }; - mNsdManager.discoverServices(serviceType, NsdManager.PROTOCOL_DNS_SD, listener); + mNsdManager.discoverServices( + serviceType, + NsdManager.PROTOCOL_DNS_SD, + mTestNetworkTracker.getNetwork(), + mExecutor, + listener); return listener; } diff --git a/thread/tests/utils/src/android/net/thread/utils/TapTestNetworkTracker.java b/thread/tests/utils/src/android/net/thread/utils/TapTestNetworkTracker.java index 43f177df06..b586a19ab7 100644 --- a/thread/tests/utils/src/android/net/thread/utils/TapTestNetworkTracker.java +++ b/thread/tests/utils/src/android/net/thread/utils/TapTestNetworkTracker.java @@ -62,6 +62,7 @@ public final class TapTestNetworkTracker { private final Looper mLooper; private TestNetworkInterface mInterface; private TestableNetworkAgent mAgent; + private Network mNetwork; private final TestableNetworkCallback mNetworkCallback; private final ConnectivityManager mConnectivityManager; @@ -91,6 +92,11 @@ public final class TapTestNetworkTracker { return mInterface.getInterfaceName(); } + /** Returns the {@link android.net.Network} of the test network. */ + public Network getNetwork() { + return mNetwork; + } + private void setUpTestNetwork() throws Exception { mInterface = mContext.getSystemService(TestNetworkManager.class).createTapInterface(); @@ -105,13 +111,13 @@ public final class TapTestNetworkTracker { newNetworkCapabilities(), lp, new NetworkAgentConfig.Builder().build()); - final Network network = mAgent.register(); + mNetwork = mAgent.register(); mAgent.markConnected(); PollingCheck.check( "No usable address on interface", TIMEOUT.toMillis(), - () -> hasUsableAddress(network, getInterfaceName())); + () -> hasUsableAddress(mNetwork, getInterfaceName())); lp.setLinkAddresses(makeLinkAddresses()); mAgent.sendLinkProperties(lp);