1
0
Fork 0
mirror of https://github.com/vanitasvitae/Smack.git synced 2024-06-13 07:04:49 +02:00
Smack/smack-resolver-minidns-dox/src/test/java/org/jivesoftware/smackx/dox/resolver/minidns/DnsOverXmppMiniDnsResolverTest.java
Florian Schmaus 4133eb175c Replace XPP3 by XmlPullParser interface wrapping StAX and XPP3
Introducing Smack's own XmlPullParser interface which tries to stay as
compatible as possible to XPP3. The interface is used to either wrap
StAX's XMLStreamReader if Smack is used on Java SE, and XPP3's
XmlPullParser if Smack is used on on Android.

Fixes SMACK-591.

Also introduce JUnit 5 and non-strict javadoc projects.
2019-05-06 22:10:50 +02:00

168 lines
5.7 KiB
Java

/**
*
* Copyright 2019 Florian Schmaus
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jivesoftware.smackx.dox.resolver.minidns;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.io.IOException;
import java.net.InetAddress;
import java.util.concurrent.atomic.AtomicBoolean;
import org.junit.jupiter.api.Test;
import org.minidns.DnsCache;
import org.minidns.DnsClient;
import org.minidns.MiniDnsFuture;
import org.minidns.dnsmessage.DnsMessage;
import org.minidns.dnsmessage.DnsMessage.RESPONSE_CODE;
import org.minidns.dnsmessage.Question;
import org.minidns.dnsname.DnsName;
import org.minidns.dnsqueryresult.CachedDnsQueryResult;
import org.minidns.dnsqueryresult.DnsQueryResult;
import org.minidns.dnssec.DnssecClient;
import org.minidns.dnssec.DnssecValidationFailedException;
import org.minidns.record.Record.TYPE;
import org.minidns.source.DnsDataSource;
public final class DnsOverXmppMiniDnsResolverTest {
@Test
public void dnsOverXmppMiniDnsResolverTest() throws IOException {
TestDnsDataSource dnsSource = new TestDnsDataSource();
TestDnsDataSource dnssecSource = new TestDnsDataSource();
DnsClient dnsClient = new DnsClient(NoopDnsCache.INSTANCE);
dnsClient.setDataSource(dnsSource);
DnssecClient dnssecClient = new DnssecClient(NoopDnsCache.INSTANCE);
dnssecClient.setDataSource(dnssecSource);
DnsOverXmppMiniDnsResolver doxResolver = new DnsOverXmppMiniDnsResolver(dnsClient, dnssecClient);
Question question = new Question("example.org", TYPE.A);
{
DnsMessage nondnssecQuery = question.asQueryMessage();
doxResolver.resolve(nondnssecQuery);
assertTrue(dnsSource.getAndResetWasQueried());
assertFalse(dnssecSource.getAndResetWasQueried());
}
{
DnsMessage.Builder dnssecQueryBuilder = question.asMessageBuilder();
dnssecQueryBuilder.getEdnsBuilder().setDnssecOk();
DnsMessage dnssecQuery = dnssecQueryBuilder.build();
DnssecValidationFailedException dnssecValidationFailedException = null;
try {
doxResolver.resolve(dnssecQuery);
} catch (DnssecValidationFailedException e) {
dnssecValidationFailedException = e;
}
// This exception is expected since we don't have a realy DNS source.
assertNotNull(dnssecValidationFailedException);
assertFalse(dnsSource.getAndResetWasQueried());
assertTrue(dnssecSource.getAndResetWasQueried());
}
}
public static class TestDnsDataSource implements DnsDataSource {
private final AtomicBoolean wasQueried = new AtomicBoolean();
public boolean getAndResetWasQueried() {
return wasQueried.getAndSet(false);
}
private void setWasQueried() {
wasQueried.set(true);
}
@Override
public DnsQueryResult query(DnsMessage query, InetAddress address, int port) throws IOException {
setWasQueried();
return new TestDnsQueryResult(query);
}
@Override
public MiniDnsFuture<DnsQueryResult, IOException> queryAsync(DnsMessage query, InetAddress address, int port,
OnResponseCallback onResponseCallback) {
setWasQueried();
DnsQueryResult result = new TestDnsQueryResult(query);
return MiniDnsFuture.from(result);
}
@Override
public int getUdpPayloadSize() {
return 0;
}
@Override
public int getTimeout() {
return 0;
}
@Override
public void setTimeout(int timeout) {
}
private static class TestDnsQueryResult extends DnsQueryResult {
protected TestDnsQueryResult(DnsMessage query) {
super(QueryMethod.testWorld, query, createNxDomainAnswerFor(query));
}
private static DnsMessage createNxDomainAnswerFor(DnsMessage query) {
Question question = query.getQuestion();
DnsMessage response = DnsMessage.builder()
.setQuestion(question)
.setRecursionAvailable(true)
.setResponseCode(RESPONSE_CODE.NX_DOMAIN)
.build();
return response;
}
}
}
// TODO: Workaround for NPE-if-no-cache-set bug in MiniDNS. Remove we use a MiniDNS version where this is fixed,
// i.e. one that has 864fbb5 ("Fix NPE in AbstractDnsClient if cache is 'null'")
private static class NoopDnsCache extends DnsCache {
private static final NoopDnsCache INSTANCE = new NoopDnsCache();
@Override
protected void putNormalized(DnsMessage normalizedQuery, DnsQueryResult result) {
}
@Override
public void offer(DnsMessage query, DnsQueryResult result, DnsName authoritativeZone) {
}
@Override
protected CachedDnsQueryResult getNormalized(DnsMessage normalizedQuery) {
return null;
}
}
}