datasrc_unittest.cc 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572
  1. // Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
  2. //
  3. // Permission to use, copy, modify, and/or distribute this software for any
  4. // purpose with or without fee is hereby granted, provided that the above
  5. // copyright notice and this permission notice appear in all copies.
  6. //
  7. // THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
  8. // REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
  9. // AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
  10. // INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  11. // LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
  12. // OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  13. // PERFORMANCE OF THIS SOFTWARE.
  14. // $Id$
  15. #include <stdint.h>
  16. #include <iostream>
  17. #include <vector>
  18. #include <string>
  19. #include <gtest/gtest.h>
  20. #include <dns/buffer.h>
  21. #include <dns/message.h>
  22. #include <dns/messagerenderer.h>
  23. #include <dns/question.h>
  24. #include <dns/rdataclass.h>
  25. #include <dns/rrclass.h>
  26. #include <dns/rrttl.h>
  27. #include <dns/rrtype.h>
  28. #include <auth/query.h>
  29. #include "unittest_util.h"
  30. #include "test_datasrc.h"
  31. using isc::UnitTestUtil;
  32. using namespace std;
  33. using namespace isc::dns;
  34. using namespace isc::auth;
  35. namespace {
  36. TestDataSrc ds;
  37. class DataSrcTest : public ::testing::Test {
  38. protected:
  39. DataSrcTest() : obuffer(0), renderer(obuffer), msg(Message::PARSE) {
  40. ds.init();
  41. }
  42. OutputBuffer obuffer;
  43. MessageRenderer renderer;
  44. Message msg;
  45. };
  46. void
  47. performQuery(Message& message) {
  48. message.setHeaderFlag(MessageFlag::AA());
  49. message.setRcode(Rcode::NOERROR());
  50. Query q(message, true);
  51. ds.doQuery(q);
  52. }
  53. void
  54. readAndProcessQuery(Message& message, const char* datafile) {
  55. std::vector<unsigned char> data;
  56. UnitTestUtil::readWireData(datafile, data);
  57. InputBuffer buffer(&data[0], data.size());
  58. message.fromWire(buffer);
  59. message.makeResponse();
  60. performQuery(message);
  61. }
  62. void
  63. createAndProcessQuery(Message& message, const Name& qname,
  64. const RRClass& qclass, const RRType& qtype)
  65. {
  66. message.makeResponse();
  67. message.setOpcode(Opcode::QUERY());
  68. message.addQuestion(Question(qname, qclass, qtype));
  69. message.setHeaderFlag(MessageFlag::RD());
  70. performQuery(message);
  71. }
  72. void
  73. headerCheck(const Message& message, const Rcode& rcode, const bool qrflag,
  74. const bool aaflag, const bool rdflag, const unsigned int ancount,
  75. const unsigned int nscount, const unsigned int arcount)
  76. {
  77. EXPECT_EQ(rcode, message.getRcode());
  78. EXPECT_EQ(qrflag, message.getHeaderFlag(MessageFlag::QR()));
  79. EXPECT_EQ(aaflag, message.getHeaderFlag(MessageFlag::AA()));
  80. EXPECT_EQ(rdflag, message.getHeaderFlag(MessageFlag::RD()));
  81. EXPECT_EQ(ancount, message.getRRCount(Section::ANSWER()));
  82. EXPECT_EQ(nscount, message.getRRCount(Section::AUTHORITY()));
  83. EXPECT_EQ(arcount, message.getRRCount(Section::ADDITIONAL()));
  84. }
  85. TEST_F(DataSrcTest, Query) {
  86. readAndProcessQuery(msg, "testdata/q_www");
  87. headerCheck(msg, Rcode::NOERROR(), true, true, true, 2, 4, 6);
  88. RRsetIterator rit = msg.beginSection(Section::ANSWER());
  89. RRsetPtr rrset = *rit;
  90. EXPECT_EQ(Name("www.example.com"), rrset->getName());
  91. EXPECT_EQ(RRType::A(), rrset->getType());
  92. EXPECT_EQ(RRClass::IN(), rrset->getClass());
  93. RdataIteratorPtr it = rrset->getRdataIterator();
  94. it->first();
  95. EXPECT_EQ("192.168.1.1", it->getCurrent().toText());
  96. it->next();
  97. EXPECT_TRUE(it->isLast());
  98. // XXX: also check ANSWER RRSIG
  99. rit = msg.beginSection(Section::AUTHORITY());
  100. rrset = *rit;
  101. EXPECT_EQ(Name("example.com"), rrset->getName());
  102. EXPECT_EQ(RRType::NS(), rrset->getType());
  103. EXPECT_EQ(RRClass::IN(), rrset->getClass());
  104. it = rrset->getRdataIterator();
  105. it->first();
  106. EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
  107. it->next();
  108. EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
  109. it->next();
  110. EXPECT_EQ("dns03.example.com.", it->getCurrent().toText());
  111. it->next();
  112. EXPECT_TRUE(it->isLast());
  113. rit = msg.beginSection(Section::ADDITIONAL());
  114. rrset = *rit;
  115. EXPECT_EQ(Name("dns01.example.com"), rrset->getName());
  116. EXPECT_EQ(RRType::A(), rrset->getType());
  117. EXPECT_EQ(RRClass::IN(), rrset->getClass());
  118. it = rrset->getRdataIterator();
  119. it->first();
  120. EXPECT_EQ("192.168.2.1", it->getCurrent().toText());
  121. it->next();
  122. EXPECT_TRUE(it->isLast());
  123. }
  124. TEST_F(DataSrcTest, NSQuery) {
  125. readAndProcessQuery(msg, "testdata/q_example_ns");
  126. headerCheck(msg, Rcode::NOERROR(), true, true, true, 4, 0, 6);
  127. RRsetIterator rit = msg.beginSection(Section::ANSWER());
  128. RRsetPtr rrset = *rit;
  129. EXPECT_EQ(Name("example.com"), rrset->getName());
  130. EXPECT_EQ(RRType::NS(), rrset->getType());
  131. EXPECT_EQ(RRClass::IN(), rrset->getClass());
  132. RdataIteratorPtr it = rrset->getRdataIterator();
  133. it->first();
  134. EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
  135. it->next();
  136. EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
  137. it->next();
  138. EXPECT_EQ("dns03.example.com.", it->getCurrent().toText());
  139. it->next();
  140. EXPECT_TRUE(it->isLast());
  141. }
  142. TEST_F(DataSrcTest, NxRRset) {
  143. readAndProcessQuery(msg, "testdata/q_example_ptr");
  144. headerCheck(msg, Rcode::NOERROR(), true, true, true, 0, 4, 0);
  145. RRsetIterator rit = msg.beginSection(Section::AUTHORITY());
  146. RRsetPtr rrset = *rit;
  147. EXPECT_EQ(Name("example.com"), rrset->getName());
  148. EXPECT_EQ(RRType::SOA(), rrset->getType());
  149. }
  150. TEST_F(DataSrcTest, Nxdomain) {
  151. readAndProcessQuery(msg, "testdata/q_glork");
  152. headerCheck(msg, Rcode::NXDOMAIN(), true, true, true, 0, 6, 0);
  153. RRsetIterator rit = msg.beginSection(Section::AUTHORITY());
  154. RRsetPtr rrset = *rit;
  155. EXPECT_EQ(Name("example.com"), rrset->getName());
  156. EXPECT_EQ(RRType::SOA(), rrset->getType());
  157. EXPECT_EQ(RRClass::IN(), rrset->getClass());
  158. // XXX: check for other authority section answers
  159. }
  160. TEST_F(DataSrcTest, NxZone) {
  161. readAndProcessQuery(msg, "testdata/q_spork");
  162. headerCheck(msg, Rcode::REFUSED(), true, false, true, 0, 0, 0);
  163. EXPECT_EQ(Rcode::REFUSED(), msg.getRcode());
  164. EXPECT_TRUE(msg.getHeaderFlag(MessageFlag::QR()));
  165. EXPECT_FALSE(msg.getHeaderFlag(MessageFlag::AA()));
  166. EXPECT_TRUE(msg.getHeaderFlag(MessageFlag::RD()));
  167. }
  168. TEST_F(DataSrcTest, Wildcard) {
  169. readAndProcessQuery(msg, "testdata/q_wild_a");
  170. headerCheck(msg, Rcode::NOERROR(), true, true, true, 2, 4, 6);
  171. RRsetIterator rit = msg.beginSection(Section::ANSWER());
  172. RRsetPtr rrset = *rit;
  173. EXPECT_EQ(Name("www.wild.example.com"), rrset->getName());
  174. EXPECT_EQ(RRType::A(), rrset->getType());
  175. EXPECT_EQ(RRClass::IN(), rrset->getClass());
  176. RdataIteratorPtr it = rrset->getRdataIterator();
  177. it->first();
  178. EXPECT_EQ("192.168.3.2", it->getCurrent().toText());
  179. it->next();
  180. EXPECT_TRUE(it->isLast());
  181. rit = msg.beginSection(Section::AUTHORITY());
  182. rrset = *rit;
  183. EXPECT_EQ(Name("example.com"), rrset->getName());
  184. EXPECT_EQ(RRType::NS(), rrset->getType());
  185. EXPECT_EQ(RRClass::IN(), rrset->getClass());
  186. it = rrset->getRdataIterator();
  187. it->first();
  188. EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
  189. it->next();
  190. EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
  191. it->next();
  192. EXPECT_EQ("dns03.example.com.", it->getCurrent().toText());
  193. it->next();
  194. EXPECT_TRUE(it->isLast());
  195. rit = msg.beginSection(Section::ADDITIONAL());
  196. rrset = *rit;
  197. EXPECT_EQ(Name("dns01.example.com"), rrset->getName());
  198. EXPECT_EQ(RRType::A(), rrset->getType());
  199. EXPECT_EQ(RRClass::IN(), rrset->getClass());
  200. it = rrset->getRdataIterator();
  201. it->first();
  202. EXPECT_EQ("192.168.2.1", it->getCurrent().toText());
  203. it->next();
  204. EXPECT_TRUE(it->isLast());
  205. }
  206. TEST_F(DataSrcTest, WildcardNodata) {
  207. // Check that a query for a data type not covered by the wildcard
  208. // returns NOERROR
  209. readAndProcessQuery(msg, "testdata/q_wild_aaaa");
  210. headerCheck(msg, Rcode::NOERROR(), true, true, true, 0, 2, 0);
  211. }
  212. TEST_F(DataSrcTest, AuthDelegation) {
  213. readAndProcessQuery(msg, "testdata/q_sql1");
  214. headerCheck(msg, Rcode::NOERROR(), true, true, true, 2, 4, 6);
  215. RRsetIterator rit = msg.beginSection(Section::ANSWER());
  216. RRsetPtr rrset = *rit;
  217. EXPECT_EQ(Name("www.sql1.example.com"), rrset->getName());
  218. EXPECT_EQ(RRType::A(), rrset->getType());
  219. EXPECT_EQ(RRClass::IN(), rrset->getClass());
  220. RdataIteratorPtr it = rrset->getRdataIterator();
  221. it->first();
  222. EXPECT_EQ("192.168.2.2", it->getCurrent().toText());
  223. it->next();
  224. EXPECT_TRUE(it->isLast());
  225. rit = msg.beginSection(Section::AUTHORITY());
  226. rrset = *rit;
  227. EXPECT_EQ(Name("sql1.example.com"), rrset->getName());
  228. EXPECT_EQ(RRType::NS(), rrset->getType());
  229. EXPECT_EQ(RRClass::IN(), rrset->getClass());
  230. it = rrset->getRdataIterator();
  231. it->first();
  232. EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
  233. it->next();
  234. EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
  235. it->next();
  236. EXPECT_EQ("dns03.example.com.", it->getCurrent().toText());
  237. it->next();
  238. EXPECT_TRUE(it->isLast());
  239. rit = msg.beginSection(Section::ADDITIONAL());
  240. rrset = *rit;
  241. EXPECT_EQ(Name("dns01.example.com"), rrset->getName());
  242. EXPECT_EQ(RRType::A(), rrset->getType());
  243. EXPECT_EQ(RRClass::IN(), rrset->getClass());
  244. it = rrset->getRdataIterator();
  245. it->first();
  246. EXPECT_EQ("192.168.2.1", it->getCurrent().toText());
  247. it->next();
  248. EXPECT_TRUE(it->isLast());
  249. }
  250. TEST_F(DataSrcTest, Dname) {
  251. readAndProcessQuery(msg, "testdata/q_dname");
  252. headerCheck(msg, Rcode::NOERROR(), true, true, true, 5, 4, 6);
  253. RRsetIterator rit = msg.beginSection(Section::ANSWER());
  254. RRsetPtr rrset = *rit;
  255. EXPECT_EQ(Name("dname.example.com"), rrset->getName());
  256. EXPECT_EQ(RRType::DNAME(), rrset->getType());
  257. EXPECT_EQ(RRClass::IN(), rrset->getClass());
  258. RdataIteratorPtr it = rrset->getRdataIterator();
  259. it->first();
  260. EXPECT_EQ("sql1.example.com.", it->getCurrent().toText());
  261. it->next();
  262. EXPECT_TRUE(it->isLast());
  263. // XXX: check CNAME and A record too
  264. rit = msg.beginSection(Section::AUTHORITY());
  265. rrset = *rit;
  266. EXPECT_EQ(Name("sql1.example.com"), rrset->getName());
  267. EXPECT_EQ(RRType::NS(), rrset->getType());
  268. EXPECT_EQ(RRClass::IN(), rrset->getClass());
  269. it = rrset->getRdataIterator();
  270. it->first();
  271. EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
  272. it->next();
  273. EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
  274. it->next();
  275. EXPECT_EQ("dns03.example.com.", it->getCurrent().toText());
  276. it->next();
  277. EXPECT_TRUE(it->isLast());
  278. rit = msg.beginSection(Section::ADDITIONAL());
  279. rrset = *rit;
  280. EXPECT_EQ(Name("dns01.example.com"), rrset->getName());
  281. EXPECT_EQ(RRType::A(), rrset->getType());
  282. EXPECT_EQ(RRClass::IN(), rrset->getClass());
  283. it = rrset->getRdataIterator();
  284. it->first();
  285. EXPECT_EQ("192.168.2.1", it->getCurrent().toText());
  286. it->next();
  287. EXPECT_TRUE(it->isLast());
  288. }
  289. TEST_F(DataSrcTest, Cname) {
  290. readAndProcessQuery(msg, "testdata/q_cname");
  291. headerCheck(msg, Rcode::NOERROR(), true, true, true, 2, 0, 0);
  292. RRsetIterator rit = msg.beginSection(Section::ANSWER());
  293. RRsetPtr rrset = *rit;
  294. EXPECT_EQ(Name("foo.example.com"), rrset->getName());
  295. EXPECT_EQ(RRType::CNAME(), rrset->getType());
  296. EXPECT_EQ(RRClass::IN(), rrset->getClass());
  297. RdataIteratorPtr it = rrset->getRdataIterator();
  298. it->first();
  299. EXPECT_EQ("cnametest.flame.org.", it->getCurrent().toText());
  300. it->next();
  301. EXPECT_TRUE(it->isLast());
  302. }
  303. TEST_F(DataSrcTest, CnameInt) {
  304. readAndProcessQuery(msg, "testdata/q_cname_int");
  305. headerCheck(msg, Rcode::NOERROR(), true, true, true, 4, 4, 6);
  306. RRsetIterator rit = msg.beginSection(Section::ANSWER());
  307. RRsetPtr rrset = *rit;
  308. EXPECT_EQ(Name("cname-int.example.com"), rrset->getName());
  309. EXPECT_EQ(RRType::CNAME(), rrset->getType());
  310. EXPECT_EQ(RRClass::IN(), rrset->getClass());
  311. RdataIteratorPtr it = rrset->getRdataIterator();
  312. it->first();
  313. EXPECT_EQ("www.example.com.", it->getCurrent().toText());
  314. it->next();
  315. EXPECT_TRUE(it->isLast());
  316. // XXX: check a record as well
  317. rit = msg.beginSection(Section::AUTHORITY());
  318. rrset = *rit;
  319. EXPECT_EQ(Name("example.com"), rrset->getName());
  320. EXPECT_EQ(RRType::NS(), rrset->getType());
  321. EXPECT_EQ(RRClass::IN(), rrset->getClass());
  322. }
  323. TEST_F(DataSrcTest, CnameExt) {
  324. readAndProcessQuery(msg, "testdata/q_cname_ext");
  325. headerCheck(msg, Rcode::NOERROR(), true, true, true, 4, 4, 6);
  326. RRsetIterator rit = msg.beginSection(Section::ANSWER());
  327. RRsetPtr rrset = *rit;
  328. EXPECT_EQ(Name("cname-ext.example.com"), rrset->getName());
  329. EXPECT_EQ(RRType::CNAME(), rrset->getType());
  330. EXPECT_EQ(RRClass::IN(), rrset->getClass());
  331. RdataIteratorPtr it = rrset->getRdataIterator();
  332. it->first();
  333. EXPECT_EQ("www.sql1.example.com.", it->getCurrent().toText());
  334. it->next();
  335. EXPECT_TRUE(it->isLast());
  336. rit = msg.beginSection(Section::AUTHORITY());
  337. rrset = *rit;
  338. EXPECT_EQ(Name("sql1.example.com"), rrset->getName());
  339. EXPECT_EQ(RRType::NS(), rrset->getType());
  340. EXPECT_EQ(RRClass::IN(), rrset->getClass());
  341. }
  342. TEST_F(DataSrcTest, Delegation) {
  343. readAndProcessQuery(msg, "testdata/q_subzone");
  344. headerCheck(msg, Rcode::NOERROR(), true, false, true, 0, 5, 2);
  345. RRsetIterator rit = msg.beginSection(Section::AUTHORITY());
  346. RRsetPtr rrset = *rit;
  347. EXPECT_EQ(Name("subzone.example.com."), rrset->getName());
  348. EXPECT_EQ(RRType::NS(), rrset->getType());
  349. EXPECT_EQ(RRClass::IN(), rrset->getClass());
  350. RdataIteratorPtr it = rrset->getRdataIterator();
  351. it->first();
  352. EXPECT_EQ("ns1.subzone.example.com.", it->getCurrent().toText());
  353. it->next();
  354. EXPECT_FALSE(it->isLast());
  355. rit = msg.beginSection(Section::ADDITIONAL());
  356. rrset = *rit;
  357. EXPECT_EQ(Name("ns1.subzone.example.com"), rrset->getName());
  358. EXPECT_EQ(RRType::A(), rrset->getType());
  359. EXPECT_EQ(RRClass::IN(), rrset->getClass());
  360. it = rrset->getRdataIterator();
  361. it->first();
  362. EXPECT_EQ("192.168.3.1", it->getCurrent().toText());
  363. it->next();
  364. EXPECT_TRUE(it->isLast());
  365. }
  366. TEST_F(DataSrcTest, NSDelegation) {
  367. readAndProcessQuery(msg, "testdata/q_subzone_ns");
  368. headerCheck(msg, Rcode::NOERROR(), true, false, true, 0, 5, 2);
  369. RRsetIterator rit = msg.beginSection(Section::AUTHORITY());
  370. RRsetPtr rrset = *rit;
  371. EXPECT_EQ(Name("subzone.example.com."), rrset->getName());
  372. EXPECT_EQ(RRType::NS(), rrset->getType());
  373. EXPECT_EQ(RRClass::IN(), rrset->getClass());
  374. RdataIteratorPtr it = rrset->getRdataIterator();
  375. it->first();
  376. EXPECT_EQ("ns1.subzone.example.com.", it->getCurrent().toText());
  377. it->next();
  378. EXPECT_FALSE(it->isLast());
  379. rit = msg.beginSection(Section::ADDITIONAL());
  380. rrset = *rit;
  381. EXPECT_EQ(Name("ns1.subzone.example.com"), rrset->getName());
  382. EXPECT_EQ(RRType::A(), rrset->getType());
  383. EXPECT_EQ(RRClass::IN(), rrset->getClass());
  384. it = rrset->getRdataIterator();
  385. it->first();
  386. EXPECT_EQ("192.168.3.1", it->getCurrent().toText());
  387. it->next();
  388. EXPECT_TRUE(it->isLast());
  389. }
  390. TEST_F(DataSrcTest, ANYDelegation) {
  391. // An ANY query at a zone cut should behave the same as any other
  392. // delegation
  393. readAndProcessQuery(msg, "testdata/q_subzone_any");
  394. headerCheck(msg, Rcode::NOERROR(), true, false, true, 0, 5, 2);
  395. RRsetIterator rit = msg.beginSection(Section::AUTHORITY());
  396. RRsetPtr rrset = *rit;
  397. EXPECT_EQ(Name("subzone.example.com."), rrset->getName());
  398. EXPECT_EQ(RRType::NS(), rrset->getType());
  399. EXPECT_EQ(RRClass::IN(), rrset->getClass());
  400. RdataIteratorPtr it = rrset->getRdataIterator();
  401. it->first();
  402. EXPECT_EQ("ns1.subzone.example.com.", it->getCurrent().toText());
  403. it->next();
  404. EXPECT_FALSE(it->isLast());
  405. rit = msg.beginSection(Section::ADDITIONAL());
  406. rrset = *rit;
  407. EXPECT_EQ(Name("ns1.subzone.example.com"), rrset->getName());
  408. EXPECT_EQ(RRType::A(), rrset->getType());
  409. EXPECT_EQ(RRClass::IN(), rrset->getClass());
  410. it = rrset->getRdataIterator();
  411. it->first();
  412. EXPECT_EQ("192.168.3.1", it->getCurrent().toText());
  413. it->next();
  414. EXPECT_TRUE(it->isLast());
  415. }
  416. TEST_F(DataSrcTest, DS) {
  417. readAndProcessQuery(msg, "testdata/q_subzone_ds");
  418. headerCheck(msg, Rcode::NOERROR(), true, true, true, 3, 4, 6);
  419. RRsetIterator rit = msg.beginSection(Section::ANSWER());
  420. RRsetPtr rrset = *rit;
  421. EXPECT_EQ(Name("subzone.example.com."), rrset->getName());
  422. EXPECT_EQ(RRType::DS(), rrset->getType());
  423. EXPECT_EQ(RRClass::IN(), rrset->getClass());
  424. rit = msg.beginSection(Section::AUTHORITY());
  425. rrset = *rit;
  426. EXPECT_EQ(Name("example.com"), rrset->getName());
  427. EXPECT_EQ(RRType::NS(), rrset->getType());
  428. EXPECT_EQ(RRClass::IN(), rrset->getClass());
  429. RdataIteratorPtr it = rrset->getRdataIterator();
  430. it->first();
  431. EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
  432. it->next();
  433. EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
  434. it->next();
  435. EXPECT_EQ("dns03.example.com.", it->getCurrent().toText());
  436. it->next();
  437. EXPECT_TRUE(it->isLast());
  438. }
  439. TEST_F(DataSrcTest, CNAMELoop) {
  440. createAndProcessQuery(msg, Name("loop1.example.com"), RRClass::IN(),
  441. RRType::A());
  442. }
  443. TEST_F(DataSrcTest, Nsec3Hash) {
  444. vector<uint8_t> salt;
  445. salt.push_back(0xfe);
  446. salt.push_back(0xed);
  447. salt.push_back(0xab);
  448. salt.push_back(0xee);
  449. Nsec3Param nsec3(1, 0, 10, salt);
  450. EXPECT_EQ("VIR9KJAPN2FHRLS6EP0JBQ89MBLUE296", nsec3.getHash(Name("test1")));
  451. EXPECT_EQ("FHA27EURONFH5640SFJQ8MJAKMCVB7UJ", nsec3.getHash(Name("test2")));
  452. EXPECT_EQ("A4M93LR7A60IDDQMO6TCVUPCC60CU38A", nsec3.getHash(Name("test3")));
  453. }
  454. TEST_F(DataSrcTest, AddRemoveDataSrc) {
  455. MetaDataSrc ds;
  456. ConstDataSrcPtr tsp = ConstDataSrcPtr(new TestDataSrc);
  457. EXPECT_EQ(0, ds.dataSrcCount());
  458. ds.addDataSrc(tsp);
  459. EXPECT_EQ(1, ds.dataSrcCount());
  460. ds.removeDataSrc(tsp);
  461. EXPECT_EQ(0, ds.dataSrcCount());
  462. }
  463. }