rdata_mx_unittest.cc 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. // Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
  2. //
  3. // Permission to use, copy, modify, and/or distribute this software for any
  4. // purpose with or without fee is hereby granted, provided that the above
  5. // copyright notice and this permission notice appear in all copies.
  6. //
  7. // THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
  8. // REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
  9. // AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
  10. // INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  11. // LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
  12. // OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  13. // PERFORMANCE OF THIS SOFTWARE.
  14. #include <util/buffer.h>
  15. #include <dns/messagerenderer.h>
  16. #include <dns/rdata.h>
  17. #include <dns/rdataclass.h>
  18. #include <dns/rrclass.h>
  19. #include <dns/rrtype.h>
  20. #include <gtest/gtest.h>
  21. #include <dns/tests/unittest_util.h>
  22. #include <dns/tests/rdata_unittest.h>
  23. #include <util/unittests/wiredata.h>
  24. using namespace std;
  25. using namespace isc::dns;
  26. using namespace isc::util;
  27. using namespace isc::dns::rdata;
  28. using isc::UnitTestUtil;
  29. using isc::util::unittests::matchWireData;
  30. namespace {
  31. class Rdata_MX_Test : public RdataTest {
  32. public:
  33. Rdata_MX_Test() :
  34. rdata_mx(10, Name("mx.example.com"))
  35. {}
  36. const generic::MX rdata_mx;
  37. };
  38. TEST_F(Rdata_MX_Test, createFromText) {
  39. const generic::MX rdata_mx2("10 mx.example.com.");
  40. EXPECT_EQ(0, rdata_mx2.compare(rdata_mx));
  41. }
  42. TEST_F(Rdata_MX_Test, badText) {
  43. EXPECT_THROW(const generic::MX rdata_mx("99999999 mx."), InvalidRdataText);
  44. EXPECT_THROW(const generic::MX rdata_mx("10"), InvalidRdataText);
  45. EXPECT_THROW(const generic::MX rdata_mx("SPOON"), InvalidRdataText);
  46. EXPECT_THROW(const generic::MX rdata_mx("10 mx. example.com."),
  47. InvalidRdataText);
  48. // No origin and relative
  49. EXPECT_THROW(const generic::MX rdata_mx("10 mx.example.com"),
  50. MissingNameOrigin);
  51. // Extra text at end of line
  52. EXPECT_THROW(const generic::MX rdata_mx("10 mx.example.com. extra."),
  53. InvalidRdataText);
  54. }
  55. TEST_F(Rdata_MX_Test, copy) {
  56. const generic::MX rdata_mx2(rdata_mx);
  57. EXPECT_EQ(0, rdata_mx.compare(rdata_mx2));
  58. }
  59. TEST_F(Rdata_MX_Test, createFromWire) {
  60. EXPECT_EQ(0, rdata_mx.compare(
  61. *rdataFactoryFromFile(RRType("MX"), RRClass("IN"),
  62. "rdata_mx_fromWire")));
  63. // TBD: more tests
  64. }
  65. TEST_F(Rdata_MX_Test, createFromLexer) {
  66. EXPECT_EQ(0, rdata_mx.compare(
  67. *test::createRdataUsingLexer(RRType::MX(), RRClass::IN(),
  68. "10 mx.example.com.")));
  69. // test::createRdataUsingLexer() constructs relative to
  70. // "example.org." origin.
  71. EXPECT_EQ(0, generic::MX("10 mx2.example.org.").compare(
  72. *test::createRdataUsingLexer(RRType::MX(), RRClass::IN(),
  73. "10 mx2")));
  74. // Exceptions cause NULL to be returned.
  75. EXPECT_FALSE(test::createRdataUsingLexer(RRType::MX(), RRClass::IN(),
  76. "10 mx. example.com."));
  77. // 65536 is larger than maximum possible preference
  78. EXPECT_FALSE(test::createRdataUsingLexer(RRType::MX(), RRClass::IN(),
  79. "65536 mx.example.com."));
  80. // Extra text at end of line
  81. EXPECT_FALSE(test::createRdataUsingLexer(RRType::MX(), RRClass::IN(),
  82. "10 mx.example.com. extra."));
  83. }
  84. TEST_F(Rdata_MX_Test, toWireRenderer) {
  85. renderer.writeName(Name("example.com"));
  86. rdata_mx.toWire(renderer);
  87. vector<unsigned char> data;
  88. UnitTestUtil::readWireData("rdata_mx_toWire1", data);
  89. matchWireData(&data[0], data.size(),
  90. renderer.getData(), renderer.getLength());
  91. }
  92. TEST_F(Rdata_MX_Test, toWireBuffer) {
  93. Name("example.com").toWire(obuffer);
  94. rdata_mx.toWire(obuffer);
  95. vector<unsigned char> data;
  96. UnitTestUtil::readWireData("rdata_mx_toWire2", data);
  97. matchWireData(&data[0], data.size(),
  98. obuffer.getData(), obuffer.getLength());
  99. }
  100. TEST_F(Rdata_MX_Test, toText) {
  101. EXPECT_EQ("10 mx.example.com.", rdata_mx.toText());
  102. }
  103. TEST_F(Rdata_MX_Test, getMXName) {
  104. EXPECT_EQ(Name("mx.example.com."), rdata_mx.getMXName());
  105. }
  106. TEST_F(Rdata_MX_Test, getMXPref) {
  107. EXPECT_EQ(10, rdata_mx.getMXPref());
  108. }
  109. TEST_F(Rdata_MX_Test, compare) {
  110. generic::MX small1(1, Name("mx.example.com"));
  111. generic::MX small2(10, Name("mx.example.com"));
  112. generic::MX large1(65535, Name("mx.example.com"));
  113. generic::MX large2(256, Name("mx.example.com"));
  114. // trivial case: self equivalence
  115. // cppcheck-suppress uselessCallsCompare
  116. EXPECT_EQ(0, small1.compare(small1));
  117. // confirm these are compared as unsigned values
  118. EXPECT_GT(0, small1.compare(large1));
  119. EXPECT_LT(0, large1.compare(small1));
  120. // confirm these are compared in network byte order
  121. EXPECT_GT(0, small2.compare(large2));
  122. EXPECT_LT(0, large2.compare(small2));
  123. // comparison attempt between incompatible RR types should be rejected
  124. EXPECT_THROW(rdata_mx.compare(*rdata_nomatch), bad_cast);
  125. }
  126. }