rrset_unittest.cc 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. // Copyright (C) 2010-2013 Internet Systems Consortium, Inc. ("ISC")
  2. //
  3. // Permission to use, copy, modify, and/or distribute this software for any
  4. // purpose with or without fee is hereby granted, provided that the above
  5. // copyright notice and this permission notice appear in all copies.
  6. //
  7. // THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
  8. // REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
  9. // AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
  10. // INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  11. // LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
  12. // OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  13. // PERFORMANCE OF THIS SOFTWARE.
  14. #include <util/buffer.h>
  15. #include <dns/messagerenderer.h>
  16. #include <dns/name.h>
  17. #include <dns/rdata.h>
  18. #include <dns/rdataclass.h>
  19. #include <dns/rrclass.h>
  20. #include <dns/rrtype.h>
  21. #include <dns/rrttl.h>
  22. #include <dns/rrset.h>
  23. #include <dns/tests/unittest_util.h>
  24. #include <gtest/gtest.h>
  25. #include <stdexcept>
  26. #include <sstream>
  27. using isc::UnitTestUtil;
  28. using namespace std;
  29. using namespace isc::dns;
  30. using namespace isc::util;
  31. using namespace isc::dns::rdata;
  32. namespace {
  33. class RRsetTest : public ::testing::Test {
  34. protected:
  35. RRsetTest() : buffer(0),
  36. test_name("test.example.com"),
  37. test_domain("example.com"),
  38. test_nsname("ns.example.com"),
  39. rrset_a(test_name, RRClass::IN(), RRType::A(), RRTTL(3600)),
  40. rrset_a_empty(test_name, RRClass::IN(), RRType::A(),
  41. RRTTL(3600)),
  42. rrset_any_a_empty(test_name, RRClass::ANY(), RRType::A(),
  43. RRTTL(3600)),
  44. rrset_none_a_empty(test_name, RRClass::NONE(), RRType::A(),
  45. RRTTL(3600)),
  46. rrset_ns(test_domain, RRClass::IN(), RRType::NS(),
  47. RRTTL(86400)),
  48. rrset_ch_txt(test_domain, RRClass::CH(), RRType::TXT(),
  49. RRTTL(0))
  50. {
  51. rrset_a.addRdata(in::A("192.0.2.1"));
  52. rrset_a.addRdata(in::A("192.0.2.2"));
  53. }
  54. OutputBuffer buffer;
  55. MessageRenderer renderer;
  56. Name test_name;
  57. Name test_domain;
  58. Name test_nsname;
  59. RRset rrset_a;
  60. RRset rrset_a_empty;
  61. RRset rrset_any_a_empty;
  62. RRset rrset_none_a_empty;
  63. RRset rrset_ns;
  64. RRset rrset_ch_txt;
  65. std::vector<unsigned char> wiredata;
  66. // max number of Rdata objects added to a test RRset object.
  67. // this is an arbitrary chosen limit, but should be sufficiently large
  68. // in practice and reasonable even as an extreme test case.
  69. static const int MAX_RDATA_COUNT = 100;
  70. };
  71. TEST_F(RRsetTest, getRdataCount) {
  72. for (int i = 0; i < MAX_RDATA_COUNT; ++i) {
  73. EXPECT_EQ(i, rrset_a_empty.getRdataCount());
  74. rrset_a_empty.addRdata(in::A("192.0.2.1"));
  75. }
  76. }
  77. TEST_F(RRsetTest, getName) {
  78. EXPECT_EQ(test_name, rrset_a.getName());
  79. EXPECT_EQ(test_domain, rrset_ns.getName());
  80. }
  81. TEST_F(RRsetTest, getClass) {
  82. EXPECT_EQ(RRClass("IN"), rrset_a.getClass());
  83. EXPECT_EQ(RRClass("CH"), rrset_ch_txt.getClass());
  84. }
  85. TEST_F(RRsetTest, getType) {
  86. EXPECT_EQ(RRType("A"), rrset_a.getType());
  87. EXPECT_EQ(RRType("NS"), rrset_ns.getType());
  88. EXPECT_EQ(RRType("TXT"), rrset_ch_txt.getType());
  89. }
  90. TEST_F(RRsetTest, getTTL) {
  91. EXPECT_EQ(RRTTL(3600), rrset_a.getTTL());
  92. EXPECT_EQ(RRTTL(86400), rrset_ns.getTTL());
  93. EXPECT_EQ(RRTTL(0), rrset_ch_txt.getTTL());
  94. }
  95. TEST_F(RRsetTest, setTTL) {
  96. rrset_a.setTTL(RRTTL(86400));
  97. EXPECT_EQ(RRTTL(86400), rrset_a.getTTL());
  98. rrset_a.setTTL(RRTTL(0));
  99. EXPECT_EQ(RRTTL(0), rrset_a.getTTL());
  100. }
  101. TEST_F(RRsetTest, isSameKind) {
  102. RRset rrset_w(test_name, RRClass::IN(), RRType::A(), RRTTL(3600));
  103. RRset rrset_x(test_name, RRClass::IN(), RRType::A(), RRTTL(3600));
  104. RRset rrset_y(test_name, RRClass::IN(), RRType::NS(), RRTTL(3600));
  105. RRset rrset_z(test_name, RRClass::CH(), RRType::A(), RRTTL(3600));
  106. RRset rrset_p(test_nsname, RRClass::IN(), RRType::A(), RRTTL(3600));
  107. EXPECT_TRUE(rrset_w.isSameKind(rrset_w));
  108. EXPECT_TRUE(rrset_w.isSameKind(rrset_x));
  109. EXPECT_FALSE(rrset_w.isSameKind(rrset_y));
  110. EXPECT_FALSE(rrset_w.isSameKind(rrset_z));
  111. EXPECT_FALSE(rrset_w.isSameKind(rrset_p));
  112. }
  113. void
  114. addRdataTestCommon(const RRset& rrset) {
  115. EXPECT_EQ(2, rrset.getRdataCount());
  116. RdataIteratorPtr it = rrset.getRdataIterator(); // cursor is set to the 1st
  117. EXPECT_FALSE(it->isLast());
  118. EXPECT_EQ(0, it->getCurrent().compare(in::A("192.0.2.1")));
  119. it->next();
  120. EXPECT_FALSE(it->isLast());
  121. EXPECT_EQ(0, it->getCurrent().compare(in::A("192.0.2.2")));
  122. it->next();
  123. EXPECT_TRUE(it->isLast());
  124. }
  125. TEST_F(RRsetTest, addRdata) {
  126. addRdataTestCommon(rrset_a);
  127. // Reference version of addRdata() doesn't allow to add a different
  128. // type of Rdata.
  129. EXPECT_THROW(rrset_a.addRdata(generic::NS(test_nsname)), std::bad_cast);
  130. }
  131. TEST_F(RRsetTest, addRdataPtr) {
  132. rrset_a_empty.addRdata(createRdata(rrset_a_empty.getType(),
  133. rrset_a_empty.getClass(),
  134. "192.0.2.1"));
  135. rrset_a_empty.addRdata(createRdata(rrset_a_empty.getType(),
  136. rrset_a_empty.getClass(),
  137. "192.0.2.2"));
  138. addRdataTestCommon(rrset_a);
  139. // Pointer version of addRdata() doesn't type check and does allow to
  140. //add a different type of Rdata as a result.
  141. rrset_a_empty.addRdata(createRdata(RRType::NS(), RRClass::IN(),
  142. "ns.example.com."));
  143. EXPECT_EQ(3, rrset_a_empty.getRdataCount());
  144. }
  145. TEST_F(RRsetTest, iterator) {
  146. // Iterator for an empty RRset.
  147. RdataIteratorPtr it = rrset_a_empty.getRdataIterator();
  148. EXPECT_TRUE(it->isLast());
  149. // Normal case (already tested, but do it again just in case)
  150. rrset_a_empty.addRdata(in::A("192.0.2.1"));
  151. rrset_a_empty.addRdata(in::A("192.0.2.2"));
  152. addRdataTestCommon(rrset_a_empty);
  153. // Rewind test: should be repeat the iteration by calling first().
  154. for (int i = 0; i < 2; ++i) {
  155. it = rrset_a_empty.getRdataIterator();
  156. it->first();
  157. EXPECT_FALSE(it->isLast());
  158. it->next();
  159. EXPECT_FALSE(it->isLast());
  160. it->next();
  161. EXPECT_TRUE(it->isLast());
  162. }
  163. }
  164. TEST_F(RRsetTest, toText) {
  165. EXPECT_EQ("test.example.com. 3600 IN A 192.0.2.1\n"
  166. "test.example.com. 3600 IN A 192.0.2.2\n",
  167. rrset_a.toText());
  168. // toText() cannot be performed for an empty RRset
  169. EXPECT_THROW(rrset_a_empty.toText(), EmptyRRset);
  170. // Unless it is type ANY or NONE
  171. EXPECT_EQ("test.example.com. 3600 ANY A\n",
  172. rrset_any_a_empty.toText());
  173. EXPECT_EQ("test.example.com. 3600 NONE A\n",
  174. rrset_none_a_empty.toText());
  175. }
  176. TEST_F(RRsetTest, toWireBuffer) {
  177. rrset_a.toWire(buffer);
  178. UnitTestUtil::readWireData("rrset_toWire1", wiredata);
  179. EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, buffer.getData(),
  180. buffer.getLength(), &wiredata[0], wiredata.size());
  181. // toWire() cannot be performed for an empty RRset.
  182. buffer.clear();
  183. EXPECT_THROW(rrset_a_empty.toWire(buffer), EmptyRRset);
  184. // Unless it is type ANY or None
  185. buffer.clear();
  186. rrset_any_a_empty.toWire(buffer);
  187. wiredata.clear();
  188. UnitTestUtil::readWireData("rrset_toWire3", wiredata);
  189. EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, buffer.getData(),
  190. buffer.getLength(), &wiredata[0], wiredata.size());
  191. buffer.clear();
  192. rrset_none_a_empty.toWire(buffer);
  193. wiredata.clear();
  194. UnitTestUtil::readWireData("rrset_toWire4", wiredata);
  195. EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, buffer.getData(),
  196. buffer.getLength(), &wiredata[0], wiredata.size());
  197. }
  198. TEST_F(RRsetTest, toWireRenderer) {
  199. rrset_ns.addRdata(generic::NS(test_nsname));
  200. rrset_a.toWire(renderer);
  201. rrset_ns.toWire(renderer);
  202. UnitTestUtil::readWireData("rrset_toWire2", wiredata);
  203. EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, renderer.getData(),
  204. renderer.getLength(), &wiredata[0], wiredata.size());
  205. // toWire() cannot be performed for an empty RRset.
  206. buffer.clear();
  207. EXPECT_THROW(rrset_a_empty.toWire(buffer), EmptyRRset);
  208. // Unless it is type ANY or None
  209. // toWire() can also be performed for an empty RRset.
  210. buffer.clear();
  211. rrset_any_a_empty.toWire(buffer);
  212. wiredata.clear();
  213. UnitTestUtil::readWireData("rrset_toWire3", wiredata);
  214. EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, buffer.getData(),
  215. buffer.getLength(), &wiredata[0], wiredata.size());
  216. buffer.clear();
  217. rrset_none_a_empty.toWire(buffer);
  218. wiredata.clear();
  219. UnitTestUtil::readWireData("rrset_toWire4", wiredata);
  220. EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, buffer.getData(),
  221. buffer.getLength(), &wiredata[0], wiredata.size());
  222. }
  223. // test operator<<. We simply confirm it appends the result of toText().
  224. TEST_F(RRsetTest, LeftShiftOperator) {
  225. ostringstream oss;
  226. oss << rrset_a;
  227. EXPECT_EQ(rrset_a.toText(), oss.str());
  228. }
  229. class RRsetRRSIGTest : public ::testing::Test {
  230. protected:
  231. RRsetRRSIGTest() : test_name("test.example.com")
  232. {
  233. rrset_a = RRsetPtr(new RRset(test_name, RRClass::IN(),
  234. RRType::A(), RRTTL(3600)));
  235. rrset_a->addRdata(in::A("192.0.2.1"));
  236. rrset_a->addRdata(in::A("192.0.2.2"));
  237. rrset_aaaa = RRsetPtr(new RRset(test_name, RRClass::IN(),
  238. RRType::AAAA(), RRTTL(3600)));
  239. rrset_aaaa->addRdata(in::AAAA("2001:db8::1234"));
  240. rrset_rrsig = RRsetPtr(new RRset(test_name, RRClass::IN(),
  241. RRType::RRSIG(), RRTTL(3600)));
  242. rrset_rrsig->addRdata(generic::RRSIG("AAAA 5 3 7200 20100322084538 "
  243. "20100220084538 1 example.com. "
  244. "FAKEFAKEFAKEFAKE"));
  245. rrset_aaaa->addRRsig(rrset_rrsig);
  246. }
  247. const Name test_name;
  248. RRsetPtr rrset_a; // A RRset with two RDATAs
  249. RRsetPtr rrset_aaaa; // AAAA RRset with one RDATA with RRSIG
  250. RRsetPtr rrset_rrsig; // RRSIG for the AAAA RRset
  251. };
  252. TEST_F(RRsetRRSIGTest, getRRsig) {
  253. RRsetPtr sp = rrset_a->getRRsig();
  254. EXPECT_EQ(static_cast<void*>(NULL), sp.get());
  255. sp = rrset_aaaa->getRRsig();
  256. EXPECT_NE(static_cast<void*>(NULL), sp.get());
  257. }
  258. TEST_F(RRsetRRSIGTest, addRRsig) {
  259. RRsetPtr sp = rrset_a->getRRsig();
  260. EXPECT_EQ(static_cast<void*>(NULL), sp.get());
  261. rrset_rrsig = RRsetPtr(new RRset(test_name, RRClass::IN(),
  262. RRType::RRSIG(), RRTTL(3600)));
  263. // one signature algorithm (5 = RSA/SHA-1)
  264. rrset_rrsig->addRdata(generic::RRSIG("A 5 3 3600 "
  265. "20000101000000 20000201000000 "
  266. "12345 example.com. FAKEFAKEFAKE"));
  267. // another signature algorithm (3 = DSA/SHA-1)
  268. rrset_rrsig->addRdata(generic::RRSIG("A 3 3 3600 "
  269. "20000101000000 20000201000000 "
  270. "12345 example.com. FAKEFAKEFAKE"));
  271. rrset_a->addRRsig(rrset_rrsig);
  272. sp = rrset_a->getRRsig();
  273. EXPECT_NE(static_cast<void*>(NULL), sp.get());
  274. EXPECT_EQ(2, sp->getRdataCount());
  275. // add to existing RRSIG
  276. rrset_rrsig = RRsetPtr(new RRset(test_name, RRClass::IN(),
  277. RRType::RRSIG(), RRTTL(3600)));
  278. // another signature algorithm (4 = ECC)
  279. rrset_rrsig->addRdata(generic::RRSIG("A 4 3 3600 "
  280. "20000101000000 20000201000000 "
  281. "12345 example.com. FAKEFAKEFAKE"));
  282. rrset_a->addRRsig(rrset_rrsig);
  283. EXPECT_EQ(3, sp->getRdataCount());
  284. }
  285. TEST_F(RRsetRRSIGTest, getRRsigDataCount) {
  286. EXPECT_EQ(1, rrset_aaaa->getRRsigDataCount());
  287. EXPECT_EQ(0, rrset_a->getRRsigDataCount());
  288. rrset_rrsig = RRsetPtr(new RRset(test_name, RRClass::IN(),
  289. RRType::RRSIG(), RRTTL(3600)));
  290. // one signature algorithm (5 = RSA/SHA-1)
  291. rrset_rrsig->addRdata(generic::RRSIG("A 5 3 3600 "
  292. "20000101000000 20000201000000 "
  293. "12345 example.com. FAKEFAKEFAKE"));
  294. // another signature algorithm (3 = DSA/SHA-1)
  295. rrset_rrsig->addRdata(generic::RRSIG("A 3 3 3600 "
  296. "20000101000000 20000201000000 "
  297. "12345 example.com. FAKEFAKEFAKE"));
  298. rrset_a->addRRsig(rrset_rrsig);
  299. EXPECT_EQ(2, rrset_a->getRRsigDataCount());
  300. rrset_a->removeRRsig();
  301. EXPECT_EQ(0, rrset_a->getRRsigDataCount());
  302. }
  303. TEST_F(RRsetRRSIGTest, toText) {
  304. // toText() should also return the associated RRSIG.
  305. EXPECT_EQ("test.example.com. 3600 IN AAAA 2001:db8::1234\n"
  306. "test.example.com. 3600 IN RRSIG AAAA 5 3 7200 "
  307. "20100322084538 20100220084538 1 example.com. FAKEFAKEFAKEFAKE\n",
  308. rrset_aaaa->toText());
  309. }
  310. }