message_unittest.cc 20 KB

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