[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
This commit is contained in:
Handa Wang 2024-03-29 05:42:37 +00:00
commit a449374772
2 changed files with 22 additions and 6 deletions

View file

@ -864,11 +864,12 @@ public class ThreadNetworkControllerTest {
@Test
public void meshcopService_threadDisabled_notDiscovered() throws Exception {
setUpTestNetwork();
CompletableFuture<NsdServiceInfo> 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;
}

View file

@ -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);