package com.ausregistry.jtoolkit2.se.secdns; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import org.junit.Test; import com.ausregistry.jtoolkit2.se.DomainInfoResponse; import com.ausregistry.jtoolkit2.xml.XMLDocument; import com.ausregistry.jtoolkit2.xml.XMLParser; public final class SecDnsDomainInfoResponseTest { private static final XMLParser PARSER = new XMLParser(); private static int signedShortLimit = Short.MAX_VALUE + 1; private static int signedByteLimit = Byte.MAX_VALUE + 1; @Test public void testSecDnsInfoExtensionAllFields() throws Exception { final String domainName = "test.com.au"; final DomainInfoResponse response = new DomainInfoResponse(); final SecDnsDomainInfoResponseExtension re = new SecDnsDomainInfoResponseExtension(); final XMLDocument doc = PARSER.parse(getInfoResponseExpectedXml(domainName, false)); response.registerExtension(re); response.fromXML(doc); assertTrue(re.isInitialised()); assertEquals(domainName, response.getName()); assertEquals(1, re.getInfData().getDsDataList().size()); assertFirstDSData(re.getInfData().getDsDataList().get(0)); } @Test public void testSecDnsInfoExtensionOnlyKeyData() throws Exception { final String domainName = "test.com.au"; final DomainInfoResponse response = new DomainInfoResponse(); final SecDnsDomainInfoResponseExtension re = new SecDnsDomainInfoResponseExtension(); final XMLDocument doc = PARSER.parse(getInfoResponseExpectedXml(domainName, false, true, false)); response.registerExtension(re); response.fromXML(doc); assertTrue(re.isInitialised()); assertEquals(domainName, response.getName()); assertEquals(1, re.getInfData().getKeyDataList().size()); assertKeyData(re.getInfData().getKeyDataList().get(0)); } @Test public void testSecDnsInfoExtensionMultipleDsRecords() throws Exception { final String domainName = "test.com.au"; final DomainInfoResponse response = new DomainInfoResponse(); final SecDnsDomainInfoResponseExtension re = new SecDnsDomainInfoResponseExtension(); final XMLDocument doc = PARSER.parse(getInfoResponseExpectedXml(domainName, true)); response.registerExtension(re); response.fromXML(doc); assertTrue(re.isInitialised()); assertEquals(domainName, response.getName()); assertEquals(2, re.getInfData().getDsDataList().size()); assertFirstDSData(re.getInfData().getDsDataList().get(0)); assertSecondDSData(re.getInfData().getDsDataList().get(1)); } @Test public void testSecDnsInfoNoExtensionInitialised() throws Exception { final String domainName = "test.com.au"; final DomainInfoResponse response = new DomainInfoResponse(); final SecDnsDomainInfoResponseExtension re = new SecDnsDomainInfoResponseExtension(); final XMLDocument doc = PARSER.parse(getInfoResponseNoExtensionExpectedXml(domainName)); response.registerExtension(re); response.fromXML(doc); assertEquals(domainName, response.getName()); assertFalse(re.isInitialised()); } private static void assertFirstDSData(final DSData dsData) { assertEquals("Incorrect ds keyTag", signedShortLimit, dsData.getKeyTag()); assertEquals("Incorrect ds alg", signedByteLimit, dsData.getAlg()); assertEquals("Incorrect ds digestType", 1, dsData.getDigestType()); assertEquals("Incorrect ds digest", "49FD46E6C4B45C55D4AC", dsData.getDigest()); assertKeyData(dsData.getKeyData()); } private static void assertKeyData(final KeyData keyData) { assertEquals("Incorrect keyData flags", signedShortLimit, keyData.getFlags()); assertEquals("Incorrect keyData protocol", 3, keyData.getProtocol()); assertEquals("Incorrect keyData alg", signedByteLimit, keyData.getAlg()); assertEquals("Incorrect keyData PubKey", "AQPJ////4Q==", keyData.getPubKey()); } private static void assertSecondDSData(final DSData dsData) { assertEquals("Incorrect ds keyTag", 14321, dsData.getKeyTag()); assertEquals("Incorrect ds alg", 2, dsData.getAlg()); assertEquals("Incorrect ds digestType", 5, dsData.getDigestType()); assertEquals("Incorrect ds digest", "39FD46E6C4B45C55D4AC", dsData.getDigest()); assertNull("Incorrect keyData", dsData.getKeyData()); } private static String getInfoResponseExpectedXml(final String domainName, final boolean isMulitpleDs) { final StringBuilder result = new StringBuilder(); buildXmlResponseBeforeExtension(domainName, result); buildSecDNSXmlExtension(isMulitpleDs, result); buildXmlResponseAfterExtension(result); return result.toString(); } private static String getInfoResponseExpectedXml(final String domainName, final boolean isMulitpleDs, final boolean isKeyData, final boolean isDsData) { final StringBuilder result = new StringBuilder(); buildXmlResponseBeforeExtension(domainName, result); buildSecDNSXmlExtension(isMulitpleDs, isKeyData, isDsData, result); buildXmlResponseAfterExtension(result); return result.toString(); } private static String getInfoResponseNoExtensionExpectedXml(final String domainName) { final StringBuilder result = new StringBuilder(); buildXmlResponseBeforeExtension(domainName, result); buildXmlResponseAfterExtension(result); return result.toString(); } private static void buildXmlResponseAfterExtension(final StringBuilder result) { result.append( "<trID>"); result.append( "<clTRID>ABC-12345</clTRID>"); result.append( "<svTRID>54321-XYZ</svTRID>"); result.append( "</trID>"); result.append( "</response>"); result.append("</epp>"); } private static void buildSecDNSXmlExtension(final boolean isMulitpleDs, final StringBuilder result) { buildSecDNSXmlExtension(isMulitpleDs, false, true, result); } private static void buildSecDNSXmlExtension(final boolean isMulitpleDs, final boolean isKeyData, final boolean isDsData, final StringBuilder result) { result.append( "<extension>"); result.append( "<secDNS:infData xmlns:secDNS=\"urn:ietf:params:xml:ns:secDNS-1.1\""); result.append( " xsi:schemaLocation=\"urn:ietf:params:xml:ns:secDNS-1.1 secDNS-1.1.xsd\">"); result.append( "<secDNS:maxSigLife>604800</secDNS:maxSigLife>"); if (isDsData) { result.append("<secDNS:dsData>"); result.append("<secDNS:keyTag>" + signedShortLimit + "</secDNS:keyTag>"); result.append("<secDNS:alg>" + signedByteLimit + "</secDNS:alg>"); result.append("<secDNS:digestType>1</secDNS:digestType>"); result.append("<secDNS:digest>49FD46E6C4B45C55D4AC</secDNS:digest>"); result.append("<secDNS:keyData>"); result.append("<secDNS:flags>" + signedShortLimit + "</secDNS:flags>"); result.append("<secDNS:protocol>3</secDNS:protocol>"); result.append("<secDNS:alg>" + signedByteLimit + "</secDNS:alg>"); result.append("<secDNS:pubKey>AQPJ////4Q==</secDNS:pubKey>"); result.append("</secDNS:keyData>"); result.append("</secDNS:dsData>"); if (isMulitpleDs) { result.append( "<secDNS:dsData>"); result.append( "<secDNS:keyTag>14321</secDNS:keyTag>"); result.append( "<secDNS:alg>2</secDNS:alg>"); result.append( "<secDNS:digestType>5</secDNS:digestType>"); result.append( "<secDNS:digest>39FD46E6C4B45C55D4AC</secDNS:digest>"); result.append( "</secDNS:dsData>"); } } if (isKeyData) { result.append("<secDNS:keyData>"); result.append("<secDNS:flags>" + signedShortLimit + "</secDNS:flags>"); result.append("<secDNS:protocol>3</secDNS:protocol>"); result.append("<secDNS:alg>" + signedByteLimit + "</secDNS:alg>"); result.append("<secDNS:pubKey>AQPJ////4Q==</secDNS:pubKey>"); result.append("</secDNS:keyData>"); } result.append( "</secDNS:infData>"); result.append( "</extension>"); } private static void buildXmlResponseBeforeExtension(final String domainName, final StringBuilder result) { result.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); result.append("<epp xmlns=\"urn:ietf:params:xml:ns:epp-1.0\""); result.append( " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""); result.append( " xsi:schemaLocation=\"urn:ietf:params:xml:ns:epp-1.0 epp-1.0.xsd\">"); result.append( "<response>"); result.append( "<result code=\"1000\">"); result.append( "<msg>Command completed successfully</msg>"); result.append( "</result>"); result.append( "<resData>"); result.append( "<infData xmlns=\"urn:ietf:params:xml:ns:domain-1.0\""); result.append( " xsi:schemaLocation=\"urn:ietf:params:xml:ns:domain-1.0 domain-1.0.xsd\">"); result.append( "<name>" + domainName + "</name>"); result.append( "<roid>D0000003-AR</roid>"); result.append( "<status s=\"ok\" lang=\"en\"/>"); result.append( "<registrant>EXAMPLE</registrant>"); result.append( "<contact type=\"tech\">EXAMPLE</contact>"); result.append( "<ns>"); result.append( "<hostObj>ns1.example.com.au</hostObj>"); result.append( "<hostObj>ns2.example.com.au</hostObj>"); result.append( "</ns>"); result.append( "<host>ns1.example.com.au</host>"); result.append( "<host>ns2.exmaple.com.au</host>"); result.append( "<clID>Registrar</clID>"); result.append( "<crID>Registrar</crID>"); result.append( "<crDate>2006-02-09T15:44:58.0Z</crDate>"); result.append( "<upDate>2006-02-09T15:44:58.0Z</upDate>"); result.append( "<exDate>2008-02-10T00:00:00.0Z</exDate>"); result.append( "<authInfo>"); result.append( "<pw>0192pqow</pw>"); result.append( "</authInfo>"); result.append( "</infData>"); result.append( "</resData>"); } }