| 1 | // |
| 2 | // DNSTest.cpp |
| 3 | // |
| 4 | // Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH. |
| 5 | // and Contributors. |
| 6 | // |
| 7 | // SPDX-License-Identifier: BSL-1.0 |
| 8 | // |
| 9 | |
| 10 | |
| 11 | #include "DNSTest.h" |
| 12 | #include "Poco/CppUnit/TestCaller.h" |
| 13 | #include "Poco/CppUnit/TestSuite.h" |
| 14 | #include "Poco/Net/DNS.h" |
| 15 | #include "Poco/Net/HostEntry.h" |
| 16 | #include "Poco/Net/NetException.h" |
| 17 | |
| 18 | |
| 19 | using Poco::Net::DNS; |
| 20 | using Poco::Net::IPAddress; |
| 21 | using Poco::Net::HostEntry; |
| 22 | using Poco::Net::InvalidAddressException; |
| 23 | using Poco::Net::HostNotFoundException; |
| 24 | using Poco::Net::ServiceNotFoundException; |
| 25 | using Poco::Net::NoAddressFoundException; |
| 26 | |
| 27 | |
| 28 | DNSTest::DNSTest(const std::string& name): CppUnit::TestCase(name) |
| 29 | { |
| 30 | } |
| 31 | |
| 32 | |
| 33 | DNSTest::~DNSTest() |
| 34 | { |
| 35 | } |
| 36 | |
| 37 | |
| 38 | void DNSTest::testHostByName() |
| 39 | { |
| 40 | HostEntry he1 = DNS::hostByName("aliastest.pocoproject.org" ); |
| 41 | // different systems report different canonical names, unfortunately. |
| 42 | assertTrue (he1.name() == "dnstest.pocoproject.org" || he1.name() == "aliastest.pocoproject.org" ); |
| 43 | #if !defined(POCO_HAVE_ADDRINFO) |
| 44 | // getaddrinfo() does not report any aliases |
| 45 | assertTrue (!he1.aliases().empty()); |
| 46 | assertTrue (he1.aliases()[0] == "aliastest.pocoproject.org" ); |
| 47 | #endif |
| 48 | assertTrue (he1.addresses().size() >= 1); |
| 49 | assertTrue (he1.addresses()[0].toString() == "1.2.3.4" ); |
| 50 | |
| 51 | try |
| 52 | { |
| 53 | HostEntry he1 = DNS::hostByName("nohost.pocoproject.org" ); |
| 54 | fail("host not found - must throw" ); |
| 55 | } |
| 56 | catch (HostNotFoundException&) |
| 57 | { |
| 58 | } |
| 59 | catch (NoAddressFoundException&) |
| 60 | { |
| 61 | } |
| 62 | } |
| 63 | |
| 64 | |
| 65 | void DNSTest::testHostByAddress() |
| 66 | { |
| 67 | IPAddress ip1("80.122.195.86" ); |
| 68 | HostEntry he1 = DNS::hostByAddress(ip1); |
| 69 | assertTrue (he1.name() == "mailhost.appinf.com" ); |
| 70 | assertTrue (he1.aliases().empty()); |
| 71 | assertTrue (he1.addresses().size() >= 1); |
| 72 | assertTrue (he1.addresses()[0].toString() == "80.122.195.86" ); |
| 73 | |
| 74 | IPAddress ip2("10.0.244.253" ); |
| 75 | try |
| 76 | { |
| 77 | HostEntry he2 = DNS::hostByAddress(ip2); |
| 78 | fail("host not found - must throw" ); |
| 79 | } |
| 80 | catch (HostNotFoundException&) |
| 81 | { |
| 82 | } |
| 83 | catch (NoAddressFoundException&) |
| 84 | { |
| 85 | } |
| 86 | } |
| 87 | |
| 88 | |
| 89 | void DNSTest::testResolve() |
| 90 | { |
| 91 | } |
| 92 | |
| 93 | |
| 94 | void DNSTest::testEncodeIDN() |
| 95 | { |
| 96 | std::string idn("d\xc3\xb6m\xc3\xa4in.example" ); // d"om"ain.example |
| 97 | assertTrue (DNS::isIDN(idn)); |
| 98 | assertTrue (DNS::encodeIDN(idn) == "xn--dmin-moa0i.example" ); |
| 99 | |
| 100 | idn = ".d\xc3\xb6m\xc3\xa4in.example" ; // .d"om"ain.example |
| 101 | assertTrue (DNS::isIDN(idn)); |
| 102 | assertTrue (DNS::encodeIDN(idn) == ".xn--dmin-moa0i.example" ); |
| 103 | |
| 104 | idn = "d\xc3\xb6m\xc3\xa4in.example." ; // .d"om"ain.example. |
| 105 | assertTrue (DNS::isIDN(idn)); |
| 106 | assertTrue (DNS::encodeIDN(idn) == "xn--dmin-moa0i.example." ); |
| 107 | |
| 108 | idn = "d\xc3\xb6m\xc3\xa4in" ; // d"om"ain |
| 109 | assertTrue (DNS::isIDN(idn)); |
| 110 | assertTrue (DNS::encodeIDN(idn) == "xn--dmin-moa0i" ); |
| 111 | |
| 112 | idn = "\xc3\xa4" "aaa.example" ; // "aaaa.example |
| 113 | assertTrue (DNS::isIDN(idn)); |
| 114 | assertTrue (DNS::encodeIDN(idn) == "xn--aaa-pla.example" ); |
| 115 | |
| 116 | idn = "a\xc3\xa4" "aa.example" ; // a"aaa.example |
| 117 | assertTrue (DNS::isIDN(idn)); |
| 118 | assertTrue (DNS::encodeIDN(idn) == "xn--aaa-qla.example" ); |
| 119 | |
| 120 | idn = "foo.\xc3\xa2" "bcd\xc3\xa9" "f.example" ; // foo.^abcd'ef.example |
| 121 | assertTrue (DNS::isIDN(idn)); |
| 122 | assertTrue (DNS::encodeIDN(idn) == "foo.xn--bcdf-9na9b.example" ); |
| 123 | |
| 124 | idn = "\xe2\x98\x83.example" ; // <snowman>.example |
| 125 | assertTrue (DNS::isIDN(idn)); |
| 126 | assertTrue (DNS::encodeIDN(idn) == "xn--n3h.example" ); |
| 127 | |
| 128 | idn = "\xe2\x98\x83." ; // <snowman>. |
| 129 | assertTrue (DNS::isIDN(idn)); |
| 130 | assertTrue (DNS::encodeIDN(idn) == "xn--n3h." ); |
| 131 | |
| 132 | idn = "\xe2\x98\x83" ; // <snowman> |
| 133 | assertTrue (DNS::isIDN(idn)); |
| 134 | assertTrue (DNS::encodeIDN(idn) == "xn--n3h" ); |
| 135 | |
| 136 | std::string dn = "www.pocoproject.org" ; |
| 137 | assertTrue (!DNS::isIDN(dn)); |
| 138 | assertTrue (DNS::encodeIDN(dn) == "www.pocoproject.org" ); |
| 139 | } |
| 140 | |
| 141 | |
| 142 | void DNSTest::testDecodeIDN() |
| 143 | { |
| 144 | std::string enc("xn--dmin-moa0i.example" ); |
| 145 | assertTrue (DNS::isEncodedIDN(enc)); |
| 146 | assertTrue (DNS::decodeIDN(enc) == "d\xc3\xb6m\xc3\xa4in.example" ); // d"om"ain.example |
| 147 | |
| 148 | enc = ".xn--dmin-moa0i.example" ; |
| 149 | assertTrue (DNS::isEncodedIDN(enc)); |
| 150 | assertTrue (DNS::decodeIDN(enc) == ".d\xc3\xb6m\xc3\xa4in.example" ); // .d"om"ain.example |
| 151 | |
| 152 | enc = "xn--dmin-moa0i.example." ; |
| 153 | assertTrue (DNS::isEncodedIDN(enc)); |
| 154 | assertTrue (DNS::decodeIDN(enc) == "d\xc3\xb6m\xc3\xa4in.example." ); // d"om"ain.example. |
| 155 | |
| 156 | enc = "xn--dmin-moa0i" ; |
| 157 | assertTrue (DNS::isEncodedIDN(enc)); |
| 158 | assertTrue (DNS::decodeIDN(enc) == "d\xc3\xb6m\xc3\xa4in" ); // d"om"ain |
| 159 | |
| 160 | enc = "foo.xn--bcdf-9na9b.example" ; |
| 161 | assertTrue (DNS::isEncodedIDN(enc)); |
| 162 | assertTrue (DNS::decodeIDN(enc) == "foo.\xc3\xa2" "bcd\xc3\xa9" "f.example" ); // foo.^abcd'ef.example |
| 163 | |
| 164 | enc = "xn--n3h.example" ; |
| 165 | assertTrue (DNS::isEncodedIDN(enc)); |
| 166 | assertTrue (DNS::decodeIDN(enc) == "\xe2\x98\x83.example" ); // <snowman>.example |
| 167 | |
| 168 | enc = "xn--n3h." ; |
| 169 | assertTrue (DNS::isEncodedIDN(enc)); |
| 170 | assertTrue (DNS::decodeIDN(enc) == "\xe2\x98\x83." ); // <snowman>. |
| 171 | |
| 172 | enc = "xn--n3h" ; |
| 173 | assertTrue (DNS::isEncodedIDN(enc)); |
| 174 | assertTrue (DNS::decodeIDN(enc) == "\xe2\x98\x83" ); // <snowman> |
| 175 | |
| 176 | std::string dn = "www.pocoproject.org" ; |
| 177 | assertTrue (!DNS::isEncodedIDN(dn)); |
| 178 | assertTrue (DNS::decodeIDN(dn) == "www.pocoproject.org" ); |
| 179 | } |
| 180 | |
| 181 | |
| 182 | void DNSTest::setUp() |
| 183 | { |
| 184 | } |
| 185 | |
| 186 | |
| 187 | void DNSTest::tearDown() |
| 188 | { |
| 189 | } |
| 190 | |
| 191 | |
| 192 | CppUnit::Test* DNSTest::suite() |
| 193 | { |
| 194 | CppUnit::TestSuite* pSuite = new CppUnit::TestSuite("DNSTest" ); |
| 195 | |
| 196 | CppUnit_addTest(pSuite, DNSTest, testHostByName); |
| 197 | CppUnit_addTest(pSuite, DNSTest, testHostByAddress); |
| 198 | CppUnit_addTest(pSuite, DNSTest, testResolve); |
| 199 | CppUnit_addTest(pSuite, DNSTest, testEncodeIDN); |
| 200 | CppUnit_addTest(pSuite, DNSTest, testDecodeIDN); |
| 201 | |
| 202 | return pSuite; |
| 203 | } |
| 204 | |