name_unittest.cc 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595
  1. // Copyright (C) 2009 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 <vector>
  15. #include <string>
  16. #include <sstream>
  17. #include <iomanip>
  18. #include <limits>
  19. #include <stdexcept>
  20. #include <util/buffer.h>
  21. #include <dns/exceptions.h>
  22. #include <dns/name.h>
  23. #include <dns/messagerenderer.h>
  24. #include <dns/tests/unittest_util.h>
  25. #include <gtest/gtest.h>
  26. using namespace std;
  27. using namespace isc;
  28. using namespace isc::dns;
  29. using namespace isc::util;
  30. //
  31. // XXX: these are defined as class static constants, but some compilers
  32. // seemingly cannot find the symbols when used in the EXPECT_xxx macros.
  33. //
  34. const size_t Name::MAX_WIRE;
  35. const size_t Name::MAX_LABELS;
  36. namespace {
  37. class NameTest : public ::testing::Test {
  38. protected:
  39. NameTest() : example_name("www.example.com"),
  40. example_name_upper("WWW.EXAMPLE.COM"),
  41. small_name("aaa.example.com"),
  42. large_name("zzz.example.com"),
  43. buffer_actual(0), buffer_expected(0)
  44. {}
  45. const Name example_name;
  46. Name example_name_upper; // this will be modified and cannot be const
  47. const Name small_name;
  48. const Name large_name;
  49. OutputBuffer buffer_actual, buffer_expected;
  50. //
  51. // helper methods
  52. //
  53. static Name nameFactoryFromWire(const char* datafile, size_t position,
  54. bool downcase = false);
  55. // construct a name including all non-upper-case-alphabet characters.
  56. static Name nameFactoryLowerCase();
  57. void compareInWireFormat(const Name& name_actual,
  58. const Name& name_expected);
  59. };
  60. const Name downcased_global("\\255.EXAMPLE.COM", true);
  61. Name
  62. NameTest::nameFactoryFromWire(const char* datafile, size_t position,
  63. bool downcase)
  64. {
  65. vector<unsigned char> data;
  66. UnitTestUtil::readWireData(datafile, data);
  67. InputBuffer buffer(&data[0], data.size());
  68. buffer.setPosition(position);
  69. return (Name(buffer, downcase));
  70. }
  71. Name
  72. NameTest::nameFactoryLowerCase() {
  73. string lowercase_namestr;
  74. lowercase_namestr.reserve(Name::MAX_WIRE);
  75. unsigned int ch = 0;
  76. unsigned int labelcount = 0;
  77. do {
  78. if (ch < 'A' || ch > 'Z') {
  79. ostringstream ss;
  80. ss.setf(ios_base::right, ios_base::adjustfield);
  81. ss.width(3);
  82. ss << setfill('0') << ch;
  83. lowercase_namestr += '\\' + ss.str();
  84. if (++labelcount == Name::MAX_LABELLEN) {
  85. lowercase_namestr.push_back('.');
  86. labelcount = 0;
  87. }
  88. }
  89. } while (++ch <= Name::MAX_WIRE);
  90. return (Name(lowercase_namestr));
  91. }
  92. void
  93. NameTest::compareInWireFormat(const Name& name_actual,
  94. const Name& name_expected)
  95. {
  96. buffer_actual.clear();
  97. buffer_expected.clear();
  98. name_actual.toWire(buffer_actual);
  99. name_expected.toWire(buffer_expected);
  100. EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData,
  101. buffer_actual.getData(), buffer_actual.getLength(),
  102. buffer_expected.getData(), buffer_expected.getLength());
  103. }
  104. TEST_F(NameTest, nonlocalObject) {
  105. // A previous version of code relied on a non local static object for
  106. // name construction, so a non local static Name object defined outside
  107. // the name module might not be initialized correctly. This test detects
  108. // that kind of bug.
  109. EXPECT_EQ("\\255.example.com.", downcased_global.toText());
  110. }
  111. TEST_F(NameTest, fromText) {
  112. vector<string> strnames;
  113. strnames.push_back("www.example.com");
  114. strnames.push_back("www.example.com."); // with a trailing dot
  115. strnames.push_back("wWw.exAmpLe.com"); // mixed cases
  116. strnames.push_back("\\wWw.exAmpLe.com"); // escape with a backslash
  117. // decimal representation for "WWW"
  118. strnames.push_back("\\087\\087\\087.example.com");
  119. vector<string>::const_iterator it;
  120. for (it = strnames.begin(); it != strnames.end(); ++it) {
  121. EXPECT_PRED_FORMAT2(UnitTestUtil::matchName, example_name, Name(*it));
  122. }
  123. // root names
  124. EXPECT_PRED_FORMAT2(UnitTestUtil::matchName, Name("@"), Name("."));
  125. // downcase
  126. EXPECT_EQ(Name("Www.eXample.coM", true).toText(), example_name.toText());
  127. //
  128. // Tests for bogus names. These should trigger an exception.
  129. //
  130. // empty label cannot be followed by another label
  131. EXPECT_THROW(Name(".a"), EmptyLabel);
  132. // duplicate period
  133. EXPECT_THROW(Name("a.."), EmptyLabel);
  134. // label length must be < 64
  135. EXPECT_THROW(Name("012345678901234567890123456789"
  136. "012345678901234567890123456789"
  137. "0123"), TooLongLabel);
  138. // now-unsupported bitstring labels
  139. EXPECT_THROW(Name("\\[b11010000011101]"), BadLabelType);
  140. // label length must be < 64
  141. EXPECT_THROW(Name("012345678901234567890123456789"
  142. "012345678901234567890123456789"
  143. "012\\x"), TooLongLabel);
  144. // but okay as long as resulting len < 64 even if the original string is
  145. // "too long"
  146. EXPECT_NO_THROW(Name("012345678901234567890123456789"
  147. "012345678901234567890123456789"
  148. "01\\x"));
  149. // incomplete \DDD pattern (exactly 3 D's must appear)
  150. EXPECT_THROW(Name("\\12abc"), BadEscape);
  151. // \DDD must not exceed 255
  152. EXPECT_THROW(Name("\\256"), BadEscape);
  153. // Same tests for \111 as for \\x above
  154. EXPECT_THROW(Name("012345678901234567890123456789"
  155. "012345678901234567890123456789"
  156. "012\\111"), TooLongLabel);
  157. EXPECT_NO_THROW(Name("012345678901234567890123456789"
  158. "012345678901234567890123456789"
  159. "01\\111"));
  160. // A domain name must be 255 octets or less
  161. EXPECT_THROW(Name("123456789.123456789.123456789.123456789.123456789."
  162. "123456789.123456789.123456789.123456789.123456789."
  163. "123456789.123456789.123456789.123456789.123456789."
  164. "123456789.123456789.123456789.123456789.123456789."
  165. "123456789.123456789.123456789.123456789.123456789."
  166. "1234"), TooLongName);
  167. // This is a possible longest name and should be accepted
  168. EXPECT_NO_THROW(Name("123456789.123456789.123456789.123456789.123456789."
  169. "123456789.123456789.123456789.123456789.123456789."
  170. "123456789.123456789.123456789.123456789.123456789."
  171. "123456789.123456789.123456789.123456789.123456789."
  172. "123456789.123456789.123456789.123456789.123456789."
  173. "123"));
  174. // \DDD must consist of 3 digits.
  175. EXPECT_THROW(Name("\\12"), IncompleteName);
  176. // a name with the max number of labels. should be constructed without
  177. // an error, and its length should be the max value.
  178. Name maxlabels = Name("0.1.2.3.4.5.6.7.8.9.0.1.2.3.4.5.6.7.8.9." // 40
  179. "0.1.2.3.4.5.6.7.8.9.0.1.2.3.4.5.6.7.8.9." // 80
  180. "0.1.2.3.4.5.6.7.8.9.0.1.2.3.4.5.6.7.8.9." // 120
  181. "0.1.2.3.4.5.6.7.8.9.0.1.2.3.4.5.6.7.8.9." // 160
  182. "0.1.2.3.4.5.6.7.8.9.0.1.2.3.4.5.6.7.8.9." // 200
  183. "0.1.2.3.4.5.6.7.8.9.0.1.2.3.4.5.6.7.8.9." // 240
  184. "0.1.2.3.4.5.6.");
  185. EXPECT_EQ(Name::MAX_LABELS, maxlabels.getLabelCount());
  186. }
  187. TEST_F(NameTest, fromWire) {
  188. //
  189. // test cases derived from BIND9 tests.
  190. //
  191. // normal case with a compression pointer
  192. EXPECT_PRED_FORMAT2(UnitTestUtil::matchName,
  193. nameFactoryFromWire("name_fromWire1", 25),
  194. Name("vix.com"));
  195. // bogus label character (looks like a local compression pointer)
  196. EXPECT_THROW(nameFactoryFromWire("name_fromWire2", 25), DNSMessageFORMERR);
  197. // a bad compression pointer (too big)
  198. EXPECT_THROW(nameFactoryFromWire("name_fromWire3_1", 25),
  199. DNSMessageFORMERR);
  200. // forward reference
  201. EXPECT_THROW(nameFactoryFromWire("name_fromWire3_2", 25),
  202. DNSMessageFORMERR);
  203. // invalid name length
  204. EXPECT_THROW(nameFactoryFromWire("name_fromWire4", 550), DNSMessageFORMERR);
  205. // skip test for from Wire5. It's for disabling decompression, but our
  206. // implementation always allows it.
  207. // bad pointer (too big)
  208. EXPECT_THROW(nameFactoryFromWire("name_fromWire6", 25), DNSMessageFORMERR);
  209. // input ends unexpectedly
  210. EXPECT_THROW(nameFactoryFromWire("name_fromWire7", 25), DNSMessageFORMERR);
  211. // many hops of compression but valid. should succeed.
  212. EXPECT_PRED_FORMAT2(UnitTestUtil::matchName,
  213. nameFactoryFromWire("name_fromWire8", 383),
  214. Name("vix.com"));
  215. //
  216. // Additional test cases
  217. //
  218. // large names, a long but valid one, and invalid (too long) one.
  219. EXPECT_EQ(Name::MAX_WIRE,
  220. nameFactoryFromWire("name_fromWire9", 0).getLength());
  221. EXPECT_THROW(nameFactoryFromWire("name_fromWire10", 0).getLength(),
  222. DNSMessageFORMERR);
  223. // A name with possible maximum number of labels; awkward but valid
  224. EXPECT_EQ(nameFactoryFromWire("name_fromWire11", 0).getLabelCount(),
  225. Name::MAX_LABELS);
  226. // Wire format including an invalid label length
  227. EXPECT_THROW(nameFactoryFromWire("name_fromWire12", 0), DNSMessageFORMERR);
  228. // converting upper-case letters to down-case
  229. EXPECT_EQ("vix.com.",
  230. nameFactoryFromWire("name_fromWire1", 25, true).toText());
  231. EXPECT_EQ(3, nameFactoryFromWire("name_fromWire1", 25).getLabelCount());
  232. }
  233. TEST_F(NameTest, copyConstruct) {
  234. Name copy(example_name);
  235. EXPECT_EQ(copy, example_name);
  236. // Check the copied data is valid even after the original is deleted
  237. Name* copy2 = new Name(example_name);
  238. Name copy3(*copy2);
  239. delete copy2;
  240. EXPECT_EQ(copy3, example_name);
  241. }
  242. TEST_F(NameTest, assignment) {
  243. Name copy(".");
  244. copy = example_name;
  245. EXPECT_EQ(copy, example_name);
  246. // Check if the copied data is valid even after the original is deleted
  247. Name* copy2 = new Name(example_name);
  248. Name copy3(".");
  249. copy3 = *copy2;
  250. delete copy2;
  251. EXPECT_EQ(copy3, example_name);
  252. // Self assignment
  253. copy = copy;
  254. EXPECT_EQ(example_name, copy);
  255. }
  256. TEST_F(NameTest, toText) {
  257. // tests derived from BIND9
  258. EXPECT_EQ("a.b.c.d", Name("a.b.c.d").toText(true));
  259. EXPECT_EQ("a.\\\\[[.c.d", Name("a.\\\\[\\[.c.d").toText(true));
  260. EXPECT_EQ("a.b.C.d.", Name("a.b.C.d").toText(false));
  261. EXPECT_EQ("a.b.", Name("a.b.").toText(false));
  262. // test omit_final_dot. It's false by default.
  263. EXPECT_EQ("a.b.c.d", Name("a.b.c.d.").toText(true));
  264. EXPECT_EQ(Name("a.b.").toText(false), Name("a.b.").toText());
  265. // the root name is a special case: omit_final_dot will be ignored.
  266. EXPECT_EQ(".", Name(".").toText(true));
  267. // test all printable characters to see whether special characters are
  268. // escaped while the others are intact. note that the conversion is
  269. // implementation specific; for example, it's not invalid to escape a
  270. // "normal" character such as 'a' with regard to the standard.
  271. string all_printable("!\\\"#\\$%&'\\(\\)*+,-\\./0123456789:\\;<=>?\\@"
  272. "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  273. "[\\\\]^_.`abcdefghijklmnopqrstuvwxyz{|}~.");
  274. EXPECT_EQ(all_printable,
  275. nameFactoryFromWire("name_fromWire13", 0).toText());
  276. string all_nonprintable(
  277. "\\000\\001\\002\\003\\004\\005\\006\\007\\008\\009"
  278. "\\010\\011\\012\\013\\014\\015\\016\\017\\018\\019"
  279. "\\020\\021\\022\\023\\024\\025\\026\\027\\028\\029"
  280. "\\030\\031\\032\\127\\128\\129"
  281. "\\130\\131\\132\\133\\134\\135\\136\\137\\138\\139"
  282. "\\140\\141\\142\\143\\144\\145\\146\\147\\148\\149"
  283. "\\150\\151\\152\\153\\154\\155\\156."
  284. "\\157\\158\\159"
  285. "\\160\\161\\162\\163\\164\\165\\166\\167\\168\\169"
  286. "\\170\\171\\172\\173\\174\\175\\176\\177\\178\\179"
  287. "\\180\\181\\182\\183\\184\\185\\186\\187\\188\\189"
  288. "\\190\\191\\192\\193\\194\\195\\196\\197\\198\\199"
  289. "\\200\\201\\202\\203\\204\\205\\206\\207\\208\\209"
  290. "\\210\\211\\212\\213\\214\\215\\216\\217\\218\\219."
  291. "\\220\\221\\222\\223\\224\\225\\226\\227\\228\\229"
  292. "\\230\\231\\232\\233\\234\\235\\236\\237\\238\\239"
  293. "\\240\\241\\242\\243\\244\\245\\246\\247\\248\\249"
  294. "\\250\\251\\252\\253\\254\\255.");
  295. EXPECT_EQ(all_nonprintable,
  296. nameFactoryFromWire("name_fromWire14", 0).toText());
  297. }
  298. TEST_F(NameTest, toWireBuffer) {
  299. vector<unsigned char> data;
  300. OutputBuffer buffer(0);
  301. UnitTestUtil::readWireData(string("01610376697803636f6d00"), data);
  302. Name("a.vix.com.").toWire(buffer);
  303. EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, &data[0], data.size(),
  304. buffer.getData(), buffer.getLength());
  305. }
  306. //
  307. // We test various corner cases in Renderer tests, but add this test case
  308. // to fill the code coverage gap.
  309. //
  310. TEST_F(NameTest, toWireRenderer) {
  311. vector<unsigned char> data;
  312. MessageRenderer renderer;
  313. UnitTestUtil::readWireData(string("01610376697803636f6d00"), data);
  314. Name("a.vix.com.").toWire(renderer);
  315. EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, &data[0], data.size(),
  316. renderer.getData(), renderer.getLength());
  317. }
  318. //
  319. // Helper class to hold comparison test parameters.
  320. //
  321. struct CompareParameters {
  322. CompareParameters(const Name& n1, const Name& n2,
  323. NameComparisonResult::NameRelation r, int o,
  324. unsigned int l) :
  325. name1(n1), name2(n2), reln(r), order(o), labels(l) {}
  326. static int normalizeOrder(int o)
  327. {
  328. if (o > 0) {
  329. return (1);
  330. } else if (o < 0) {
  331. return (-1);
  332. }
  333. return (0);
  334. }
  335. Name name1;
  336. Name name2;
  337. NameComparisonResult::NameRelation reln;
  338. int order;
  339. unsigned int labels;
  340. };
  341. TEST_F(NameTest, compare) {
  342. vector<CompareParameters> params;
  343. params.push_back(CompareParameters(Name("c.d"), Name("a.b.c.d"),
  344. NameComparisonResult::SUPERDOMAIN,
  345. -1, 3));
  346. params.push_back(CompareParameters(Name("a.b.c.d"), Name("c.d"),
  347. NameComparisonResult::SUBDOMAIN, 1, 3));
  348. params.push_back(CompareParameters(Name("a.b.c.d"), Name("c.d.e.f"),
  349. NameComparisonResult::COMMONANCESTOR,
  350. -1, 1));
  351. params.push_back(CompareParameters(Name("a.b.c.d"), Name("f.g.c.d"),
  352. NameComparisonResult::COMMONANCESTOR,
  353. -1, 3));
  354. params.push_back(CompareParameters(Name("a.b.c.d"), Name("A.b.C.d."),
  355. NameComparisonResult::EQUAL,
  356. 0, 5));
  357. vector<CompareParameters>::const_iterator it;
  358. for (it = params.begin(); it != params.end(); ++it) {
  359. NameComparisonResult result = (*it).name1.compare((*it).name2);
  360. EXPECT_EQ((*it).reln, result.getRelation());
  361. EXPECT_EQ((*it).order,
  362. CompareParameters::normalizeOrder(result.getOrder()));
  363. EXPECT_EQ((*it).labels, result.getCommonLabels());
  364. }
  365. }
  366. TEST_F(NameTest, equal) {
  367. EXPECT_TRUE(example_name == Name("WWW.EXAMPLE.COM."));
  368. EXPECT_TRUE(example_name.equals(Name("WWW.EXAMPLE.COM.")));
  369. EXPECT_TRUE(example_name != Name("www.example.org."));
  370. EXPECT_TRUE(example_name.nequals(Name("www.example.org.")));
  371. // lengths don't match
  372. EXPECT_TRUE(example_name != Name("www2.example.com."));
  373. EXPECT_TRUE(example_name.nequals(Name("www2.example.com.")));
  374. // lengths are equal, but # of labels don't match (first test checks the
  375. // prerequisite).
  376. EXPECT_EQ(example_name.getLength(), Name("www\\.example.com.").getLength());
  377. EXPECT_TRUE(example_name != Name("www\\.example.com."));
  378. EXPECT_TRUE(example_name.nequals(Name("www\\.example.com.")));
  379. }
  380. TEST_F(NameTest, isWildcard) {
  381. EXPECT_FALSE(example_name.isWildcard());
  382. EXPECT_TRUE(Name("*.a.example.com").isWildcard());
  383. EXPECT_FALSE(Name("a.*.example.com").isWildcard());
  384. }
  385. TEST_F(NameTest, concatenate) {
  386. NameComparisonResult result =
  387. Name("aaa.www.example.com.").compare(Name("aaa").concatenate(example_name));
  388. EXPECT_EQ(NameComparisonResult::EQUAL, result.getRelation());
  389. result = example_name.compare(Name(".").concatenate(example_name));
  390. EXPECT_EQ(NameComparisonResult::EQUAL, result.getRelation());
  391. result = example_name.compare(example_name.concatenate(Name(".")));
  392. EXPECT_EQ(NameComparisonResult::EQUAL, result.getRelation());
  393. // concatenating two valid names would result in too long a name.
  394. Name n1("123456789.123456789.123456789.123456789.123456789."
  395. "123456789.123456789.123456789.123456789.123456789."
  396. "123456789.123456789.123456789.123456789.123456789.");
  397. Name n2("123456789.123456789.123456789.123456789.123456789."
  398. "123456789.123456789.123456789.123456789.123456789."
  399. "1234.");
  400. EXPECT_THROW(n1.concatenate(n2), TooLongName);
  401. }
  402. TEST_F(NameTest, reverse) {
  403. EXPECT_PRED_FORMAT2(UnitTestUtil::matchName, example_name.reverse(),
  404. Name("com.example.www."));
  405. EXPECT_PRED_FORMAT2(UnitTestUtil::matchName, Name(".").reverse(),
  406. Name("."));
  407. EXPECT_PRED_FORMAT2(UnitTestUtil::matchName,
  408. Name("a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s").reverse(),
  409. Name("s.r.q.p.o.n.m.l.k.j.i.h.g.f.e.d.c.b.a"));
  410. }
  411. TEST_F(NameTest, split) {
  412. // normal cases with or without explicitly specifying the trailing dot.
  413. EXPECT_PRED_FORMAT2(UnitTestUtil::matchName, example_name.split(1, 2),
  414. Name("example.com."));
  415. EXPECT_PRED_FORMAT2(UnitTestUtil::matchName, example_name.split(1, 3),
  416. Name("example.com."));
  417. // edge cases: only the first or last label.
  418. EXPECT_PRED_FORMAT2(UnitTestUtil::matchName, example_name.split(0, 1),
  419. Name("www."));
  420. EXPECT_PRED_FORMAT2(UnitTestUtil::matchName, example_name.split(3, 1),
  421. Name("."));
  422. // invalid range: an exception should be thrown.
  423. EXPECT_THROW(example_name.split(1, 0), OutOfRange);
  424. EXPECT_THROW(example_name.split(2, 3), OutOfRange);
  425. // invalid range: the following parameters would cause overflow,
  426. // bypassing naive validation.
  427. EXPECT_THROW(example_name.split(1, numeric_limits<unsigned int>::max()),
  428. OutOfRange);
  429. }
  430. TEST_F(NameTest, split_for_suffix) {
  431. EXPECT_PRED_FORMAT2(UnitTestUtil::matchName, example_name.split(1),
  432. Name("example.com"));
  433. EXPECT_PRED_FORMAT2(UnitTestUtil::matchName, example_name.split(0),
  434. example_name);
  435. EXPECT_PRED_FORMAT2(UnitTestUtil::matchName, example_name.split(3),
  436. Name("."));
  437. // Invalid case: the level must be less than the original label count.
  438. EXPECT_THROW(example_name.split(4), OutOfRange);
  439. }
  440. TEST_F(NameTest, downcase) {
  441. // usual case: all-upper case name to all-lower case
  442. compareInWireFormat(example_name_upper.downcase(), example_name);
  443. // confirm that non upper-case characters are intact
  444. compareInWireFormat(nameFactoryLowerCase().downcase(),
  445. nameFactoryLowerCase());
  446. // confirm the calling object is actually modified
  447. example_name_upper.downcase();
  448. compareInWireFormat(example_name_upper, example_name);
  449. }
  450. TEST_F(NameTest, at) {
  451. // Confirm at() produces the exact sequence of wire-format name data
  452. vector<uint8_t> data;
  453. for (size_t i = 0; i < example_name.getLength(); i++) {
  454. data.push_back(example_name.at(i));
  455. }
  456. example_name.toWire(buffer_expected);
  457. EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData,
  458. &data[0], data.size(), buffer_expected.getData(),
  459. buffer_expected.getLength());
  460. // Out-of-range access: should trigger an exception.
  461. EXPECT_THROW(example_name.at(example_name.getLength()), OutOfRange);
  462. }
  463. //
  464. // The following set of tests confirm the result of <=, <, >=, >
  465. // The test logic is simple, and all tests are just straightforward variations
  466. // of the first one.
  467. //
  468. TEST_F(NameTest, leq) {
  469. // small <= large is true
  470. EXPECT_TRUE(small_name.leq(large_name));
  471. EXPECT_TRUE(small_name <= large_name);
  472. // small <= small is true
  473. EXPECT_TRUE(small_name.leq(small_name));
  474. EXPECT_LE(small_name, small_name);
  475. // large <= small is false
  476. EXPECT_FALSE(large_name.leq(small_name));
  477. EXPECT_FALSE(large_name <= small_name);
  478. }
  479. TEST_F(NameTest, geq) {
  480. EXPECT_TRUE(large_name.geq(small_name));
  481. EXPECT_TRUE(large_name >= small_name);
  482. EXPECT_TRUE(large_name.geq(large_name));
  483. EXPECT_GE(large_name, large_name);
  484. EXPECT_FALSE(small_name.geq(large_name));
  485. EXPECT_FALSE(small_name >= large_name);
  486. }
  487. TEST_F(NameTest, lthan) {
  488. EXPECT_TRUE(small_name.lthan(large_name));
  489. EXPECT_TRUE(small_name < large_name);
  490. EXPECT_FALSE(small_name.lthan(small_name));
  491. EXPECT_FALSE(small_name < small_name);
  492. EXPECT_FALSE(large_name.lthan(small_name));
  493. EXPECT_FALSE(large_name < small_name);
  494. }
  495. TEST_F(NameTest, gthan) {
  496. EXPECT_TRUE(large_name.gthan(small_name));
  497. EXPECT_TRUE(large_name > small_name);
  498. EXPECT_FALSE(large_name.gthan(large_name));
  499. EXPECT_FALSE(large_name > large_name);
  500. EXPECT_FALSE(small_name.gthan(large_name));
  501. EXPECT_FALSE(small_name > large_name);
  502. }
  503. TEST_F(NameTest, constants) {
  504. EXPECT_EQ(Name("."), Name::ROOT_NAME());
  505. }
  506. // test operator<<. We simply confirm it appends the result of toText().
  507. TEST_F(NameTest, LeftShiftOperator) {
  508. ostringstream oss;
  509. oss << example_name;
  510. EXPECT_EQ(example_name.toText(), oss.str());
  511. }
  512. }