Implement service lost callback
Service lost should be notified when receive the
onServiceNameRemoved callbacks from
MdnsServiceBrowserListener.
Bug: 254166302
Test: atest FrameworksNetTests
Change-Id: I298816ac186efeda85cea4cd11f3beab6b341bc5
diff --git a/service-t/src/com/android/server/NsdService.java b/service-t/src/com/android/server/NsdService.java
index 0d3ffd1..36c3cd4 100644
--- a/service-t/src/com/android/server/NsdService.java
+++ b/service-t/src/com/android/server/NsdService.java
@@ -190,7 +190,9 @@
@Override
public void onServiceNameRemoved(@NonNull MdnsServiceInfo serviceInfo) {
- // TODO: implement service name removed callback.
+ mNsdStateMachine.sendMessage(MDNS_DISCOVERY_MANAGER_EVENT, mTransactionId,
+ NsdManager.SERVICE_LOST,
+ new MdnsEvent(mClientId, mReqServiceInfo.getServiceType(), serviceInfo));
}
}
@@ -849,14 +851,17 @@
final MdnsEvent event = (MdnsEvent) obj;
final int clientId = event.mClientId;
+ final NsdServiceInfo info = buildNsdServiceInfoFromMdnsEvent(event);
if (DBG) {
Log.d(TAG, String.format("MdnsDiscoveryManager event code=%s transactionId=%d",
NsdManager.nameOf(code), transactionId));
}
switch (code) {
case NsdManager.SERVICE_FOUND:
- clientInfo.onServiceFound(
- clientId, buildNsdServiceInfoFromMdnsEvent(event));
+ clientInfo.onServiceFound(clientId, info);
+ break;
+ case NsdManager.SERVICE_LOST:
+ clientInfo.onServiceLost(clientId, info);
break;
default:
return false;
diff --git a/tests/unit/java/com/android/server/NsdServiceTest.java b/tests/unit/java/com/android/server/NsdServiceTest.java
index a42a7d7..a1c865f 100644
--- a/tests/unit/java/com/android/server/NsdServiceTest.java
+++ b/tests/unit/java/com/android/server/NsdServiceTest.java
@@ -607,7 +607,7 @@
verify(discListener, timeout(TIMEOUT_MS)).onDiscoveryStarted(SERVICE_TYPE);
final MdnsServiceBrowserListener listener = listenerCaptor.getValue();
- final MdnsServiceInfo mdnsServiceInfo = new MdnsServiceInfo(
+ final MdnsServiceInfo foundInfo = new MdnsServiceInfo(
SERVICE_NAME, /* serviceInstanceName */
serviceTypeWithLocalDomain.split("\\."), /* serviceType */
List.of(), /* subtypes */
@@ -619,13 +619,33 @@
List.of(), /* textEntries */
1234, /* interfaceIndex */
network);
- // Verify onServiceNameFound callback
- listener.onServiceNameDiscovered(mdnsServiceInfo);
+
+ // Verify onServiceNameDiscovered callback
+ listener.onServiceNameDiscovered(foundInfo);
verify(discListener, timeout(TIMEOUT_MS)).onServiceFound(argThat(info ->
info.getServiceName().equals(SERVICE_NAME)
&& info.getServiceType().equals(SERVICE_TYPE)
&& info.getNetwork().equals(network)));
+ final MdnsServiceInfo removedInfo = new MdnsServiceInfo(
+ SERVICE_NAME, /* serviceInstanceName */
+ serviceTypeWithLocalDomain.split("\\."), /* serviceType */
+ null, /* subtypes */
+ null, /* hostName */
+ 0, /* port */
+ null, /* ipv4Address */
+ null, /* ipv6Address */
+ null, /* textStrings */
+ null, /* textEntries */
+ 1234, /* interfaceIndex */
+ network);
+ // Verify onServiceNameRemoved callback
+ listener.onServiceNameRemoved(removedInfo);
+ verify(discListener, timeout(TIMEOUT_MS)).onServiceLost(argThat(info ->
+ info.getServiceName().equals(SERVICE_NAME)
+ && info.getServiceType().equals(SERVICE_TYPE)
+ && info.getNetwork().equals(network)));
+
client.stopServiceDiscovery(discListener);
waitForIdle();
verify(mDiscoveryManager).unregisterListener(eq(serviceTypeWithLocalDomain), any());