rrclass_unittest.cc 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. // Copyright (C) 2010-2017 Internet Systems Consortium, Inc. ("ISC")
  2. //
  3. // This Source Code Form is subject to the terms of the Mozilla Public
  4. // License, v. 2.0. If a copy of the MPL was not distributed with this
  5. // file, You can obtain one at http://mozilla.org/MPL/2.0/.
  6. #include <gtest/gtest.h>
  7. #include <util/buffer.h>
  8. #include <dns/messagerenderer.h>
  9. #include <dns/rrclass.h>
  10. #include <dns/tests/unittest_util.h>
  11. #include <util/unittests/wiredata.h>
  12. #include <boost/scoped_ptr.hpp>
  13. using namespace std;
  14. using namespace isc;
  15. using namespace isc::dns;
  16. using namespace isc::util;
  17. using boost::scoped_ptr;
  18. using isc::util::unittests::matchWireData;
  19. namespace {
  20. class RRClassTest : public ::testing::Test {
  21. protected:
  22. RRClassTest() : obuffer(0) {}
  23. OutputBuffer obuffer;
  24. MessageRenderer renderer;
  25. static RRClass rrclassFactoryFromWire(const char* datafile);
  26. static const RRClass rrclass_1, rrclass_0x80, rrclass_0x800,
  27. rrclass_0x8000, rrclass_max;
  28. static const uint8_t wiredata[];
  29. };
  30. const RRClass RRClassTest::rrclass_1(1);
  31. const RRClass RRClassTest::rrclass_0x80(0x80);
  32. const RRClass RRClassTest::rrclass_0x800(0x800);
  33. const RRClass RRClassTest::rrclass_0x8000(0x8000);
  34. const RRClass RRClassTest::rrclass_max(0xffff);
  35. // This is wire-format data for the above sample RRClass rendered in the
  36. // appearing order.
  37. const uint8_t RRClassTest::wiredata[] = { 0x00, 0x01, 0x00, 0x80, 0x08,
  38. 0x00, 0x80, 0x00, 0xff, 0xff };
  39. RRClass
  40. RRClassTest::rrclassFactoryFromWire(const char* datafile) {
  41. std::vector<unsigned char> data;
  42. UnitTestUtil::readWireData(datafile, data);
  43. InputBuffer buffer(&data[0], data.size());
  44. return (RRClass(buffer));
  45. }
  46. TEST_F(RRClassTest, fromTextConstructor) {
  47. EXPECT_EQ("IN", RRClass("IN").toText());
  48. EXPECT_EQ("CH", RRClass("CH").toText());
  49. EXPECT_EQ("CLASS65535", RRClass("CLASS65535").toText());
  50. // some uncommon cases: see the corresponding RRType tests.
  51. EXPECT_EQ(53, RRClass("CLASS00053").getCode());
  52. EXPECT_THROW(RRClass("CLASS000053"), InvalidRRClass);
  53. // bogus CLASSnnn representations: should trigger an exception
  54. EXPECT_THROW(RRClass("CLASS"), InvalidRRClass);
  55. EXPECT_THROW(RRClass("CLASS-1"), InvalidRRClass);
  56. EXPECT_THROW(RRClass("CLASSxxx"), InvalidRRClass);
  57. EXPECT_THROW(RRClass("CLASS65536"), InvalidRRClass);
  58. EXPECT_THROW(RRClass("CLASS6500x"), InvalidRRClass);
  59. EXPECT_THROW(RRClass("CLASS65000 "), InvalidRRClass);
  60. }
  61. TEST_F(RRClassTest, fromWire) {
  62. EXPECT_EQ(0x1234,
  63. rrclassFactoryFromWire("rrcode16_fromWire1").getCode());
  64. EXPECT_THROW(rrclassFactoryFromWire("rrcode16_fromWire2"),
  65. IncompleteRRClass);
  66. }
  67. TEST_F(RRClassTest, caseConstruct) {
  68. EXPECT_EQ("IN", RRClass("in").toText());
  69. EXPECT_EQ("CH", RRClass("ch").toText());
  70. EXPECT_EQ("CLASS65535", RRClass("class65535").toText());
  71. }
  72. TEST_F(RRClassTest, toText) {
  73. EXPECT_EQ("IN", RRClass(1).toText());
  74. EXPECT_EQ("CLASS65000", RRClass(65000).toText());
  75. }
  76. TEST_F(RRClassTest, createFromText) {
  77. scoped_ptr<RRClass> chclass(RRClass::createFromText("CH"));
  78. EXPECT_TRUE(chclass);
  79. EXPECT_EQ("CH", chclass->toText());
  80. scoped_ptr<RRClass> zzclass(RRClass::createFromText("ZZ"));
  81. EXPECT_FALSE(zzclass);
  82. }
  83. TEST_F(RRClassTest, toWireBuffer) {
  84. rrclass_1.toWire(obuffer);
  85. rrclass_0x80.toWire(obuffer);
  86. rrclass_0x800.toWire(obuffer);
  87. rrclass_0x8000.toWire(obuffer);
  88. rrclass_max.toWire(obuffer);
  89. matchWireData(wiredata, sizeof (wiredata),
  90. obuffer.getData(), obuffer.getLength());
  91. }
  92. TEST_F(RRClassTest, toWireRenderer) {
  93. rrclass_1.toWire(renderer);
  94. rrclass_0x80.toWire(renderer);
  95. rrclass_0x800.toWire(renderer);
  96. rrclass_0x8000.toWire(renderer);
  97. rrclass_max.toWire(renderer);
  98. matchWireData(wiredata, sizeof (wiredata),
  99. renderer.getData(), renderer.getLength());
  100. }
  101. TEST_F(RRClassTest, wellKnownClass) {
  102. EXPECT_EQ(1, RRClass::IN().getCode());
  103. EXPECT_EQ("IN", RRClass::IN().toText());
  104. }
  105. TEST_F(RRClassTest, compare) {
  106. EXPECT_TRUE(RRClass(1) == RRClass("IN"));
  107. EXPECT_TRUE(RRClass(1).equals(RRClass("IN")));
  108. EXPECT_TRUE(RRClass(0).nequals(RRClass("IN")));
  109. EXPECT_TRUE(RRClass("IN") < RRClass("CH"));
  110. EXPECT_TRUE(RRClass(100) < RRClass(65535));
  111. }
  112. // test operator<<. We simply confirm it appends the result of toText().
  113. TEST_F(RRClassTest, LeftShiftOperator) {
  114. ostringstream oss;
  115. oss << RRClass::IN();
  116. EXPECT_EQ(RRClass::IN().toText(), oss.str());
  117. }
  118. // Below, we'll check definitions for all well-known RR classes; whether they
  119. // are defined and have the correct parameter values. Test data are generated
  120. // from the list available at:
  121. // http://www.iana.org/assignments/dns-parameters/dns-parameters.xml
  122. struct ClassParam {
  123. const char* const txt; // "IN", "CH", etc
  124. const uint16_t code; // 1, 3,
  125. const RRClass& (*obj)(); // RRClass::IN(), etc
  126. } known_classes[] = {
  127. {"IN", 1, RRClass::IN}, {"CH", 3, RRClass::CH}, {"HS", 4, RRClass::HS},
  128. {"NONE", 254, RRClass::NONE}, {"ANY", 255, RRClass::ANY},
  129. {NULL, 0, NULL}
  130. };
  131. TEST(RRClassConstTest, wellKnowns) {
  132. for (int i = 0; known_classes[i].txt; ++i) {
  133. SCOPED_TRACE("Checking well known RRClass: " +
  134. string(known_classes[i].txt));
  135. EXPECT_EQ(known_classes[i].code,
  136. RRClass(known_classes[i].txt).getCode());
  137. EXPECT_EQ(known_classes[i].code,
  138. (*known_classes[i].obj)().getCode());
  139. }
  140. }
  141. }