Skip to content

Commit ad953c4

Browse files
committed
Lookup a name as absolute after all search path are exhausted
Closes dnsjava#118
1 parent c85392a commit ad953c4

2 files changed

Lines changed: 92 additions & 0 deletions

File tree

src/main/java/org/xbill/DNS/Lookup.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,8 @@ public Record[] run() {
610610
break;
611611
}
612612
}
613+
614+
resolve(name, Name.root);
613615
}
614616
if (!done) {
615617
if (badresponse) {
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
// SPDX-License-Identifier: BSD-2-Clause
2+
package org.xbill.DNS;
3+
4+
import static org.junit.jupiter.api.Assertions.assertEquals;
5+
import static org.mockito.ArgumentMatchers.any;
6+
import static org.mockito.Mockito.times;
7+
import static org.mockito.Mockito.verify;
8+
import static org.mockito.Mockito.when;
9+
import static org.xbill.DNS.ResolverConfig.CONFIGPROVIDER_SKIP_INIT;
10+
11+
import java.io.IOException;
12+
import java.net.InetAddress;
13+
import org.junit.jupiter.api.Test;
14+
import org.mockito.Mockito;
15+
import org.mockito.stubbing.Answer;
16+
17+
public class LookupTest {
18+
@Test
19+
void testNdots1() throws IOException {
20+
try {
21+
System.setProperty(CONFIGPROVIDER_SKIP_INIT, "true");
22+
Resolver mockResolver = Mockito.mock(Resolver.class);
23+
Name queryName = Name.fromConstantString("example.com");
24+
when(mockResolver.send(any(Message.class)))
25+
.thenAnswer(
26+
(Answer<Message>)
27+
invocation -> {
28+
Message query = invocation.getArgument(0);
29+
Message answer = new Message(query.getHeader().getID());
30+
answer.addRecord(query.getQuestion(), Section.QUESTION);
31+
answer.addRecord(
32+
new ARecord(
33+
query.getQuestion().getName(),
34+
DClass.IN,
35+
60,
36+
InetAddress.getByName("127.0.0.1")),
37+
Section.ANSWER);
38+
return answer;
39+
});
40+
Lookup l = new Lookup(queryName, Type.A);
41+
l.setCache(null);
42+
l.setResolver(mockResolver);
43+
l.setSearchPath("namespace.svc.cluster.local", "svc.cluster.local", "cluster.local");
44+
Record[] results = l.run();
45+
verify(mockResolver, times(1)).send(any(Message.class));
46+
assertEquals(1, results.length);
47+
} finally {
48+
System.clearProperty(CONFIGPROVIDER_SKIP_INIT);
49+
}
50+
}
51+
52+
@Test
53+
void testNdotsFallbackToAbsolute() throws IOException {
54+
try {
55+
System.setProperty(CONFIGPROVIDER_SKIP_INIT, "true");
56+
Resolver mockResolver = Mockito.mock(Resolver.class);
57+
Name queryName = Name.fromConstantString("example.com");
58+
when(mockResolver.send(any(Message.class)))
59+
.thenAnswer(
60+
(Answer<Message>)
61+
invocation -> {
62+
Message query = invocation.getArgument(0);
63+
Message answer = new Message(query.getHeader().getID());
64+
answer.addRecord(query.getQuestion(), Section.QUESTION);
65+
if (query.getQuestion().getName().labels() == 3) {
66+
answer.addRecord(
67+
new ARecord(
68+
query.getQuestion().getName(),
69+
DClass.IN,
70+
60,
71+
InetAddress.getByName("127.0.0.1")),
72+
Section.ANSWER);
73+
} else {
74+
answer.getHeader().setRcode(Rcode.NXDOMAIN);
75+
}
76+
return answer;
77+
});
78+
Lookup l = new Lookup(queryName, Type.A);
79+
l.setCache(null);
80+
l.setResolver(mockResolver);
81+
l.setNdots(5);
82+
l.setSearchPath("namespace.svc.cluster.local", "svc.cluster.local", "cluster.local");
83+
Record[] results = l.run();
84+
verify(mockResolver, times(4)).send(any(Message.class));
85+
assertEquals(1, results.length);
86+
} finally {
87+
System.clearProperty(CONFIGPROVIDER_SKIP_INIT);
88+
}
89+
}
90+
}

0 commit comments

Comments
 (0)