Add unit test for query TXT records. (#8923)

Motivation:

We did not have any unit tests that queries for TXT records.

Modifications:

Add unit test to query TXT records.

Result:

More test-coverage.
This commit is contained in:
Norman Maurer 2019-03-09 21:41:28 +01:00
parent a258cd6f42
commit 7b5f4e0227

View File

@ -38,6 +38,7 @@ import io.netty.handler.codec.dns.DnsResponseCode;
import io.netty.handler.codec.dns.DnsSection;
import io.netty.resolver.HostsFileEntriesResolver;
import io.netty.resolver.ResolvedAddressTypes;
import io.netty.util.CharsetUtil;
import io.netty.util.NetUtil;
import io.netty.util.ReferenceCountUtil;
import io.netty.util.concurrent.Future;
@ -2432,4 +2433,75 @@ public class DnsNameResolverTest {
true // decodeIdn
).close();
}
@Test
public void testQueryTxt() throws Exception {
final String hostname = "txt.netty.io";
final String txt1 = "some text";
final String txt2 = "some more text";
TestDnsServer server = new TestDnsServer(new RecordStore() {
@Override
public Set<ResourceRecord> getRecords(QuestionRecord question) {
if (question.getDomainName().equals(hostname)) {
Map<String, Object> map1 = new HashMap<String, Object>();
map1.put(DnsAttribute.CHARACTER_STRING.toLowerCase(), txt1);
Map<String, Object> map2 = new HashMap<String, Object>();
map2.put(DnsAttribute.CHARACTER_STRING.toLowerCase(), txt2);
Set<ResourceRecord> records = new HashSet<ResourceRecord>();
records.add(new TestDnsServer.TestResourceRecord(question.getDomainName(), RecordType.TXT, map1));
records.add(new TestDnsServer.TestResourceRecord(question.getDomainName(), RecordType.TXT, map2));
return records;
}
return Collections.emptySet();
}
});
server.start();
DnsNameResolver resolver = newResolver(ResolvedAddressTypes.IPV4_ONLY)
.nameServerProvider(new SingletonDnsServerAddressStreamProvider(server.localAddress()))
.build();
try {
AddressedEnvelope<DnsResponse, InetSocketAddress> envelope = resolver.query(
new DefaultDnsQuestion(hostname, DnsRecordType.TXT)).syncUninterruptibly().getNow();
assertNotNull(envelope.sender());
DnsResponse response = envelope.content();
assertNotNull(response);
assertEquals(DnsResponseCode.NOERROR, response.code());
int count = response.count(DnsSection.ANSWER);
assertEquals(2, count);
List<String> txts = new ArrayList<String>();
for (int i = 0; i < 2; i++) {
txts.addAll(decodeTxt(response.recordAt(DnsSection.ANSWER, i)));
}
assertTrue(txts.contains(txt1));
assertTrue(txts.contains(txt2));
envelope.release();
} finally {
resolver.close();
server.stop();
}
}
private static List<String> decodeTxt(DnsRecord record) {
if (!(record instanceof DnsRawRecord)) {
return Collections.emptyList();
}
List<String> list = new ArrayList<String>();
ByteBuf data = ((DnsRawRecord) record).content();
int idx = data.readerIndex();
int wIdx = data.writerIndex();
while (idx < wIdx) {
int len = data.getUnsignedByte(idx++);
list.add(data.toString(idx, len, CharsetUtil.UTF_8));
idx += len;
}
return list;
}
}