Merge "[Feature sync] Propagate network interface index to MdnsServiceInfo"

This commit is contained in:
Paul Hu
2022-10-26 01:17:10 +00:00
committed by Gerrit Code Review
12 changed files with 255 additions and 24 deletions

View File

@@ -106,9 +106,9 @@ public class MdnsResponseDecoderTests {
+ "63616C0000018001000000780004C0A8010A000001800100000078"
+ "0004C0A8010A00000000000000");
private static final String DUMMY_CAST_SERVICE_NAME = "_googlecast";
private static final String[] DUMMY_CAST_SERVICE_TYPE =
new String[] {DUMMY_CAST_SERVICE_NAME, "_tcp", "local"};
private static final String CAST_SERVICE_NAME = "_googlecast";
private static final String[] CAST_SERVICE_TYPE =
new String[] {CAST_SERVICE_NAME, "_tcp", "local"};
private final List<MdnsResponse> responses = new LinkedList<>();
@@ -116,13 +116,13 @@ public class MdnsResponseDecoderTests {
@Before
public void setUp() {
MdnsResponseDecoder decoder = new MdnsResponseDecoder(mClock, DUMMY_CAST_SERVICE_TYPE);
MdnsResponseDecoder decoder = new MdnsResponseDecoder(mClock, CAST_SERVICE_TYPE);
assertNotNull(data);
DatagramPacket packet = new DatagramPacket(data, data.length);
packet.setSocketAddress(
new InetSocketAddress(MdnsConstants.getMdnsIPv4Address(), MdnsConstants.MDNS_PORT));
responses.clear();
int errorCode = decoder.decode(packet, responses);
int errorCode = decoder.decode(packet, responses, MdnsSocket.INTERFACE_INDEX_UNSPECIFIED);
assertEquals(MdnsResponseDecoder.SUCCESS, errorCode);
assertEquals(1, responses.size());
}
@@ -135,7 +135,7 @@ public class MdnsResponseDecoderTests {
packet.setSocketAddress(
new InetSocketAddress(MdnsConstants.getMdnsIPv4Address(), MdnsConstants.MDNS_PORT));
responses.clear();
int errorCode = decoder.decode(packet, responses);
int errorCode = decoder.decode(packet, responses, MdnsSocket.INTERFACE_INDEX_UNSPECIFIED);
assertEquals(MdnsResponseDecoder.SUCCESS, errorCode);
assertEquals(2, responses.size());
}
@@ -153,7 +153,7 @@ public class MdnsResponseDecoderTests {
MdnsServiceRecord serviceRecord = response.getServiceRecord();
String serviceName = serviceRecord.getServiceName();
assertEquals(DUMMY_CAST_SERVICE_NAME, serviceName);
assertEquals(CAST_SERVICE_NAME, serviceName);
String serviceInstanceName = serviceRecord.getServiceInstanceName();
assertEquals("Johnny's Chromecast", serviceInstanceName);
@@ -187,14 +187,14 @@ public class MdnsResponseDecoderTests {
@Test
public void testDecodeIPv6AnswerPacket() throws IOException {
MdnsResponseDecoder decoder = new MdnsResponseDecoder(mClock, DUMMY_CAST_SERVICE_TYPE);
MdnsResponseDecoder decoder = new MdnsResponseDecoder(mClock, CAST_SERVICE_TYPE);
assertNotNull(data6);
DatagramPacket packet = new DatagramPacket(data6, data6.length);
packet.setSocketAddress(
new InetSocketAddress(MdnsConstants.getMdnsIPv6Address(), MdnsConstants.MDNS_PORT));
responses.clear();
int errorCode = decoder.decode(packet, responses);
int errorCode = decoder.decode(packet, responses, MdnsSocket.INTERFACE_INDEX_UNSPECIFIED);
assertEquals(MdnsResponseDecoder.SUCCESS, errorCode);
MdnsResponse response = responses.get(0);
@@ -234,4 +234,19 @@ public class MdnsResponseDecoderTests {
response.setTextRecord(null);
assertFalse(response.isComplete());
}
@Test
public void decode_withInterfaceIndex_populatesInterfaceIndex() {
MdnsResponseDecoder decoder = new MdnsResponseDecoder(mClock, CAST_SERVICE_TYPE);
assertNotNull(data6);
DatagramPacket packet = new DatagramPacket(data6, data6.length);
packet.setSocketAddress(
new InetSocketAddress(MdnsConstants.getMdnsIPv6Address(), MdnsConstants.MDNS_PORT));
responses.clear();
int errorCode = decoder.decode(packet, responses, /* interfaceIndex= */ 10);
assertEquals(errorCode, MdnsResponseDecoder.SUCCESS);
assertEquals(responses.size(), 1);
assertEquals(responses.get(0).getInterfaceIndex(), 10);
}
}

View File

@@ -221,6 +221,19 @@ public class MdnsResponseTests {
assertEquals(response.getTextRecord(), record);
}
@Test
public void getInterfaceIndex_returnsDefaultValue() {
MdnsResponse response = new MdnsResponse(/* now= */ 0);
assertEquals(response.getInterfaceIndex(), -1);
}
@Test
public void getInterfaceIndex_afterSet_returnsValue() {
MdnsResponse response = new MdnsResponse(/* now= */ 0);
response.setInterfaceIndex(5);
assertEquals(response.getInterfaceIndex(), 5);
}
@Test
public void mergeRecordsFrom_indicates_change_on_ipv4_address() throws IOException {
MdnsResponse response = makeMdnsResponse(

View File

@@ -115,6 +115,40 @@ public class MdnsServiceInfoTest {
info.getAttributes());
}
@Test
public void getInterfaceIndex_constructorWithDefaultValues_returnsMinusOne() {
MdnsServiceInfo info =
new MdnsServiceInfo(
"my-mdns-service",
new String[] {"_googlecast", "_tcp"},
List.of(),
new String[] {"my-host", "local"},
12345,
"192.168.1.1",
"2001::1",
List.of());
assertEquals(info.getInterfaceIndex(), -1);
}
@Test
public void getInterfaceIndex_constructorWithInterfaceIndex_returnsProvidedIndex() {
MdnsServiceInfo info =
new MdnsServiceInfo(
"my-mdns-service",
new String[] {"_googlecast", "_tcp"},
List.of(),
new String[] {"my-host", "local"},
12345,
"192.168.1.1",
"2001::1",
List.of(),
/* textEntries= */ null,
/* interfaceIndex= */ 20);
assertEquals(info.getInterfaceIndex(), 20);
}
@Test
public void parcelable_canBeParceledAndUnparceled() {
Parcel parcel = Parcel.obtain();

View File

@@ -401,7 +401,8 @@ public class MdnsServiceTypeClientTests {
ipV4Address,
5353,
Collections.singletonList("ABCDE"),
Collections.emptyMap());
Collections.emptyMap(),
/* interfaceIndex= */ 20);
client.processResponse(initialResponse);
// Process a second response with a different port and updated text attributes.
@@ -411,7 +412,8 @@ public class MdnsServiceTypeClientTests {
ipV4Address,
5354,
Collections.singletonList("ABCDE"),
Collections.singletonMap("key", "value"));
Collections.singletonMap("key", "value"),
/* interfaceIndex= */ 20);
client.processResponse(secondResponse);
// Verify onServiceFound was called once for the initial response.
@@ -422,6 +424,7 @@ public class MdnsServiceTypeClientTests {
assertEquals(initialServiceInfo.getPort(), 5353);
assertEquals(initialServiceInfo.getSubtypes(), Collections.singletonList("ABCDE"));
assertNull(initialServiceInfo.getAttributeByKey("key"));
assertEquals(initialServiceInfo.getInterfaceIndex(), 20);
// Verify onServiceUpdated was called once for the second response.
verify(mockListenerOne).onServiceUpdated(serviceInfoCaptor.capture());
@@ -432,6 +435,7 @@ public class MdnsServiceTypeClientTests {
assertTrue(updatedServiceInfo.hasSubtypes());
assertEquals(updatedServiceInfo.getSubtypes(), Collections.singletonList("ABCDE"));
assertEquals(updatedServiceInfo.getAttributeByKey("key"), "value");
assertEquals(updatedServiceInfo.getInterfaceIndex(), 20);
}
@Test
@@ -446,7 +450,8 @@ public class MdnsServiceTypeClientTests {
ipV6Address,
5353,
Collections.singletonList("ABCDE"),
Collections.emptyMap());
Collections.emptyMap(),
/* interfaceIndex= */ 20);
client.processResponse(initialResponse);
// Process a second response with a different port and updated text attributes.
@@ -456,7 +461,8 @@ public class MdnsServiceTypeClientTests {
ipV6Address,
5354,
Collections.singletonList("ABCDE"),
Collections.singletonMap("key", "value"));
Collections.singletonMap("key", "value"),
/* interfaceIndex= */ 20);
client.processResponse(secondResponse);
System.out.println("secondResponses ip"
@@ -470,6 +476,7 @@ public class MdnsServiceTypeClientTests {
assertEquals(initialServiceInfo.getPort(), 5353);
assertEquals(initialServiceInfo.getSubtypes(), Collections.singletonList("ABCDE"));
assertNull(initialServiceInfo.getAttributeByKey("key"));
assertEquals(initialServiceInfo.getInterfaceIndex(), 20);
// Verify onServiceUpdated was called once for the second response.
verify(mockListenerOne).onServiceUpdated(serviceInfoCaptor.capture());
@@ -480,6 +487,7 @@ public class MdnsServiceTypeClientTests {
assertTrue(updatedServiceInfo.hasSubtypes());
assertEquals(updatedServiceInfo.getSubtypes(), Collections.singletonList("ABCDE"));
assertEquals(updatedServiceInfo.getAttributeByKey("key"), "value");
assertEquals(updatedServiceInfo.getInterfaceIndex(), 20);
}
@Test
@@ -727,7 +735,6 @@ public class MdnsServiceTypeClientTests {
}
}
// Creates a complete mDNS response.
private MdnsResponse createResponse(
@NonNull String serviceInstanceName,
@NonNull String host,
@@ -735,6 +742,19 @@ public class MdnsServiceTypeClientTests {
@NonNull List<String> subtypes,
@NonNull Map<String, String> textAttributes)
throws Exception {
return createResponse(serviceInstanceName, host, port, subtypes, textAttributes,
/* interfaceIndex= */ -1);
}
// Creates a complete mDNS response.
private MdnsResponse createResponse(
@NonNull String serviceInstanceName,
@NonNull String host,
int port,
@NonNull List<String> subtypes,
@NonNull Map<String, String> textAttributes,
int interfaceIndex)
throws Exception {
String[] hostName = new String[]{"hostname"};
MdnsServiceRecord serviceRecord = mock(MdnsServiceRecord.class);
when(serviceRecord.getServiceHost()).thenReturn(hostName);
@@ -747,10 +767,12 @@ public class MdnsServiceTypeClientTests {
when(inetAddressRecord.getInet6Address())
.thenReturn((Inet6Address) Inet6Address.getByName(host));
response.setInet6AddressRecord(inetAddressRecord);
response.setInterfaceIndex(interfaceIndex);
} else {
when(inetAddressRecord.getInet4Address())
.thenReturn((Inet4Address) Inet4Address.getByName(host));
response.setInet4AddressRecord(inetAddressRecord);
response.setInterfaceIndex(interfaceIndex);
}
MdnsTextRecord textRecord = mock(MdnsTextRecord.class);

View File

@@ -18,6 +18,7 @@ package com.android.server.connectivity.mdns;
import static com.android.testutils.DevSdkIgnoreRuleKt.SC_V2;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
@@ -25,6 +26,7 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -45,6 +47,7 @@ import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.ArgumentMatchers;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@@ -490,4 +493,58 @@ public class MdnsSocketClientTests {
assertFalse(mdnsClient.receivedUnicastResponse);
assertFalse(mdnsClient.cannotReceiveMulticastResponse.get());
}
@Test
public void startDiscovery_andPropagateInterfaceIndex_includesInterfaceIndex()
throws Exception {
//MdnsConfigsFlagsImpl.allowNetworkInterfaceIndexPropagation.override(true);
when(mockMulticastSocket.getInterfaceIndex()).thenReturn(21);
mdnsClient =
new MdnsSocketClient(mContext, mockMulticastLock) {
@Override
MdnsSocket createMdnsSocket(int port) {
if (port == MdnsConstants.MDNS_PORT) {
return mockMulticastSocket;
}
return mockUnicastSocket;
}
};
mdnsClient.setCallback(mockCallback);
mdnsClient.startDiscovery();
ArgumentCaptor<MdnsResponse> mdnsResponseCaptor =
ArgumentCaptor.forClass(MdnsResponse.class);
verify(mockCallback, timeout(TIMEOUT).atLeast(1))
.onResponseReceived(mdnsResponseCaptor.capture());
assertEquals(21, mdnsResponseCaptor.getValue().getInterfaceIndex());
}
@Test
@Ignore("MdnsConfigs is not configurable currently.")
public void startDiscovery_andDoNotPropagateInterfaceIndex_doesNotIncludeInterfaceIndex()
throws Exception {
//MdnsConfigsFlagsImpl.allowNetworkInterfaceIndexPropagation.override(false);
when(mockMulticastSocket.getInterfaceIndex()).thenReturn(21);
mdnsClient =
new MdnsSocketClient(mContext, mockMulticastLock) {
@Override
MdnsSocket createMdnsSocket(int port) {
if (port == MdnsConstants.MDNS_PORT) {
return mockMulticastSocket;
}
return mockUnicastSocket;
}
};
mdnsClient.setCallback(mockCallback);
mdnsClient.startDiscovery();
ArgumentCaptor<MdnsResponse> mdnsResponseCaptor =
ArgumentCaptor.forClass(MdnsResponse.class);
verify(mockMulticastSocket, never()).getInterfaceIndex();
verify(mockCallback, timeout(TIMEOUT).atLeast(1))
.onResponseReceived(mdnsResponseCaptor.capture());
assertEquals(-1, mdnsResponseCaptor.getValue().getInterfaceIndex());
}
}