Merge "Send packets on the specific socket"
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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,
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user