message_unittest.cc 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068
  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. namespace isc {
  55. namespace util {
  56. namespace detail {
  57. extern int64_t (*gettimeFunction)();
  58. }
  59. }
  60. }
  61. // XXX: this is defined as class static constants, but some compilers
  62. // seemingly cannot find the symbol when used in the EXPECT_xxx macros.
  63. const uint16_t TSIGContext::DEFAULT_FUDGE;
  64. namespace {
  65. class MessageTest : public ::testing::Test {
  66. protected:
  67. MessageTest() : test_name("test.example.com"), obuffer(0),
  68. message_parse(Message::PARSE),
  69. message_render(Message::RENDER),
  70. bogus_section(static_cast<Message::Section>(
  71. Message::SECTION_ADDITIONAL + 1)),
  72. tsig_ctx(TSIGKey("www.example.com:"
  73. "SFuWd/q99SzF8Yzd1QbB9g=="))
  74. {
  75. rrset_a = RRsetPtr(new RRset(test_name, RRClass::IN(),
  76. RRType::A(), RRTTL(3600)));
  77. rrset_a->addRdata(in::A("192.0.2.1"));
  78. rrset_a->addRdata(in::A("192.0.2.2"));
  79. rrset_aaaa = RRsetPtr(new RRset(test_name, RRClass::IN(),
  80. RRType::AAAA(), RRTTL(3600)));
  81. rrset_aaaa->addRdata(in::AAAA("2001:db8::1234"));
  82. rrset_rrsig = RRsetPtr(new RRset(test_name, RRClass::IN(),
  83. RRType::RRSIG(), RRTTL(3600)));
  84. rrset_rrsig->addRdata(generic::RRSIG("AAAA 5 3 7200 20100322084538 "
  85. "20100220084538 1 example.com "
  86. "FAKEFAKEFAKEFAKE"));
  87. rrset_aaaa->addRRsig(rrset_rrsig);
  88. }
  89. static Question factoryFromFile(const char* datafile);
  90. const Name test_name;
  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> received_data;
  101. vector<unsigned char> expected_data;
  102. void factoryFromFile(Message& message, const char* datafile,
  103. Message::ParseOptions options =
  104. Message::PARSE_DEFAULT);
  105. };
  106. void
  107. MessageTest::factoryFromFile(Message& message, const char* datafile,
  108. Message::ParseOptions options)
  109. {
  110. received_data.clear();
  111. UnitTestUtil::readWireData(datafile, received_data);
  112. InputBuffer buffer(&received_data[0], received_data.size());
  113. message.fromWire(buffer, options);
  114. }
  115. TEST_F(MessageTest, headerFlag) {
  116. // by default no flag is set
  117. EXPECT_FALSE(message_render.getHeaderFlag(Message::HEADERFLAG_QR));
  118. EXPECT_FALSE(message_render.getHeaderFlag(Message::HEADERFLAG_AA));
  119. EXPECT_FALSE(message_render.getHeaderFlag(Message::HEADERFLAG_TC));
  120. EXPECT_FALSE(message_render.getHeaderFlag(Message::HEADERFLAG_RD));
  121. EXPECT_FALSE(message_render.getHeaderFlag(Message::HEADERFLAG_RA));
  122. EXPECT_FALSE(message_render.getHeaderFlag(Message::HEADERFLAG_AD));
  123. EXPECT_FALSE(message_render.getHeaderFlag(Message::HEADERFLAG_CD));
  124. // set operation: by default it will be on
  125. message_render.setHeaderFlag(Message::HEADERFLAG_QR);
  126. EXPECT_TRUE(message_render.getHeaderFlag(Message::HEADERFLAG_QR));
  127. // it can be set to on explicitly, too
  128. message_render.setHeaderFlag(Message::HEADERFLAG_AA, true);
  129. EXPECT_TRUE(message_render.getHeaderFlag(Message::HEADERFLAG_AA));
  130. // the bit can also be cleared
  131. message_render.setHeaderFlag(Message::HEADERFLAG_AA, false);
  132. EXPECT_FALSE(message_render.getHeaderFlag(Message::HEADERFLAG_AA));
  133. // Invalid flag values
  134. EXPECT_THROW(message_render.setHeaderFlag(
  135. static_cast<Message::HeaderFlag>(0)), InvalidParameter);
  136. EXPECT_THROW(message_render.setHeaderFlag(
  137. static_cast<Message::HeaderFlag>(0x7000)),
  138. InvalidParameter);
  139. EXPECT_THROW(message_render.setHeaderFlag(
  140. static_cast<Message::HeaderFlag>(0x0800)),
  141. InvalidParameter);
  142. EXPECT_THROW(message_render.setHeaderFlag(
  143. static_cast<Message::HeaderFlag>(0x0040)),
  144. InvalidParameter);
  145. EXPECT_THROW(message_render.setHeaderFlag(
  146. static_cast<Message::HeaderFlag>(0x10000)),
  147. InvalidParameter);
  148. EXPECT_THROW(message_render.setHeaderFlag(
  149. static_cast<Message::HeaderFlag>(0x80000000)),
  150. InvalidParameter);
  151. // set operation isn't allowed in the parse mode.
  152. EXPECT_THROW(message_parse.setHeaderFlag(Message::HEADERFLAG_QR),
  153. InvalidMessageOperation);
  154. }
  155. TEST_F(MessageTest, getEDNS) {
  156. EXPECT_FALSE(message_parse.getEDNS()); // by default EDNS isn't set
  157. factoryFromFile(message_parse, "message_fromWire10.wire");
  158. EXPECT_TRUE(message_parse.getEDNS());
  159. EXPECT_EQ(0, message_parse.getEDNS()->getVersion());
  160. EXPECT_EQ(4096, message_parse.getEDNS()->getUDPSize());
  161. EXPECT_TRUE(message_parse.getEDNS()->getDNSSECAwareness());
  162. }
  163. TEST_F(MessageTest, setEDNS) {
  164. // setEDNS() isn't allowed in the parse mode
  165. EXPECT_THROW(message_parse.setEDNS(EDNSPtr(new EDNS())),
  166. InvalidMessageOperation);
  167. EDNSPtr edns = EDNSPtr(new EDNS());
  168. message_render.setEDNS(edns);
  169. EXPECT_EQ(edns, message_render.getEDNS());
  170. }
  171. TEST_F(MessageTest, fromWireWithTSIG) {
  172. // Initially there should be no TSIG
  173. EXPECT_EQ(static_cast<void*>(NULL), message_parse.getTSIGRecord());
  174. // getTSIGRecord() is only valid in the parse mode.
  175. EXPECT_THROW(message_render.getTSIGRecord(), InvalidMessageOperation);
  176. factoryFromFile(message_parse, "message_toWire2.wire");
  177. const uint8_t expected_mac[] = {
  178. 0x22, 0x70, 0x26, 0xad, 0x29, 0x7b, 0xee, 0xe7,
  179. 0x21, 0xce, 0x6c, 0x6f, 0xff, 0x1e, 0x9e, 0xf3
  180. };
  181. const TSIGRecord* tsig_rr = message_parse.getTSIGRecord();
  182. ASSERT_NE(static_cast<void*>(NULL), tsig_rr);
  183. EXPECT_EQ(Name("www.example.com"), tsig_rr->getName());
  184. EXPECT_EQ(85, tsig_rr->getLength()); // see TSIGRecordTest.getLength
  185. EXPECT_EQ(TSIGKey::HMACMD5_NAME(), tsig_rr->getRdata().getAlgorithm());
  186. EXPECT_EQ(0x4da8877a, tsig_rr->getRdata().getTimeSigned());
  187. EXPECT_EQ(TSIGContext::DEFAULT_FUDGE, tsig_rr->getRdata().getFudge());
  188. EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData,
  189. tsig_rr->getRdata().getMAC(),
  190. tsig_rr->getRdata().getMACSize(),
  191. expected_mac, sizeof(expected_mac));
  192. EXPECT_EQ(0, tsig_rr->getRdata().getError());
  193. EXPECT_EQ(0, tsig_rr->getRdata().getOtherLen());
  194. EXPECT_EQ(static_cast<void*>(NULL), tsig_rr->getRdata().getOtherData());
  195. // If we clear the message for reuse, the recorded TSIG will be cleared.
  196. message_parse.clear(Message::PARSE);
  197. EXPECT_EQ(static_cast<void*>(NULL), message_parse.getTSIGRecord());
  198. }
  199. TEST_F(MessageTest, fromWireWithTSIGCompressed) {
  200. // Mostly same as fromWireWithTSIG, but the TSIG owner name is compressed.
  201. factoryFromFile(message_parse, "message_fromWire12.wire");
  202. const TSIGRecord* tsig_rr = message_parse.getTSIGRecord();
  203. ASSERT_NE(static_cast<void*>(NULL), tsig_rr);
  204. EXPECT_EQ(Name("www.example.com"), tsig_rr->getName());
  205. // len(www.example.com) = 17, but when fully compressed, the length is
  206. // 2 bytes. So the length of the record should be 15 bytes shorter.
  207. EXPECT_EQ(70, tsig_rr->getLength());
  208. }
  209. TEST_F(MessageTest, fromWireWithBadTSIG) {
  210. // Multiple TSIG RRs
  211. EXPECT_THROW(factoryFromFile(message_parse, "message_fromWire13.wire"),
  212. DNSMessageFORMERR);
  213. message_parse.clear(Message::PARSE);
  214. // TSIG in the answer section (must be in additional)
  215. EXPECT_THROW(factoryFromFile(message_parse, "message_fromWire14.wire"),
  216. DNSMessageFORMERR);
  217. message_parse.clear(Message::PARSE);
  218. // TSIG is not the last record.
  219. EXPECT_THROW(factoryFromFile(message_parse, "message_fromWire15.wire"),
  220. DNSMessageFORMERR);
  221. message_parse.clear(Message::PARSE);
  222. // Unexpected RR Class (this will fail in constructing TSIGRecord)
  223. EXPECT_THROW(factoryFromFile(message_parse, "message_fromWire16.wire"),
  224. DNSMessageFORMERR);
  225. }
  226. TEST_F(MessageTest, getRRCount) {
  227. // by default all counters should be 0
  228. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_QUESTION));
  229. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_ANSWER));
  230. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_AUTHORITY));
  231. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_ADDITIONAL));
  232. message_render.addQuestion(Question(Name("test.example.com"),
  233. RRClass::IN(), RRType::A()));
  234. EXPECT_EQ(1, message_render.getRRCount(Message::SECTION_QUESTION));
  235. // rrset_a contains two RRs
  236. message_render.addRRset(Message::SECTION_ANSWER, rrset_a);
  237. EXPECT_EQ(2, message_render.getRRCount(Message::SECTION_ANSWER));
  238. // parse a message containing a Question and EDNS OPT RR.
  239. // OPT shouldn't be counted as normal RR, so result of getRRCount
  240. // shouldn't change.
  241. factoryFromFile(message_parse, "message_fromWire11.wire");
  242. EXPECT_EQ(1, message_render.getRRCount(Message::SECTION_QUESTION));
  243. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_ADDITIONAL));
  244. // out-of-band section ID
  245. EXPECT_THROW(message_parse.getRRCount(bogus_section), OutOfRange);
  246. }
  247. TEST_F(MessageTest, addRRset) {
  248. // default case
  249. message_render.addRRset(Message::SECTION_ANSWER, rrset_a);
  250. EXPECT_EQ(rrset_a,
  251. *message_render.beginSection(Message::SECTION_ANSWER));
  252. EXPECT_EQ(2, message_render.getRRCount(Message::SECTION_ANSWER));
  253. // signed RRset, default case
  254. message_render.clear(Message::RENDER);
  255. message_render.addRRset(Message::SECTION_ANSWER, rrset_aaaa);
  256. EXPECT_EQ(rrset_aaaa,
  257. *message_render.beginSection(Message::SECTION_ANSWER));
  258. EXPECT_EQ(1, message_render.getRRCount(Message::SECTION_ANSWER));
  259. // signed RRset, add with the RRSIG. getRRCount() should return 2
  260. message_render.clear(Message::RENDER);
  261. message_render.addRRset(Message::SECTION_ANSWER, rrset_aaaa, true);
  262. EXPECT_EQ(rrset_aaaa,
  263. *message_render.beginSection(Message::SECTION_ANSWER));
  264. EXPECT_EQ(2, message_render.getRRCount(Message::SECTION_ANSWER));
  265. // signed RRset, add explicitly without RRSIG.
  266. message_render.clear(Message::RENDER);
  267. message_render.addRRset(Message::SECTION_ANSWER, rrset_aaaa, false);
  268. EXPECT_EQ(rrset_aaaa,
  269. *message_render.beginSection(Message::SECTION_ANSWER));
  270. EXPECT_EQ(1, message_render.getRRCount(Message::SECTION_ANSWER));
  271. }
  272. TEST_F(MessageTest, badAddRRset) {
  273. // addRRset() isn't allowed in the parse mode.
  274. EXPECT_THROW(message_parse.addRRset(Message::SECTION_ANSWER,
  275. rrset_a), InvalidMessageOperation);
  276. // out-of-band section ID
  277. EXPECT_THROW(message_render.addRRset(bogus_section, rrset_a), OutOfRange);
  278. // NULL RRset
  279. EXPECT_THROW(message_render.addRRset(Message::SECTION_ANSWER, RRsetPtr()),
  280. InvalidParameter);
  281. }
  282. TEST_F(MessageTest, hasRRset) {
  283. message_render.addRRset(Message::SECTION_ANSWER, rrset_a);
  284. EXPECT_TRUE(message_render.hasRRset(Message::SECTION_ANSWER, test_name,
  285. RRClass::IN(), RRType::A()));
  286. // section doesn't match
  287. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ADDITIONAL, test_name,
  288. RRClass::IN(), RRType::A()));
  289. // name doesn't match
  290. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ANSWER,
  291. Name("nomatch.example"),
  292. RRClass::IN(), RRType::A()));
  293. // RR class doesn't match
  294. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ANSWER, test_name,
  295. RRClass::CH(), RRType::A()));
  296. // RR type doesn't match
  297. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ANSWER, test_name,
  298. RRClass::IN(), RRType::AAAA()));
  299. // out-of-band section ID
  300. EXPECT_THROW(message_render.hasRRset(bogus_section, test_name,
  301. RRClass::IN(), RRType::A()),
  302. OutOfRange);
  303. // Repeat the checks having created an RRset of the appropriate type.
  304. RRsetPtr rrs1(new RRset(test_name, RRClass::IN(), RRType::A(), RRTTL(60)));
  305. EXPECT_TRUE(message_render.hasRRset(Message::SECTION_ANSWER, rrs1));
  306. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ADDITIONAL, rrs1));
  307. RRsetPtr rrs2(new RRset(Name("nomatch.example"), RRClass::IN(), RRType::A(),
  308. RRTTL(5)));
  309. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ANSWER, rrs2));
  310. RRsetPtr rrs3(new RRset(test_name, RRClass::CH(), RRType::A(), RRTTL(60)));
  311. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ANSWER, rrs3));
  312. RRsetPtr rrs4(new RRset(test_name, RRClass::IN(), RRType::AAAA(), RRTTL(5)));
  313. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ANSWER, rrs4));
  314. RRsetPtr rrs5(new RRset(test_name, RRClass::IN(), RRType::AAAA(), RRTTL(5)));
  315. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ANSWER, rrs4));
  316. EXPECT_THROW(message_render.hasRRset(bogus_section, rrs1), OutOfRange);
  317. }
  318. TEST_F(MessageTest, removeRRset) {
  319. message_render.addRRset(Message::SECTION_ANSWER, rrset_a);
  320. message_render.addRRset(Message::SECTION_ANSWER, rrset_aaaa);
  321. EXPECT_TRUE(message_render.hasRRset(Message::SECTION_ANSWER, test_name,
  322. RRClass::IN(), RRType::A()));
  323. EXPECT_TRUE(message_render.hasRRset(Message::SECTION_ANSWER, test_name,
  324. RRClass::IN(), RRType::AAAA()));
  325. EXPECT_EQ(3, message_render.getRRCount(Message::SECTION_ANSWER));
  326. // Locate the AAAA RRset and remove it; this has one RR in it.
  327. RRsetIterator i = message_render.beginSection(Message::SECTION_ANSWER);
  328. if ((*i)->getType() == RRType::A()) {
  329. ++i;
  330. }
  331. EXPECT_EQ(RRType::AAAA(), (*i)->getType());
  332. message_render.removeRRset(Message::SECTION_ANSWER, i);
  333. EXPECT_TRUE(message_render.hasRRset(Message::SECTION_ANSWER, test_name,
  334. RRClass::IN(), RRType::A()));
  335. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ANSWER, test_name,
  336. RRClass::IN(), RRType::AAAA()));
  337. EXPECT_EQ(2, message_render.getRRCount(Message::SECTION_ANSWER));
  338. }
  339. TEST_F(MessageTest, clearQuestionSection) {
  340. QuestionPtr q(new Question(Name("www.example.com"), RRClass::IN(),
  341. RRType::A()));
  342. message_render.addQuestion(q);
  343. ASSERT_EQ(1, message_render.getRRCount(Message::SECTION_QUESTION));
  344. message_render.clearSection(Message::SECTION_QUESTION);
  345. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_QUESTION));
  346. EXPECT_TRUE(message_render.beginQuestion() ==
  347. message_render.endQuestion());
  348. }
  349. TEST_F(MessageTest, clearAnswerSection) {
  350. // Add two RRsets, check they are present, clear the section,
  351. // check if they are gone.
  352. message_render.addRRset(Message::SECTION_ANSWER, rrset_a);
  353. message_render.addRRset(Message::SECTION_ANSWER, rrset_aaaa);
  354. ASSERT_TRUE(message_render.hasRRset(Message::SECTION_ANSWER, test_name,
  355. RRClass::IN(), RRType::A()));
  356. ASSERT_TRUE(message_render.hasRRset(Message::SECTION_ANSWER, test_name,
  357. RRClass::IN(), RRType::AAAA()));
  358. ASSERT_EQ(3, message_render.getRRCount(Message::SECTION_ANSWER));
  359. message_render.clearSection(Message::SECTION_ANSWER);
  360. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ANSWER, test_name,
  361. RRClass::IN(), RRType::A()));
  362. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ANSWER, test_name,
  363. RRClass::IN(), RRType::AAAA()));
  364. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_ANSWER));
  365. }
  366. TEST_F(MessageTest, clearAuthoritySection) {
  367. // Add two RRsets, check they are present, clear the section,
  368. // check if they are gone.
  369. message_render.addRRset(Message::SECTION_AUTHORITY, rrset_a);
  370. message_render.addRRset(Message::SECTION_AUTHORITY, rrset_aaaa);
  371. ASSERT_TRUE(message_render.hasRRset(Message::SECTION_AUTHORITY, test_name,
  372. RRClass::IN(), RRType::A()));
  373. ASSERT_TRUE(message_render.hasRRset(Message::SECTION_AUTHORITY, test_name,
  374. RRClass::IN(), RRType::AAAA()));
  375. ASSERT_EQ(3, message_render.getRRCount(Message::SECTION_AUTHORITY));
  376. message_render.clearSection(Message::SECTION_AUTHORITY);
  377. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_AUTHORITY, test_name,
  378. RRClass::IN(), RRType::A()));
  379. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_AUTHORITY, test_name,
  380. RRClass::IN(), RRType::AAAA()));
  381. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_AUTHORITY));
  382. }
  383. TEST_F(MessageTest, clearAdditionalSection) {
  384. // Add two RRsets, check they are present, clear the section,
  385. // check if they are gone.
  386. message_render.addRRset(Message::SECTION_ADDITIONAL, rrset_a);
  387. message_render.addRRset(Message::SECTION_ADDITIONAL, rrset_aaaa);
  388. ASSERT_TRUE(message_render.hasRRset(Message::SECTION_ADDITIONAL, test_name,
  389. RRClass::IN(), RRType::A()));
  390. ASSERT_TRUE(message_render.hasRRset(Message::SECTION_ADDITIONAL, test_name,
  391. RRClass::IN(), RRType::AAAA()));
  392. ASSERT_EQ(3, message_render.getRRCount(Message::SECTION_ADDITIONAL));
  393. message_render.clearSection(Message::SECTION_ADDITIONAL);
  394. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ADDITIONAL, test_name,
  395. RRClass::IN(), RRType::A()));
  396. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ADDITIONAL, test_name,
  397. RRClass::IN(), RRType::AAAA()));
  398. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_ADDITIONAL));
  399. }
  400. TEST_F(MessageTest, badClearSection) {
  401. // attempt of clearing a message in the parse mode.
  402. EXPECT_THROW(message_parse.clearSection(Message::SECTION_QUESTION),
  403. InvalidMessageOperation);
  404. // attempt of clearing out-of-range section
  405. EXPECT_THROW(message_render.clearSection(bogus_section), OutOfRange);
  406. }
  407. TEST_F(MessageTest, badBeginSection) {
  408. // valid cases are tested via other tests
  409. EXPECT_THROW(message_render.beginSection(Message::SECTION_QUESTION),
  410. InvalidMessageSection);
  411. EXPECT_THROW(message_render.beginSection(bogus_section), OutOfRange);
  412. }
  413. TEST_F(MessageTest, badEndSection) {
  414. // valid cases are tested via other tests
  415. EXPECT_THROW(message_render.endSection(Message::SECTION_QUESTION),
  416. InvalidMessageSection);
  417. EXPECT_THROW(message_render.endSection(bogus_section), OutOfRange);
  418. }
  419. TEST_F(MessageTest, appendSection) {
  420. Message target(Message::RENDER);
  421. // Section check
  422. EXPECT_THROW(target.appendSection(bogus_section, message_render),
  423. OutOfRange);
  424. // Make sure nothing is copied if there is nothing to copy
  425. target.appendSection(Message::SECTION_QUESTION, message_render);
  426. EXPECT_EQ(0, target.getRRCount(Message::SECTION_QUESTION));
  427. target.appendSection(Message::SECTION_ANSWER, message_render);
  428. EXPECT_EQ(0, target.getRRCount(Message::SECTION_ANSWER));
  429. target.appendSection(Message::SECTION_AUTHORITY, message_render);
  430. EXPECT_EQ(0, target.getRRCount(Message::SECTION_AUTHORITY));
  431. target.appendSection(Message::SECTION_ADDITIONAL, message_render);
  432. EXPECT_EQ(0, target.getRRCount(Message::SECTION_ADDITIONAL));
  433. // Now add some data, copy again, and see if it got added
  434. message_render.addQuestion(Question(Name("test.example.com"),
  435. RRClass::IN(), RRType::A()));
  436. message_render.addRRset(Message::SECTION_ANSWER, rrset_a);
  437. message_render.addRRset(Message::SECTION_AUTHORITY, rrset_a);
  438. message_render.addRRset(Message::SECTION_ADDITIONAL, rrset_a);
  439. message_render.addRRset(Message::SECTION_ADDITIONAL, rrset_aaaa);
  440. target.appendSection(Message::SECTION_QUESTION, message_render);
  441. EXPECT_EQ(1, target.getRRCount(Message::SECTION_QUESTION));
  442. target.appendSection(Message::SECTION_ANSWER, message_render);
  443. EXPECT_EQ(2, target.getRRCount(Message::SECTION_ANSWER));
  444. EXPECT_TRUE(target.hasRRset(Message::SECTION_ANSWER, test_name,
  445. RRClass::IN(), RRType::A()));
  446. target.appendSection(Message::SECTION_AUTHORITY, message_render);
  447. EXPECT_EQ(2, target.getRRCount(Message::SECTION_AUTHORITY));
  448. EXPECT_TRUE(target.hasRRset(Message::SECTION_AUTHORITY, test_name,
  449. RRClass::IN(), RRType::A()));
  450. target.appendSection(Message::SECTION_ADDITIONAL, message_render);
  451. EXPECT_EQ(3, target.getRRCount(Message::SECTION_ADDITIONAL));
  452. EXPECT_TRUE(target.hasRRset(Message::SECTION_ADDITIONAL, test_name,
  453. RRClass::IN(), RRType::A()));
  454. EXPECT_TRUE(target.hasRRset(Message::SECTION_ADDITIONAL, test_name,
  455. RRClass::IN(), RRType::AAAA()));
  456. // One more test, test to see if the section gets added, not replaced
  457. Message source2(Message::RENDER);
  458. source2.addRRset(Message::SECTION_ANSWER, rrset_aaaa);
  459. target.appendSection(Message::SECTION_ANSWER, source2);
  460. EXPECT_EQ(3, target.getRRCount(Message::SECTION_ANSWER));
  461. EXPECT_TRUE(target.hasRRset(Message::SECTION_ANSWER, test_name,
  462. RRClass::IN(), RRType::A()));
  463. EXPECT_TRUE(target.hasRRset(Message::SECTION_ANSWER, test_name,
  464. RRClass::IN(), RRType::AAAA()));
  465. }
  466. TEST_F(MessageTest, parseHeader) {
  467. received_data.clear();
  468. UnitTestUtil::readWireData("message_fromWire1", received_data);
  469. // parseHeader() isn't allowed in the render mode.
  470. InputBuffer buffer(&received_data[0], received_data.size());
  471. EXPECT_THROW(message_render.parseHeader(buffer), InvalidMessageOperation);
  472. message_parse.parseHeader(buffer);
  473. EXPECT_EQ(0x1035, message_parse.getQid());
  474. EXPECT_EQ(Opcode::QUERY(), message_parse.getOpcode());
  475. EXPECT_EQ(Rcode::NOERROR(), message_parse.getRcode());
  476. EXPECT_TRUE(message_parse.getHeaderFlag(Message::HEADERFLAG_QR));
  477. EXPECT_TRUE(message_parse.getHeaderFlag(Message::HEADERFLAG_AA));
  478. EXPECT_FALSE(message_parse.getHeaderFlag(Message::HEADERFLAG_TC));
  479. EXPECT_TRUE(message_parse.getHeaderFlag(Message::HEADERFLAG_RD));
  480. EXPECT_FALSE(message_parse.getHeaderFlag(Message::HEADERFLAG_RA));
  481. EXPECT_FALSE(message_parse.getHeaderFlag(Message::HEADERFLAG_AD));
  482. EXPECT_FALSE(message_parse.getHeaderFlag(Message::HEADERFLAG_CD));
  483. EXPECT_EQ(1, message_parse.getRRCount(Message::SECTION_QUESTION));
  484. EXPECT_EQ(2, message_parse.getRRCount(Message::SECTION_ANSWER));
  485. EXPECT_EQ(0, message_parse.getRRCount(Message::SECTION_AUTHORITY));
  486. EXPECT_EQ(0, message_parse.getRRCount(Message::SECTION_ADDITIONAL));
  487. // Only the header part should have been examined.
  488. EXPECT_EQ(12, buffer.getPosition()); // 12 = size of the header section
  489. EXPECT_TRUE(message_parse.beginQuestion() == message_parse.endQuestion());
  490. EXPECT_TRUE(message_parse.beginSection(Message::SECTION_ANSWER) ==
  491. message_parse.endSection(Message::SECTION_ANSWER));
  492. EXPECT_TRUE(message_parse.beginSection(Message::SECTION_AUTHORITY) ==
  493. message_parse.endSection(Message::SECTION_AUTHORITY));
  494. EXPECT_TRUE(message_parse.beginSection(Message::SECTION_ADDITIONAL) ==
  495. message_parse.endSection(Message::SECTION_ADDITIONAL));
  496. }
  497. TEST_F(MessageTest, fromWire) {
  498. // fromWire() isn't allowed in the render mode.
  499. EXPECT_THROW(factoryFromFile(message_render, "message_fromWire1"),
  500. InvalidMessageOperation);
  501. factoryFromFile(message_parse, "message_fromWire1");
  502. EXPECT_EQ(0x1035, message_parse.getQid());
  503. EXPECT_EQ(Opcode::QUERY(), message_parse.getOpcode());
  504. EXPECT_EQ(Rcode::NOERROR(), message_parse.getRcode());
  505. EXPECT_TRUE(message_parse.getHeaderFlag(Message::HEADERFLAG_QR));
  506. EXPECT_TRUE(message_parse.getHeaderFlag(Message::HEADERFLAG_RD));
  507. EXPECT_TRUE(message_parse.getHeaderFlag(Message::HEADERFLAG_AA));
  508. QuestionPtr q = *message_parse.beginQuestion();
  509. EXPECT_EQ(test_name, q->getName());
  510. EXPECT_EQ(RRType::A(), q->getType());
  511. EXPECT_EQ(RRClass::IN(), q->getClass());
  512. EXPECT_EQ(1, message_parse.getRRCount(Message::SECTION_QUESTION));
  513. EXPECT_EQ(2, message_parse.getRRCount(Message::SECTION_ANSWER));
  514. EXPECT_EQ(0, message_parse.getRRCount(Message::SECTION_AUTHORITY));
  515. EXPECT_EQ(0, message_parse.getRRCount(Message::SECTION_ADDITIONAL));
  516. RRsetPtr rrset = *message_parse.beginSection(Message::SECTION_ANSWER);
  517. EXPECT_EQ(test_name, rrset->getName());
  518. EXPECT_EQ(RRType::A(), rrset->getType());
  519. EXPECT_EQ(RRClass::IN(), rrset->getClass());
  520. // TTL should be 3600, even though that of the 2nd RR is 7200
  521. EXPECT_EQ(RRTTL(3600), rrset->getTTL());
  522. RdataIteratorPtr it = rrset->getRdataIterator();
  523. EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
  524. it->next();
  525. EXPECT_EQ("192.0.2.2", it->getCurrent().toText());
  526. it->next();
  527. EXPECT_TRUE(it->isLast());
  528. }
  529. TEST_F(MessageTest, fromWireShortBuffer) {
  530. // We trim a valid message (ending with an SOA RR) for one byte.
  531. // fromWire() should throw an exception while parsing the trimmed RR.
  532. UnitTestUtil::readWireData("message_fromWire22.wire", received_data);
  533. InputBuffer buffer(&received_data[0], received_data.size() - 1);
  534. EXPECT_THROW(message_parse.fromWire(buffer), InvalidBufferPosition);
  535. }
  536. TEST_F(MessageTest, fromWireCombineRRs) {
  537. // This message contains 3 RRs in the answer section in the order of
  538. // A, AAAA, A types. fromWire() should combine the two A RRs into a
  539. // single RRset by default.
  540. factoryFromFile(message_parse, "message_fromWire19.wire");
  541. RRsetIterator it = message_parse.beginSection(Message::SECTION_ANSWER);
  542. RRsetIterator it_end = message_parse.endSection(Message::SECTION_ANSWER);
  543. ASSERT_TRUE(it != it_end);
  544. EXPECT_EQ(RRType::A(), (*it)->getType());
  545. EXPECT_EQ(2, (*it)->getRdataCount());
  546. ++it;
  547. ASSERT_TRUE(it != it_end);
  548. EXPECT_EQ(RRType::AAAA(), (*it)->getType());
  549. EXPECT_EQ(1, (*it)->getRdataCount());
  550. }
  551. // A helper function for a test pattern commonly used in several tests below.
  552. void
  553. preserveRRCheck(const Message& message, Message::Section section) {
  554. RRsetIterator it = message.beginSection(section);
  555. RRsetIterator it_end = message.endSection(section);
  556. ASSERT_TRUE(it != it_end);
  557. EXPECT_EQ(RRType::A(), (*it)->getType());
  558. EXPECT_EQ(1, (*it)->getRdataCount());
  559. EXPECT_EQ("192.0.2.1", (*it)->getRdataIterator()->getCurrent().toText());
  560. ++it;
  561. ASSERT_TRUE(it != it_end);
  562. EXPECT_EQ(RRType::AAAA(), (*it)->getType());
  563. EXPECT_EQ(1, (*it)->getRdataCount());
  564. EXPECT_EQ("2001:db8::1", (*it)->getRdataIterator()->getCurrent().toText());
  565. ++it;
  566. ASSERT_TRUE(it != it_end);
  567. EXPECT_EQ(RRType::A(), (*it)->getType());
  568. EXPECT_EQ(1, (*it)->getRdataCount());
  569. EXPECT_EQ("192.0.2.2", (*it)->getRdataIterator()->getCurrent().toText());
  570. }
  571. TEST_F(MessageTest, fromWirePreserveAnswer) {
  572. // Using the same data as the previous test, but specify the PRESERVE_ORDER
  573. // option. The received order of RRs should be preserved, and each RR
  574. // should be stored in a single RRset.
  575. factoryFromFile(message_parse, "message_fromWire19.wire",
  576. Message::PRESERVE_ORDER);
  577. {
  578. SCOPED_TRACE("preserve answer RRs");
  579. preserveRRCheck(message_parse, Message::SECTION_ANSWER);
  580. }
  581. }
  582. TEST_F(MessageTest, fromWirePreserveAuthority) {
  583. // Same for the previous test, but for the authority section.
  584. factoryFromFile(message_parse, "message_fromWire20.wire",
  585. Message::PRESERVE_ORDER);
  586. {
  587. SCOPED_TRACE("preserve authority RRs");
  588. preserveRRCheck(message_parse, Message::SECTION_AUTHORITY);
  589. }
  590. }
  591. TEST_F(MessageTest, fromWirePreserveAdditional) {
  592. // Same for the previous test, but for the additional section.
  593. factoryFromFile(message_parse, "message_fromWire21.wire",
  594. Message::PRESERVE_ORDER);
  595. {
  596. SCOPED_TRACE("preserve additional RRs");
  597. preserveRRCheck(message_parse, Message::SECTION_ADDITIONAL);
  598. }
  599. }
  600. TEST_F(MessageTest, EDNS0ExtRcode) {
  601. // Extended Rcode = BADVERS
  602. factoryFromFile(message_parse, "message_fromWire10.wire");
  603. EXPECT_EQ(Rcode::BADVERS(), message_parse.getRcode());
  604. // Maximum extended Rcode
  605. message_parse.clear(Message::PARSE);
  606. factoryFromFile(message_parse, "message_fromWire11.wire");
  607. EXPECT_EQ(0xfff, message_parse.getRcode().getCode());
  608. }
  609. TEST_F(MessageTest, BadEDNS0) {
  610. // OPT RR in the answer section
  611. EXPECT_THROW(factoryFromFile(message_parse, "message_fromWire4"),
  612. DNSMessageFORMERR);
  613. // multiple OPT RRs (in the additional section)
  614. message_parse.clear(Message::PARSE);
  615. EXPECT_THROW(factoryFromFile(message_parse, "message_fromWire5"),
  616. DNSMessageFORMERR);
  617. }
  618. TEST_F(MessageTest, toWire) {
  619. message_render.setQid(0x1035);
  620. message_render.setOpcode(Opcode::QUERY());
  621. message_render.setRcode(Rcode::NOERROR());
  622. message_render.setHeaderFlag(Message::HEADERFLAG_QR, true);
  623. message_render.setHeaderFlag(Message::HEADERFLAG_RD, true);
  624. message_render.setHeaderFlag(Message::HEADERFLAG_AA, true);
  625. message_render.addQuestion(Question(Name("test.example.com"), RRClass::IN(),
  626. RRType::A()));
  627. message_render.addRRset(Message::SECTION_ANSWER, rrset_a);
  628. EXPECT_EQ(1, message_render.getRRCount(Message::SECTION_QUESTION));
  629. EXPECT_EQ(2, message_render.getRRCount(Message::SECTION_ANSWER));
  630. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_AUTHORITY));
  631. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_ADDITIONAL));
  632. message_render.toWire(renderer);
  633. vector<unsigned char> data;
  634. UnitTestUtil::readWireData("message_toWire1", data);
  635. EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, renderer.getData(),
  636. renderer.getLength(), &data[0], data.size());
  637. }
  638. TEST_F(MessageTest, toWireInParseMode) {
  639. // toWire() isn't allowed in the parse mode.
  640. EXPECT_THROW(message_parse.toWire(renderer), InvalidMessageOperation);
  641. }
  642. // See dnssectime_unittest.cc
  643. template <int64_t NOW>
  644. int64_t
  645. testGetTime() {
  646. return (NOW);
  647. }
  648. // bit-wise constant flags to configure DNS header flags for test
  649. // messages.
  650. const unsigned int QR_FLAG = 0x1;
  651. const unsigned int AA_FLAG = 0x2;
  652. const unsigned int RD_FLAG = 0x4;
  653. void
  654. commonTSIGToWireCheck(Message& message, MessageRenderer& renderer,
  655. TSIGContext& tsig_ctx, const char* const expected_file,
  656. unsigned int message_flags = RD_FLAG,
  657. RRType qtype = RRType::A(),
  658. const vector<const char*>* answer_data = NULL)
  659. {
  660. message.setOpcode(Opcode::QUERY());
  661. message.setRcode(Rcode::NOERROR());
  662. if ((message_flags & QR_FLAG) != 0) {
  663. message.setHeaderFlag(Message::HEADERFLAG_QR);
  664. }
  665. if ((message_flags & AA_FLAG) != 0) {
  666. message.setHeaderFlag(Message::HEADERFLAG_AA);
  667. }
  668. if ((message_flags & RD_FLAG) != 0) {
  669. message.setHeaderFlag(Message::HEADERFLAG_RD);
  670. }
  671. message.addQuestion(Question(Name("www.example.com"), RRClass::IN(),
  672. qtype));
  673. if (answer_data != NULL) {
  674. RRsetPtr ans_rrset(new RRset(Name("www.example.com"), RRClass::IN(),
  675. qtype, RRTTL(86400)));
  676. for (vector<const char*>::const_iterator it = answer_data->begin();
  677. it != answer_data->end();
  678. ++it) {
  679. ans_rrset->addRdata(createRdata(qtype, RRClass::IN(), *it));
  680. }
  681. message.addRRset(Message::SECTION_ANSWER, ans_rrset);
  682. }
  683. message.toWire(renderer, tsig_ctx);
  684. vector<unsigned char> expected_data;
  685. UnitTestUtil::readWireData(expected_file, expected_data);
  686. EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, renderer.getData(),
  687. renderer.getLength(),
  688. &expected_data[0], expected_data.size());
  689. }
  690. TEST_F(MessageTest, toWireWithTSIG) {
  691. // Rendering a message with TSIG. Various special cases specific to
  692. // TSIG are tested in the tsig tests. We only check the message contains
  693. // a TSIG at the end and the ARCOUNT of the header is updated.
  694. isc::util::detail::gettimeFunction = testGetTime<0x4da8877a>;
  695. message_render.setQid(0x2d65);
  696. {
  697. SCOPED_TRACE("Message sign with TSIG");
  698. commonTSIGToWireCheck(message_render, renderer, tsig_ctx,
  699. "message_toWire2.wire");
  700. }
  701. }
  702. TEST_F(MessageTest, toWireWithEDNSAndTSIG) {
  703. // Similar to the previous test, but with an EDNS before TSIG.
  704. // The wire data check will confirm the ordering.
  705. isc::util::detail::gettimeFunction = testGetTime<0x4db60d1f>;
  706. message_render.setQid(0x6cd);
  707. EDNSPtr edns(new EDNS());
  708. edns->setUDPSize(4096);
  709. message_render.setEDNS(edns);
  710. {
  711. SCOPED_TRACE("Message sign with TSIG and EDNS");
  712. commonTSIGToWireCheck(message_render, renderer, tsig_ctx,
  713. "message_toWire3.wire");
  714. }
  715. }
  716. // Some of the following tests involve truncation. We use the query name
  717. // "www.example.com" and some TXT question/answers. The length of the
  718. // header and question will be 33 bytes. If we also try to include a
  719. // TSIG of the same key name (not compressed) with HMAC-MD5, the TSIG RR
  720. // will be 85 bytes.
  721. // A long TXT RDATA. With a fully compressed owner name, the corresponding
  722. // RR will be 268 bytes.
  723. const char* const long_txt1 = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcde";
  724. // With a fully compressed owner name, the corresponding RR will be 212 bytes.
  725. // It should result in truncation even without TSIG (33 + 268 + 212 = 513)
  726. const char* const long_txt2 = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456";
  727. // With a fully compressed owner name, the corresponding RR will be 127 bytes.
  728. // So, it can fit in the standard 512 bytes with txt1 and without TSIG, but
  729. // adding a TSIG would result in truncation (33 + 268 + 127 + 85 = 513)
  730. const char* const long_txt3 = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01";
  731. // This is 1 byte shorter than txt3, which will result in a possible longest
  732. // message containing answer RRs and TSIG.
  733. const char* const long_txt4 = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0";
  734. // Example output generated by
  735. // "dig -y www.example.com:SFuWd/q99SzF8Yzd1QbB9g== www.example.com txt
  736. // QID: 0x22c2
  737. // Time Signed: 0x00004e179212
  738. TEST_F(MessageTest, toWireTSIGTruncation) {
  739. isc::util::detail::gettimeFunction = testGetTime<0x4e179212>;
  740. // Verify a validly signed query so that we can use the TSIG context
  741. factoryFromFile(message_parse, "message_fromWire17.wire");
  742. EXPECT_EQ(TSIGError::NOERROR(),
  743. tsig_ctx.verify(message_parse.getTSIGRecord(),
  744. &received_data[0], received_data.size()));
  745. message_render.setQid(0x22c2);
  746. vector<const char*> answer_data;
  747. answer_data.push_back(long_txt1);
  748. answer_data.push_back(long_txt2);
  749. {
  750. SCOPED_TRACE("Message sign with TSIG and TC bit on");
  751. commonTSIGToWireCheck(message_render, renderer, tsig_ctx,
  752. "message_toWire4.wire",
  753. QR_FLAG|AA_FLAG|RD_FLAG,
  754. RRType::TXT(), &answer_data);
  755. }
  756. }
  757. TEST_F(MessageTest, toWireTSIGTruncation2) {
  758. // Similar to the previous test, but without TSIG it wouldn't cause
  759. // truncation.
  760. isc::util::detail::gettimeFunction = testGetTime<0x4e179212>;
  761. factoryFromFile(message_parse, "message_fromWire17.wire");
  762. EXPECT_EQ(TSIGError::NOERROR(),
  763. tsig_ctx.verify(message_parse.getTSIGRecord(),
  764. &received_data[0], received_data.size()));
  765. message_render.setQid(0x22c2);
  766. vector<const char*> answer_data;
  767. answer_data.push_back(long_txt1);
  768. answer_data.push_back(long_txt3);
  769. {
  770. SCOPED_TRACE("Message sign with TSIG and TC bit on (2)");
  771. commonTSIGToWireCheck(message_render, renderer, tsig_ctx,
  772. "message_toWire4.wire",
  773. QR_FLAG|AA_FLAG|RD_FLAG,
  774. RRType::TXT(), &answer_data);
  775. }
  776. }
  777. TEST_F(MessageTest, toWireTSIGTruncation3) {
  778. // Similar to previous ones, but truncation occurs due to too many
  779. // Questions (very unusual, but not necessarily illegal).
  780. // We are going to create a message starting with a standard
  781. // header (12 bytes) and multiple questions in the Question
  782. // section of the same owner name (changing the RRType, just so
  783. // that it would be the form that would be accepted by the BIND 9
  784. // parser). The first Question is 21 bytes in length, and the subsequent
  785. // ones are 6 bytes. We'll also use a TSIG whose size is 85 bytes.
  786. // Up to 66 questions can fit in the standard 512-byte buffer
  787. // (12 + 21 + 6 * 65 + 85 = 508). If we try to add one more it would
  788. // result in truncation.
  789. message_render.setOpcode(Opcode::QUERY());
  790. message_render.setRcode(Rcode::NOERROR());
  791. for (int i = 1; i <= 67; ++i) {
  792. message_render.addQuestion(Question(Name("www.example.com"),
  793. RRClass::IN(), RRType(i)));
  794. }
  795. message_render.toWire(renderer, tsig_ctx);
  796. // Check the rendered data by parsing it. We only check it has the
  797. // TC bit on, has the correct number of questions, and has a TSIG RR.
  798. // Checking the signature wouldn't be necessary for this rare case
  799. // scenario.
  800. InputBuffer buffer(renderer.getData(), renderer.getLength());
  801. message_parse.fromWire(buffer);
  802. EXPECT_TRUE(message_parse.getHeaderFlag(Message::HEADERFLAG_TC));
  803. // Note that the number of questions are 66, not 67 as we tried to add.
  804. EXPECT_EQ(66, message_parse.getRRCount(Message::SECTION_QUESTION));
  805. EXPECT_TRUE(message_parse.getTSIGRecord() != NULL);
  806. }
  807. TEST_F(MessageTest, toWireTSIGNoTruncation) {
  808. // A boundary case that shouldn't cause truncation: the resulting
  809. // response message with a TSIG will be 512 bytes long.
  810. isc::util::detail::gettimeFunction = testGetTime<0x4e17b38d>;
  811. factoryFromFile(message_parse, "message_fromWire18.wire");
  812. EXPECT_EQ(TSIGError::NOERROR(),
  813. tsig_ctx.verify(message_parse.getTSIGRecord(),
  814. &received_data[0], received_data.size()));
  815. message_render.setQid(0xd6e2);
  816. vector<const char*> answer_data;
  817. answer_data.push_back(long_txt1);
  818. answer_data.push_back(long_txt4);
  819. {
  820. SCOPED_TRACE("Message sign with TSIG, no truncation");
  821. commonTSIGToWireCheck(message_render, renderer, tsig_ctx,
  822. "message_toWire5.wire",
  823. QR_FLAG|AA_FLAG|RD_FLAG,
  824. RRType::TXT(), &answer_data);
  825. }
  826. }
  827. // This is a buggy renderer for testing. It behaves like the straightforward
  828. // MessageRenderer, but once it has some data, its setLengthLimit() ignores
  829. // the given parameter and resets the limit to the current length, making
  830. // subsequent insertion result in truncation, which would make TSIG RR
  831. // rendering fail unexpectedly in the test that follows.
  832. class BadRenderer : public MessageRenderer {
  833. public:
  834. virtual void setLengthLimit(size_t len) {
  835. if (getLength() > 0) {
  836. MessageRenderer::setLengthLimit(getLength());
  837. } else {
  838. MessageRenderer::setLengthLimit(len);
  839. }
  840. }
  841. };
  842. TEST_F(MessageTest, toWireTSIGLengthErrors) {
  843. // specify an unusual short limit that wouldn't be able to hold
  844. // the TSIG.
  845. renderer.setLengthLimit(tsig_ctx.getTSIGLength() - 1);
  846. // Use commonTSIGToWireCheck() only to call toWire() with otherwise valid
  847. // conditions. The checks inside it don't matter because we expect an
  848. // exception before any of the checks.
  849. EXPECT_THROW(commonTSIGToWireCheck(message_render, renderer, tsig_ctx,
  850. "message_toWire2.wire"),
  851. InvalidParameter);
  852. // This one is large enough for TSIG, but the remaining limit isn't
  853. // even enough for the Header section.
  854. renderer.clear();
  855. message_render.clear(Message::RENDER);
  856. renderer.setLengthLimit(tsig_ctx.getTSIGLength() + 1);
  857. EXPECT_THROW(commonTSIGToWireCheck(message_render, renderer, tsig_ctx,
  858. "message_toWire2.wire"),
  859. InvalidParameter);
  860. // Trying to render a message with TSIG using a buggy renderer.
  861. BadRenderer bad_renderer;
  862. bad_renderer.setLengthLimit(512);
  863. message_render.clear(Message::RENDER);
  864. EXPECT_THROW(commonTSIGToWireCheck(message_render, bad_renderer, tsig_ctx,
  865. "message_toWire2.wire"),
  866. Unexpected);
  867. }
  868. TEST_F(MessageTest, toWireWithoutOpcode) {
  869. message_render.setRcode(Rcode::NOERROR());
  870. EXPECT_THROW(message_render.toWire(renderer), InvalidMessageOperation);
  871. }
  872. TEST_F(MessageTest, toWireWithoutRcode) {
  873. message_render.setOpcode(Opcode::QUERY());
  874. EXPECT_THROW(message_render.toWire(renderer), InvalidMessageOperation);
  875. }
  876. TEST_F(MessageTest, toText) {
  877. // Check toText() output for a typical DNS response with records in
  878. // all sections
  879. factoryFromFile(message_parse, "message_toText1.wire");
  880. {
  881. SCOPED_TRACE("Message toText test (basic case)");
  882. ifstream ifs;
  883. unittests::openTestData("message_toText1.txt", ifs);
  884. unittests::matchTextData(ifs, message_parse.toText());
  885. }
  886. // Another example with EDNS. The expected data was slightly modified
  887. // from the dig output (other than replacing tabs with a space): adding
  888. // a newline after the "OPT PSEUDOSECTION". This is an intentional change
  889. // in our version for better readability.
  890. message_parse.clear(Message::PARSE);
  891. factoryFromFile(message_parse, "message_toText2.wire");
  892. {
  893. SCOPED_TRACE("Message toText test with EDNS");
  894. ifstream ifs;
  895. unittests::openTestData("message_toText2.txt", ifs);
  896. unittests::matchTextData(ifs, message_parse.toText());
  897. }
  898. // Another example with TSIG. The expected data was slightly modified
  899. // from the dig output (other than replacing tabs with a space): removing
  900. // a redundant white space at the end of TSIG RDATA. We'd rather consider
  901. // it a dig's defect than a feature.
  902. message_parse.clear(Message::PARSE);
  903. factoryFromFile(message_parse, "message_toText3.wire");
  904. {
  905. SCOPED_TRACE("Message toText test with TSIG");
  906. ifstream ifs;
  907. unittests::openTestData("message_toText3.txt", ifs);
  908. unittests::matchTextData(ifs, message_parse.toText());
  909. }
  910. }
  911. TEST_F(MessageTest, toTextWithoutOpcode) {
  912. message_render.setRcode(Rcode::NOERROR());
  913. EXPECT_THROW(message_render.toText(), InvalidMessageOperation);
  914. }
  915. TEST_F(MessageTest, toTextWithoutRcode) {
  916. message_render.setOpcode(Opcode::QUERY());
  917. EXPECT_THROW(message_render.toText(), InvalidMessageOperation);
  918. }
  919. }