message_unittest.cc 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  1. // Copyright (C) 2010 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. // $Id$
  15. #include <exceptions/exceptions.h>
  16. #include <dns/buffer.h>
  17. #include <dns/edns.h>
  18. #include <dns/exceptions.h>
  19. #include <dns/message.h>
  20. #include <dns/messagerenderer.h>
  21. #include <dns/question.h>
  22. #include <dns/opcode.h>
  23. #include <dns/rcode.h>
  24. #include <dns/rdataclass.h>
  25. #include <dns/rrclass.h>
  26. #include <dns/rrttl.h>
  27. #include <dns/rrtype.h>
  28. #include <gtest/gtest.h>
  29. #include <dns/tests/unittest_util.h>
  30. using isc::UnitTestUtil;
  31. using namespace std;
  32. using namespace isc;
  33. using namespace isc::dns;
  34. using namespace isc::dns::rdata;
  35. //
  36. // Note: we need more tests, including:
  37. // parsing malformed headers
  38. // more complete tests about parsing/rendering header flags, opcode, rcode, etc.
  39. // tests for adding RRsets
  40. // tests for RRset/Question iterators
  41. // But, we'll ship with the current set of tests for now, partly because many
  42. // of the above are covered as part of other tests, and partly due to time
  43. // limitation. We also expect to revisit the fundamental design of the Message
  44. // class, at which point we'll also revise the tests including more cases.
  45. //
  46. const uint16_t Message::DEFAULT_MAX_UDPSIZE;
  47. const Name test_name("test.example.com");
  48. namespace {
  49. class MessageTest : public ::testing::Test {
  50. protected:
  51. MessageTest() : obuffer(0), renderer(obuffer),
  52. message_parse(Message::PARSE),
  53. message_render(Message::RENDER),
  54. bogus_section(static_cast<Message::Section>(
  55. Message::SECTION_ADDITIONAL + 1))
  56. {
  57. rrset_a = RRsetPtr(new RRset(test_name, RRClass::IN(),
  58. RRType::A(), RRTTL(3600)));
  59. rrset_a->addRdata(in::A("192.0.2.1"));
  60. rrset_a->addRdata(in::A("192.0.2.2"));
  61. rrset_aaaa = RRsetPtr(new RRset(test_name, RRClass::IN(),
  62. RRType::AAAA(), RRTTL(3600)));
  63. rrset_aaaa->addRdata(in::AAAA("2001:db8::1234"));
  64. rrset_rrsig = RRsetPtr(new RRset(test_name, RRClass::IN(),
  65. RRType::RRSIG(), RRTTL(3600)));
  66. rrset_rrsig->addRdata(generic::RRSIG("AAAA 5 3 7200 20100322084538 "
  67. "20100220084538 1 example.com "
  68. "FAKEFAKEFAKEFAKE"));
  69. rrset_aaaa->addRRsig(rrset_rrsig);
  70. }
  71. static Question factoryFromFile(const char* datafile);
  72. OutputBuffer obuffer;
  73. MessageRenderer renderer;
  74. Message message_parse;
  75. Message message_render;
  76. const Message::Section bogus_section;
  77. RRsetPtr rrset_a; // A RRset with two RDATAs
  78. RRsetPtr rrset_aaaa; // AAAA RRset with one RDATA with RRSIG
  79. RRsetPtr rrset_rrsig; // RRSIG for the AAAA RRset
  80. static void factoryFromFile(Message& message, const char* datafile);
  81. };
  82. void
  83. MessageTest::factoryFromFile(Message& message, const char* datafile) {
  84. std::vector<unsigned char> data;
  85. UnitTestUtil::readWireData(datafile, data);
  86. InputBuffer buffer(&data[0], data.size());
  87. message.fromWire(buffer);
  88. }
  89. TEST_F(MessageTest, headerFlag) {
  90. // by default no flag is set
  91. EXPECT_FALSE(message_render.getHeaderFlag(Message::HEADERFLAG_QR));
  92. EXPECT_FALSE(message_render.getHeaderFlag(Message::HEADERFLAG_AA));
  93. EXPECT_FALSE(message_render.getHeaderFlag(Message::HEADERFLAG_TC));
  94. EXPECT_FALSE(message_render.getHeaderFlag(Message::HEADERFLAG_RD));
  95. EXPECT_FALSE(message_render.getHeaderFlag(Message::HEADERFLAG_RA));
  96. EXPECT_FALSE(message_render.getHeaderFlag(Message::HEADERFLAG_AD));
  97. EXPECT_FALSE(message_render.getHeaderFlag(Message::HEADERFLAG_CD));
  98. // set operation: by default it will be on
  99. message_render.setHeaderFlag(Message::HEADERFLAG_QR);
  100. EXPECT_TRUE(message_render.getHeaderFlag(Message::HEADERFLAG_QR));
  101. // it can be set to on explicitly, too
  102. message_render.setHeaderFlag(Message::HEADERFLAG_AA, true);
  103. EXPECT_TRUE(message_render.getHeaderFlag(Message::HEADERFLAG_AA));
  104. // the bit can also be cleared
  105. message_render.setHeaderFlag(Message::HEADERFLAG_AA, false);
  106. EXPECT_FALSE(message_render.getHeaderFlag(Message::HEADERFLAG_AA));
  107. // Invalid flag values
  108. EXPECT_THROW(message_render.setHeaderFlag(
  109. static_cast<Message::HeaderFlag>(0)), InvalidParameter);
  110. EXPECT_THROW(message_render.setHeaderFlag(
  111. static_cast<Message::HeaderFlag>(0x7000)),
  112. InvalidParameter);
  113. EXPECT_THROW(message_render.setHeaderFlag(
  114. static_cast<Message::HeaderFlag>(0x0800)),
  115. InvalidParameter);
  116. EXPECT_THROW(message_render.setHeaderFlag(
  117. static_cast<Message::HeaderFlag>(0x0040)),
  118. InvalidParameter);
  119. EXPECT_THROW(message_render.setHeaderFlag(
  120. static_cast<Message::HeaderFlag>(0x10000)),
  121. InvalidParameter);
  122. EXPECT_THROW(message_render.setHeaderFlag(
  123. static_cast<Message::HeaderFlag>(0x80000000)),
  124. InvalidParameter);
  125. // set operation isn't allowed in the parse mode.
  126. EXPECT_THROW(message_parse.setHeaderFlag(Message::HEADERFLAG_QR),
  127. InvalidMessageOperation);
  128. }
  129. TEST_F(MessageTest, getEDNS) {
  130. EXPECT_FALSE(message_parse.getEDNS()); // by default EDNS isn't set
  131. factoryFromFile(message_parse, "message_fromWire10.wire");
  132. EXPECT_TRUE(message_parse.getEDNS());
  133. EXPECT_EQ(0, message_parse.getEDNS()->getVersion());
  134. EXPECT_EQ(4096, message_parse.getEDNS()->getUDPSize());
  135. EXPECT_TRUE(message_parse.getEDNS()->getDNSSECAwareness());
  136. }
  137. TEST_F(MessageTest, setEDNS) {
  138. // setEDNS() isn't allowed in the parse mode
  139. EXPECT_THROW(message_parse.setEDNS(EDNSPtr(new EDNS())),
  140. InvalidMessageOperation);
  141. EDNSPtr edns = EDNSPtr(new EDNS());
  142. message_render.setEDNS(edns);
  143. EXPECT_EQ(edns, message_render.getEDNS());
  144. }
  145. TEST_F(MessageTest, getRRCount) {
  146. // by default all counters should be 0
  147. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_QUESTION));
  148. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_ANSWER));
  149. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_AUTHORITY));
  150. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_ADDITIONAL));
  151. message_render.addQuestion(Question(Name("test.example.com"),
  152. RRClass::IN(), RRType::A()));
  153. EXPECT_EQ(1, message_render.getRRCount(Message::SECTION_QUESTION));
  154. // rrset_a contains two RRs
  155. message_render.addRRset(Message::SECTION_ANSWER, rrset_a);
  156. EXPECT_EQ(2, message_render.getRRCount(Message::SECTION_ANSWER));
  157. // parse a message containing a Question and EDNS OPT RR.
  158. // OPT shouldn't be counted as normal RR, so result of getRRCount
  159. // shouldn't change.
  160. factoryFromFile(message_parse, "message_fromWire11.wire");
  161. EXPECT_EQ(1, message_render.getRRCount(Message::SECTION_QUESTION));
  162. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_ADDITIONAL));
  163. // out-of-band section ID
  164. EXPECT_THROW(message_parse.getRRCount(bogus_section), OutOfRange);
  165. }
  166. TEST_F(MessageTest, addRRset) {
  167. // default case
  168. message_render.addRRset(Message::SECTION_ANSWER, rrset_a);
  169. EXPECT_EQ(rrset_a,
  170. *message_render.beginSection(Message::SECTION_ANSWER));
  171. EXPECT_EQ(2, message_render.getRRCount(Message::SECTION_ANSWER));
  172. // signed RRset, default case
  173. message_render.clear(Message::RENDER);
  174. message_render.addRRset(Message::SECTION_ANSWER, rrset_aaaa);
  175. EXPECT_EQ(rrset_aaaa,
  176. *message_render.beginSection(Message::SECTION_ANSWER));
  177. EXPECT_EQ(1, message_render.getRRCount(Message::SECTION_ANSWER));
  178. // signed RRset, add with the RRSIG. getRRCount() should return 2
  179. message_render.clear(Message::RENDER);
  180. message_render.addRRset(Message::SECTION_ANSWER, rrset_aaaa, true);
  181. EXPECT_EQ(rrset_aaaa,
  182. *message_render.beginSection(Message::SECTION_ANSWER));
  183. EXPECT_EQ(2, message_render.getRRCount(Message::SECTION_ANSWER));
  184. // signed RRset, add explicitly without RRSIG.
  185. message_render.clear(Message::RENDER);
  186. message_render.addRRset(Message::SECTION_ANSWER, rrset_aaaa, false);
  187. EXPECT_EQ(rrset_aaaa,
  188. *message_render.beginSection(Message::SECTION_ANSWER));
  189. EXPECT_EQ(1, message_render.getRRCount(Message::SECTION_ANSWER));
  190. }
  191. TEST_F(MessageTest, badAddRRset) {
  192. // addRRset() isn't allowed in the parse mode.
  193. EXPECT_THROW(message_parse.addRRset(Message::SECTION_ANSWER,
  194. rrset_a), InvalidMessageOperation);
  195. // out-of-band section ID
  196. EXPECT_THROW(message_render.addRRset(bogus_section, rrset_a), OutOfRange);
  197. }
  198. TEST_F(MessageTest, hasRRset) {
  199. message_render.addRRset(Message::SECTION_ANSWER, rrset_a);
  200. EXPECT_TRUE(message_render.hasRRset(Message::SECTION_ANSWER, test_name,
  201. RRClass::IN(), RRType::A()));
  202. // section doesn't match
  203. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ADDITIONAL, test_name,
  204. RRClass::IN(), RRType::A()));
  205. // name doesn't match
  206. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ANSWER,
  207. Name("nomatch.example"),
  208. RRClass::IN(), RRType::A()));
  209. // RR class doesn't match
  210. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ANSWER, test_name,
  211. RRClass::CH(), RRType::A()));
  212. // RR type doesn't match
  213. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ANSWER, test_name,
  214. RRClass::IN(), RRType::AAAA()));
  215. // out-of-band section ID
  216. EXPECT_THROW(message_render.hasRRset(bogus_section, test_name,
  217. RRClass::IN(), RRType::A()),
  218. OutOfRange);
  219. }
  220. TEST_F(MessageTest, badBeginSection) {
  221. // valid cases are tested via other tests
  222. EXPECT_THROW(message_render.beginSection(Message::SECTION_QUESTION),
  223. InvalidMessageSection);
  224. EXPECT_THROW(message_render.beginSection(bogus_section), OutOfRange);
  225. }
  226. TEST_F(MessageTest, badEndSection) {
  227. // valid cases are tested via other tests
  228. EXPECT_THROW(message_render.endSection(Message::SECTION_QUESTION),
  229. InvalidMessageSection);
  230. EXPECT_THROW(message_render.endSection(bogus_section), OutOfRange);
  231. }
  232. TEST_F(MessageTest, fromWire) {
  233. factoryFromFile(message_parse, "message_fromWire1");
  234. EXPECT_EQ(0x1035, message_parse.getQid());
  235. EXPECT_EQ(Opcode::QUERY(), message_parse.getOpcode());
  236. EXPECT_EQ(Rcode::NOERROR(), message_parse.getRcode());
  237. EXPECT_TRUE(message_parse.getHeaderFlag(Message::HEADERFLAG_QR));
  238. EXPECT_TRUE(message_parse.getHeaderFlag(Message::HEADERFLAG_RD));
  239. EXPECT_TRUE(message_parse.getHeaderFlag(Message::HEADERFLAG_AA));
  240. QuestionPtr q = *message_parse.beginQuestion();
  241. EXPECT_EQ(test_name, q->getName());
  242. EXPECT_EQ(RRType::A(), q->getType());
  243. EXPECT_EQ(RRClass::IN(), q->getClass());
  244. EXPECT_EQ(1, message_parse.getRRCount(Message::SECTION_QUESTION));
  245. EXPECT_EQ(2, message_parse.getRRCount(Message::SECTION_ANSWER));
  246. EXPECT_EQ(0, message_parse.getRRCount(Message::SECTION_AUTHORITY));
  247. EXPECT_EQ(0, message_parse.getRRCount(Message::SECTION_ADDITIONAL));
  248. RRsetPtr rrset = *message_parse.beginSection(Message::SECTION_ANSWER);
  249. EXPECT_EQ(test_name, rrset->getName());
  250. EXPECT_EQ(RRType::A(), rrset->getType());
  251. EXPECT_EQ(RRClass::IN(), rrset->getClass());
  252. // TTL should be 3600, even though that of the 2nd RR is 7200
  253. EXPECT_EQ(RRTTL(3600), rrset->getTTL());
  254. RdataIteratorPtr it = rrset->getRdataIterator();
  255. EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
  256. it->next();
  257. EXPECT_EQ("192.0.2.2", it->getCurrent().toText());
  258. it->next();
  259. EXPECT_TRUE(it->isLast());
  260. }
  261. TEST_F(MessageTest, EDNS0ExtRcode) {
  262. // Extended Rcode = BADVERS
  263. factoryFromFile(message_parse, "message_fromWire10.wire");
  264. EXPECT_EQ(Rcode::BADVERS(), message_parse.getRcode());
  265. // Maximum extended Rcode
  266. message_parse.clear(Message::PARSE);
  267. factoryFromFile(message_parse, "message_fromWire11.wire");
  268. EXPECT_EQ(0xfff, message_parse.getRcode().getCode());
  269. }
  270. TEST_F(MessageTest, BadEDNS0) {
  271. // OPT RR in the answer section
  272. EXPECT_THROW(factoryFromFile(message_parse, "message_fromWire4"),
  273. DNSMessageFORMERR);
  274. // multiple OPT RRs (in the additional section)
  275. message_parse.clear(Message::PARSE);
  276. EXPECT_THROW(factoryFromFile(message_parse, "message_fromWire5"),
  277. DNSMessageFORMERR);
  278. }
  279. TEST_F(MessageTest, toWire) {
  280. message_render.setQid(0x1035);
  281. message_render.setOpcode(Opcode::QUERY());
  282. message_render.setRcode(Rcode::NOERROR());
  283. message_render.setHeaderFlag(Message::HEADERFLAG_QR, true);
  284. message_render.setHeaderFlag(Message::HEADERFLAG_RD, true);
  285. message_render.setHeaderFlag(Message::HEADERFLAG_AA, true);
  286. message_render.addQuestion(Question(Name("test.example.com"), RRClass::IN(),
  287. RRType::A()));
  288. message_render.addRRset(Message::SECTION_ANSWER, rrset_a);
  289. EXPECT_EQ(1, message_render.getRRCount(Message::SECTION_QUESTION));
  290. EXPECT_EQ(2, message_render.getRRCount(Message::SECTION_ANSWER));
  291. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_AUTHORITY));
  292. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_ADDITIONAL));
  293. message_render.toWire(renderer);
  294. vector<unsigned char> data;
  295. UnitTestUtil::readWireData("message_toWire1", data);
  296. EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, obuffer.getData(),
  297. obuffer.getLength(), &data[0], data.size());
  298. }
  299. TEST_F(MessageTest, toWireInParseMode) {
  300. // toWire() isn't allowed in the parse mode.
  301. EXPECT_THROW(message_parse.toWire(renderer), InvalidMessageOperation);
  302. }
  303. TEST_F(MessageTest, toWireWithoutOpcode) {
  304. message_render.setRcode(Rcode::NOERROR());
  305. EXPECT_THROW(message_render.toWire(renderer), InvalidMessageOperation);
  306. }
  307. TEST_F(MessageTest, toWireWithoutRcode) {
  308. message_render.setOpcode(Opcode::QUERY());
  309. EXPECT_THROW(message_render.toWire(renderer), InvalidMessageOperation);
  310. }
  311. TEST_F(MessageTest, toTextWithoutOpcode) {
  312. message_render.setRcode(Rcode::NOERROR());
  313. EXPECT_THROW(message_render.toText(), InvalidMessageOperation);
  314. }
  315. TEST_F(MessageTest, toTextWithoutRcode) {
  316. message_render.setOpcode(Opcode::QUERY());
  317. EXPECT_THROW(message_render.toText(), InvalidMessageOperation);
  318. }
  319. }