message_unittest.cc 49 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168
  1. // Copyright (C) 2010-2013 Internet Systems Consortium, Inc. ("ISC")
  2. //
  3. // Permission to use, copy, modify, and/or distribute this software for any
  4. // purpose with or without fee is hereby granted, provided that the above
  5. // copyright notice and this permission notice appear in all copies.
  6. //
  7. // THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
  8. // REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
  9. // AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
  10. // INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  11. // LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
  12. // OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  13. // PERFORMANCE OF THIS SOFTWARE.
  14. #include <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. // initially, we have 0
  249. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_ANSWER));
  250. // add two A RRs (unsigned)
  251. message_render.addRRset(Message::SECTION_ANSWER, rrset_a);
  252. EXPECT_EQ(rrset_a,
  253. *message_render.beginSection(Message::SECTION_ANSWER));
  254. EXPECT_EQ(2, message_render.getRRCount(Message::SECTION_ANSWER));
  255. message_render.clear(Message::RENDER);
  256. // add one AAAA RR (signed)
  257. message_render.addRRset(Message::SECTION_ANSWER, rrset_aaaa);
  258. EXPECT_EQ(rrset_aaaa,
  259. *message_render.beginSection(Message::SECTION_ANSWER));
  260. EXPECT_EQ(2, message_render.getRRCount(Message::SECTION_ANSWER));
  261. }
  262. TEST_F(MessageTest, badAddRRset) {
  263. // addRRset() isn't allowed in the parse mode.
  264. EXPECT_THROW(message_parse.addRRset(Message::SECTION_ANSWER,
  265. rrset_a), InvalidMessageOperation);
  266. // out-of-band section ID
  267. EXPECT_THROW(message_render.addRRset(bogus_section, rrset_a), OutOfRange);
  268. // NULL RRset
  269. EXPECT_THROW(message_render.addRRset(Message::SECTION_ANSWER, RRsetPtr()),
  270. InvalidParameter);
  271. }
  272. TEST_F(MessageTest, hasRRset) {
  273. message_render.addRRset(Message::SECTION_ANSWER, rrset_a);
  274. EXPECT_TRUE(message_render.hasRRset(Message::SECTION_ANSWER, test_name,
  275. RRClass::IN(), RRType::A()));
  276. // section doesn't match
  277. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ADDITIONAL, test_name,
  278. RRClass::IN(), RRType::A()));
  279. // name doesn't match
  280. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ANSWER,
  281. Name("nomatch.example"),
  282. RRClass::IN(), RRType::A()));
  283. // RR class doesn't match
  284. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ANSWER, test_name,
  285. RRClass::CH(), RRType::A()));
  286. // RR type doesn't match
  287. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ANSWER, test_name,
  288. RRClass::IN(), RRType::AAAA()));
  289. // out-of-band section ID
  290. EXPECT_THROW(message_render.hasRRset(bogus_section, test_name,
  291. RRClass::IN(), RRType::A()),
  292. OutOfRange);
  293. // Repeat the checks having created an RRset of the appropriate type.
  294. RRsetPtr rrs1(new RRset(test_name, RRClass::IN(), RRType::A(), RRTTL(60)));
  295. EXPECT_TRUE(message_render.hasRRset(Message::SECTION_ANSWER, rrs1));
  296. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ADDITIONAL, rrs1));
  297. RRsetPtr rrs2(new RRset(Name("nomatch.example"), RRClass::IN(), RRType::A(),
  298. RRTTL(5)));
  299. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ANSWER, rrs2));
  300. RRsetPtr rrs3(new RRset(test_name, RRClass::CH(), RRType::A(), RRTTL(60)));
  301. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ANSWER, rrs3));
  302. RRsetPtr rrs4(new RRset(test_name, RRClass::IN(), RRType::AAAA(), RRTTL(5)));
  303. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ANSWER, rrs4));
  304. RRsetPtr rrs5(new RRset(test_name, RRClass::IN(), RRType::AAAA(), RRTTL(5)));
  305. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ANSWER, rrs4));
  306. EXPECT_THROW(message_render.hasRRset(bogus_section, rrs1), OutOfRange);
  307. }
  308. TEST_F(MessageTest, removeRRset) {
  309. message_render.addRRset(Message::SECTION_ANSWER, rrset_a);
  310. message_render.addRRset(Message::SECTION_ANSWER, rrset_aaaa);
  311. EXPECT_TRUE(message_render.hasRRset(Message::SECTION_ANSWER, test_name,
  312. RRClass::IN(), RRType::A()));
  313. EXPECT_TRUE(message_render.hasRRset(Message::SECTION_ANSWER, test_name,
  314. RRClass::IN(), RRType::AAAA()));
  315. EXPECT_EQ(4, message_render.getRRCount(Message::SECTION_ANSWER));
  316. // Locate the AAAA RRset and remove it and any associated RRSIGs
  317. RRsetIterator i = message_render.beginSection(Message::SECTION_ANSWER);
  318. if ((*i)->getType() == RRType::A()) {
  319. ++i;
  320. }
  321. EXPECT_EQ(RRType::AAAA(), (*i)->getType());
  322. message_render.removeRRset(Message::SECTION_ANSWER, i);
  323. EXPECT_TRUE(message_render.hasRRset(Message::SECTION_ANSWER, test_name,
  324. RRClass::IN(), RRType::A()));
  325. EXPECT_FALSE(message_render.hasRRset(Message::SECTION_ANSWER, test_name,
  326. RRClass::IN(), RRType::AAAA()));
  327. EXPECT_EQ(2, message_render.getRRCount(Message::SECTION_ANSWER));
  328. }
  329. TEST_F(MessageTest, clearQuestionSection) {
  330. QuestionPtr q(new Question(Name("www.example.com"), RRClass::IN(),
  331. RRType::A()));
  332. message_render.addQuestion(q);
  333. ASSERT_EQ(1, message_render.getRRCount(Message::SECTION_QUESTION));
  334. message_render.clearSection(Message::SECTION_QUESTION);
  335. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_QUESTION));
  336. EXPECT_TRUE(message_render.beginQuestion() ==
  337. message_render.endQuestion());
  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(4, 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(4, 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(4, 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, badClearSection) {
  391. // attempt of clearing a message in the parse mode.
  392. EXPECT_THROW(message_parse.clearSection(Message::SECTION_QUESTION),
  393. InvalidMessageOperation);
  394. // attempt of clearing out-of-range section
  395. EXPECT_THROW(message_render.clearSection(bogus_section), OutOfRange);
  396. }
  397. TEST_F(MessageTest, badBeginSection) {
  398. // valid cases are tested via other tests
  399. EXPECT_THROW(message_render.beginSection(Message::SECTION_QUESTION),
  400. InvalidMessageSection);
  401. EXPECT_THROW(message_render.beginSection(bogus_section), OutOfRange);
  402. }
  403. TEST_F(MessageTest, badEndSection) {
  404. // valid cases are tested via other tests
  405. EXPECT_THROW(message_render.endSection(Message::SECTION_QUESTION),
  406. InvalidMessageSection);
  407. EXPECT_THROW(message_render.endSection(bogus_section), OutOfRange);
  408. }
  409. TEST_F(MessageTest, appendSection) {
  410. Message target(Message::RENDER);
  411. // Section check
  412. EXPECT_THROW(target.appendSection(bogus_section, message_render),
  413. OutOfRange);
  414. // Make sure nothing is copied if there is nothing to copy
  415. target.appendSection(Message::SECTION_QUESTION, message_render);
  416. EXPECT_EQ(0, target.getRRCount(Message::SECTION_QUESTION));
  417. target.appendSection(Message::SECTION_ANSWER, message_render);
  418. EXPECT_EQ(0, target.getRRCount(Message::SECTION_ANSWER));
  419. target.appendSection(Message::SECTION_AUTHORITY, message_render);
  420. EXPECT_EQ(0, target.getRRCount(Message::SECTION_AUTHORITY));
  421. target.appendSection(Message::SECTION_ADDITIONAL, message_render);
  422. EXPECT_EQ(0, target.getRRCount(Message::SECTION_ADDITIONAL));
  423. // Now add some data, copy again, and see if it got added
  424. message_render.addQuestion(Question(Name("test.example.com"),
  425. RRClass::IN(), RRType::A()));
  426. message_render.addRRset(Message::SECTION_ANSWER, rrset_a);
  427. message_render.addRRset(Message::SECTION_AUTHORITY, rrset_a);
  428. message_render.addRRset(Message::SECTION_ADDITIONAL, rrset_a);
  429. message_render.addRRset(Message::SECTION_ADDITIONAL, rrset_aaaa);
  430. target.appendSection(Message::SECTION_QUESTION, message_render);
  431. EXPECT_EQ(1, target.getRRCount(Message::SECTION_QUESTION));
  432. target.appendSection(Message::SECTION_ANSWER, message_render);
  433. EXPECT_EQ(2, target.getRRCount(Message::SECTION_ANSWER));
  434. EXPECT_TRUE(target.hasRRset(Message::SECTION_ANSWER, test_name,
  435. RRClass::IN(), RRType::A()));
  436. target.appendSection(Message::SECTION_AUTHORITY, message_render);
  437. EXPECT_EQ(2, target.getRRCount(Message::SECTION_AUTHORITY));
  438. EXPECT_TRUE(target.hasRRset(Message::SECTION_AUTHORITY, test_name,
  439. RRClass::IN(), RRType::A()));
  440. target.appendSection(Message::SECTION_ADDITIONAL, message_render);
  441. EXPECT_EQ(4, target.getRRCount(Message::SECTION_ADDITIONAL));
  442. EXPECT_TRUE(target.hasRRset(Message::SECTION_ADDITIONAL, test_name,
  443. RRClass::IN(), RRType::A()));
  444. EXPECT_TRUE(target.hasRRset(Message::SECTION_ADDITIONAL, test_name,
  445. RRClass::IN(), RRType::AAAA()));
  446. // One more test, test to see if the section gets added, not replaced
  447. Message source2(Message::RENDER);
  448. source2.addRRset(Message::SECTION_ANSWER, rrset_aaaa);
  449. target.appendSection(Message::SECTION_ANSWER, source2);
  450. EXPECT_EQ(4, target.getRRCount(Message::SECTION_ANSWER));
  451. EXPECT_TRUE(target.hasRRset(Message::SECTION_ANSWER, test_name,
  452. RRClass::IN(), RRType::A()));
  453. EXPECT_TRUE(target.hasRRset(Message::SECTION_ANSWER, test_name,
  454. RRClass::IN(), RRType::AAAA()));
  455. }
  456. TEST_F(MessageTest, parseHeader) {
  457. received_data.clear();
  458. UnitTestUtil::readWireData("message_fromWire1", received_data);
  459. // parseHeader() isn't allowed in the render mode.
  460. InputBuffer buffer(&received_data[0], received_data.size());
  461. EXPECT_THROW(message_render.parseHeader(buffer), InvalidMessageOperation);
  462. message_parse.parseHeader(buffer);
  463. EXPECT_EQ(0x1035, message_parse.getQid());
  464. EXPECT_EQ(Opcode::QUERY(), message_parse.getOpcode());
  465. EXPECT_EQ(Rcode::NOERROR(), message_parse.getRcode());
  466. EXPECT_TRUE(message_parse.getHeaderFlag(Message::HEADERFLAG_QR));
  467. EXPECT_TRUE(message_parse.getHeaderFlag(Message::HEADERFLAG_AA));
  468. EXPECT_FALSE(message_parse.getHeaderFlag(Message::HEADERFLAG_TC));
  469. EXPECT_TRUE(message_parse.getHeaderFlag(Message::HEADERFLAG_RD));
  470. EXPECT_FALSE(message_parse.getHeaderFlag(Message::HEADERFLAG_RA));
  471. EXPECT_FALSE(message_parse.getHeaderFlag(Message::HEADERFLAG_AD));
  472. EXPECT_FALSE(message_parse.getHeaderFlag(Message::HEADERFLAG_CD));
  473. EXPECT_EQ(1, message_parse.getRRCount(Message::SECTION_QUESTION));
  474. EXPECT_EQ(2, message_parse.getRRCount(Message::SECTION_ANSWER));
  475. EXPECT_EQ(0, message_parse.getRRCount(Message::SECTION_AUTHORITY));
  476. EXPECT_EQ(0, message_parse.getRRCount(Message::SECTION_ADDITIONAL));
  477. // Only the header part should have been examined.
  478. EXPECT_EQ(12, buffer.getPosition()); // 12 = size of the header section
  479. EXPECT_TRUE(message_parse.beginQuestion() == message_parse.endQuestion());
  480. EXPECT_TRUE(message_parse.beginSection(Message::SECTION_ANSWER) ==
  481. message_parse.endSection(Message::SECTION_ANSWER));
  482. EXPECT_TRUE(message_parse.beginSection(Message::SECTION_AUTHORITY) ==
  483. message_parse.endSection(Message::SECTION_AUTHORITY));
  484. EXPECT_TRUE(message_parse.beginSection(Message::SECTION_ADDITIONAL) ==
  485. message_parse.endSection(Message::SECTION_ADDITIONAL));
  486. }
  487. void
  488. checkMessageFromWire(const Message& message_parse,
  489. const Name& test_name)
  490. {
  491. EXPECT_EQ(0x1035, message_parse.getQid());
  492. EXPECT_EQ(Opcode::QUERY(), message_parse.getOpcode());
  493. EXPECT_EQ(Rcode::NOERROR(), message_parse.getRcode());
  494. EXPECT_TRUE(message_parse.getHeaderFlag(Message::HEADERFLAG_QR));
  495. EXPECT_TRUE(message_parse.getHeaderFlag(Message::HEADERFLAG_RD));
  496. EXPECT_TRUE(message_parse.getHeaderFlag(Message::HEADERFLAG_AA));
  497. QuestionPtr q = *message_parse.beginQuestion();
  498. EXPECT_EQ(test_name, q->getName());
  499. EXPECT_EQ(RRType::A(), q->getType());
  500. EXPECT_EQ(RRClass::IN(), q->getClass());
  501. EXPECT_EQ(1, message_parse.getRRCount(Message::SECTION_QUESTION));
  502. EXPECT_EQ(2, message_parse.getRRCount(Message::SECTION_ANSWER));
  503. EXPECT_EQ(0, message_parse.getRRCount(Message::SECTION_AUTHORITY));
  504. EXPECT_EQ(0, message_parse.getRRCount(Message::SECTION_ADDITIONAL));
  505. RRsetPtr rrset = *message_parse.beginSection(Message::SECTION_ANSWER);
  506. EXPECT_EQ(test_name, rrset->getName());
  507. EXPECT_EQ(RRType::A(), rrset->getType());
  508. EXPECT_EQ(RRClass::IN(), rrset->getClass());
  509. // TTL should be 3600, even though that of the 2nd RR is 7200
  510. EXPECT_EQ(RRTTL(3600), rrset->getTTL());
  511. RdataIteratorPtr it = rrset->getRdataIterator();
  512. EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
  513. it->next();
  514. EXPECT_EQ("192.0.2.2", it->getCurrent().toText());
  515. it->next();
  516. EXPECT_TRUE(it->isLast());
  517. }
  518. TEST_F(MessageTest, fromWire) {
  519. // fromWire() isn't allowed in the render mode.
  520. EXPECT_THROW(factoryFromFile(message_render, "message_fromWire1"),
  521. InvalidMessageOperation);
  522. factoryFromFile(message_parse, "message_fromWire1");
  523. checkMessageFromWire(message_parse, test_name);
  524. }
  525. TEST_F(MessageTest, fromWireMultiple) {
  526. // Parse from wire multiple times.
  527. factoryFromFile(message_parse, "message_fromWire1");
  528. factoryFromFile(message_parse, "message_fromWire1");
  529. factoryFromFile(message_parse, "message_fromWire1");
  530. factoryFromFile(message_parse, "message_fromWire1");
  531. checkMessageFromWire(message_parse, test_name);
  532. // Calling parseHeader() directly before fromWire() should not cause
  533. // any problems.
  534. received_data.clear();
  535. UnitTestUtil::readWireData("message_fromWire1", received_data);
  536. InputBuffer buffer(&received_data[0], received_data.size());
  537. message_parse.parseHeader(buffer);
  538. message_parse.fromWire(buffer);
  539. message_parse.parseHeader(buffer);
  540. message_parse.fromWire(buffer);
  541. checkMessageFromWire(message_parse, test_name);
  542. }
  543. TEST_F(MessageTest, fromWireShortBuffer) {
  544. // We trim a valid message (ending with an SOA RR) for one byte.
  545. // fromWire() should throw an exception while parsing the trimmed RR.
  546. UnitTestUtil::readWireData("message_fromWire22.wire", received_data);
  547. InputBuffer buffer(&received_data[0], received_data.size() - 1);
  548. EXPECT_THROW(message_parse.fromWire(buffer), InvalidBufferPosition);
  549. }
  550. TEST_F(MessageTest, fromWireCombineRRs) {
  551. // This message contains 3 RRs in the answer section in the order of
  552. // A, AAAA, A types. fromWire() should combine the two A RRs into a
  553. // single RRset by default.
  554. factoryFromFile(message_parse, "message_fromWire19.wire");
  555. RRsetIterator it = message_parse.beginSection(Message::SECTION_ANSWER);
  556. RRsetIterator it_end = message_parse.endSection(Message::SECTION_ANSWER);
  557. ASSERT_TRUE(it != it_end);
  558. EXPECT_EQ(RRType::A(), (*it)->getType());
  559. EXPECT_EQ(2, (*it)->getRdataCount());
  560. ++it;
  561. ASSERT_TRUE(it != it_end);
  562. EXPECT_EQ(RRType::AAAA(), (*it)->getType());
  563. EXPECT_EQ(1, (*it)->getRdataCount());
  564. }
  565. // A helper function for a test pattern commonly used in several tests below.
  566. void
  567. preserveRRCheck(const Message& message, Message::Section section) {
  568. RRsetIterator it = message.beginSection(section);
  569. RRsetIterator it_end = message.endSection(section);
  570. ASSERT_TRUE(it != it_end);
  571. EXPECT_EQ(RRType::A(), (*it)->getType());
  572. EXPECT_EQ(1, (*it)->getRdataCount());
  573. EXPECT_EQ("192.0.2.1", (*it)->getRdataIterator()->getCurrent().toText());
  574. ++it;
  575. ASSERT_TRUE(it != it_end);
  576. EXPECT_EQ(RRType::AAAA(), (*it)->getType());
  577. EXPECT_EQ(1, (*it)->getRdataCount());
  578. EXPECT_EQ("2001:db8::1", (*it)->getRdataIterator()->getCurrent().toText());
  579. ++it;
  580. ASSERT_TRUE(it != it_end);
  581. EXPECT_EQ(RRType::A(), (*it)->getType());
  582. EXPECT_EQ(1, (*it)->getRdataCount());
  583. EXPECT_EQ("192.0.2.2", (*it)->getRdataIterator()->getCurrent().toText());
  584. }
  585. TEST_F(MessageTest, fromWirePreserveAnswer) {
  586. // Using the same data as the previous test, but specify the PRESERVE_ORDER
  587. // option. The received order of RRs should be preserved, and each RR
  588. // should be stored in a single RRset.
  589. factoryFromFile(message_parse, "message_fromWire19.wire",
  590. Message::PRESERVE_ORDER);
  591. {
  592. SCOPED_TRACE("preserve answer RRs");
  593. preserveRRCheck(message_parse, Message::SECTION_ANSWER);
  594. }
  595. }
  596. TEST_F(MessageTest, fromWirePreserveAuthority) {
  597. // Same for the previous test, but for the authority section.
  598. factoryFromFile(message_parse, "message_fromWire20.wire",
  599. Message::PRESERVE_ORDER);
  600. {
  601. SCOPED_TRACE("preserve authority RRs");
  602. preserveRRCheck(message_parse, Message::SECTION_AUTHORITY);
  603. }
  604. }
  605. TEST_F(MessageTest, fromWirePreserveAdditional) {
  606. // Same for the previous test, but for the additional section.
  607. factoryFromFile(message_parse, "message_fromWire21.wire",
  608. Message::PRESERVE_ORDER);
  609. {
  610. SCOPED_TRACE("preserve additional RRs");
  611. preserveRRCheck(message_parse, Message::SECTION_ADDITIONAL);
  612. }
  613. }
  614. TEST_F(MessageTest, EDNS0ExtRcode) {
  615. // Extended Rcode = BADVERS
  616. factoryFromFile(message_parse, "message_fromWire10.wire");
  617. EXPECT_EQ(Rcode::BADVERS(), message_parse.getRcode());
  618. // Maximum extended Rcode
  619. message_parse.clear(Message::PARSE);
  620. factoryFromFile(message_parse, "message_fromWire11.wire");
  621. EXPECT_EQ(0xfff, message_parse.getRcode().getCode());
  622. }
  623. TEST_F(MessageTest, BadEDNS0) {
  624. // OPT RR in the answer section
  625. EXPECT_THROW(factoryFromFile(message_parse, "message_fromWire4"),
  626. DNSMessageFORMERR);
  627. // multiple OPT RRs (in the additional section)
  628. message_parse.clear(Message::PARSE);
  629. EXPECT_THROW(factoryFromFile(message_parse, "message_fromWire5"),
  630. DNSMessageFORMERR);
  631. }
  632. TEST_F(MessageTest, toWire) {
  633. message_render.setQid(0x1035);
  634. message_render.setOpcode(Opcode::QUERY());
  635. message_render.setRcode(Rcode::NOERROR());
  636. message_render.setHeaderFlag(Message::HEADERFLAG_QR, true);
  637. message_render.setHeaderFlag(Message::HEADERFLAG_RD, true);
  638. message_render.setHeaderFlag(Message::HEADERFLAG_AA, true);
  639. message_render.addQuestion(Question(Name("test.example.com"), RRClass::IN(),
  640. RRType::A()));
  641. message_render.addRRset(Message::SECTION_ANSWER, rrset_a);
  642. EXPECT_EQ(1, message_render.getRRCount(Message::SECTION_QUESTION));
  643. EXPECT_EQ(2, message_render.getRRCount(Message::SECTION_ANSWER));
  644. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_AUTHORITY));
  645. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_ADDITIONAL));
  646. message_render.toWire(renderer);
  647. vector<unsigned char> data;
  648. UnitTestUtil::readWireData("message_toWire1", data);
  649. EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, renderer.getData(),
  650. renderer.getLength(), &data[0], data.size());
  651. }
  652. TEST_F(MessageTest, toWireSigned) {
  653. message_render.setQid(0x75c1);
  654. message_render.setOpcode(Opcode::QUERY());
  655. message_render.setRcode(Rcode::NOERROR());
  656. message_render.setHeaderFlag(Message::HEADERFLAG_QR, true);
  657. message_render.setHeaderFlag(Message::HEADERFLAG_RD, true);
  658. message_render.setHeaderFlag(Message::HEADERFLAG_AA, true);
  659. message_render.addQuestion(Question(Name("test.example.com"), RRClass::IN(),
  660. RRType::A()));
  661. rrset_rrsig = RRsetPtr(new RRset(test_name, RRClass::IN(),
  662. RRType::RRSIG(), RRTTL(3600)));
  663. // one signature algorithm (5 = RSA/SHA-1)
  664. rrset_rrsig->addRdata(generic::RRSIG("A 5 3 3600 "
  665. "20000101000000 20000201000000 "
  666. "12345 example.com. FAKEFAKEFAKE"));
  667. // another signature algorithm (3 = DSA/SHA-1)
  668. rrset_rrsig->addRdata(generic::RRSIG("A 3 3 3600 "
  669. "20000101000000 20000201000000 "
  670. "12345 example.com. FAKEFAKEFAKE"));
  671. rrset_a->addRRsig(rrset_rrsig);
  672. EXPECT_EQ(2, rrset_a->getRRsigDataCount());
  673. message_render.addRRset(Message::SECTION_ANSWER, rrset_a);
  674. EXPECT_EQ(1, message_render.getRRCount(Message::SECTION_QUESTION));
  675. EXPECT_EQ(4, message_render.getRRCount(Message::SECTION_ANSWER));
  676. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_AUTHORITY));
  677. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_ADDITIONAL));
  678. message_render.toWire(renderer);
  679. vector<unsigned char> data;
  680. UnitTestUtil::readWireData("message_toWire6", data);
  681. EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, renderer.getData(),
  682. renderer.getLength(), &data[0], data.size());
  683. }
  684. TEST_F(MessageTest, toWireSignedAndTruncated) {
  685. message_render.setQid(0x75c1);
  686. message_render.setOpcode(Opcode::QUERY());
  687. message_render.setRcode(Rcode::NOERROR());
  688. message_render.setHeaderFlag(Message::HEADERFLAG_QR, true);
  689. message_render.setHeaderFlag(Message::HEADERFLAG_RD, true);
  690. message_render.setHeaderFlag(Message::HEADERFLAG_AA, true);
  691. message_render.addQuestion(Question(Name("test.example.com"), RRClass::IN(),
  692. RRType::TXT()));
  693. RRsetPtr rrset_txt = RRsetPtr(new RRset(test_name, RRClass::IN(),
  694. RRType::TXT(), RRTTL(3600)));
  695. rrset_txt->addRdata(generic::TXT(string(255, 'a')));
  696. rrset_txt->addRdata(generic::TXT(string(255, 'b')));
  697. rrset_txt->addRdata(generic::TXT(string(255, 'c')));
  698. rrset_txt->addRdata(generic::TXT(string(255, 'd')));
  699. rrset_txt->addRdata(generic::TXT(string(255, 'e')));
  700. rrset_txt->addRdata(generic::TXT(string(255, 'f')));
  701. rrset_txt->addRdata(generic::TXT(string(255, 'g')));
  702. rrset_txt->addRdata(generic::TXT(string(255, 'h')));
  703. rrset_rrsig = RRsetPtr(new RRset(test_name, RRClass::IN(),
  704. RRType::RRSIG(), RRTTL(3600)));
  705. // one signature algorithm (5 = RSA/SHA-1)
  706. rrset_rrsig->addRdata(generic::RRSIG("TXT 5 3 3600 "
  707. "20000101000000 20000201000000 "
  708. "12345 example.com. FAKEFAKEFAKE"));
  709. rrset_txt->addRRsig(rrset_rrsig);
  710. EXPECT_EQ(1, rrset_txt->getRRsigDataCount());
  711. message_render.addRRset(Message::SECTION_ANSWER, rrset_txt);
  712. EXPECT_EQ(1, message_render.getRRCount(Message::SECTION_QUESTION));
  713. EXPECT_EQ(9, message_render.getRRCount(Message::SECTION_ANSWER));
  714. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_AUTHORITY));
  715. EXPECT_EQ(0, message_render.getRRCount(Message::SECTION_ADDITIONAL));
  716. message_render.toWire(renderer);
  717. vector<unsigned char> data;
  718. UnitTestUtil::readWireData("message_toWire7", data);
  719. EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, renderer.getData(),
  720. renderer.getLength(), &data[0], data.size());
  721. }
  722. TEST_F(MessageTest, toWireInParseMode) {
  723. // toWire() isn't allowed in the parse mode.
  724. EXPECT_THROW(message_parse.toWire(renderer), InvalidMessageOperation);
  725. }
  726. // See dnssectime_unittest.cc
  727. template <int64_t NOW>
  728. int64_t
  729. testGetTime() {
  730. return (NOW);
  731. }
  732. // bit-wise constant flags to configure DNS header flags for test
  733. // messages.
  734. const unsigned int QR_FLAG = 0x1;
  735. const unsigned int AA_FLAG = 0x2;
  736. const unsigned int RD_FLAG = 0x4;
  737. void
  738. commonTSIGToWireCheck(Message& message, MessageRenderer& renderer,
  739. TSIGContext& tsig_ctx, const char* const expected_file,
  740. unsigned int message_flags = RD_FLAG,
  741. RRType qtype = RRType::A(),
  742. const vector<const char*>* answer_data = NULL)
  743. {
  744. message.setOpcode(Opcode::QUERY());
  745. message.setRcode(Rcode::NOERROR());
  746. if ((message_flags & QR_FLAG) != 0) {
  747. message.setHeaderFlag(Message::HEADERFLAG_QR);
  748. }
  749. if ((message_flags & AA_FLAG) != 0) {
  750. message.setHeaderFlag(Message::HEADERFLAG_AA);
  751. }
  752. if ((message_flags & RD_FLAG) != 0) {
  753. message.setHeaderFlag(Message::HEADERFLAG_RD);
  754. }
  755. message.addQuestion(Question(Name("www.example.com"), RRClass::IN(),
  756. qtype));
  757. if (answer_data != NULL) {
  758. RRsetPtr ans_rrset(new RRset(Name("www.example.com"), RRClass::IN(),
  759. qtype, RRTTL(86400)));
  760. for (vector<const char*>::const_iterator it = answer_data->begin();
  761. it != answer_data->end();
  762. ++it) {
  763. ans_rrset->addRdata(createRdata(qtype, RRClass::IN(), *it));
  764. }
  765. message.addRRset(Message::SECTION_ANSWER, ans_rrset);
  766. }
  767. message.toWire(renderer, &tsig_ctx);
  768. vector<unsigned char> expected_data;
  769. UnitTestUtil::readWireData(expected_file, expected_data);
  770. EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, renderer.getData(),
  771. renderer.getLength(),
  772. &expected_data[0], expected_data.size());
  773. }
  774. TEST_F(MessageTest, toWireWithTSIG) {
  775. // Rendering a message with TSIG. Various special cases specific to
  776. // TSIG are tested in the tsig tests. We only check the message contains
  777. // a TSIG at the end and the ARCOUNT of the header is updated.
  778. isc::util::detail::gettimeFunction = testGetTime<0x4da8877a>;
  779. message_render.setQid(0x2d65);
  780. {
  781. SCOPED_TRACE("Message sign with TSIG");
  782. commonTSIGToWireCheck(message_render, renderer, tsig_ctx,
  783. "message_toWire2.wire");
  784. }
  785. }
  786. TEST_F(MessageTest, toWireWithEDNSAndTSIG) {
  787. // Similar to the previous test, but with an EDNS before TSIG.
  788. // The wire data check will confirm the ordering.
  789. isc::util::detail::gettimeFunction = testGetTime<0x4db60d1f>;
  790. message_render.setQid(0x6cd);
  791. EDNSPtr edns(new EDNS());
  792. edns->setUDPSize(4096);
  793. message_render.setEDNS(edns);
  794. {
  795. SCOPED_TRACE("Message sign with TSIG and EDNS");
  796. commonTSIGToWireCheck(message_render, renderer, tsig_ctx,
  797. "message_toWire3.wire");
  798. }
  799. }
  800. // Some of the following tests involve truncation. We use the query name
  801. // "www.example.com" and some TXT question/answers. The length of the
  802. // header and question will be 33 bytes. If we also try to include a
  803. // TSIG of the same key name (not compressed) with HMAC-MD5, the TSIG RR
  804. // will be 85 bytes.
  805. // A long TXT RDATA. With a fully compressed owner name, the corresponding
  806. // RR will be 268 bytes.
  807. const char* const long_txt1 = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcde";
  808. // With a fully compressed owner name, the corresponding RR will be 212 bytes.
  809. // It should result in truncation even without TSIG (33 + 268 + 212 = 513)
  810. const char* const long_txt2 = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456";
  811. // With a fully compressed owner name, the corresponding RR will be 127 bytes.
  812. // So, it can fit in the standard 512 bytes with txt1 and without TSIG, but
  813. // adding a TSIG would result in truncation (33 + 268 + 127 + 85 = 513)
  814. const char* const long_txt3 = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01";
  815. // This is 1 byte shorter than txt3, which will result in a possible longest
  816. // message containing answer RRs and TSIG.
  817. const char* const long_txt4 = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0";
  818. // Example output generated by
  819. // "dig -y www.example.com:SFuWd/q99SzF8Yzd1QbB9g== www.example.com txt
  820. // QID: 0x22c2
  821. // Time Signed: 0x00004e179212
  822. TEST_F(MessageTest, toWireTSIGTruncation) {
  823. isc::util::detail::gettimeFunction = testGetTime<0x4e179212>;
  824. // Verify a validly signed query so that we can use the TSIG context
  825. factoryFromFile(message_parse, "message_fromWire17.wire");
  826. EXPECT_EQ(TSIGError::NOERROR(),
  827. tsig_ctx.verify(message_parse.getTSIGRecord(),
  828. &received_data[0], received_data.size()));
  829. message_render.setQid(0x22c2);
  830. vector<const char*> answer_data;
  831. answer_data.push_back(long_txt1);
  832. answer_data.push_back(long_txt2);
  833. {
  834. SCOPED_TRACE("Message sign with TSIG and TC bit on");
  835. commonTSIGToWireCheck(message_render, renderer, tsig_ctx,
  836. "message_toWire4.wire",
  837. QR_FLAG|AA_FLAG|RD_FLAG,
  838. RRType::TXT(), &answer_data);
  839. }
  840. }
  841. TEST_F(MessageTest, toWireTSIGTruncation2) {
  842. // Similar to the previous test, but without TSIG it wouldn't cause
  843. // truncation.
  844. isc::util::detail::gettimeFunction = testGetTime<0x4e179212>;
  845. factoryFromFile(message_parse, "message_fromWire17.wire");
  846. EXPECT_EQ(TSIGError::NOERROR(),
  847. tsig_ctx.verify(message_parse.getTSIGRecord(),
  848. &received_data[0], received_data.size()));
  849. message_render.setQid(0x22c2);
  850. vector<const char*> answer_data;
  851. answer_data.push_back(long_txt1);
  852. answer_data.push_back(long_txt3);
  853. {
  854. SCOPED_TRACE("Message sign with TSIG and TC bit on (2)");
  855. commonTSIGToWireCheck(message_render, renderer, tsig_ctx,
  856. "message_toWire4.wire",
  857. QR_FLAG|AA_FLAG|RD_FLAG,
  858. RRType::TXT(), &answer_data);
  859. }
  860. }
  861. TEST_F(MessageTest, toWireTSIGTruncation3) {
  862. // Similar to previous ones, but truncation occurs due to too many
  863. // Questions (very unusual, but not necessarily illegal).
  864. // We are going to create a message starting with a standard
  865. // header (12 bytes) and multiple questions in the Question
  866. // section of the same owner name (changing the RRType, just so
  867. // that it would be the form that would be accepted by the BIND 9
  868. // parser). The first Question is 21 bytes in length, and the subsequent
  869. // ones are 6 bytes. We'll also use a TSIG whose size is 85 bytes.
  870. // Up to 66 questions can fit in the standard 512-byte buffer
  871. // (12 + 21 + 6 * 65 + 85 = 508). If we try to add one more it would
  872. // result in truncation.
  873. message_render.setOpcode(Opcode::QUERY());
  874. message_render.setRcode(Rcode::NOERROR());
  875. for (int i = 1; i <= 67; ++i) {
  876. message_render.addQuestion(Question(Name("www.example.com"),
  877. RRClass::IN(), RRType(i)));
  878. }
  879. message_render.toWire(renderer, &tsig_ctx);
  880. // Check the rendered data by parsing it. We only check it has the
  881. // TC bit on, has the correct number of questions, and has a TSIG RR.
  882. // Checking the signature wouldn't be necessary for this rare case
  883. // scenario.
  884. InputBuffer buffer(renderer.getData(), renderer.getLength());
  885. message_parse.fromWire(buffer);
  886. EXPECT_TRUE(message_parse.getHeaderFlag(Message::HEADERFLAG_TC));
  887. // Note that the number of questions are 66, not 67 as we tried to add.
  888. EXPECT_EQ(66, message_parse.getRRCount(Message::SECTION_QUESTION));
  889. EXPECT_TRUE(message_parse.getTSIGRecord() != NULL);
  890. }
  891. TEST_F(MessageTest, toWireTSIGNoTruncation) {
  892. // A boundary case that shouldn't cause truncation: the resulting
  893. // response message with a TSIG will be 512 bytes long.
  894. isc::util::detail::gettimeFunction = testGetTime<0x4e17b38d>;
  895. factoryFromFile(message_parse, "message_fromWire18.wire");
  896. EXPECT_EQ(TSIGError::NOERROR(),
  897. tsig_ctx.verify(message_parse.getTSIGRecord(),
  898. &received_data[0], received_data.size()));
  899. message_render.setQid(0xd6e2);
  900. vector<const char*> answer_data;
  901. answer_data.push_back(long_txt1);
  902. answer_data.push_back(long_txt4);
  903. {
  904. SCOPED_TRACE("Message sign with TSIG, no truncation");
  905. commonTSIGToWireCheck(message_render, renderer, tsig_ctx,
  906. "message_toWire5.wire",
  907. QR_FLAG|AA_FLAG|RD_FLAG,
  908. RRType::TXT(), &answer_data);
  909. }
  910. }
  911. // This is a buggy renderer for testing. It behaves like the straightforward
  912. // MessageRenderer, but once it has some data, its setLengthLimit() ignores
  913. // the given parameter and resets the limit to the current length, making
  914. // subsequent insertion result in truncation, which would make TSIG RR
  915. // rendering fail unexpectedly in the test that follows.
  916. class BadRenderer : public MessageRenderer {
  917. public:
  918. virtual void setLengthLimit(size_t len) {
  919. if (getLength() > 0) {
  920. MessageRenderer::setLengthLimit(getLength());
  921. } else {
  922. MessageRenderer::setLengthLimit(len);
  923. }
  924. }
  925. };
  926. TEST_F(MessageTest, toWireTSIGLengthErrors) {
  927. // specify an unusual short limit that wouldn't be able to hold
  928. // the TSIG.
  929. renderer.setLengthLimit(tsig_ctx.getTSIGLength() - 1);
  930. // Use commonTSIGToWireCheck() only to call toWire() with otherwise valid
  931. // conditions. The checks inside it don't matter because we expect an
  932. // exception before any of the checks.
  933. EXPECT_THROW(commonTSIGToWireCheck(message_render, renderer, tsig_ctx,
  934. "message_toWire2.wire"),
  935. InvalidParameter);
  936. // This one is large enough for TSIG, but the remaining limit isn't
  937. // even enough for the Header section.
  938. renderer.clear();
  939. message_render.clear(Message::RENDER);
  940. renderer.setLengthLimit(tsig_ctx.getTSIGLength() + 1);
  941. EXPECT_THROW(commonTSIGToWireCheck(message_render, renderer, tsig_ctx,
  942. "message_toWire2.wire"),
  943. InvalidParameter);
  944. // Trying to render a message with TSIG using a buggy renderer.
  945. BadRenderer bad_renderer;
  946. bad_renderer.setLengthLimit(512);
  947. message_render.clear(Message::RENDER);
  948. EXPECT_THROW(commonTSIGToWireCheck(message_render, bad_renderer, tsig_ctx,
  949. "message_toWire2.wire"),
  950. Unexpected);
  951. }
  952. TEST_F(MessageTest, toWireWithoutOpcode) {
  953. message_render.setRcode(Rcode::NOERROR());
  954. EXPECT_THROW(message_render.toWire(renderer), InvalidMessageOperation);
  955. }
  956. TEST_F(MessageTest, toWireWithoutRcode) {
  957. message_render.setOpcode(Opcode::QUERY());
  958. EXPECT_THROW(message_render.toWire(renderer), InvalidMessageOperation);
  959. }
  960. TEST_F(MessageTest, toText) {
  961. // Check toText() output for a typical DNS response with records in
  962. // all sections
  963. factoryFromFile(message_parse, "message_toText1.wire");
  964. {
  965. SCOPED_TRACE("Message toText test (basic case)");
  966. ifstream ifs;
  967. unittests::openTestData("message_toText1.txt", ifs);
  968. unittests::matchTextData(ifs, message_parse.toText());
  969. }
  970. // Another example with EDNS. The expected data was slightly modified
  971. // from the dig output (other than replacing tabs with a space): adding
  972. // a newline after the "OPT PSEUDOSECTION". This is an intentional change
  973. // in our version for better readability.
  974. message_parse.clear(Message::PARSE);
  975. factoryFromFile(message_parse, "message_toText2.wire");
  976. {
  977. SCOPED_TRACE("Message toText test with EDNS");
  978. ifstream ifs;
  979. unittests::openTestData("message_toText2.txt", ifs);
  980. unittests::matchTextData(ifs, message_parse.toText());
  981. }
  982. // Another example with TSIG. The expected data was slightly modified
  983. // from the dig output (other than replacing tabs with a space): removing
  984. // a redundant white space at the end of TSIG RDATA. We'd rather consider
  985. // it a dig's defect than a feature.
  986. message_parse.clear(Message::PARSE);
  987. factoryFromFile(message_parse, "message_toText3.wire");
  988. {
  989. SCOPED_TRACE("Message toText test with TSIG");
  990. ifstream ifs;
  991. unittests::openTestData("message_toText3.txt", ifs);
  992. unittests::matchTextData(ifs, message_parse.toText());
  993. }
  994. }
  995. TEST_F(MessageTest, toTextWithoutOpcode) {
  996. message_render.setRcode(Rcode::NOERROR());
  997. EXPECT_THROW(message_render.toText(), InvalidMessageOperation);
  998. }
  999. TEST_F(MessageTest, toTextWithoutRcode) {
  1000. message_render.setOpcode(Opcode::QUERY());
  1001. EXPECT_THROW(message_render.toText(), InvalidMessageOperation);
  1002. }
  1003. }