Clear inetaddress fields when removing the record

When calling MdnsResponse.setInet4AddressRecord with null, the record
was removed from the records list, but not from the inet4AddressRecord /
inet6AddressRecord fields.

Fix that, and update the MdnsResponseDecoder test that missed the bug
because it modified the same incomplete MdnsResponse multiple times
(so isComplete keeps returning false), instead of using a copy of
a complete MdnsResponse.

This requires using a copy constructor, which will be useful for future
changes, so add it with a test.

Bug: 267570781
Test: atest
Change-Id: I199a8e4bc9a54a142c1fec1acee2ab6b1baa7efb
This commit is contained in:
Remi NGUYEN VAN
2023-03-02 17:46:42 +09:00
parent 016aad904d
commit af4ea5826b
3 changed files with 62 additions and 5 deletions

View File

@@ -16,6 +16,8 @@
package com.android.server.connectivity.mdns;
import static android.net.InetAddresses.parseNumericAddress;
import static com.android.server.connectivity.mdns.MdnsResponseDecoder.Clock;
import static com.android.testutils.DevSdkIgnoreRuleKt.SC_V2;
@@ -239,25 +241,29 @@ public class MdnsResponseDecoderTests {
@Test
public void testIsComplete() {
MdnsResponse response = responses.get(0);
MdnsResponse response = new MdnsResponse(responses.get(0));
assertTrue(response.isComplete());
response.clearPointerRecords();
assertFalse(response.isComplete());
response = responses.get(0);
response = new MdnsResponse(responses.get(0));
response.setInet4AddressRecord(null);
assertFalse(response.isComplete());
response = responses.get(0);
response.setInet6AddressRecord(new MdnsInetAddressRecord(new String[] { "testhostname" },
0L /* receiptTimeMillis */, false /* cacheFlush */, 1234L /* ttlMillis */,
parseNumericAddress("2008:db1::123")));
assertTrue(response.isComplete());
response.setInet6AddressRecord(null);
assertFalse(response.isComplete());
response = responses.get(0);
response = new MdnsResponse(responses.get(0));
response.setServiceRecord(null);
assertFalse(response.isComplete());
response = responses.get(0);
response = new MdnsResponse(responses.get(0));
response.setTextRecord(null);
assertFalse(response.isComplete());
}

View File

@@ -16,6 +16,8 @@
package com.android.server.connectivity.mdns;
import static android.net.InetAddresses.parseNumericAddress;
import static com.android.testutils.DevSdkIgnoreRuleKt.SC_V2;
import static org.junit.Assert.assertEquals;
@@ -26,6 +28,8 @@ import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.mock;
import static java.util.Collections.emptyList;
import android.net.Network;
import com.android.net.module.util.HexDump;
@@ -330,4 +334,35 @@ public class MdnsResponseTests {
// Merging should not indicate any change.
assertFalse(response.mergeRecordsFrom(response2));
}
@Test
public void copyConstructor() {
final MdnsResponse response = new MdnsResponse(/* now= */ 0, INTERFACE_INDEX, mNetwork);
final String[] hostname = new String[] { "MyHostname" };
final String[] serviceName = new String[] { "MyService", "_type", "_tcp", "local" };
final String[] serviceType = new String[] { "_type", "_tcp", "local" };
response.addPointerRecord(new MdnsPointerRecord(serviceType, 0L /* receiptTimeMillis */,
false /* cacheFlush */, 1234L /* ttlMillis */, serviceName));
response.setServiceRecord(new MdnsServiceRecord(serviceName, 0L /* receiptTimeMillis */,
true /* cacheFlush */, 1234L /* ttlMillis */, 0 /* servicePriority */,
0 /* serviceWeight */, 0 /* servicePort */, hostname));
response.setTextRecord(new MdnsTextRecord(serviceName, 0L /* receiptTimeMillis */,
true /* cacheFlush */, 1234L /* ttlMillis */, emptyList() /* entries */));
response.setInet4AddressRecord(new MdnsInetAddressRecord(
hostname, 0L /* receiptTimeMillis */, true /* cacheFlush */,
1234L /* ttlMillis */, parseNumericAddress("192.0.2.123")));
response.setInet6AddressRecord(new MdnsInetAddressRecord(
hostname, 0L /* receiptTimeMillis */, true /* cacheFlush */,
1234L /* ttlMillis */, parseNumericAddress("2001:db8::123")));
final MdnsResponse copy = new MdnsResponse(response);
assertEquals(response.getInet6AddressRecord(), copy.getInet6AddressRecord());
assertEquals(response.getInet4AddressRecord(), copy.getInet4AddressRecord());
assertEquals(response.getPointerRecords(), copy.getPointerRecords());
assertEquals(response.getServiceRecord(), copy.getServiceRecord());
assertEquals(response.getTextRecord(), copy.getTextRecord());
assertEquals(response.getRecords(), copy.getRecords());
assertEquals(response.getNetwork(), copy.getNetwork());
assertEquals(response.getInterfaceIndex(), copy.getInterfaceIndex());
}
}