message_unittest.cc 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731
  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 <fstream>
  15. #include <boost/scoped_ptr.hpp>
  16. #include <exceptions/exceptions.h>
  17. #include <util/buffer.h>
  18. #include <util/time_utilities.h>
  19. #include <util/unittests/testdata.h>
  20. #include <util/unittests/textdata.h>
  21. #include <dns/edns.h>
  22. #include <dns/exceptions.h>
  23. #include <dns/message.h>
  24. #include <dns/messagerenderer.h>
  25. #include <dns/question.h>
  26. #include <dns/opcode.h>
  27. #include <dns/rcode.h>
  28. #include <dns/rdataclass.h>
  29. #include <dns/rrclass.h>
  30. #include <dns/rrttl.h>
  31. #include <dns/rrtype.h>
  32. #include <dns/tsig.h>
  33. #include <dns/tsigkey.h>
  34. #include <gtest/gtest.h>
  35. #include <dns/tests/unittest_util.h>
  36. using isc::UnitTestUtil;
  37. using namespace std;
  38. using namespace isc;
  39. using namespace isc::dns;
  40. using namespace isc::util;
  41. using namespace isc::dns::rdata;
  42. //
  43. // Note: we need more tests, including:
  44. // parsing malformed headers
  45. // more complete tests about parsing/rendering header flags, opcode, rcode, etc.
  46. // tests for adding RRsets
  47. // tests for RRset/Question iterators
  48. // But, we'll ship with the current set of tests for now, partly because many
  49. // of the above are covered as part of other tests, and partly due to time
  50. // limitation. We also expect to revisit the fundamental design of the Message
  51. // class, at which point we'll also revise the tests including more cases.
  52. //
  53. const uint16_t Message::DEFAULT_MAX_UDPSIZE;
  54. const Name test_name("test.example.com");
  55. namespace isc {
  56. namespace util {
  57. namespace detail {
  58. extern int64_t (*gettimeFunction)();
  59. }
  60. }
  61. }
  62. // XXX: this is defined as class static constants, but some compilers
  63. // seemingly cannot find the symbol when used in the EXPECT_xxx macros.
  64. const uint16_t TSIGContext::DEFAULT_FUDGE;
  65. namespace {
  66. class MessageTest : public ::testing::Test {
  67. protected:
  68. MessageTest() : obuffer(0), renderer(obuffer),
  69. message_parse(Message::PARSE),
  70. message_render(Message::RENDER),
  71. bogus_section(static_cast<Message::Section>(
  72. Message::SECTION_ADDITIONAL + 1)),
  73. tsig_ctx(TSIGKey("www.example.com:"
  74. "SFuWd/q99SzF8Yzd1QbB9g=="))
  75. {
  76. rrset_a = RRsetPtr(new RRset(test_name, RRClass::IN(),
  77. RRType::A(), RRTTL(3600)));
  78. rrset_a->addRdata(in::A("192.0.2.1"));
  79. rrset_a->addRdata(in::A("192.0.2.2"));
  80. rrset_aaaa = RRsetPtr(new RRset(test_name, RRClass::IN(),
  81. RRType::AAAA(), RRTTL(3600)));
  82. rrset_aaaa->addRdata(in::AAAA("2001:db8::1234"));
  83. rrset_rrsig = RRsetPtr(new RRset(test_name, RRClass::IN(),
  84. RRType::RRSIG(), RRTTL(3600)));
  85. rrset_rrsig->addRdata(generic::RRSIG("AAAA 5 3 7200 20100322084538 "
  86. "20100220084538 1 example.com "
  87. "FAKEFAKEFAKEFAKE"));
  88. rrset_aaaa->addRRsig(rrset_rrsig);
  89. }
  90. static Question factoryFromFile(const char* datafile);
  91. OutputBuffer obuffer;
  92. MessageRenderer renderer;
  93. Message message_parse;
  94. Message message_render;
  95. const Message::Section bogus_section;
  96. RRsetPtr rrset_a; // A RRset with two RDATAs
  97. RRsetPtr rrset_aaaa; // AAAA RRset with one RDATA with RRSIG
  98. RRsetPtr rrset_rrsig; // RRSIG for the AAAA RRset
  99. TSIGContext tsig_ctx;
  100. vector<unsigned char> expected_data;
  101. static void factoryFromFile(Message& message, const char* datafile);
  102. };
  103. void
  104. MessageTest::factoryFromFile(Message& message, const char* datafile) {
  105. std::vector<unsigned char> data;
  106. UnitTestUtil::readWireData(datafile, data);
  107. InputBuffer buffer(&data[0], data.size());
  108. message.fromWire(buffer);
  109. }
  110. TEST_F(MessageTest, headerFlag) {
  111. // by default no flag is set
  112. EXPECT_FALSE(message_render.getHeaderFlag(Message::HEADERFLAG_QR));
  113. EXPECT_FALSE(message_render.getHeaderFlag(Message::HEADERFLAG_AA));
  114. EXPECT_FALSE(message_render.getHeaderFlag(Message::HEADERFLAG_TC));
  115. EXPECT_FALSE(message_render.getHeaderFlag(Message::HEADERFLAG_RD));
  116. EXPECT_FALSE(message_render.getHeaderFlag(Message::HEADERFLAG_RA));
  117. EXPECT_FALSE(message_render.getHeaderFlag(Message::HEADERFLAG_AD));
  118. EXPECT_FALSE(message_render.getHeaderFlag(Message::HEADERFLAG_CD));
  119. // set operation: by default it will be on
  120. message_render.setHeaderFlag(Message::HEADERFLAG_QR);
  121. EXPECT_TRUE(message_render.getHeaderFlag(Message::HEADERFLAG_QR));
  122. // it can be set to on explicitly, too
  123. message_render.setHeaderFlag(Message::HEADERFLAG_AA, true);
  124. EXPECT_TRUE(message_render.getHeaderFlag(Message::HEADERFLAG_AA));
  125. // the bit can also be cleared
  126. message_render.setHeaderFlag(Message::HEADERFLAG_AA, false);
  127. EXPECT_FALSE(message_render.getHeaderFlag(Message::HEADERFLAG_AA));
  128. // Invalid flag values
  129. EXPECT_THROW(message_render.setHeaderFlag(
  130. static_cast<Message::HeaderFlag>(0)), InvalidParameter);
  131. EXPECT_THROW(message_render.setHeaderFlag(
  132. static_cast<Message::HeaderFlag>(0x7000)),
  133. InvalidParameter);
  134. EXPECT_THROW(message_render.setHeaderFlag(
  135. static_cast<Message::HeaderFlag>(0x0800)),
  136. InvalidParameter);
  137. EXPECT_THROW(message_render.setHeaderFlag(
  138. static_cast<Message::HeaderFlag>(0x0040)),
  139. InvalidParameter);
  140. EXPECT_THROW(message_render.setHeaderFlag(
  141. static_cast<Message::HeaderFlag>(0x10000)),
  142. InvalidParameter);
  143. EXPECT_THROW(message_render.setHeaderFlag(
  144. static_cast<Message::HeaderFlag>(0x80000000)),
  145. InvalidParameter);
  146. // set operation isn't allowed in the parse mode.
  147. EXPECT_THROW(message_parse.setHeaderFlag(Message::HEADERFLAG_QR),
  148. InvalidMessageOperation);
  149. }
  150. TEST_F(MessageTest, getEDNS) {
  151. EXPECT_FALSE(message_parse.getEDNS()); // by default EDNS isn't set
  152. factoryFromFile(message_parse, "message_fromWire10.wire");
  153. EXPECT_TRUE(message_parse.getEDNS());
  154. EXPECT_EQ(0, message_parse.getEDNS()->getVersion());
  155. EXPECT_EQ(4096, message_parse.getEDNS()->getUDPSize());
  156. EXPECT_TRUE(message_parse.getEDNS()->getDNSSECAwareness());
  157. }
  158. TEST_F(MessageTest, setEDNS) {
  159. // setEDNS() isn't allowed in the parse mode
  160. EXPECT_THROW(message_parse.setEDNS(EDNSPtr(new EDNS())),
  161. InvalidMessageOperation);
  162. EDNSPtr edns = EDNSPtr(new EDNS());
  163. message_render.setEDNS(edns);
  164. EXPECT_EQ(edns, message_render.getEDNS());
  165. }
  166. TEST_F(MessageTest, fromWireWithTSIG) {
  167. // Initially there should be no TSIG
  168. EXPECT_EQ(static_cast<void*>(NULL), message_parse.getTSIGRecord());
  169. // getTSIGRecord() is only valid in the parse mode.
  170. EXPECT_THROW(message_render.getTSIGRecord(), InvalidMessageOperation);
  171. factoryFromFile(message_parse, "message_toWire2.wire");
  172. const char expected_mac[] = {
  173. 0x22, 0x70, 0x26, 0xad, 0x29, 0x7b, 0xee, 0xe7,
  174. 0x21, 0xce, 0x6c, 0x6f, 0xff, 0x1e, 0x9e, 0xf3
  175. };
  176. const TSIGRecord* tsig_rr = message_parse.getTSIGRecord();
  177. ASSERT_NE(static_cast<void*>(NULL), tsig_rr);
  178. EXPECT_EQ(Name("www.example.com"), tsig_rr->getName());
  179. EXPECT_EQ(85, tsig_rr->getLength()); // see TSIGRecordTest.getLength
  180. EXPECT_EQ(TSIGKey::HMACMD5_NAME(), tsig_rr->getRdata().getAlgorithm());
  181. EXPECT_EQ(0x4da8877a, tsig_rr->getRdata().getTimeSigned());
  182. EXPECT_EQ(TSIGContext::DEFAULT_FUDGE, tsig_rr->getRdata().getFudge());
  183. EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData,
  184. tsig_rr->getRdata().getMAC(),
  185. tsig_rr->getRdata().getMACSize(),
  186. expected_mac, sizeof(expected_mac));
  187. EXPECT_EQ(0, tsig_rr->getRdata().getError());
  188. EXPECT_EQ(0, tsig_rr->getRdata().getOtherLen());
  189. EXPECT_EQ(static_cast<void*>(NULL), tsig_rr->getRdata().getOtherData());
  190. // If we clear the message for reuse, the recorded TSIG will be cleared.
  191. message_parse.clear(Message::PARSE);
  192. EXPECT_EQ(static_cast<void*>(NULL), message_parse.getTSIGRecord());
  193. }
  194. TEST_F(MessageTest, fromWireWithTSIGCompressed) {
  195. // Mostly same as fromWireWithTSIG, but the TSIG owner name is compressed.
  196. factoryFromFile(message_parse, "message_fromWire12.wire");
  197. const TSIGRecord* tsig_rr = message_parse.getTSIGRecord();
  198. ASSERT_NE(static_cast<void*>(NULL), tsig_rr);
  199. EXPECT_EQ(Name("www.example.com"), tsig_rr->getName());
  200. // len(www.example.com) = 17, but when fully compressed, the length is
  201. // 2 bytes. So the length of the record should be 15 bytes shorter.
  202. EXPECT_EQ(70, tsig_rr->getLength());
  203. }
  204. TEST_F(MessageTest, fromWireWithBadTSIG) {
  205. // Multiple TSIG RRs
  206. EXPECT_THROW(factoryFromFile(message_parse, "message_fromWire13.wire"),
  207. DNSMessageFORMERR);
  208. message_parse.clear(Message::PARSE);
  209. // TSIG in the answer section (must be in additional)
  210. EXPECT_THROW(factoryFromFile(message_parse, "message_fromWire14.wire"),
  211. DNSMessageFORMERR);
  212. message_parse.clear(Message::PARSE);
  213. // TSIG is not the last record.
  214. EXPECT_THROW(factoryFromFile(message_parse, "message_fromWire15.wire"),
  215. DNSMessageFORMERR);
  216. message_parse.clear(Message::PARSE);
  217. // Unexpected RR Class (this will fail in constructing TSIGRecord)
  218. EXPECT_THROW(factoryFromFile(message_parse, "message_fromWire16.wire"),
  219. DNSMessageFORMERR);
  220. }
  221. TEST_F(MessageTest, getRRCount) {
  222. // by default all counters should be 0
  223. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_QUESTION));
  224. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_ANSWER));
  225. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_AUTHORITY));
  226. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_ADDITIONAL));
  227. message_render.addQuestion(Question(Name("test.example.com"),
  228. RRClass::IN(), RRType::A()));
  229. EXPECT_EQ(1, message_render.getRRCount(Message::SECTION_QUESTION));
  230. // rrset_a contains two RRs
  231. message_render.addRRset(Message::SECTION_ANSWER, rrset_a);
  232. EXPECT_EQ(2, message_render.getRRCount(Message::SECTION_ANSWER));
  233. // parse a message containing a Question and EDNS OPT RR.
  234. // OPT shouldn't be counted as normal RR, so result of getRRCount
  235. // shouldn't change.
  236. factoryFromFile(message_parse, "message_fromWire11.wire");
  237. EXPECT_EQ(1, message_render.getRRCount(Message::SECTION_QUESTION));
  238. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_ADDITIONAL));
  239. // out-of-band section ID
  240. EXPECT_THROW(message_parse.getRRCount(bogus_section), OutOfRange);
  241. }
  242. TEST_F(MessageTest, addRRset) {
  243. // default case
  244. message_render.addRRset(Message::SECTION_ANSWER, rrset_a);
  245. EXPECT_EQ(rrset_a,
  246. *message_render.beginSection(Message::SECTION_ANSWER));
  247. EXPECT_EQ(2, message_render.getRRCount(Message::SECTION_ANSWER));
  248. // signed RRset, default case
  249. message_render.clear(Message::RENDER);
  250. message_render.addRRset(Message::SECTION_ANSWER, rrset_aaaa);
  251. EXPECT_EQ(rrset_aaaa,
  252. *message_render.beginSection(Message::SECTION_ANSWER));
  253. EXPECT_EQ(1, message_render.getRRCount(Message::SECTION_ANSWER));
  254. // signed RRset, add with the RRSIG. getRRCount() should return 2
  255. message_render.clear(Message::RENDER);
  256. message_render.addRRset(Message::SECTION_ANSWER, rrset_aaaa, true);
  257. EXPECT_EQ(rrset_aaaa,
  258. *message_render.beginSection(Message::SECTION_ANSWER));
  259. EXPECT_EQ(2, message_render.getRRCount(Message::SECTION_ANSWER));
  260. // signed RRset, add explicitly without RRSIG.
  261. message_render.clear(Message::RENDER);
  262. message_render.addRRset(Message::SECTION_ANSWER, rrset_aaaa, false);
  263. EXPECT_EQ(rrset_aaaa,
  264. *message_render.beginSection(Message::SECTION_ANSWER));
  265. EXPECT_EQ(1, message_render.getRRCount(Message::SECTION_ANSWER));
  266. }
  267. TEST_F(MessageTest, badAddRRset) {
  268. // addRRset() isn't allowed in the parse mode.
  269. EXPECT_THROW(message_parse.addRRset(Message::SECTION_ANSWER,
  270. rrset_a), InvalidMessageOperation);
  271. // out-of-band section ID
  272. EXPECT_THROW(message_render.addRRset(bogus_section, rrset_a), OutOfRange);
  273. }
  274. TEST_F(MessageTest, hasRRset) {
  275. message_render.addRRset(Message::SECTION_ANSWER, rrset_a);
  276. EXPECT_TRUE(message_render.hasRRset(Message::SECTION_ANSWER, test_name,
  277. RRClass::IN(), RRType::A()));
  278. // section doesn't match
  279. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ADDITIONAL, test_name,
  280. RRClass::IN(), RRType::A()));
  281. // name doesn't match
  282. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ANSWER,
  283. Name("nomatch.example"),
  284. RRClass::IN(), RRType::A()));
  285. // RR class doesn't match
  286. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ANSWER, test_name,
  287. RRClass::CH(), RRType::A()));
  288. // RR type doesn't match
  289. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ANSWER, test_name,
  290. RRClass::IN(), RRType::AAAA()));
  291. // out-of-band section ID
  292. EXPECT_THROW(message_render.hasRRset(bogus_section, test_name,
  293. RRClass::IN(), RRType::A()),
  294. OutOfRange);
  295. // Repeat the checks having created an RRset of the appropriate type.
  296. RRsetPtr rrs1(new RRset(test_name, RRClass::IN(), RRType::A(), RRTTL(60)));
  297. EXPECT_TRUE(message_render.hasRRset(Message::SECTION_ANSWER, rrs1));
  298. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ADDITIONAL, rrs1));
  299. RRsetPtr rrs2(new RRset(Name("nomatch.example"), RRClass::IN(), RRType::A(),
  300. RRTTL(5)));
  301. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ANSWER, rrs2));
  302. RRsetPtr rrs3(new RRset(test_name, RRClass::CH(), RRType::A(), RRTTL(60)));
  303. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ANSWER, rrs3));
  304. RRsetPtr rrs4(new RRset(test_name, RRClass::IN(), RRType::AAAA(), RRTTL(5)));
  305. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ANSWER, rrs4));
  306. RRsetPtr rrs5(new RRset(test_name, RRClass::IN(), RRType::AAAA(), RRTTL(5)));
  307. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ANSWER, rrs4));
  308. EXPECT_THROW(message_render.hasRRset(bogus_section, rrs1), OutOfRange);
  309. }
  310. TEST_F(MessageTest, removeRRset) {
  311. message_render.addRRset(Message::SECTION_ANSWER, rrset_a);
  312. message_render.addRRset(Message::SECTION_ANSWER, rrset_aaaa);
  313. EXPECT_TRUE(message_render.hasRRset(Message::SECTION_ANSWER, test_name,
  314. RRClass::IN(), RRType::A()));
  315. EXPECT_TRUE(message_render.hasRRset(Message::SECTION_ANSWER, test_name,
  316. RRClass::IN(), RRType::AAAA()));
  317. EXPECT_EQ(3, message_render.getRRCount(Message::SECTION_ANSWER));
  318. // Locate the AAAA RRset and remove it; this has one RR in it.
  319. RRsetIterator i = message_render.beginSection(Message::SECTION_ANSWER);
  320. if ((*i)->getType() == RRType::A()) {
  321. ++i;
  322. }
  323. EXPECT_EQ(RRType::AAAA(), (*i)->getType());
  324. message_render.removeRRset(Message::SECTION_ANSWER, i);
  325. EXPECT_TRUE(message_render.hasRRset(Message::SECTION_ANSWER, test_name,
  326. RRClass::IN(), RRType::A()));
  327. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ANSWER, test_name,
  328. RRClass::IN(), RRType::AAAA()));
  329. EXPECT_EQ(2, message_render.getRRCount(Message::SECTION_ANSWER));
  330. }
  331. TEST_F(MessageTest, clearQuestionSection) {
  332. QuestionPtr q(new Question(Name("www.example.com"), RRClass::IN(),
  333. RRType::A()));
  334. message_render.addQuestion(q);
  335. ASSERT_EQ(1, message_render.getRRCount(Message::SECTION_QUESTION));
  336. message_render.clearSection(Message::SECTION_QUESTION);
  337. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_QUESTION));
  338. }
  339. TEST_F(MessageTest, clearAnswerSection) {
  340. // Add two RRsets, check they are present, clear the section,
  341. // check if they are gone.
  342. message_render.addRRset(Message::SECTION_ANSWER, rrset_a);
  343. message_render.addRRset(Message::SECTION_ANSWER, rrset_aaaa);
  344. ASSERT_TRUE(message_render.hasRRset(Message::SECTION_ANSWER, test_name,
  345. RRClass::IN(), RRType::A()));
  346. ASSERT_TRUE(message_render.hasRRset(Message::SECTION_ANSWER, test_name,
  347. RRClass::IN(), RRType::AAAA()));
  348. ASSERT_EQ(3, message_render.getRRCount(Message::SECTION_ANSWER));
  349. message_render.clearSection(Message::SECTION_ANSWER);
  350. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ANSWER, test_name,
  351. RRClass::IN(), RRType::A()));
  352. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ANSWER, test_name,
  353. RRClass::IN(), RRType::AAAA()));
  354. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_ANSWER));
  355. }
  356. TEST_F(MessageTest, clearAuthoritySection) {
  357. // Add two RRsets, check they are present, clear the section,
  358. // check if they are gone.
  359. message_render.addRRset(Message::SECTION_AUTHORITY, rrset_a);
  360. message_render.addRRset(Message::SECTION_AUTHORITY, rrset_aaaa);
  361. ASSERT_TRUE(message_render.hasRRset(Message::SECTION_AUTHORITY, test_name,
  362. RRClass::IN(), RRType::A()));
  363. ASSERT_TRUE(message_render.hasRRset(Message::SECTION_AUTHORITY, test_name,
  364. RRClass::IN(), RRType::AAAA()));
  365. ASSERT_EQ(3, message_render.getRRCount(Message::SECTION_AUTHORITY));
  366. message_render.clearSection(Message::SECTION_AUTHORITY);
  367. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_AUTHORITY, test_name,
  368. RRClass::IN(), RRType::A()));
  369. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_AUTHORITY, test_name,
  370. RRClass::IN(), RRType::AAAA()));
  371. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_AUTHORITY));
  372. }
  373. TEST_F(MessageTest, clearAdditionalSection) {
  374. // Add two RRsets, check they are present, clear the section,
  375. // check if they are gone.
  376. message_render.addRRset(Message::SECTION_ADDITIONAL, rrset_a);
  377. message_render.addRRset(Message::SECTION_ADDITIONAL, rrset_aaaa);
  378. ASSERT_TRUE(message_render.hasRRset(Message::SECTION_ADDITIONAL, test_name,
  379. RRClass::IN(), RRType::A()));
  380. ASSERT_TRUE(message_render.hasRRset(Message::SECTION_ADDITIONAL, test_name,
  381. RRClass::IN(), RRType::AAAA()));
  382. ASSERT_EQ(3, message_render.getRRCount(Message::SECTION_ADDITIONAL));
  383. message_render.clearSection(Message::SECTION_ADDITIONAL);
  384. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ADDITIONAL, test_name,
  385. RRClass::IN(), RRType::A()));
  386. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ADDITIONAL, test_name,
  387. RRClass::IN(), RRType::AAAA()));
  388. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_ADDITIONAL));
  389. }
  390. TEST_F(MessageTest, badBeginSection) {
  391. // valid cases are tested via other tests
  392. EXPECT_THROW(message_render.beginSection(Message::SECTION_QUESTION),
  393. InvalidMessageSection);
  394. EXPECT_THROW(message_render.beginSection(bogus_section), OutOfRange);
  395. }
  396. TEST_F(MessageTest, badEndSection) {
  397. // valid cases are tested via other tests
  398. EXPECT_THROW(message_render.endSection(Message::SECTION_QUESTION),
  399. InvalidMessageSection);
  400. EXPECT_THROW(message_render.endSection(bogus_section), OutOfRange);
  401. }
  402. TEST_F(MessageTest, appendSection) {
  403. Message target(Message::RENDER);
  404. // Section check
  405. EXPECT_THROW(target.appendSection(bogus_section, message_render),
  406. OutOfRange);
  407. // Make sure nothing is copied if there is nothing to copy
  408. target.appendSection(Message::SECTION_QUESTION, message_render);
  409. EXPECT_EQ(0, target.getRRCount(Message::SECTION_QUESTION));
  410. target.appendSection(Message::SECTION_ANSWER, message_render);
  411. EXPECT_EQ(0, target.getRRCount(Message::SECTION_ANSWER));
  412. target.appendSection(Message::SECTION_AUTHORITY, message_render);
  413. EXPECT_EQ(0, target.getRRCount(Message::SECTION_AUTHORITY));
  414. target.appendSection(Message::SECTION_ADDITIONAL, message_render);
  415. EXPECT_EQ(0, target.getRRCount(Message::SECTION_ADDITIONAL));
  416. // Now add some data, copy again, and see if it got added
  417. message_render.addQuestion(Question(Name("test.example.com"),
  418. RRClass::IN(), RRType::A()));
  419. message_render.addRRset(Message::SECTION_ANSWER, rrset_a);
  420. message_render.addRRset(Message::SECTION_AUTHORITY, rrset_a);
  421. message_render.addRRset(Message::SECTION_ADDITIONAL, rrset_a);
  422. message_render.addRRset(Message::SECTION_ADDITIONAL, rrset_aaaa);
  423. target.appendSection(Message::SECTION_QUESTION, message_render);
  424. EXPECT_EQ(1, target.getRRCount(Message::SECTION_QUESTION));
  425. target.appendSection(Message::SECTION_ANSWER, message_render);
  426. EXPECT_EQ(2, target.getRRCount(Message::SECTION_ANSWER));
  427. EXPECT_TRUE(target.hasRRset(Message::SECTION_ANSWER, test_name,
  428. RRClass::IN(), RRType::A()));
  429. target.appendSection(Message::SECTION_AUTHORITY, message_render);
  430. EXPECT_EQ(2, target.getRRCount(Message::SECTION_AUTHORITY));
  431. EXPECT_TRUE(target.hasRRset(Message::SECTION_AUTHORITY, test_name,
  432. RRClass::IN(), RRType::A()));
  433. target.appendSection(Message::SECTION_ADDITIONAL, message_render);
  434. EXPECT_EQ(3, target.getRRCount(Message::SECTION_ADDITIONAL));
  435. EXPECT_TRUE(target.hasRRset(Message::SECTION_ADDITIONAL, test_name,
  436. RRClass::IN(), RRType::A()));
  437. EXPECT_TRUE(target.hasRRset(Message::SECTION_ADDITIONAL, test_name,
  438. RRClass::IN(), RRType::AAAA()));
  439. // One more test, test to see if the section gets added, not replaced
  440. Message source2(Message::RENDER);
  441. source2.addRRset(Message::SECTION_ANSWER, rrset_aaaa);
  442. target.appendSection(Message::SECTION_ANSWER, source2);
  443. EXPECT_EQ(3, target.getRRCount(Message::SECTION_ANSWER));
  444. EXPECT_TRUE(target.hasRRset(Message::SECTION_ANSWER, test_name,
  445. RRClass::IN(), RRType::A()));
  446. EXPECT_TRUE(target.hasRRset(Message::SECTION_ANSWER, test_name,
  447. RRClass::IN(), RRType::AAAA()));
  448. }
  449. TEST_F(MessageTest, fromWire) {
  450. factoryFromFile(message_parse, "message_fromWire1");
  451. EXPECT_EQ(0x1035, message_parse.getQid());
  452. EXPECT_EQ(Opcode::QUERY(), message_parse.getOpcode());
  453. EXPECT_EQ(Rcode::NOERROR(), message_parse.getRcode());
  454. EXPECT_TRUE(message_parse.getHeaderFlag(Message::HEADERFLAG_QR));
  455. EXPECT_TRUE(message_parse.getHeaderFlag(Message::HEADERFLAG_RD));
  456. EXPECT_TRUE(message_parse.getHeaderFlag(Message::HEADERFLAG_AA));
  457. QuestionPtr q = *message_parse.beginQuestion();
  458. EXPECT_EQ(test_name, q->getName());
  459. EXPECT_EQ(RRType::A(), q->getType());
  460. EXPECT_EQ(RRClass::IN(), q->getClass());
  461. EXPECT_EQ(1, message_parse.getRRCount(Message::SECTION_QUESTION));
  462. EXPECT_EQ(2, message_parse.getRRCount(Message::SECTION_ANSWER));
  463. EXPECT_EQ(0, message_parse.getRRCount(Message::SECTION_AUTHORITY));
  464. EXPECT_EQ(0, message_parse.getRRCount(Message::SECTION_ADDITIONAL));
  465. RRsetPtr rrset = *message_parse.beginSection(Message::SECTION_ANSWER);
  466. EXPECT_EQ(test_name, rrset->getName());
  467. EXPECT_EQ(RRType::A(), rrset->getType());
  468. EXPECT_EQ(RRClass::IN(), rrset->getClass());
  469. // TTL should be 3600, even though that of the 2nd RR is 7200
  470. EXPECT_EQ(RRTTL(3600), rrset->getTTL());
  471. RdataIteratorPtr it = rrset->getRdataIterator();
  472. EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
  473. it->next();
  474. EXPECT_EQ("192.0.2.2", it->getCurrent().toText());
  475. it->next();
  476. EXPECT_TRUE(it->isLast());
  477. }
  478. TEST_F(MessageTest, EDNS0ExtRcode) {
  479. // Extended Rcode = BADVERS
  480. factoryFromFile(message_parse, "message_fromWire10.wire");
  481. EXPECT_EQ(Rcode::BADVERS(), message_parse.getRcode());
  482. // Maximum extended Rcode
  483. message_parse.clear(Message::PARSE);
  484. factoryFromFile(message_parse, "message_fromWire11.wire");
  485. EXPECT_EQ(0xfff, message_parse.getRcode().getCode());
  486. }
  487. TEST_F(MessageTest, BadEDNS0) {
  488. // OPT RR in the answer section
  489. EXPECT_THROW(factoryFromFile(message_parse, "message_fromWire4"),
  490. DNSMessageFORMERR);
  491. // multiple OPT RRs (in the additional section)
  492. message_parse.clear(Message::PARSE);
  493. EXPECT_THROW(factoryFromFile(message_parse, "message_fromWire5"),
  494. DNSMessageFORMERR);
  495. }
  496. TEST_F(MessageTest, toWire) {
  497. message_render.setQid(0x1035);
  498. message_render.setOpcode(Opcode::QUERY());
  499. message_render.setRcode(Rcode::NOERROR());
  500. message_render.setHeaderFlag(Message::HEADERFLAG_QR, true);
  501. message_render.setHeaderFlag(Message::HEADERFLAG_RD, true);
  502. message_render.setHeaderFlag(Message::HEADERFLAG_AA, true);
  503. message_render.addQuestion(Question(Name("test.example.com"), RRClass::IN(),
  504. RRType::A()));
  505. message_render.addRRset(Message::SECTION_ANSWER, rrset_a);
  506. EXPECT_EQ(1, message_render.getRRCount(Message::SECTION_QUESTION));
  507. EXPECT_EQ(2, message_render.getRRCount(Message::SECTION_ANSWER));
  508. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_AUTHORITY));
  509. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_ADDITIONAL));
  510. message_render.toWire(renderer);
  511. vector<unsigned char> data;
  512. UnitTestUtil::readWireData("message_toWire1", data);
  513. EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, obuffer.getData(),
  514. obuffer.getLength(), &data[0], data.size());
  515. }
  516. TEST_F(MessageTest, toWireInParseMode) {
  517. // toWire() isn't allowed in the parse mode.
  518. EXPECT_THROW(message_parse.toWire(renderer), InvalidMessageOperation);
  519. }
  520. // See dnssectime_unittest.cc
  521. template <int64_t NOW>
  522. int64_t
  523. testGetTime() {
  524. return (NOW);
  525. }
  526. void
  527. commonTSIGToWireCheck(Message& message, MessageRenderer& renderer,
  528. TSIGContext& tsig_ctx, const char* const expected_file)
  529. {
  530. message.setOpcode(Opcode::QUERY());
  531. message.setRcode(Rcode::NOERROR());
  532. message.setHeaderFlag(Message::HEADERFLAG_RD, true);
  533. message.addQuestion(Question(Name("www.example.com"), RRClass::IN(),
  534. RRType::A()));
  535. message.toWire(renderer, tsig_ctx);
  536. vector<unsigned char> expected_data;
  537. UnitTestUtil::readWireData(expected_file, expected_data);
  538. EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, renderer.getData(),
  539. renderer.getLength(),
  540. &expected_data[0], expected_data.size());
  541. }
  542. TEST_F(MessageTest, toWireWithTSIG) {
  543. // Rendering a message with TSIG. Various special cases specific to
  544. // TSIG are tested in the tsig tests. We only check the message contains
  545. // a TSIG at the end and the ARCOUNT of the header is updated.
  546. isc::util::detail::gettimeFunction = testGetTime<0x4da8877a>;
  547. message_render.setQid(0x2d65);
  548. {
  549. SCOPED_TRACE("Message sign with TSIG");
  550. commonTSIGToWireCheck(message_render, renderer, tsig_ctx,
  551. "message_toWire2.wire");
  552. }
  553. }
  554. TEST_F(MessageTest, toWireWithEDNSAndTSIG) {
  555. // Similar to the previous test, but with an EDNS before TSIG.
  556. // The wire data check will confirm the ordering.
  557. isc::util::detail::gettimeFunction = testGetTime<0x4db60d1f>;
  558. message_render.setQid(0x6cd);
  559. EDNSPtr edns(new EDNS());
  560. edns->setUDPSize(4096);
  561. message_render.setEDNS(edns);
  562. {
  563. SCOPED_TRACE("Message sign with TSIG and EDNS");
  564. commonTSIGToWireCheck(message_render, renderer, tsig_ctx,
  565. "message_toWire3.wire");
  566. }
  567. }
  568. TEST_F(MessageTest, toWireWithoutOpcode) {
  569. message_render.setRcode(Rcode::NOERROR());
  570. EXPECT_THROW(message_render.toWire(renderer), InvalidMessageOperation);
  571. }
  572. TEST_F(MessageTest, toWireWithoutRcode) {
  573. message_render.setOpcode(Opcode::QUERY());
  574. EXPECT_THROW(message_render.toWire(renderer), InvalidMessageOperation);
  575. }
  576. TEST_F(MessageTest, toText) {
  577. // Check toText() output for a typical DNS response with records in
  578. // all sections
  579. factoryFromFile(message_parse, "message_toText1.wire");
  580. {
  581. SCOPED_TRACE("Message toText test (basic case)");
  582. ifstream ifs;
  583. unittests::openTestData("message_toText1.txt", ifs);
  584. unittests::matchTextData(ifs, message_parse.toText());
  585. }
  586. // Another example with EDNS. The expected data was slightly modified
  587. // from the dig output (other than replacing tabs with a space): adding
  588. // a newline after the "OPT PSEUDOSECTION". This is an intentional change
  589. // in our version for better readability.
  590. message_parse.clear(Message::PARSE);
  591. factoryFromFile(message_parse, "message_toText2.wire");
  592. {
  593. SCOPED_TRACE("Message toText test with EDNS");
  594. ifstream ifs;
  595. unittests::openTestData("message_toText2.txt", ifs);
  596. unittests::matchTextData(ifs, message_parse.toText());
  597. }
  598. // Another example with TSIG. The expected data was slightly modified
  599. // from the dig output (other than replacing tabs with a space): removing
  600. // a redundant white space at the end of TSIG RDATA. We'd rather consider
  601. // it a dig's defect than a feature.
  602. message_parse.clear(Message::PARSE);
  603. factoryFromFile(message_parse, "message_toText3.wire");
  604. {
  605. SCOPED_TRACE("Message toText test with TSIG");
  606. ifstream ifs;
  607. unittests::openTestData("message_toText3.txt", ifs);
  608. unittests::matchTextData(ifs, message_parse.toText());
  609. }
  610. }
  611. TEST_F(MessageTest, toTextWithoutOpcode) {
  612. message_render.setRcode(Rcode::NOERROR());
  613. EXPECT_THROW(message_render.toText(), InvalidMessageOperation);
  614. }
  615. TEST_F(MessageTest, toTextWithoutRcode) {
  616. message_render.setOpcode(Opcode::QUERY());
  617. EXPECT_THROW(message_render.toText(), InvalidMessageOperation);
  618. }
  619. }