diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 577f37086..f78494301 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -1,3 +1,6 @@ +### 3.1.1-beta +* Fixing reponse warning `;; Warning: query response not set` + ### 3.1.0-beta * TCP Protocol support diff --git a/build.gradle b/build.gradle index 9a50898bf..a22f3b6d0 100644 --- a/build.gradle +++ b/build.gradle @@ -24,6 +24,7 @@ configurations.all { force 'net.java.dev.jna:jna:5.13.0' } } + dependencies { compileOnly group: 'org.projectlombok', name: 'lombok', version: '1.18.+' @@ -59,6 +60,10 @@ dependencies { test { systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" + useJUnitPlatform() + testLogging { + events "passed", "skipped", "failed" + } } compileJava { diff --git a/gradle.properties b/gradle.properties index a85f78fd9..2f6a67cf9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -version=3.1.0-beta +version=3.1.1-beta quarkusPluginId=io.quarkus quarkusPluginVersion=2.16.0.Final quarkusPlatformGroupId=io.quarkus.platform diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/Hostname.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/Hostname.java index b23d25511..2a12380d6 100644 --- a/src/main/java/com/mageddo/dnsproxyserver/server/dns/Hostname.java +++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/Hostname.java @@ -5,13 +5,13 @@ import java.util.Objects; -@EqualsAndHashCode(of = "name") +@EqualsAndHashCode(of = "value") public class Hostname { - private final String name; + private final String value; - public Hostname(String name) { - this.name = StringUtils.lowerCase(name); + public Hostname(String value) { + this.value = StringUtils.lowerCase(value); } public boolean isEqualTo(String cname) { @@ -19,16 +19,16 @@ public boolean isEqualTo(String cname) { } public boolean isEqualTo(Hostname hostname) { - return Objects.equals(this.name, hostname.name); + return Objects.equals(this.value, hostname.value); } - public String getName() { - return this.name; + public String getValue() { + return this.value; } @Override public String toString() { - return this.name; + return this.value; } public static Hostname of(String hostname){ diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/Messages.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/Messages.java index d9d5a0433..871c78f59 100644 --- a/src/main/java/com/mageddo/dnsproxyserver/server/dns/Messages.java +++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/Messages.java @@ -6,6 +6,7 @@ import org.xbill.DNS.ARecord; import org.xbill.DNS.CNAMERecord; import org.xbill.DNS.DClass; +import org.xbill.DNS.Flags; import org.xbill.DNS.Message; import org.xbill.DNS.Name; import org.xbill.DNS.Rcode; @@ -25,7 +26,7 @@ public static String simplePrint(Message message) { if (answer == null) { return Optional .ofNullable(findQuestionHostname(message)) - .map(Hostname::getName) + .map(Hostname::getValue) .orElse("N/A"); } return String.format("%s", simplePrint(answer)); @@ -62,15 +63,16 @@ public static Hostname findQuestionHostname(Message m) { return Hostname.of(hostname); } - public static Message aAnswer(Message msg, String ip) { - return aAnswer(msg, ip, 30L); + public static Message aAnswer(Message query, String ip) { + return aAnswer(query, ip, 30L); } - public static Message aAnswer(Message msg, String ip, final long ttl) { - msg.getHeader().setRcode(Rcode.NOERROR); - final var answer = new ARecord(msg.getQuestion().getName(), DClass.IN, ttl, Ips.toAddress(ip)); - msg.addRecord(answer, Section.ANSWER); - return msg; + public static Message aAnswer(Message query, String ip, final long ttl) { + final var res = withNoErrorResponse(query.clone()); + final var answer = new ARecord(res.getQuestion().getName(), DClass.IN, ttl, Ips.toAddress(ip)); + res.addRecord(answer, Section.ANSWER); + + return res; } public static String findFirstAnswerRecordStr(Message msg) { @@ -99,28 +101,16 @@ public static Message nxDomain(Message msg) { return msg; } - public static Message answer(Message msg, Config.Entry entry) { - if (entry.getType() == Config.Entry.Type.A) { - return aAnswer(msg, entry.getIp(), entry.getTtl()); - } - return cnameAnswer(msg, entry); - } - - public static Message cnameAnswer(Message msg, Config.Entry entry) { - return cnameAnswer(msg, entry.getTtl(), entry.getTarget()); - } - @SneakyThrows - public static Message cnameAnswer(Message msg, Integer ttl, String hostname) { - final var newMsg = new Message(msg.toWire()); - newMsg.getHeader().setRcode(Rcode.NOERROR); + public static Message cnameResponse(Message query, Integer ttl, String hostname) { + final var res = withNoErrorResponse(query.clone()); final var answer = new CNAMERecord( - newMsg.getQuestion().getName(), + res.getQuestion().getName(), DClass.IN, ttl, Name.fromString(Hostnames.toAbsoluteName(hostname)) ); - newMsg.addRecord(answer, Section.ANSWER); - return newMsg; + res.addRecord(answer, Section.ANSWER); + return res; } @SneakyThrows @@ -141,6 +131,10 @@ public static Config.Entry.Type findQuestionType(Message msg) { return Config.Entry.Type.of(findQuestionTypeCode(msg)); } + /** + * Add records from source to target for all sections + * @return a clone with the combination. + */ public static Message combine(Message source, Message target) { final var clone = clone(target); for (int i = 1; i < 4; i++) { @@ -153,7 +147,7 @@ public static Message combine(Message source, Message target) { } @SneakyThrows - public static Message copyQuestionWithNewName(Message msg, String hostname) { + public static Message copyQuestionForNowHostname(Message msg, String hostname) { final var newMsg = Message.newQuery(msg .getQuestion() .withName(Name.fromString(hostname)) @@ -173,14 +167,28 @@ public static Duration findTTL(Message m) { return Duration.ofSeconds(answer.getTTL()); } - public static Message copyAnswers(Message req, Message res) { - return combine(res, req); + /** + * Set the id of the query into the response, se the response will match if the query; + */ + public static Message matchId(Message req, Message res) { + final var reqId = req.getHeader().getID(); + res.getHeader().setID(reqId); + return res; } - static Message clone(Message req) { - if (req == null) { + static Message clone(Message msg) { + if (msg == null) { return null; } - return req.clone(); + return msg.clone(); + } + + static Message withNoErrorResponse(Message res) { + final var header = res.getHeader(); + header.setFlag(Flags.QR); + header.setRcode(Rcode.NOERROR); + return res; } + + } diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/TCPServer.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/TCPServer.java index ba595ce39..b2981eedb 100644 --- a/src/main/java/com/mageddo/dnsproxyserver/server/dns/TCPServer.java +++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/TCPServer.java @@ -52,7 +52,7 @@ void watchDog() { try { final var itr = this.clients.iterator(); if (this.clients.isEmpty()) { - log.debug("status=no-clients"); + log.trace("status=no-clients"); return; } final var clientsBefore = this.clients.size(); diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/Wildcards.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/Wildcards.java index e1f1d1441..a46b683e9 100644 --- a/src/main/java/com/mageddo/dnsproxyserver/server/dns/Wildcards.java +++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/Wildcards.java @@ -6,7 +6,7 @@ public class Wildcards { public static List buildHostAndWildcards(Hostname hostname) { - final var query = "." + hostname.getName(); + final var query = "." + hostname.getValue(); final var hostnames = new ArrayList(); hostnames.add(Hostname.of(query.substring(1))); diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/Solver.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/Solver.java index 60686784e..6666c48ec 100644 --- a/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/Solver.java +++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/Solver.java @@ -4,7 +4,8 @@ import org.xbill.DNS.Message; public interface Solver { - Message handle(Message reqMsg); + + Message handle(Message query); default String name() { return ClassUtils.getSimpleName(getClass()); diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/SolverDelegate.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/SolverDelegate.java index be0f29e8a..438a2670a 100644 --- a/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/SolverDelegate.java +++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/SolverDelegate.java @@ -10,6 +10,9 @@ import javax.inject.Inject; import javax.inject.Singleton; +/** + * When {@link SolverLocalDB} finds a wildcard hostname, delegate the found hostname to this class. + */ @Slf4j @Singleton @AllArgsConstructor(onConstructor = @__({@Inject})) @@ -17,19 +20,24 @@ public class SolverDelegate { private final SolverProvider solverProvider; - public Message solve(Message reqMsg, Config.Entry entry){ + public Message solve(Message query, Config.Entry entry){ log.debug("status=solvingCnameIp, source={}, target={}", entry.getHostname(), entry.getTarget()); - final var cnameAnswer = Messages.cnameAnswer(reqMsg, entry); - final var question = Messages.copyQuestionWithNewName(reqMsg, Hostnames.toAbsoluteName(entry.getTarget())); + final var cnameAnswer = cnameAnswer(query, entry); + final var question = Messages.copyQuestionForNowHostname(query, Hostnames.toAbsoluteName(entry.getTarget())); for (final var solver : this.solverProvider.getSolversExcludingLocalDB()) { - final var aRes = solver.handle(question); - if (aRes != null) { - log.debug("status=cnameARecordSolved, host={}, r={}", entry.getHostname(), Messages.simplePrint(aRes)); - return Messages.combine(aRes, cnameAnswer); + final var res = solver.handle(question); + if (res != null) { + log.debug("status=cnameARecordSolved, host={}, r={}", entry.getHostname(), Messages.simplePrint(res)); + return Messages.combine(res, cnameAnswer); } } + // answer only the cname, without the matching IP when a IP is not found return cnameAnswer; } + + static Message cnameAnswer(Message query, Config.Entry entry) { + return Messages.cnameResponse(query, entry.getTtl(), entry.getTarget()); + } } diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/SolverDocker.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/SolverDocker.java index e96b42958..b5754ed1f 100644 --- a/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/SolverDocker.java +++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/SolverDocker.java @@ -20,20 +20,20 @@ public class SolverDocker implements Solver { private final DockerDAO dockerDAO; @Override - public Message handle(Message reqMsg) { + public Message handle(Message query) { if (!this.dockerDAO.isConnected()) { log.trace("status=dockerDisconnected"); return null; } - final var askedHost = Messages.findQuestionHostname(reqMsg); + final var askedHost = Messages.findQuestionHostname(query); for (final var host : Wildcards.buildHostAndWildcards(askedHost)) { final var ip = this.dockerService.findBestHostIP(host); if (ip == null) { return null; } - return Messages.aAnswer(reqMsg, ip); + return Messages.aAnswer(query, ip); } return null; diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/SolverLocalDB.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/SolverLocalDB.java index 27cd24d11..ad4ef31b8 100644 --- a/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/SolverLocalDB.java +++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/SolverLocalDB.java @@ -21,20 +21,20 @@ public class SolverLocalDB implements Solver { private final SolverDelegate solverDelegate; @Override - public Message handle(Message reqMsg) { + public Message handle(Message query) { final var stopWatch = StopWatch.createStarted(); - final var type = Messages.findQuestionTypeCode(reqMsg); + final var type = Messages.findQuestionTypeCode(query); if (Entry.Type.isNot(type, Entry.Type.A, Entry.Type.CNAME)) { log.trace("status=typeNotSupported, action=continue, type={}, time={}", type, stopWatch.getTime()); return null; } - final var askedHost = Messages.findQuestionHostname(reqMsg); + final var askedHost = Messages.findQuestionHostname(query); for (final var host : Wildcards.buildHostAndWildcards(askedHost)) { stopWatch.split(); - final var entry = this.configDAO.findEntryForActiveEnv(host.getName()); + final var entry = this.configDAO.findEntryForActiveEnv(host.getValue()); if (entry == null) { log.trace( "status=partialNotFound, askedHost={}, time={}", @@ -48,9 +48,9 @@ public Message handle(Message reqMsg) { ); if (entry.getType() == Entry.Type.A) { - return Messages.aAnswer(reqMsg, entry.getIp(), entry.getTtl()); + return Messages.aAnswer(query, entry.getIp(), entry.getTtl()); } - return this.solverDelegate.solve(reqMsg, entry); + return this.solverDelegate.solve(query, entry); } log.trace("status=notFound, askedHost={}, totalTime={}", askedHost, stopWatch.getTime()); diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/SolverMock.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/SolverMock.java new file mode 100644 index 000000000..03dc87607 --- /dev/null +++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/SolverMock.java @@ -0,0 +1,35 @@ +package com.mageddo.dnsproxyserver.server.dns.solver; + +import com.mageddo.dnsproxyserver.server.dns.IP; +import com.mageddo.dnsproxyserver.server.dns.Messages; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.tuple.Pair; +import org.xbill.DNS.Message; + +import java.util.List; +import java.util.stream.Stream; + +@Slf4j +public class SolverMock implements Solver { + + private final List> mocks; + + public SolverMock(Pair... mocks) { + this(Stream.of(mocks).toList()); + } + + public SolverMock(List> mocks) { + this.mocks = mocks; + } + + @Override + public Message handle(Message query) { + final var hostname = Messages.findQuestionHostname(query); + for (final var entry : this.mocks) { + if (entry.getKey().equalsIgnoreCase(hostname.getValue())) { + return Messages.aAnswer(query, entry.getValue().raw()); + } + } + return null; + } +} diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/SolverRemote.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/SolverRemote.java index 51e5930b7..22e4ede33 100644 --- a/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/SolverRemote.java +++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/SolverRemote.java @@ -21,27 +21,27 @@ public class SolverRemote implements Solver { private final RemoteResolvers delegate; @Override - public Message handle(Message req) { + public Message handle(Message query) { Message lastErrorMsg = null; for (int i = 0; i < this.delegate.resolvers().size(); i++) { final Resolver resolver = this.delegate.resolvers().get(i); try { - final var res = resolver.send(req); + final var res = resolver.send(query); if (res.getRcode() == Rcode.NOERROR) { - log.trace("status=found, i={}, req={}, res={}, server={}", i, simplePrint(req), simplePrint(res), resolver); + log.trace("status=found, i={}, req={}, res={}, server={}", i, simplePrint(query), simplePrint(res), resolver); return res; } else { lastErrorMsg = res; - log.trace("status=notFound, i={}, req={}, res={}, server={}", i, simplePrint(req), simplePrint(res), resolver); + log.trace("status=notFound, i={}, req={}, res={}, server={}", i, simplePrint(query), simplePrint(res), resolver); } } catch (IOException e) { if (e.getMessage().contains("Timed out while trying")) { - log.info("status=timedOut, req={}, msg={}", simplePrint(req), e.getMessage()); + log.info("status=timedOut, req={}, msg={}", simplePrint(query), e.getMessage()); continue; } log.warn( "status=failed, i={}, req={}, server={}, errClass={}, msg={}", - i, simplePrint(req), resolver, ClassUtils.getSimpleName(e), e.getMessage(), e + i, simplePrint(query), resolver, ClassUtils.getSimpleName(e), e.getMessage(), e ); } } diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/SolverSystem.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/SolverSystem.java index 183520892..224e4e5e8 100644 --- a/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/SolverSystem.java +++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/SolverSystem.java @@ -18,8 +18,8 @@ public class SolverSystem implements Solver { private final DockerDAO dockerDAO; @Override - public Message handle(Message reqMsg) { - final var hostname = Messages.findQuestionHostname(reqMsg); + public Message handle(Message query) { + final var hostname = Messages.findQuestionHostname(query); final var config = Configs.getInstance(); if (hostname.isEqualTo(config.getHostMachineHostname())) { // fixme fazer case com hostname + search domain final var ip = this.dockerDAO.findHostMachineIp(); @@ -28,7 +28,7 @@ public Message handle(Message reqMsg) { return null; } log.debug("status=solvingHostMachineName, host={}, ip={}", hostname, ip); - return Messages.aAnswer(reqMsg, ip.raw()); + return Messages.aAnswer(query, ip.raw()); } return null; } diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/SolversCache.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/SolversCache.java index 8679b57cc..e58edf84e 100644 --- a/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/SolversCache.java +++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/SolversCache.java @@ -36,7 +36,7 @@ public Message handle(Message reqMsg, Function delegate) { }); return Optional .ofNullable(res) - .map(it -> Messages.copyAnswers(reqMsg, it)) + .map(it -> Messages.matchId(reqMsg, it)) .orElse(null); } @@ -45,4 +45,7 @@ static String buildKey(Message reqMsg) { return String.format("%s-%s", type != null ? type : UUID.randomUUID(), findQuestionHostname(reqMsg)); } + public int getSize(){ + return this.cache.getSize(); + } } diff --git a/src/test/java/com/mageddo/dnsproxyserver/server/dns/solver/SolverDelegateTest.java b/src/test/java/com/mageddo/dnsproxyserver/server/dns/solver/SolverDelegateTest.java new file mode 100644 index 000000000..e5a1b4625 --- /dev/null +++ b/src/test/java/com/mageddo/dnsproxyserver/server/dns/solver/SolverDelegateTest.java @@ -0,0 +1,50 @@ +package com.mageddo.dnsproxyserver.server.dns.solver; + +import com.mageddo.dnsproxyserver.templates.EntryTemplates; +import com.mageddo.dnsproxyserver.templates.MessageTemplates; +import com.mageddo.dnsproxyserver.templates.SolverMockTemplates; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; + +import static com.mageddo.utils.Assertions.validResponse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.Mockito.doReturn; + +@ExtendWith(MockitoExtension.class) +class SolverDelegateTest { + + @Mock + SolverProvider solverProvider; + + SolverDelegate delegate; + + @BeforeEach + void beforeEach() { + this.delegate = new SolverDelegate(this.solverProvider); + } + + @Test + void mustDelegateAndGetValidAnswer() { + + // arrange + final var query = MessageTemplates.acmeAQuery(); + final var cname = EntryTemplates.cname("acme.com", "acme.com.br"); + + doReturn(List.of(SolverMockTemplates.whateverMock("acme.com.br"))) + .when(this.solverProvider) + .getSolversExcludingLocalDB(); + + // act + final var response = this.delegate.solve(query, cname); + + // assert + assertNotNull(response); + validResponse(response); + + } +} diff --git a/src/test/java/com/mageddo/dnsproxyserver/server/dns/solver/SolverLocalDBTest.java b/src/test/java/com/mageddo/dnsproxyserver/server/dns/solver/SolverLocalDBTest.java index c62cf5a7d..b0cb68229 100644 --- a/src/test/java/com/mageddo/dnsproxyserver/server/dns/solver/SolverLocalDBTest.java +++ b/src/test/java/com/mageddo/dnsproxyserver/server/dns/solver/SolverLocalDBTest.java @@ -51,7 +51,7 @@ void mustSolveFromLocalDB() { // arrange final var host = "acme.com"; - final var entry = EntryTemplates.build(host); + final var entry = EntryTemplates.a(host); this.configDAO.addEntry(Config.Env.DEFAULT_ENV, entry); final var msg = Messages.aQuestion(toAbsoluteName(host)); diff --git a/src/test/java/com/mageddo/dnsproxyserver/server/dns/solver/SolversCacheTest.java b/src/test/java/com/mageddo/dnsproxyserver/server/dns/solver/SolversCacheTest.java new file mode 100644 index 000000000..607081c4e --- /dev/null +++ b/src/test/java/com/mageddo/dnsproxyserver/server/dns/solver/SolversCacheTest.java @@ -0,0 +1,38 @@ +package com.mageddo.dnsproxyserver.server.dns.solver; + +import com.mageddo.dnsproxyserver.server.dns.Messages; +import com.mageddo.dnsproxyserver.templates.MessageTemplates; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; +import org.xbill.DNS.Flags; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@ExtendWith(MockitoExtension.class) +class SolversCacheTest { + + SolversCache cache = new SolversCache(); + + @Test + void mustCacheAndGetValidResponse(){ + + // arrange + final var req = MessageTemplates.acmeAQuery(); + + // act + final var res = this.cache.handle(req, message -> Messages.aAnswer(message, "0.0.0.0")); + + // assert + assertNotNull(res); + assertEquals(1, this.cache.getSize()); + + final var header = res.getHeader(); + assertEquals(req.getHeader().getID(), res.getHeader().getID()); + assertTrue(header.getFlag(Flags.QR)); + + } + +} diff --git a/src/test/java/com/mageddo/dnsproxyserver/templates/EntryTemplates.java b/src/test/java/com/mageddo/dnsproxyserver/templates/EntryTemplates.java index 65b24f8fb..9ffcdbd54 100644 --- a/src/test/java/com/mageddo/dnsproxyserver/templates/EntryTemplates.java +++ b/src/test/java/com/mageddo/dnsproxyserver/templates/EntryTemplates.java @@ -3,7 +3,8 @@ import com.mageddo.dnsproxyserver.config.Config; public class EntryTemplates { - public static Config.Entry build(String host) { + + public static Config.Entry a(String host) { return Config.Entry .builder() .hostname(host) diff --git a/src/test/java/com/mageddo/dnsproxyserver/templates/MessageTemplates.java b/src/test/java/com/mageddo/dnsproxyserver/templates/MessageTemplates.java index 161eb0ec1..953a41ee1 100644 --- a/src/test/java/com/mageddo/dnsproxyserver/templates/MessageTemplates.java +++ b/src/test/java/com/mageddo/dnsproxyserver/templates/MessageTemplates.java @@ -14,4 +14,8 @@ public static Message buildAQuestionFor(String hostname) { return Message.newQuery(r); } + public static Message acmeAQuery() { + return buildAQuestionFor("acme.com."); + } + } diff --git a/src/test/java/com/mageddo/dnsproxyserver/templates/SolverMockTemplates.java b/src/test/java/com/mageddo/dnsproxyserver/templates/SolverMockTemplates.java new file mode 100644 index 000000000..6861a8be4 --- /dev/null +++ b/src/test/java/com/mageddo/dnsproxyserver/templates/SolverMockTemplates.java @@ -0,0 +1,18 @@ +package com.mageddo.dnsproxyserver.templates; + +import com.mageddo.dnsproxyserver.server.dns.IP; +import com.mageddo.dnsproxyserver.server.dns.solver.SolverMock; +import org.apache.commons.lang3.tuple.Pair; + +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class SolverMockTemplates { + public static SolverMock whateverMock(String ... hostnames){ + final var mocks = Stream + .of(hostnames) + .map(it -> Pair.of(it, IP.of("0.0.0.0"))) + .collect(Collectors.toList()); + return new SolverMock(mocks); + } +} diff --git a/src/test/java/com/mageddo/utils/Assertions.java b/src/test/java/com/mageddo/utils/Assertions.java new file mode 100644 index 000000000..5ba12036f --- /dev/null +++ b/src/test/java/com/mageddo/utils/Assertions.java @@ -0,0 +1,12 @@ +package com.mageddo.utils; + +import org.xbill.DNS.Flags; +import org.xbill.DNS.Message; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class Assertions { + public static void validResponse(Message m) { + assertTrue(m.getHeader().getFlag(Flags.QR)); + } +}