Merge "Send packets on the specific socket"

This commit is contained in:
Paul Hu
2023-06-27 05:40:38 +00:00
committed by Gerrit Code Review
8 changed files with 157 additions and 186 deletions

View File

@@ -18,7 +18,6 @@ package com.android.server.connectivity.mdns;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.net.Network;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.util.Pair; import android.util.Pair;
@@ -70,8 +69,8 @@ public class EnqueueMdnsQueryCallable implements Callable<Pair<Integer, List<Str
private final List<String> subtypes; private final List<String> subtypes;
private final boolean expectUnicastResponse; private final boolean expectUnicastResponse;
private final int transactionId; private final int transactionId;
@Nullable @NonNull
private final Network network; private final SocketKey socketKey;
private final boolean sendDiscoveryQueries; private final boolean sendDiscoveryQueries;
@NonNull @NonNull
private final List<MdnsResponse> servicesToResolve; private final List<MdnsResponse> servicesToResolve;
@@ -86,7 +85,7 @@ public class EnqueueMdnsQueryCallable implements Callable<Pair<Integer, List<Str
@NonNull Collection<String> subtypes, @NonNull Collection<String> subtypes,
boolean expectUnicastResponse, boolean expectUnicastResponse,
int transactionId, int transactionId,
@Nullable Network network, @NonNull SocketKey socketKey,
boolean onlyUseIpv6OnIpv6OnlyNetworks, boolean onlyUseIpv6OnIpv6OnlyNetworks,
boolean sendDiscoveryQueries, boolean sendDiscoveryQueries,
@NonNull Collection<MdnsResponse> servicesToResolve, @NonNull Collection<MdnsResponse> servicesToResolve,
@@ -97,7 +96,7 @@ public class EnqueueMdnsQueryCallable implements Callable<Pair<Integer, List<Str
this.subtypes = new ArrayList<>(subtypes); this.subtypes = new ArrayList<>(subtypes);
this.expectUnicastResponse = expectUnicastResponse; this.expectUnicastResponse = expectUnicastResponse;
this.transactionId = transactionId; this.transactionId = transactionId;
this.network = network; this.socketKey = socketKey;
this.onlyUseIpv6OnIpv6OnlyNetworks = onlyUseIpv6OnIpv6OnlyNetworks; this.onlyUseIpv6OnIpv6OnlyNetworks = onlyUseIpv6OnIpv6OnlyNetworks;
this.sendDiscoveryQueries = sendDiscoveryQueries; this.sendDiscoveryQueries = sendDiscoveryQueries;
this.servicesToResolve = new ArrayList<>(servicesToResolve); this.servicesToResolve = new ArrayList<>(servicesToResolve);
@@ -216,7 +215,7 @@ public class EnqueueMdnsQueryCallable implements Callable<Pair<Integer, List<Str
if (expectUnicastResponse) { if (expectUnicastResponse) {
if (requestSender instanceof MdnsMultinetworkSocketClient) { if (requestSender instanceof MdnsMultinetworkSocketClient) {
((MdnsMultinetworkSocketClient) requestSender).sendPacketRequestingUnicastResponse( ((MdnsMultinetworkSocketClient) requestSender).sendPacketRequestingUnicastResponse(
packet, network, onlyUseIpv6OnIpv6OnlyNetworks); packet, socketKey, onlyUseIpv6OnIpv6OnlyNetworks);
} else { } else {
requestSender.sendPacketRequestingUnicastResponse( requestSender.sendPacketRequestingUnicastResponse(
packet, onlyUseIpv6OnIpv6OnlyNetworks); packet, onlyUseIpv6OnIpv6OnlyNetworks);
@@ -225,7 +224,7 @@ public class EnqueueMdnsQueryCallable implements Callable<Pair<Integer, List<Str
if (requestSender instanceof MdnsMultinetworkSocketClient) { if (requestSender instanceof MdnsMultinetworkSocketClient) {
((MdnsMultinetworkSocketClient) requestSender) ((MdnsMultinetworkSocketClient) requestSender)
.sendPacketRequestingMulticastResponse( .sendPacketRequestingMulticastResponse(
packet, network, onlyUseIpv6OnIpv6OnlyNetworks); packet, socketKey, onlyUseIpv6OnIpv6OnlyNetworks);
} else { } else {
requestSender.sendPacketRequestingMulticastResponse( requestSender.sendPacketRequestingMulticastResponse(
packet, onlyUseIpv6OnIpv6OnlyNetworks); packet, onlyUseIpv6OnIpv6OnlyNetworks);

View File

@@ -16,6 +16,8 @@
package com.android.server.connectivity.mdns; package com.android.server.connectivity.mdns;
import static com.android.internal.annotations.VisibleForTesting.Visibility.PACKAGE;
import static java.nio.charset.StandardCharsets.UTF_8; import static java.nio.charset.StandardCharsets.UTF_8;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
@@ -25,7 +27,7 @@ import java.net.UnknownHostException;
import java.nio.charset.Charset; import java.nio.charset.Charset;
/** mDNS-related constants. */ /** mDNS-related constants. */
@VisibleForTesting @VisibleForTesting(visibility = PACKAGE)
public final class MdnsConstants { public final class MdnsConstants {
public static final int MDNS_PORT = 5353; public static final int MDNS_PORT = 5353;
// Flags word format is: // Flags word format is:

View File

@@ -254,8 +254,7 @@ public class MdnsDiscoveryManager implements MdnsSocketClientBase.Callback {
private void handleOnResponseReceived(@NonNull MdnsPacket packet, private void handleOnResponseReceived(@NonNull MdnsPacket packet,
@NonNull SocketKey socketKey) { @NonNull SocketKey socketKey) {
for (MdnsServiceTypeClient serviceTypeClient : getMdnsServiceTypeClient(socketKey)) { for (MdnsServiceTypeClient serviceTypeClient : getMdnsServiceTypeClient(socketKey)) {
serviceTypeClient.processResponse( serviceTypeClient.processResponse(packet, socketKey);
packet, socketKey.getInterfaceIndex(), socketKey.getNetwork());
} }
} }

View File

@@ -213,25 +213,22 @@ public class MdnsMultinetworkSocketClient implements MdnsSocketClientBase {
return true; return true;
} }
private void sendMdnsPacket(@NonNull DatagramPacket packet, @Nullable Network targetNetwork, private void sendMdnsPacket(@NonNull DatagramPacket packet, @NonNull SocketKey targetSocketKey,
boolean onlyUseIpv6OnIpv6OnlyNetworks) { boolean onlyUseIpv6OnIpv6OnlyNetworks) {
final boolean isIpv6 = ((InetSocketAddress) packet.getSocketAddress()).getAddress() final boolean isIpv6 = ((InetSocketAddress) packet.getSocketAddress()).getAddress()
instanceof Inet6Address; instanceof Inet6Address;
final boolean isIpv4 = ((InetSocketAddress) packet.getSocketAddress()).getAddress() final boolean isIpv4 = ((InetSocketAddress) packet.getSocketAddress()).getAddress()
instanceof Inet4Address; instanceof Inet4Address;
final ArrayMap<MdnsInterfaceSocket, SocketKey> activeSockets = getActiveSockets(); final ArrayMap<MdnsInterfaceSocket, SocketKey> activeSockets = getActiveSockets();
boolean shouldQueryIpv6 = !onlyUseIpv6OnIpv6OnlyNetworks || isIpv6OnlyNetworks( boolean shouldQueryIpv6 = !onlyUseIpv6OnIpv6OnlyNetworks || isIpv6OnlySockets(
activeSockets, targetNetwork); activeSockets, targetSocketKey);
for (int i = 0; i < activeSockets.size(); i++) { for (int i = 0; i < activeSockets.size(); i++) {
final MdnsInterfaceSocket socket = activeSockets.keyAt(i); final MdnsInterfaceSocket socket = activeSockets.keyAt(i);
final Network network = activeSockets.valueAt(i).getNetwork(); final SocketKey socketKey = activeSockets.valueAt(i);
// Check ip capability and network before sending packet // Check ip capability and network before sending packet
if (((isIpv6 && socket.hasJoinedIpv6() && shouldQueryIpv6) if (((isIpv6 && socket.hasJoinedIpv6() && shouldQueryIpv6)
|| (isIpv4 && socket.hasJoinedIpv4())) || (isIpv4 && socket.hasJoinedIpv4()))
// Contrary to MdnsUtils.isNetworkMatched, only send packets targeting && Objects.equals(socketKey, targetSocketKey)) {
// the null network to interfaces that have the null network (tethering
// downstream interfaces).
&& Objects.equals(network, targetNetwork)) {
try { try {
socket.send(packet); socket.send(packet);
} catch (IOException e) { } catch (IOException e) {
@@ -241,13 +238,13 @@ public class MdnsMultinetworkSocketClient implements MdnsSocketClientBase {
} }
} }
private boolean isIpv6OnlyNetworks( private boolean isIpv6OnlySockets(
@NonNull ArrayMap<MdnsInterfaceSocket, SocketKey> activeSockets, @NonNull ArrayMap<MdnsInterfaceSocket, SocketKey> activeSockets,
@Nullable Network targetNetwork) { @NonNull SocketKey targetSocketKey) {
for (int i = 0; i < activeSockets.size(); i++) { for (int i = 0; i < activeSockets.size(); i++) {
final MdnsInterfaceSocket socket = activeSockets.keyAt(i); final MdnsInterfaceSocket socket = activeSockets.keyAt(i);
final Network network = activeSockets.valueAt(i).getNetwork(); final SocketKey socketKey = activeSockets.valueAt(i);
if (Objects.equals(network, targetNetwork) && socket.hasJoinedIpv4()) { if (Objects.equals(socketKey, targetSocketKey) && socket.hasJoinedIpv4()) {
return false; return false;
} }
} }
@@ -276,38 +273,35 @@ public class MdnsMultinetworkSocketClient implements MdnsSocketClientBase {
} }
/** /**
* Send a mDNS request packet via given network that asks for multicast response. * Send a mDNS request packet via given socket key that asks for multicast response.
*
* <p>The socket client may use a null network to identify some or all interfaces, in which case
* passing null sends the packet to these.
*/ */
public void sendPacketRequestingMulticastResponse(@NonNull DatagramPacket packet, public void sendPacketRequestingMulticastResponse(@NonNull DatagramPacket packet,
@Nullable Network network, boolean onlyUseIpv6OnIpv6OnlyNetworks) { @NonNull SocketKey socketKey, boolean onlyUseIpv6OnIpv6OnlyNetworks) {
mHandler.post(() -> sendMdnsPacket(packet, network, onlyUseIpv6OnIpv6OnlyNetworks)); mHandler.post(() -> sendMdnsPacket(packet, socketKey, onlyUseIpv6OnIpv6OnlyNetworks));
} }
@Override @Override
public void sendPacketRequestingMulticastResponse( public void sendPacketRequestingMulticastResponse(
@NonNull DatagramPacket packet, boolean onlyUseIpv6OnIpv6OnlyNetworks) { @NonNull DatagramPacket packet, boolean onlyUseIpv6OnIpv6OnlyNetworks) {
sendPacketRequestingMulticastResponse( throw new UnsupportedOperationException("This socket client need to specify the socket to"
packet, null /* network */, onlyUseIpv6OnIpv6OnlyNetworks); + "send packet");
} }
/** /**
* Send a mDNS request packet via given network that asks for unicast response. * Send a mDNS request packet via given socket key that asks for unicast response.
* *
* <p>The socket client may use a null network to identify some or all interfaces, in which case * <p>The socket client may use a null network to identify some or all interfaces, in which case
* passing null sends the packet to these. * passing null sends the packet to these.
*/ */
public void sendPacketRequestingUnicastResponse(@NonNull DatagramPacket packet, public void sendPacketRequestingUnicastResponse(@NonNull DatagramPacket packet,
@Nullable Network network, boolean onlyUseIpv6OnIpv6OnlyNetworks) { @NonNull SocketKey socketKey, boolean onlyUseIpv6OnIpv6OnlyNetworks) {
mHandler.post(() -> sendMdnsPacket(packet, network, onlyUseIpv6OnIpv6OnlyNetworks)); mHandler.post(() -> sendMdnsPacket(packet, socketKey, onlyUseIpv6OnIpv6OnlyNetworks));
} }
@Override @Override
public void sendPacketRequestingUnicastResponse( public void sendPacketRequestingUnicastResponse(
@NonNull DatagramPacket packet, boolean onlyUseIpv6OnIpv6OnlyNetworks) { @NonNull DatagramPacket packet, boolean onlyUseIpv6OnIpv6OnlyNetworks) {
sendPacketRequestingUnicastResponse( throw new UnsupportedOperationException("This socket client need to specify the socket to"
packet, null /* network */, onlyUseIpv6OnIpv6OnlyNetworks); + "send packet");
} }
} }

View File

@@ -20,7 +20,6 @@ import static java.util.concurrent.TimeUnit.MILLISECONDS;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.net.Network;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.ArrayMap; import android.util.ArrayMap;
import android.util.ArraySet; import android.util.ArraySet;
@@ -262,15 +261,13 @@ public class MdnsServiceTypeClient {
/** /**
* Process an incoming response packet. * Process an incoming response packet.
*/ */
public synchronized void processResponse(@NonNull MdnsPacket packet, int interfaceIndex, public synchronized void processResponse(@NonNull MdnsPacket packet,
Network network) { @NonNull SocketKey socketKey) {
synchronized (lock) { synchronized (lock) {
// Augment the list of current known responses, and generated responses for resolve // Augment the list of current known responses, and generated responses for resolve
// requests if there is no known response // requests if there is no known response
final List<MdnsResponse> currentList = new ArrayList<>(instanceNameToResponse.values()); final List<MdnsResponse> currentList = new ArrayList<>(instanceNameToResponse.values());
List<MdnsResponse> additionalResponses = makeResponsesForResolve(socketKey);
List<MdnsResponse> additionalResponses = makeResponsesForResolve(interfaceIndex,
network);
for (MdnsResponse additionalResponse : additionalResponses) { for (MdnsResponse additionalResponse : additionalResponses) {
if (!instanceNameToResponse.containsKey( if (!instanceNameToResponse.containsKey(
additionalResponse.getServiceInstanceName())) { additionalResponse.getServiceInstanceName())) {
@@ -278,7 +275,8 @@ public class MdnsServiceTypeClient {
} }
} }
final Pair<ArraySet<MdnsResponse>, ArrayList<MdnsResponse>> augmentedResult = final Pair<ArraySet<MdnsResponse>, ArrayList<MdnsResponse>> augmentedResult =
responseDecoder.augmentResponses(packet, currentList, interfaceIndex, network); responseDecoder.augmentResponses(packet, currentList,
socketKey.getInterfaceIndex(), socketKey.getNetwork());
final ArraySet<MdnsResponse> modifiedResponse = augmentedResult.first; final ArraySet<MdnsResponse> modifiedResponse = augmentedResult.first;
final ArrayList<MdnsResponse> allResponses = augmentedResult.second; final ArrayList<MdnsResponse> allResponses = augmentedResult.second;
@@ -508,8 +506,7 @@ public class MdnsServiceTypeClient {
} }
} }
private List<MdnsResponse> makeResponsesForResolve(int interfaceIndex, private List<MdnsResponse> makeResponsesForResolve(@NonNull SocketKey socketKey) {
@NonNull Network network) {
final List<MdnsResponse> resolveResponses = new ArrayList<>(); final List<MdnsResponse> resolveResponses = new ArrayList<>();
for (int i = 0; i < listeners.size(); i++) { for (int i = 0; i < listeners.size(); i++) {
final String resolveName = listeners.valueAt(i).getResolveInstanceName(); final String resolveName = listeners.valueAt(i).getResolveInstanceName();
@@ -524,7 +521,7 @@ public class MdnsServiceTypeClient {
instanceFullName.addAll(Arrays.asList(serviceTypeLabels)); instanceFullName.addAll(Arrays.asList(serviceTypeLabels));
knownResponse = new MdnsResponse( knownResponse = new MdnsResponse(
0L /* lastUpdateTime */, instanceFullName.toArray(new String[0]), 0L /* lastUpdateTime */, instanceFullName.toArray(new String[0]),
interfaceIndex, network); socketKey.getInterfaceIndex(), socketKey.getNetwork());
} }
resolveResponses.add(knownResponse); resolveResponses.add(knownResponse);
} }
@@ -548,10 +545,7 @@ public class MdnsServiceTypeClient {
// The listener is requesting to resolve a service that has no info in // The listener is requesting to resolve a service that has no info in
// cache. Use the provided name to generate a minimal response, so other records are // cache. Use the provided name to generate a minimal response, so other records are
// queried to complete it. // queried to complete it.
// Only the names are used to know which queries to send, other parameters like servicesToResolve = makeResponsesForResolve(config.socketKey);
// interfaceIndex do not matter.
servicesToResolve = makeResponsesForResolve(
0 /* interfaceIndex */, config.socketKey.getNetwork());
sendDiscoveryQueries = servicesToResolve.size() < listeners.size(); sendDiscoveryQueries = servicesToResolve.size() < listeners.size();
} }
Pair<Integer, List<String>> result; Pair<Integer, List<String>> result;
@@ -564,7 +558,7 @@ public class MdnsServiceTypeClient {
config.subtypes, config.subtypes,
config.expectUnicastResponse, config.expectUnicastResponse,
config.transactionId, config.transactionId,
config.socketKey.getNetwork(), config.socketKey,
config.onlyUseIpv6OnIpv6OnlyNetworks, config.onlyUseIpv6OnIpv6OnlyNetworks,
sendDiscoveryQueries, sendDiscoveryQueries,
servicesToResolve, servicesToResolve,

View File

@@ -19,7 +19,6 @@ package com.android.server.connectivity.mdns;
import static com.android.testutils.DevSdkIgnoreRuleKt.SC_V2; import static com.android.testutils.DevSdkIgnoreRuleKt.SC_V2;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.eq; import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
@@ -212,31 +211,31 @@ public class MdnsDiscoveryManagerTests {
runOnHandler(() -> discoveryManager.onResponseReceived( runOnHandler(() -> discoveryManager.onResponseReceived(
responseForServiceTypeOne, SOCKET_KEY_NULL_NETWORK)); responseForServiceTypeOne, SOCKET_KEY_NULL_NETWORK));
// Packets for network null are only processed by the ServiceTypeClient for network null // Packets for network null are only processed by the ServiceTypeClient for network null
verify(mockServiceTypeClientType1NullNetwork).processResponse(responseForServiceTypeOne, verify(mockServiceTypeClientType1NullNetwork).processResponse(
SOCKET_KEY_NULL_NETWORK.getInterfaceIndex(), SOCKET_KEY_NULL_NETWORK.getNetwork()); responseForServiceTypeOne, SOCKET_KEY_NULL_NETWORK);
verify(mockServiceTypeClientType1Network1, never()).processResponse(any(), anyInt(), any()); verify(mockServiceTypeClientType1Network1, never()).processResponse(any(), any());
verify(mockServiceTypeClientType2Network2, never()).processResponse(any(), anyInt(), any()); verify(mockServiceTypeClientType2Network2, never()).processResponse(any(), any());
final MdnsPacket responseForServiceTypeTwo = createMdnsPacket(SERVICE_TYPE_2); final MdnsPacket responseForServiceTypeTwo = createMdnsPacket(SERVICE_TYPE_2);
runOnHandler(() -> discoveryManager.onResponseReceived( runOnHandler(() -> discoveryManager.onResponseReceived(
responseForServiceTypeTwo, SOCKET_KEY_NETWORK_1)); responseForServiceTypeTwo, SOCKET_KEY_NETWORK_1));
verify(mockServiceTypeClientType1NullNetwork, never()).processResponse(any(), anyInt(), verify(mockServiceTypeClientType1NullNetwork, never()).processResponse(any(),
eq(SOCKET_KEY_NETWORK_1.getNetwork())); eq(SOCKET_KEY_NETWORK_1));
verify(mockServiceTypeClientType1Network1).processResponse(responseForServiceTypeTwo, verify(mockServiceTypeClientType1Network1).processResponse(
SOCKET_KEY_NETWORK_1.getInterfaceIndex(), SOCKET_KEY_NETWORK_1.getNetwork()); responseForServiceTypeTwo, SOCKET_KEY_NETWORK_1);
verify(mockServiceTypeClientType2Network2, never()).processResponse(any(), anyInt(), verify(mockServiceTypeClientType2Network2, never()).processResponse(any(),
eq(SOCKET_KEY_NETWORK_1.getNetwork())); eq(SOCKET_KEY_NETWORK_1));
final MdnsPacket responseForSubtype = final MdnsPacket responseForSubtype =
createMdnsPacket("subtype._sub._googlecast._tcp.local"); createMdnsPacket("subtype._sub._googlecast._tcp.local");
runOnHandler(() -> discoveryManager.onResponseReceived( runOnHandler(() -> discoveryManager.onResponseReceived(
responseForSubtype, SOCKET_KEY_NETWORK_2)); responseForSubtype, SOCKET_KEY_NETWORK_2));
verify(mockServiceTypeClientType1NullNetwork, never()).processResponse(any(), anyInt(), verify(mockServiceTypeClientType1NullNetwork, never()).processResponse(any(),
eq(SOCKET_KEY_NETWORK_2.getNetwork())); eq(SOCKET_KEY_NETWORK_2));
verify(mockServiceTypeClientType1Network1, never()).processResponse(any(), anyInt(), verify(mockServiceTypeClientType1Network1, never()).processResponse(any(),
eq(SOCKET_KEY_NETWORK_2.getNetwork())); eq(SOCKET_KEY_NETWORK_2));
verify(mockServiceTypeClientType2Network2).processResponse(responseForSubtype, verify(mockServiceTypeClientType2Network2).processResponse(
SOCKET_KEY_NETWORK_2.getInterfaceIndex(), SOCKET_KEY_NETWORK_2.getNetwork()); responseForSubtype, SOCKET_KEY_NETWORK_2);
} }
@Test @Test
@@ -260,10 +259,8 @@ public class MdnsDiscoveryManagerTests {
// Receive a response, it should be processed on both clients. // Receive a response, it should be processed on both clients.
final MdnsPacket response = createMdnsPacket(SERVICE_TYPE_1); final MdnsPacket response = createMdnsPacket(SERVICE_TYPE_1);
runOnHandler(() -> discoveryManager.onResponseReceived(response, SOCKET_KEY_NETWORK_1)); runOnHandler(() -> discoveryManager.onResponseReceived(response, SOCKET_KEY_NETWORK_1));
verify(mockServiceTypeClientType1Network1).processResponse(response, verify(mockServiceTypeClientType1Network1).processResponse(response, SOCKET_KEY_NETWORK_1);
SOCKET_KEY_NETWORK_1.getInterfaceIndex(), SOCKET_KEY_NETWORK_1.getNetwork()); verify(mockServiceTypeClientType2Network1).processResponse(response, SOCKET_KEY_NETWORK_1);
verify(mockServiceTypeClientType2Network1).processResponse(response,
SOCKET_KEY_NETWORK_1.getInterfaceIndex(), SOCKET_KEY_NETWORK_1.getNetwork());
// The first callback receives a notification that the network has been destroyed, // The first callback receives a notification that the network has been destroyed,
// mockServiceTypeClientOne1 should send service removed notifications and remove from the // mockServiceTypeClientOne1 should send service removed notifications and remove from the
@@ -276,10 +273,10 @@ public class MdnsDiscoveryManagerTests {
// removed from the list of clients, it is no longer able to process responses. // removed from the list of clients, it is no longer able to process responses.
runOnHandler(() -> discoveryManager.onResponseReceived(response, SOCKET_KEY_NETWORK_1)); runOnHandler(() -> discoveryManager.onResponseReceived(response, SOCKET_KEY_NETWORK_1));
// Still times(1) as a response was received once previously // Still times(1) as a response was received once previously
verify(mockServiceTypeClientType1Network1, times(1)).processResponse(response, verify(mockServiceTypeClientType1Network1, times(1)).processResponse(
SOCKET_KEY_NETWORK_1.getInterfaceIndex(), SOCKET_KEY_NETWORK_1.getNetwork()); response, SOCKET_KEY_NETWORK_1);
verify(mockServiceTypeClientType2Network1, times(2)).processResponse(response, verify(mockServiceTypeClientType2Network1, times(2)).processResponse(
SOCKET_KEY_NETWORK_1.getInterfaceIndex(), SOCKET_KEY_NETWORK_1.getNetwork()); response, SOCKET_KEY_NETWORK_1);
// The client for NETWORK_1 receives the callback that the NETWORK_2 has been destroyed, // The client for NETWORK_1 receives the callback that the NETWORK_2 has been destroyed,
// mockServiceTypeClientTwo2 shouldn't send any notifications. // mockServiceTypeClientTwo2 shouldn't send any notifications.
@@ -289,10 +286,10 @@ public class MdnsDiscoveryManagerTests {
// Receive a response again, mockServiceTypeClientType2Network1 is still in the list of // Receive a response again, mockServiceTypeClientType2Network1 is still in the list of
// clients, it's still able to process responses. // clients, it's still able to process responses.
runOnHandler(() -> discoveryManager.onResponseReceived(response, SOCKET_KEY_NETWORK_1)); runOnHandler(() -> discoveryManager.onResponseReceived(response, SOCKET_KEY_NETWORK_1));
verify(mockServiceTypeClientType1Network1, times(1)).processResponse(response, verify(mockServiceTypeClientType1Network1, times(1)).processResponse(
SOCKET_KEY_NETWORK_1.getInterfaceIndex(), SOCKET_KEY_NETWORK_1.getNetwork()); response, SOCKET_KEY_NETWORK_1);
verify(mockServiceTypeClientType2Network1, times(3)).processResponse(response, verify(mockServiceTypeClientType2Network1, times(3)).processResponse(
SOCKET_KEY_NETWORK_1.getInterfaceIndex(), SOCKET_KEY_NETWORK_1.getNetwork()); response, SOCKET_KEY_NETWORK_1);
} }
@Test @Test
@@ -310,8 +307,8 @@ public class MdnsDiscoveryManagerTests {
final MdnsPacket response = createMdnsPacket(SERVICE_TYPE_1); final MdnsPacket response = createMdnsPacket(SERVICE_TYPE_1);
final int ifIndex = 1; final int ifIndex = 1;
runOnHandler(() -> discoveryManager.onResponseReceived(response, SOCKET_KEY_NULL_NETWORK)); runOnHandler(() -> discoveryManager.onResponseReceived(response, SOCKET_KEY_NULL_NETWORK));
verify(mockServiceTypeClientType1NullNetwork).processResponse(response, verify(mockServiceTypeClientType1NullNetwork).processResponse(
SOCKET_KEY_NULL_NETWORK.getInterfaceIndex(), SOCKET_KEY_NULL_NETWORK.getNetwork()); response, SOCKET_KEY_NULL_NETWORK);
runOnHandler(() -> callback.onAllSocketsDestroyed(SOCKET_KEY_NULL_NETWORK)); runOnHandler(() -> callback.onAllSocketsDestroyed(SOCKET_KEY_NULL_NETWORK));
verify(mockServiceTypeClientType1NullNetwork).notifySocketDestroyed(); verify(mockServiceTypeClientType1NullNetwork).notifySocketDestroyed();
@@ -319,8 +316,8 @@ public class MdnsDiscoveryManagerTests {
// Receive a response again, it should not be processed. // Receive a response again, it should not be processed.
runOnHandler(() -> discoveryManager.onResponseReceived(response, SOCKET_KEY_NULL_NETWORK)); runOnHandler(() -> discoveryManager.onResponseReceived(response, SOCKET_KEY_NULL_NETWORK));
// Still times(1) as a response was received once previously // Still times(1) as a response was received once previously
verify(mockServiceTypeClientType1NullNetwork, times(1)).processResponse(response, verify(mockServiceTypeClientType1NullNetwork, times(1)).processResponse(
SOCKET_KEY_NULL_NETWORK.getInterfaceIndex(), SOCKET_KEY_NULL_NETWORK.getNetwork()); response, SOCKET_KEY_NULL_NETWORK);
// Unregister the listener, notifyNetworkUnrequested should be called but other stop methods // Unregister the listener, notifyNetworkUnrequested should be called but other stop methods
// won't be call because the service type client was unregistered and destroyed. But those // won't be call because the service type client was unregistered and destroyed. But those

View File

@@ -74,7 +74,6 @@ public class MdnsMultinetworkSocketClientTest {
@Before @Before
public void setUp() throws SocketException { public void setUp() throws SocketException {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
doReturn(mNetwork).when(mSocketKey).getNetwork();
final HandlerThread thread = new HandlerThread("MdnsMultinetworkSocketClientTest"); final HandlerThread thread = new HandlerThread("MdnsMultinetworkSocketClientTest");
thread.start(); thread.start();
@@ -127,8 +126,6 @@ public class MdnsMultinetworkSocketClientTest {
final SocketKey tetherSocketKey1 = mock(SocketKey.class); final SocketKey tetherSocketKey1 = mock(SocketKey.class);
final SocketKey tetherSocketKey2 = mock(SocketKey.class); final SocketKey tetherSocketKey2 = mock(SocketKey.class);
doReturn(null).when(tetherSocketKey1).getNetwork();
doReturn(null).when(tetherSocketKey2).getNetwork();
// Notify socket created // Notify socket created
callback.onSocketCreated(mSocketKey, mSocket, List.of()); callback.onSocketCreated(mSocketKey, mSocket, List.of());
verify(mSocketCreationCallback).onSocketCreated(mSocketKey); verify(mSocketCreationCallback).onSocketCreated(mSocketKey);
@@ -137,8 +134,8 @@ public class MdnsMultinetworkSocketClientTest {
callback.onSocketCreated(tetherSocketKey2, tetherIfaceSock2, List.of()); callback.onSocketCreated(tetherSocketKey2, tetherIfaceSock2, List.of());
verify(mSocketCreationCallback).onSocketCreated(tetherSocketKey2); verify(mSocketCreationCallback).onSocketCreated(tetherSocketKey2);
// Send packet to IPv4 with target network and verify sending has been called. // Send packet to IPv4 with mSocketKey and verify sending has been called.
mSocketClient.sendPacketRequestingMulticastResponse(ipv4Packet, mNetwork, mSocketClient.sendPacketRequestingMulticastResponse(ipv4Packet, mSocketKey,
false /* onlyUseIpv6OnIpv6OnlyNetworks */); false /* onlyUseIpv6OnIpv6OnlyNetworks */);
HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT); HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
verify(mSocket).send(ipv4Packet); verify(mSocket).send(ipv4Packet);
@@ -146,30 +143,30 @@ public class MdnsMultinetworkSocketClientTest {
verify(tetherIfaceSock2, never()).send(any()); verify(tetherIfaceSock2, never()).send(any());
// Send packet to IPv4 with onlyUseIpv6OnIpv6OnlyNetworks = true, the packet will be sent. // Send packet to IPv4 with onlyUseIpv6OnIpv6OnlyNetworks = true, the packet will be sent.
mSocketClient.sendPacketRequestingMulticastResponse(ipv4Packet, mNetwork, mSocketClient.sendPacketRequestingMulticastResponse(ipv4Packet, mSocketKey,
true /* onlyUseIpv6OnIpv6OnlyNetworks */); true /* onlyUseIpv6OnIpv6OnlyNetworks */);
HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT); HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
verify(mSocket, times(2)).send(ipv4Packet); verify(mSocket, times(2)).send(ipv4Packet);
verify(tetherIfaceSock1, never()).send(any()); verify(tetherIfaceSock1, never()).send(any());
verify(tetherIfaceSock2, never()).send(any()); verify(tetherIfaceSock2, never()).send(any());
// Send packet to IPv6 without target network and verify sending has been called. // Send packet to IPv6 with tetherSocketKey1 and verify sending has been called.
mSocketClient.sendPacketRequestingMulticastResponse(ipv6Packet, null, mSocketClient.sendPacketRequestingMulticastResponse(ipv6Packet, tetherSocketKey1,
false /* onlyUseIpv6OnIpv6OnlyNetworks */); false /* onlyUseIpv6OnIpv6OnlyNetworks */);
HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT); HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
verify(mSocket, never()).send(ipv6Packet); verify(mSocket, never()).send(ipv6Packet);
verify(tetherIfaceSock1).send(ipv6Packet); verify(tetherIfaceSock1).send(ipv6Packet);
verify(tetherIfaceSock2).send(ipv6Packet); verify(tetherIfaceSock2, never()).send(ipv6Packet);
// Send packet to IPv6 with onlyUseIpv6OnIpv6OnlyNetworks = true, the packet will not be // Send packet to IPv6 with onlyUseIpv6OnIpv6OnlyNetworks = true, the packet will not be
// sent. Therefore, the tetherIfaceSock1.send() and tetherIfaceSock2.send() are still be // sent. Therefore, the tetherIfaceSock1.send() and tetherIfaceSock2.send() are still be
// called once. // called once.
mSocketClient.sendPacketRequestingMulticastResponse(ipv6Packet, null, mSocketClient.sendPacketRequestingMulticastResponse(ipv6Packet, tetherSocketKey1,
true /* onlyUseIpv6OnIpv6OnlyNetworks */); true /* onlyUseIpv6OnIpv6OnlyNetworks */);
HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT); HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
verify(mSocket, never()).send(ipv6Packet); verify(mSocket, never()).send(ipv6Packet);
verify(tetherIfaceSock1, times(1)).send(ipv6Packet); verify(tetherIfaceSock1, times(1)).send(ipv6Packet);
verify(tetherIfaceSock2, times(1)).send(ipv6Packet); verify(tetherIfaceSock2, never()).send(ipv6Packet);
} }
@Test @Test
@@ -249,8 +246,8 @@ public class MdnsMultinetworkSocketClientTest {
verify(mSocketCreationCallback).onSocketCreated(socketKey2); verify(mSocketCreationCallback).onSocketCreated(socketKey2);
verify(mSocketCreationCallback).onSocketCreated(socketKey3); verify(mSocketCreationCallback).onSocketCreated(socketKey3);
// Send IPv4 packet on the non-null Network and verify sending has been called. // Send IPv4 packet on the mSocketKey and verify sending has been called.
mSocketClient.sendPacketRequestingMulticastResponse(ipv4Packet, mNetwork, mSocketClient.sendPacketRequestingMulticastResponse(ipv4Packet, mSocketKey,
false /* onlyUseIpv6OnIpv6OnlyNetworks */); false /* onlyUseIpv6OnIpv6OnlyNetworks */);
HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT); HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
verify(mSocket).send(ipv4Packet); verify(mSocket).send(ipv4Packet);
@@ -278,38 +275,38 @@ public class MdnsMultinetworkSocketClientTest {
verify(socketCreationCb2).onSocketCreated(socketKey2); verify(socketCreationCb2).onSocketCreated(socketKey2);
verify(socketCreationCb2).onSocketCreated(socketKey3); verify(socketCreationCb2).onSocketCreated(socketKey3);
// Send IPv4 packet to null network and verify sending to the 2 tethered interface sockets. // Send IPv4 packet on socket2 and verify sending to the socket2 only.
mSocketClient.sendPacketRequestingMulticastResponse(ipv4Packet, null, mSocketClient.sendPacketRequestingMulticastResponse(ipv4Packet, socketKey2,
false /* onlyUseIpv6OnIpv6OnlyNetworks */); false /* onlyUseIpv6OnIpv6OnlyNetworks */);
HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT); HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
// ipv4Packet still sent only once on mSocket: times(1) matches the packet sent earlier on // ipv4Packet still sent only once on mSocket: times(1) matches the packet sent earlier on
// mNetwork // mNetwork
verify(mSocket, times(1)).send(ipv4Packet); verify(mSocket, times(1)).send(ipv4Packet);
verify(socket2).send(ipv4Packet); verify(socket2).send(ipv4Packet);
verify(socket3).send(ipv4Packet); verify(socket3, never()).send(ipv4Packet);
// Unregister the second request // Unregister the second request
mHandler.post(() -> mSocketClient.notifyNetworkUnrequested(listener2)); mHandler.post(() -> mSocketClient.notifyNetworkUnrequested(listener2));
verify(mProvider, timeout(DEFAULT_TIMEOUT)).unrequestSocket(callback2); verify(mProvider, timeout(DEFAULT_TIMEOUT)).unrequestSocket(callback2);
// Send IPv4 packet again and verify it's still sent a second time // Send IPv4 packet again and verify it's still sent a second time
mSocketClient.sendPacketRequestingMulticastResponse(ipv4Packet, null, mSocketClient.sendPacketRequestingMulticastResponse(ipv4Packet, socketKey2,
false /* onlyUseIpv6OnIpv6OnlyNetworks */); false /* onlyUseIpv6OnIpv6OnlyNetworks */);
HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT); HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
verify(socket2, times(2)).send(ipv4Packet); verify(socket2, times(2)).send(ipv4Packet);
verify(socket3, times(2)).send(ipv4Packet); verify(socket3, never()).send(ipv4Packet);
// Unrequest remaining sockets // Unrequest remaining sockets
mHandler.post(() -> mSocketClient.notifyNetworkUnrequested(mListener)); mHandler.post(() -> mSocketClient.notifyNetworkUnrequested(mListener));
verify(mProvider, timeout(DEFAULT_TIMEOUT)).unrequestSocket(callback); verify(mProvider, timeout(DEFAULT_TIMEOUT)).unrequestSocket(callback);
// Send IPv4 packet and verify no more sending. // Send IPv4 packet and verify no more sending.
mSocketClient.sendPacketRequestingMulticastResponse(ipv4Packet, null, mSocketClient.sendPacketRequestingMulticastResponse(ipv4Packet, mSocketKey,
false /* onlyUseIpv6OnIpv6OnlyNetworks */); false /* onlyUseIpv6OnIpv6OnlyNetworks */);
HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT); HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
verify(mSocket, times(1)).send(ipv4Packet); verify(mSocket, times(1)).send(ipv4Packet);
verify(socket2, times(2)).send(ipv4Packet); verify(socket2, times(2)).send(ipv4Packet);
verify(socket3, times(2)).send(ipv4Packet); verify(socket3, never()).send(ipv4Packet);
} }
@Test @Test

View File

@@ -438,7 +438,7 @@ public class MdnsServiceTypeClientTests {
client.processResponse(createResponse( client.processResponse(createResponse(
"service-instance-1", "192.0.2.123", 5353, "service-instance-1", "192.0.2.123", 5353,
SERVICE_TYPE_LABELS, SERVICE_TYPE_LABELS,
Collections.emptyMap(), TEST_TTL), /* interfaceIndex= */ 20, mockNetwork); Collections.emptyMap(), TEST_TTL), socketKey);
verify(mockListenerOne).onServiceNameDiscovered(any()); verify(mockListenerOne).onServiceNameDiscovered(any());
verify(mockListenerOne).onServiceFound(any()); verify(mockListenerOne).onServiceFound(any());
@@ -459,8 +459,7 @@ public class MdnsServiceTypeClientTests {
private static void verifyServiceInfo(MdnsServiceInfo serviceInfo, String serviceName, private static void verifyServiceInfo(MdnsServiceInfo serviceInfo, String serviceName,
String[] serviceType, List<String> ipv4Addresses, List<String> ipv6Addresses, int port, String[] serviceType, List<String> ipv4Addresses, List<String> ipv6Addresses, int port,
List<String> subTypes, Map<String, String> attributes, int interfaceIndex, List<String> subTypes, Map<String, String> attributes, SocketKey socketKey) {
Network network) {
assertEquals(serviceName, serviceInfo.getServiceInstanceName()); assertEquals(serviceName, serviceInfo.getServiceInstanceName());
assertArrayEquals(serviceType, serviceInfo.getServiceType()); assertArrayEquals(serviceType, serviceInfo.getServiceType());
assertEquals(ipv4Addresses, serviceInfo.getIpv4Addresses()); assertEquals(ipv4Addresses, serviceInfo.getIpv4Addresses());
@@ -471,8 +470,8 @@ public class MdnsServiceTypeClientTests {
assertTrue(attributes.containsKey(key)); assertTrue(attributes.containsKey(key));
assertEquals(attributes.get(key), serviceInfo.getAttributeByKey(key)); assertEquals(attributes.get(key), serviceInfo.getAttributeByKey(key));
} }
assertEquals(interfaceIndex, serviceInfo.getInterfaceIndex()); assertEquals(socketKey.getInterfaceIndex(), serviceInfo.getInterfaceIndex());
assertEquals(network, serviceInfo.getNetwork()); assertEquals(socketKey.getNetwork(), serviceInfo.getNetwork());
} }
@Test @Test
@@ -482,7 +481,7 @@ public class MdnsServiceTypeClientTests {
client.processResponse(createResponse( client.processResponse(createResponse(
"service-instance-1", null /* host */, 0 /* port */, "service-instance-1", null /* host */, 0 /* port */,
SERVICE_TYPE_LABELS, SERVICE_TYPE_LABELS,
Collections.emptyMap(), TEST_TTL), INTERFACE_INDEX, mockNetwork); Collections.emptyMap(), TEST_TTL), socketKey);
verify(mockListenerOne).onServiceNameDiscovered(serviceInfoCaptor.capture()); verify(mockListenerOne).onServiceNameDiscovered(serviceInfoCaptor.capture());
verifyServiceInfo(serviceInfoCaptor.getAllValues().get(0), verifyServiceInfo(serviceInfoCaptor.getAllValues().get(0),
"service-instance-1", "service-instance-1",
@@ -492,8 +491,7 @@ public class MdnsServiceTypeClientTests {
/* port= */ 0, /* port= */ 0,
/* subTypes= */ List.of(), /* subTypes= */ List.of(),
Collections.emptyMap(), Collections.emptyMap(),
INTERFACE_INDEX, socketKey);
mockNetwork);
verify(mockListenerOne, never()).onServiceFound(any(MdnsServiceInfo.class)); verify(mockListenerOne, never()).onServiceFound(any(MdnsServiceInfo.class));
verify(mockListenerOne, never()).onServiceUpdated(any(MdnsServiceInfo.class)); verify(mockListenerOne, never()).onServiceUpdated(any(MdnsServiceInfo.class));
@@ -508,14 +506,14 @@ public class MdnsServiceTypeClientTests {
client.processResponse(createResponse( client.processResponse(createResponse(
"service-instance-1", ipV4Address, 5353, "service-instance-1", ipV4Address, 5353,
/* subtype= */ "ABCDE", /* subtype= */ "ABCDE",
Collections.emptyMap(), TEST_TTL), /* interfaceIndex= */ 20, mockNetwork); Collections.emptyMap(), TEST_TTL), socketKey);
// Process a second response with a different port and updated text attributes. // Process a second response with a different port and updated text attributes.
client.processResponse(createResponse( client.processResponse(createResponse(
"service-instance-1", ipV4Address, 5354, "service-instance-1", ipV4Address, 5354,
/* subtype= */ "ABCDE", /* subtype= */ "ABCDE",
Collections.singletonMap("key", "value"), TEST_TTL), Collections.singletonMap("key", "value"), TEST_TTL),
/* interfaceIndex= */ 20, mockNetwork); socketKey);
// Verify onServiceNameDiscovered was called once for the initial response. // Verify onServiceNameDiscovered was called once for the initial response.
verify(mockListenerOne).onServiceNameDiscovered(serviceInfoCaptor.capture()); verify(mockListenerOne).onServiceNameDiscovered(serviceInfoCaptor.capture());
@@ -527,8 +525,7 @@ public class MdnsServiceTypeClientTests {
5353 /* port */, 5353 /* port */,
Collections.singletonList("ABCDE") /* subTypes */, Collections.singletonList("ABCDE") /* subTypes */,
Collections.singletonMap("key", null) /* attributes */, Collections.singletonMap("key", null) /* attributes */,
20 /* interfaceIndex */, socketKey);
mockNetwork);
// Verify onServiceFound was called once for the initial response. // Verify onServiceFound was called once for the initial response.
verify(mockListenerOne).onServiceFound(serviceInfoCaptor.capture()); verify(mockListenerOne).onServiceFound(serviceInfoCaptor.capture());
@@ -538,8 +535,8 @@ public class MdnsServiceTypeClientTests {
assertEquals(initialServiceInfo.getPort(), 5353); assertEquals(initialServiceInfo.getPort(), 5353);
assertEquals(initialServiceInfo.getSubtypes(), Collections.singletonList("ABCDE")); assertEquals(initialServiceInfo.getSubtypes(), Collections.singletonList("ABCDE"));
assertNull(initialServiceInfo.getAttributeByKey("key")); assertNull(initialServiceInfo.getAttributeByKey("key"));
assertEquals(initialServiceInfo.getInterfaceIndex(), 20); assertEquals(socketKey.getInterfaceIndex(), initialServiceInfo.getInterfaceIndex());
assertEquals(mockNetwork, initialServiceInfo.getNetwork()); assertEquals(socketKey.getNetwork(), initialServiceInfo.getNetwork());
// Verify onServiceUpdated was called once for the second response. // Verify onServiceUpdated was called once for the second response.
verify(mockListenerOne).onServiceUpdated(serviceInfoCaptor.capture()); verify(mockListenerOne).onServiceUpdated(serviceInfoCaptor.capture());
@@ -550,8 +547,8 @@ public class MdnsServiceTypeClientTests {
assertTrue(updatedServiceInfo.hasSubtypes()); assertTrue(updatedServiceInfo.hasSubtypes());
assertEquals(updatedServiceInfo.getSubtypes(), Collections.singletonList("ABCDE")); assertEquals(updatedServiceInfo.getSubtypes(), Collections.singletonList("ABCDE"));
assertEquals(updatedServiceInfo.getAttributeByKey("key"), "value"); assertEquals(updatedServiceInfo.getAttributeByKey("key"), "value");
assertEquals(updatedServiceInfo.getInterfaceIndex(), 20); assertEquals(socketKey.getInterfaceIndex(), updatedServiceInfo.getInterfaceIndex());
assertEquals(mockNetwork, updatedServiceInfo.getNetwork()); assertEquals(socketKey.getNetwork(), updatedServiceInfo.getNetwork());
} }
@Test @Test
@@ -563,14 +560,14 @@ public class MdnsServiceTypeClientTests {
client.processResponse(createResponse( client.processResponse(createResponse(
"service-instance-1", ipV6Address, 5353, "service-instance-1", ipV6Address, 5353,
/* subtype= */ "ABCDE", /* subtype= */ "ABCDE",
Collections.emptyMap(), TEST_TTL), /* interfaceIndex= */ 20, mockNetwork); Collections.emptyMap(), TEST_TTL), socketKey);
// Process a second response with a different port and updated text attributes. // Process a second response with a different port and updated text attributes.
client.processResponse(createResponse( client.processResponse(createResponse(
"service-instance-1", ipV6Address, 5354, "service-instance-1", ipV6Address, 5354,
/* subtype= */ "ABCDE", /* subtype= */ "ABCDE",
Collections.singletonMap("key", "value"), TEST_TTL), Collections.singletonMap("key", "value"), TEST_TTL),
/* interfaceIndex= */ 20, mockNetwork); socketKey);
// Verify onServiceNameDiscovered was called once for the initial response. // Verify onServiceNameDiscovered was called once for the initial response.
verify(mockListenerOne).onServiceNameDiscovered(serviceInfoCaptor.capture()); verify(mockListenerOne).onServiceNameDiscovered(serviceInfoCaptor.capture());
@@ -582,8 +579,7 @@ public class MdnsServiceTypeClientTests {
5353 /* port */, 5353 /* port */,
Collections.singletonList("ABCDE") /* subTypes */, Collections.singletonList("ABCDE") /* subTypes */,
Collections.singletonMap("key", null) /* attributes */, Collections.singletonMap("key", null) /* attributes */,
20 /* interfaceIndex */, socketKey);
mockNetwork);
// Verify onServiceFound was called once for the initial response. // Verify onServiceFound was called once for the initial response.
verify(mockListenerOne).onServiceFound(serviceInfoCaptor.capture()); verify(mockListenerOne).onServiceFound(serviceInfoCaptor.capture());
@@ -593,8 +589,8 @@ public class MdnsServiceTypeClientTests {
assertEquals(initialServiceInfo.getPort(), 5353); assertEquals(initialServiceInfo.getPort(), 5353);
assertEquals(initialServiceInfo.getSubtypes(), Collections.singletonList("ABCDE")); assertEquals(initialServiceInfo.getSubtypes(), Collections.singletonList("ABCDE"));
assertNull(initialServiceInfo.getAttributeByKey("key")); assertNull(initialServiceInfo.getAttributeByKey("key"));
assertEquals(initialServiceInfo.getInterfaceIndex(), 20); assertEquals(socketKey.getInterfaceIndex(), initialServiceInfo.getInterfaceIndex());
assertEquals(mockNetwork, initialServiceInfo.getNetwork()); assertEquals(socketKey.getNetwork(), initialServiceInfo.getNetwork());
// Verify onServiceUpdated was called once for the second response. // Verify onServiceUpdated was called once for the second response.
verify(mockListenerOne).onServiceUpdated(serviceInfoCaptor.capture()); verify(mockListenerOne).onServiceUpdated(serviceInfoCaptor.capture());
@@ -605,8 +601,8 @@ public class MdnsServiceTypeClientTests {
assertTrue(updatedServiceInfo.hasSubtypes()); assertTrue(updatedServiceInfo.hasSubtypes());
assertEquals(updatedServiceInfo.getSubtypes(), Collections.singletonList("ABCDE")); assertEquals(updatedServiceInfo.getSubtypes(), Collections.singletonList("ABCDE"));
assertEquals(updatedServiceInfo.getAttributeByKey("key"), "value"); assertEquals(updatedServiceInfo.getAttributeByKey("key"), "value");
assertEquals(updatedServiceInfo.getInterfaceIndex(), 20); assertEquals(socketKey.getInterfaceIndex(), updatedServiceInfo.getInterfaceIndex());
assertEquals(mockNetwork, updatedServiceInfo.getNetwork()); assertEquals(socketKey.getNetwork(), updatedServiceInfo.getNetwork());
} }
private void verifyServiceRemovedNoCallback(MdnsServiceBrowserListener listener) { private void verifyServiceRemovedNoCallback(MdnsServiceBrowserListener listener) {
@@ -615,17 +611,17 @@ public class MdnsServiceTypeClientTests {
} }
private void verifyServiceRemovedCallback(MdnsServiceBrowserListener listener, private void verifyServiceRemovedCallback(MdnsServiceBrowserListener listener,
String serviceName, String[] serviceType, int interfaceIndex, Network network) { String serviceName, String[] serviceType, SocketKey socketKey) {
verify(listener).onServiceRemoved(argThat( verify(listener).onServiceRemoved(argThat(
info -> serviceName.equals(info.getServiceInstanceName()) info -> serviceName.equals(info.getServiceInstanceName())
&& Arrays.equals(serviceType, info.getServiceType()) && Arrays.equals(serviceType, info.getServiceType())
&& info.getInterfaceIndex() == interfaceIndex && info.getInterfaceIndex() == socketKey.getInterfaceIndex()
&& network.equals(info.getNetwork()))); && socketKey.getNetwork().equals(info.getNetwork())));
verify(listener).onServiceNameRemoved(argThat( verify(listener).onServiceNameRemoved(argThat(
info -> serviceName.equals(info.getServiceInstanceName()) info -> serviceName.equals(info.getServiceInstanceName())
&& Arrays.equals(serviceType, info.getServiceType()) && Arrays.equals(serviceType, info.getServiceType())
&& info.getInterfaceIndex() == interfaceIndex && info.getInterfaceIndex() == socketKey.getInterfaceIndex()
&& network.equals(info.getNetwork()))); && socketKey.getNetwork().equals(info.getNetwork())));
} }
@Test @Test
@@ -639,12 +635,12 @@ public class MdnsServiceTypeClientTests {
client.processResponse(createResponse( client.processResponse(createResponse(
serviceName, ipV6Address, 5353, serviceName, ipV6Address, 5353,
SERVICE_TYPE_LABELS, SERVICE_TYPE_LABELS,
Collections.emptyMap(), TEST_TTL), INTERFACE_INDEX, mockNetwork); Collections.emptyMap(), TEST_TTL), socketKey);
client.processResponse(createResponse( client.processResponse(createResponse(
"goodbye-service", ipV6Address, 5353, "goodbye-service", ipV6Address, 5353,
SERVICE_TYPE_LABELS, SERVICE_TYPE_LABELS,
Collections.emptyMap(), /* ptrTtlMillis= */ 0L), INTERFACE_INDEX, mockNetwork); Collections.emptyMap(), /* ptrTtlMillis= */ 0L), socketKey);
// Verify removed callback won't be called if the service is not existed. // Verify removed callback won't be called if the service is not existed.
verifyServiceRemovedNoCallback(mockListenerOne); verifyServiceRemovedNoCallback(mockListenerOne);
@@ -654,11 +650,11 @@ public class MdnsServiceTypeClientTests {
client.processResponse(createResponse( client.processResponse(createResponse(
serviceName, ipV6Address, 5353, serviceName, ipV6Address, 5353,
SERVICE_TYPE_LABELS, SERVICE_TYPE_LABELS,
Collections.emptyMap(), 0L), INTERFACE_INDEX, mockNetwork); Collections.emptyMap(), 0L), socketKey);
verifyServiceRemovedCallback( verifyServiceRemovedCallback(
mockListenerOne, serviceName, SERVICE_TYPE_LABELS, INTERFACE_INDEX, mockNetwork); mockListenerOne, serviceName, SERVICE_TYPE_LABELS, socketKey);
verifyServiceRemovedCallback( verifyServiceRemovedCallback(
mockListenerTwo, serviceName, SERVICE_TYPE_LABELS, INTERFACE_INDEX, mockNetwork); mockListenerTwo, serviceName, SERVICE_TYPE_LABELS, socketKey);
} }
@Test @Test
@@ -667,7 +663,7 @@ public class MdnsServiceTypeClientTests {
client.processResponse(createResponse( client.processResponse(createResponse(
"service-instance-1", "192.168.1.1", 5353, "service-instance-1", "192.168.1.1", 5353,
/* subtype= */ "ABCDE", /* subtype= */ "ABCDE",
Collections.emptyMap(), TEST_TTL), INTERFACE_INDEX, mockNetwork); Collections.emptyMap(), TEST_TTL), socketKey);
client.startSendAndReceive(mockListenerOne, MdnsSearchOptions.getDefaultOptions()); client.startSendAndReceive(mockListenerOne, MdnsSearchOptions.getDefaultOptions());
@@ -681,8 +677,7 @@ public class MdnsServiceTypeClientTests {
5353 /* port */, 5353 /* port */,
Collections.singletonList("ABCDE") /* subTypes */, Collections.singletonList("ABCDE") /* subTypes */,
Collections.singletonMap("key", null) /* attributes */, Collections.singletonMap("key", null) /* attributes */,
INTERFACE_INDEX, socketKey);
mockNetwork);
// Verify onServiceFound was called once for the existing response. // Verify onServiceFound was called once for the existing response.
verify(mockListenerOne).onServiceFound(serviceInfoCaptor.capture()); verify(mockListenerOne).onServiceFound(serviceInfoCaptor.capture());
@@ -697,7 +692,7 @@ public class MdnsServiceTypeClientTests {
client.processResponse(createResponse( client.processResponse(createResponse(
"service-instance-1", "192.168.1.1", 5353, "service-instance-1", "192.168.1.1", 5353,
SERVICE_TYPE_LABELS, SERVICE_TYPE_LABELS,
Collections.emptyMap(), /* ptrTtlMillis= */ 0L), INTERFACE_INDEX, mockNetwork); Collections.emptyMap(), /* ptrTtlMillis= */ 0L), socketKey);
client.startSendAndReceive(mockListenerTwo, MdnsSearchOptions.getDefaultOptions()); client.startSendAndReceive(mockListenerTwo, MdnsSearchOptions.getDefaultOptions());
@@ -727,7 +722,7 @@ public class MdnsServiceTypeClientTests {
// Process the initial response. // Process the initial response.
client.processResponse(createResponse( client.processResponse(createResponse(
serviceInstanceName, "192.168.1.1", 5353, /* subtype= */ "ABCDE", serviceInstanceName, "192.168.1.1", 5353, /* subtype= */ "ABCDE",
Collections.emptyMap(), TEST_TTL), INTERFACE_INDEX, mockNetwork); Collections.emptyMap(), TEST_TTL), socketKey);
// Clear the scheduled runnable. // Clear the scheduled runnable.
currentThreadExecutor.getAndClearLastScheduledRunnable(); currentThreadExecutor.getAndClearLastScheduledRunnable();
@@ -744,8 +739,8 @@ public class MdnsServiceTypeClientTests {
firstMdnsTask.run(); firstMdnsTask.run();
// Verify removed callback was called. // Verify removed callback was called.
verifyServiceRemovedCallback(mockListenerOne, serviceInstanceName, SERVICE_TYPE_LABELS, verifyServiceRemovedCallback(
INTERFACE_INDEX, mockNetwork); mockListenerOne, serviceInstanceName, SERVICE_TYPE_LABELS, socketKey);
} }
@Test @Test
@@ -766,7 +761,7 @@ public class MdnsServiceTypeClientTests {
// Process the initial response. // Process the initial response.
client.processResponse(createResponse( client.processResponse(createResponse(
serviceInstanceName, "192.168.1.1", 5353, /* subtype= */ "ABCDE", serviceInstanceName, "192.168.1.1", 5353, /* subtype= */ "ABCDE",
Collections.emptyMap(), TEST_TTL), INTERFACE_INDEX, mockNetwork); Collections.emptyMap(), TEST_TTL), socketKey);
// Clear the scheduled runnable. // Clear the scheduled runnable.
currentThreadExecutor.getAndClearLastScheduledRunnable(); currentThreadExecutor.getAndClearLastScheduledRunnable();
@@ -799,7 +794,7 @@ public class MdnsServiceTypeClientTests {
// Process the initial response. // Process the initial response.
client.processResponse(createResponse( client.processResponse(createResponse(
serviceInstanceName, "192.168.1.1", 5353, /* subtype= */ "ABCDE", serviceInstanceName, "192.168.1.1", 5353, /* subtype= */ "ABCDE",
Collections.emptyMap(), TEST_TTL), INTERFACE_INDEX, mockNetwork); Collections.emptyMap(), TEST_TTL), socketKey);
// Clear the scheduled runnable. // Clear the scheduled runnable.
currentThreadExecutor.getAndClearLastScheduledRunnable(); currentThreadExecutor.getAndClearLastScheduledRunnable();
@@ -809,8 +804,8 @@ public class MdnsServiceTypeClientTests {
firstMdnsTask.run(); firstMdnsTask.run();
// Verify removed callback was called. // Verify removed callback was called.
verifyServiceRemovedCallback(mockListenerOne, serviceInstanceName, SERVICE_TYPE_LABELS, verifyServiceRemovedCallback(
INTERFACE_INDEX, mockNetwork); mockListenerOne, serviceInstanceName, SERVICE_TYPE_LABELS, socketKey);
} }
@Test @Test
@@ -825,23 +820,23 @@ public class MdnsServiceTypeClientTests {
final String subtype = "ABCDE"; final String subtype = "ABCDE";
client.processResponse(createResponse( client.processResponse(createResponse(
serviceName, null, 5353, subtype, serviceName, null, 5353, subtype,
Collections.emptyMap(), TEST_TTL), INTERFACE_INDEX, mockNetwork); Collections.emptyMap(), TEST_TTL), socketKey);
// Process a second response which has ip address to make response become complete. // Process a second response which has ip address to make response become complete.
client.processResponse(createResponse( client.processResponse(createResponse(
serviceName, ipV4Address, 5353, subtype, serviceName, ipV4Address, 5353, subtype,
Collections.emptyMap(), TEST_TTL), INTERFACE_INDEX, mockNetwork); Collections.emptyMap(), TEST_TTL), socketKey);
// Process a third response with a different ip address, port and updated text attributes. // Process a third response with a different ip address, port and updated text attributes.
client.processResponse(createResponse( client.processResponse(createResponse(
serviceName, ipV6Address, 5354, subtype, serviceName, ipV6Address, 5354, subtype,
Collections.singletonMap("key", "value"), TEST_TTL), INTERFACE_INDEX, mockNetwork); Collections.singletonMap("key", "value"), TEST_TTL), socketKey);
// Process the last response which is goodbye message (with the main type, not subtype). // Process the last response which is goodbye message (with the main type, not subtype).
client.processResponse(createResponse( client.processResponse(createResponse(
serviceName, ipV6Address, 5354, SERVICE_TYPE_LABELS, serviceName, ipV6Address, 5354, SERVICE_TYPE_LABELS,
Collections.singletonMap("key", "value"), /* ptrTtlMillis= */ 0L), Collections.singletonMap("key", "value"), /* ptrTtlMillis= */ 0L),
INTERFACE_INDEX, mockNetwork); socketKey);
// Verify onServiceNameDiscovered was first called for the initial response. // Verify onServiceNameDiscovered was first called for the initial response.
inOrder.verify(mockListenerOne).onServiceNameDiscovered(serviceInfoCaptor.capture()); inOrder.verify(mockListenerOne).onServiceNameDiscovered(serviceInfoCaptor.capture());
@@ -853,8 +848,7 @@ public class MdnsServiceTypeClientTests {
5353 /* port */, 5353 /* port */,
Collections.singletonList(subtype) /* subTypes */, Collections.singletonList(subtype) /* subTypes */,
Collections.singletonMap("key", null) /* attributes */, Collections.singletonMap("key", null) /* attributes */,
INTERFACE_INDEX, socketKey);
mockNetwork);
// Verify onServiceFound was second called for the second response. // Verify onServiceFound was second called for the second response.
inOrder.verify(mockListenerOne).onServiceFound(serviceInfoCaptor.capture()); inOrder.verify(mockListenerOne).onServiceFound(serviceInfoCaptor.capture());
@@ -866,8 +860,7 @@ public class MdnsServiceTypeClientTests {
5353 /* port */, 5353 /* port */,
Collections.singletonList(subtype) /* subTypes */, Collections.singletonList(subtype) /* subTypes */,
Collections.singletonMap("key", null) /* attributes */, Collections.singletonMap("key", null) /* attributes */,
INTERFACE_INDEX, socketKey);
mockNetwork);
// Verify onServiceUpdated was third called for the third response. // Verify onServiceUpdated was third called for the third response.
inOrder.verify(mockListenerOne).onServiceUpdated(serviceInfoCaptor.capture()); inOrder.verify(mockListenerOne).onServiceUpdated(serviceInfoCaptor.capture());
@@ -879,8 +872,7 @@ public class MdnsServiceTypeClientTests {
5354 /* port */, 5354 /* port */,
Collections.singletonList(subtype) /* subTypes */, Collections.singletonList(subtype) /* subTypes */,
Collections.singletonMap("key", "value") /* attributes */, Collections.singletonMap("key", "value") /* attributes */,
INTERFACE_INDEX, socketKey);
mockNetwork);
// Verify onServiceRemoved was called for the last response. // Verify onServiceRemoved was called for the last response.
inOrder.verify(mockListenerOne).onServiceRemoved(serviceInfoCaptor.capture()); inOrder.verify(mockListenerOne).onServiceRemoved(serviceInfoCaptor.capture());
@@ -892,8 +884,7 @@ public class MdnsServiceTypeClientTests {
5354 /* port */, 5354 /* port */,
Collections.singletonList("ABCDE") /* subTypes */, Collections.singletonList("ABCDE") /* subTypes */,
Collections.singletonMap("key", "value") /* attributes */, Collections.singletonMap("key", "value") /* attributes */,
INTERFACE_INDEX, socketKey);
mockNetwork);
// Verify onServiceNameRemoved was called for the last response. // Verify onServiceNameRemoved was called for the last response.
inOrder.verify(mockListenerOne).onServiceNameRemoved(serviceInfoCaptor.capture()); inOrder.verify(mockListenerOne).onServiceNameRemoved(serviceInfoCaptor.capture());
@@ -905,8 +896,7 @@ public class MdnsServiceTypeClientTests {
5354 /* port */, 5354 /* port */,
Collections.singletonList("ABCDE") /* subTypes */, Collections.singletonList("ABCDE") /* subTypes */,
Collections.singletonMap("key", "value") /* attributes */, Collections.singletonMap("key", "value") /* attributes */,
INTERFACE_INDEX, socketKey);
mockNetwork);
} }
@Test @Test
@@ -932,7 +922,7 @@ public class MdnsServiceTypeClientTests {
// Send twice for IPv4 and IPv6 // Send twice for IPv4 and IPv6
inOrder.verify(mockSocketClient, times(2)).sendPacketRequestingUnicastResponse( inOrder.verify(mockSocketClient, times(2)).sendPacketRequestingUnicastResponse(
srvTxtQueryCaptor.capture(), srvTxtQueryCaptor.capture(),
eq(mockNetwork), eq(false)); eq(socketKey), eq(false));
final MdnsPacket srvTxtQueryPacket = MdnsPacket.parse( final MdnsPacket srvTxtQueryPacket = MdnsPacket.parse(
new MdnsPacketReader(srvTxtQueryCaptor.getValue())); new MdnsPacketReader(srvTxtQueryCaptor.getValue()));
@@ -955,7 +945,7 @@ public class MdnsServiceTypeClientTests {
Collections.emptyList() /* authorityRecords */, Collections.emptyList() /* authorityRecords */,
Collections.emptyList() /* additionalRecords */); Collections.emptyList() /* additionalRecords */);
client.processResponse(srvTxtResponse, INTERFACE_INDEX, mockNetwork); client.processResponse(srvTxtResponse, socketKey);
// Expect a query for A/AAAA // Expect a query for A/AAAA
final ArgumentCaptor<DatagramPacket> addressQueryCaptor = final ArgumentCaptor<DatagramPacket> addressQueryCaptor =
@@ -963,7 +953,7 @@ public class MdnsServiceTypeClientTests {
currentThreadExecutor.getAndClearLastScheduledRunnable().run(); currentThreadExecutor.getAndClearLastScheduledRunnable().run();
inOrder.verify(mockSocketClient, times(2)).sendPacketRequestingMulticastResponse( inOrder.verify(mockSocketClient, times(2)).sendPacketRequestingMulticastResponse(
addressQueryCaptor.capture(), addressQueryCaptor.capture(),
eq(mockNetwork), eq(false)); eq(socketKey), eq(false));
final MdnsPacket addressQueryPacket = MdnsPacket.parse( final MdnsPacket addressQueryPacket = MdnsPacket.parse(
new MdnsPacketReader(addressQueryCaptor.getValue())); new MdnsPacketReader(addressQueryCaptor.getValue()));
@@ -985,7 +975,7 @@ public class MdnsServiceTypeClientTests {
Collections.emptyList() /* additionalRecords */); Collections.emptyList() /* additionalRecords */);
inOrder.verify(mockListenerOne, never()).onServiceNameDiscovered(any()); inOrder.verify(mockListenerOne, never()).onServiceNameDiscovered(any());
client.processResponse(addressResponse, INTERFACE_INDEX, mockNetwork); client.processResponse(addressResponse, socketKey);
inOrder.verify(mockListenerOne).onServiceFound(serviceInfoCaptor.capture()); inOrder.verify(mockListenerOne).onServiceFound(serviceInfoCaptor.capture());
verifyServiceInfo(serviceInfoCaptor.getValue(), verifyServiceInfo(serviceInfoCaptor.getValue(),
@@ -996,8 +986,7 @@ public class MdnsServiceTypeClientTests {
1234 /* port */, 1234 /* port */,
Collections.emptyList() /* subTypes */, Collections.emptyList() /* subTypes */,
Collections.emptyMap() /* attributes */, Collections.emptyMap() /* attributes */,
INTERFACE_INDEX, socketKey);
mockNetwork);
} }
@Test @Test
@@ -1023,7 +1012,7 @@ public class MdnsServiceTypeClientTests {
// Send twice for IPv4 and IPv6 // Send twice for IPv4 and IPv6
inOrder.verify(mockSocketClient, times(2)).sendPacketRequestingUnicastResponse( inOrder.verify(mockSocketClient, times(2)).sendPacketRequestingUnicastResponse(
srvTxtQueryCaptor.capture(), srvTxtQueryCaptor.capture(),
eq(mockNetwork), eq(false)); eq(socketKey), eq(false));
final MdnsPacket srvTxtQueryPacket = MdnsPacket.parse( final MdnsPacket srvTxtQueryPacket = MdnsPacket.parse(
new MdnsPacketReader(srvTxtQueryCaptor.getValue())); new MdnsPacketReader(srvTxtQueryCaptor.getValue()));
@@ -1050,7 +1039,7 @@ public class MdnsServiceTypeClientTests {
InetAddresses.parseNumericAddress(ipV6Address))), InetAddresses.parseNumericAddress(ipV6Address))),
Collections.emptyList() /* authorityRecords */, Collections.emptyList() /* authorityRecords */,
Collections.emptyList() /* additionalRecords */); Collections.emptyList() /* additionalRecords */);
client.processResponse(srvTxtResponse, INTERFACE_INDEX, mockNetwork); client.processResponse(srvTxtResponse, socketKey);
inOrder.verify(mockListenerOne).onServiceNameDiscovered(any()); inOrder.verify(mockListenerOne).onServiceNameDiscovered(any());
inOrder.verify(mockListenerOne).onServiceFound(any()); inOrder.verify(mockListenerOne).onServiceFound(any());
@@ -1069,7 +1058,7 @@ public class MdnsServiceTypeClientTests {
// Second and later sends are sent as "expect multicast response" queries // Second and later sends are sent as "expect multicast response" queries
inOrder.verify(mockSocketClient, times(2)).sendPacketRequestingMulticastResponse( inOrder.verify(mockSocketClient, times(2)).sendPacketRequestingMulticastResponse(
renewalQueryCaptor.capture(), renewalQueryCaptor.capture(),
eq(mockNetwork), eq(false)); eq(socketKey), eq(false));
inOrder.verify(mockListenerOne).onDiscoveryQuerySent(any(), anyInt()); inOrder.verify(mockListenerOne).onDiscoveryQuerySent(any(), anyInt());
final MdnsPacket renewalPacket = MdnsPacket.parse( final MdnsPacket renewalPacket = MdnsPacket.parse(
new MdnsPacketReader(renewalQueryCaptor.getValue())); new MdnsPacketReader(renewalQueryCaptor.getValue()));
@@ -1095,7 +1084,7 @@ public class MdnsServiceTypeClientTests {
InetAddresses.parseNumericAddress(ipV6Address))), InetAddresses.parseNumericAddress(ipV6Address))),
Collections.emptyList() /* authorityRecords */, Collections.emptyList() /* authorityRecords */,
Collections.emptyList() /* additionalRecords */); Collections.emptyList() /* additionalRecords */);
client.processResponse(refreshedSrvTxtResponse, INTERFACE_INDEX, mockNetwork); client.processResponse(refreshedSrvTxtResponse, socketKey);
// Advance time to updatedReceiptTime + 1, expected no refresh query because the cache // Advance time to updatedReceiptTime + 1, expected no refresh query because the cache
// should contain the record that have update last receipt time. // should contain the record that have update last receipt time.
@@ -1126,23 +1115,23 @@ public class MdnsServiceTypeClientTests {
client.processResponse(createResponse( client.processResponse(createResponse(
requestedInstance, ipV4Address, 5353, SERVICE_TYPE_LABELS, requestedInstance, ipV4Address, 5353, SERVICE_TYPE_LABELS,
Collections.emptyMap() /* textAttributes */, TEST_TTL), Collections.emptyMap() /* textAttributes */, TEST_TTL),
INTERFACE_INDEX, mockNetwork); socketKey);
// Complete response from otherInstanceName // Complete response from otherInstanceName
client.processResponse(createResponse( client.processResponse(createResponse(
otherInstance, ipV4Address, 5353, SERVICE_TYPE_LABELS, otherInstance, ipV4Address, 5353, SERVICE_TYPE_LABELS,
Collections.emptyMap() /* textAttributes */, TEST_TTL), Collections.emptyMap() /* textAttributes */, TEST_TTL),
INTERFACE_INDEX, mockNetwork); socketKey);
// Address update from otherInstanceName // Address update from otherInstanceName
client.processResponse(createResponse( client.processResponse(createResponse(
otherInstance, ipV6Address, 5353, SERVICE_TYPE_LABELS, otherInstance, ipV6Address, 5353, SERVICE_TYPE_LABELS,
Collections.emptyMap(), TEST_TTL), INTERFACE_INDEX, mockNetwork); Collections.emptyMap(), TEST_TTL), socketKey);
// Goodbye from otherInstanceName // Goodbye from otherInstanceName
client.processResponse(createResponse( client.processResponse(createResponse(
otherInstance, ipV6Address, 5353, SERVICE_TYPE_LABELS, otherInstance, ipV6Address, 5353, SERVICE_TYPE_LABELS,
Collections.emptyMap(), 0L /* ttl */), INTERFACE_INDEX, mockNetwork); Collections.emptyMap(), 0L /* ttl */), socketKey);
// mockListenerOne gets notified for the requested instance // mockListenerOne gets notified for the requested instance
verify(mockListenerOne).onServiceNameDiscovered( verify(mockListenerOne).onServiceNameDiscovered(
@@ -1207,23 +1196,23 @@ public class MdnsServiceTypeClientTests {
newAnswers, newAnswers,
packetWithoutSubtype.authorityRecords, packetWithoutSubtype.authorityRecords,
packetWithoutSubtype.additionalRecords); packetWithoutSubtype.additionalRecords);
client.processResponse(packetWithSubtype, INTERFACE_INDEX, mockNetwork); client.processResponse(packetWithSubtype, socketKey);
// Complete response from otherInstanceName, without subtype // Complete response from otherInstanceName, without subtype
client.processResponse(createResponse( client.processResponse(createResponse(
otherInstance, ipV4Address, 5353, SERVICE_TYPE_LABELS, otherInstance, ipV4Address, 5353, SERVICE_TYPE_LABELS,
Collections.emptyMap() /* textAttributes */, TEST_TTL), Collections.emptyMap() /* textAttributes */, TEST_TTL),
INTERFACE_INDEX, mockNetwork); socketKey);
// Address update from otherInstanceName // Address update from otherInstanceName
client.processResponse(createResponse( client.processResponse(createResponse(
otherInstance, ipV6Address, 5353, SERVICE_TYPE_LABELS, otherInstance, ipV6Address, 5353, SERVICE_TYPE_LABELS,
Collections.emptyMap(), TEST_TTL), INTERFACE_INDEX, mockNetwork); Collections.emptyMap(), TEST_TTL), socketKey);
// Goodbye from otherInstanceName // Goodbye from otherInstanceName
client.processResponse(createResponse( client.processResponse(createResponse(
otherInstance, ipV6Address, 5353, SERVICE_TYPE_LABELS, otherInstance, ipV6Address, 5353, SERVICE_TYPE_LABELS,
Collections.emptyMap(), 0L /* ttl */), INTERFACE_INDEX, mockNetwork); Collections.emptyMap(), 0L /* ttl */), socketKey);
// mockListenerOne gets notified for the requested instance // mockListenerOne gets notified for the requested instance
final ArgumentMatcher<MdnsServiceInfo> subtypeInstanceMatcher = info -> final ArgumentMatcher<MdnsServiceInfo> subtypeInstanceMatcher = info ->
@@ -1278,13 +1267,13 @@ public class MdnsServiceTypeClientTests {
client.processResponse(createResponse( client.processResponse(createResponse(
requestedInstance, ipV4Address, 5353, SERVICE_TYPE_LABELS, requestedInstance, ipV4Address, 5353, SERVICE_TYPE_LABELS,
Collections.emptyMap() /* textAttributes */, TEST_TTL), Collections.emptyMap() /* textAttributes */, TEST_TTL),
INTERFACE_INDEX, mockNetwork); socketKey);
// Complete response from otherInstanceName // Complete response from otherInstanceName
client.processResponse(createResponse( client.processResponse(createResponse(
otherInstance, ipV4Address, 5353, SERVICE_TYPE_LABELS, otherInstance, ipV4Address, 5353, SERVICE_TYPE_LABELS,
Collections.emptyMap() /* textAttributes */, TEST_TTL), Collections.emptyMap() /* textAttributes */, TEST_TTL),
INTERFACE_INDEX, mockNetwork); socketKey);
verify(expectedSendFutures[1], never()).cancel(true); verify(expectedSendFutures[1], never()).cancel(true);
client.notifySocketDestroyed(); client.notifySocketDestroyed();
@@ -1332,17 +1321,17 @@ public class MdnsServiceTypeClientTests {
currentThreadExecutor.getAndClearLastScheduledRunnable().run(); currentThreadExecutor.getAndClearLastScheduledRunnable().run();
if (expectsUnicastResponse) { if (expectsUnicastResponse) {
verify(mockSocketClient).sendPacketRequestingUnicastResponse( verify(mockSocketClient).sendPacketRequestingUnicastResponse(
expectedIPv4Packets[index], mockNetwork, false); expectedIPv4Packets[index], socketKey, false);
if (multipleSocketDiscovery) { if (multipleSocketDiscovery) {
verify(mockSocketClient).sendPacketRequestingUnicastResponse( verify(mockSocketClient).sendPacketRequestingUnicastResponse(
expectedIPv6Packets[index], mockNetwork, false); expectedIPv6Packets[index], socketKey, false);
} }
} else { } else {
verify(mockSocketClient).sendPacketRequestingMulticastResponse( verify(mockSocketClient).sendPacketRequestingMulticastResponse(
expectedIPv4Packets[index], mockNetwork, false); expectedIPv4Packets[index], socketKey, false);
if (multipleSocketDiscovery) { if (multipleSocketDiscovery) {
verify(mockSocketClient).sendPacketRequestingMulticastResponse( verify(mockSocketClient).sendPacketRequestingMulticastResponse(
expectedIPv6Packets[index], mockNetwork, false); expectedIPv6Packets[index], socketKey, false);
} }
} }
} }