rdata_mx_unittest.cc 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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. using isc::UnitTestUtil;
  24. using namespace std;
  25. using namespace isc::dns;
  26. using namespace isc::util;
  27. using namespace isc::dns::rdata;
  28. namespace {
  29. class Rdata_MX_Test : public RdataTest {
  30. public:
  31. Rdata_MX_Test() :
  32. rdata_mx(10, Name("mx.example.com"))
  33. {}
  34. const generic::MX rdata_mx;
  35. };
  36. TEST_F(Rdata_MX_Test, createFromText) {
  37. const generic::MX rdata_mx2("10 mx.example.com.");
  38. EXPECT_EQ(0, rdata_mx2.compare(rdata_mx));
  39. }
  40. TEST_F(Rdata_MX_Test, badText) {
  41. EXPECT_THROW(const generic::MX rdata_mx("99999999 mx."), InvalidRdataText);
  42. EXPECT_THROW(const generic::MX rdata_mx("10"), InvalidRdataText);
  43. EXPECT_THROW(const generic::MX rdata_mx("SPOON"), InvalidRdataText);
  44. EXPECT_THROW(const generic::MX rdata_mx("10 mx. example.com."),
  45. InvalidRdataText);
  46. // No origin and relative
  47. EXPECT_THROW(const generic::MX rdata_mx("10 mx.example.com"),
  48. MissingNameOrigin);
  49. // Extra text at end of line
  50. EXPECT_THROW(const generic::MX rdata_mx("10 mx.example.com. extra."),
  51. InvalidRdataText);
  52. }
  53. TEST_F(Rdata_MX_Test, copy) {
  54. const generic::MX rdata_mx2(rdata_mx);
  55. EXPECT_EQ(0, rdata_mx.compare(rdata_mx2));
  56. }
  57. TEST_F(Rdata_MX_Test, createFromWire) {
  58. EXPECT_EQ(0, rdata_mx.compare(
  59. *rdataFactoryFromFile(RRType("MX"), RRClass("IN"),
  60. "rdata_mx_fromWire")));
  61. // TBD: more tests
  62. }
  63. TEST_F(Rdata_MX_Test, createFromLexer) {
  64. EXPECT_EQ(0, rdata_mx.compare(
  65. *test::createRdataUsingLexer(RRType::MX(), RRClass::IN(),
  66. "10 mx.example.com.")));
  67. // test::createRdataUsingLexer() constructs relative to
  68. // "example.org." origin.
  69. EXPECT_EQ(0, generic::MX("10 mx2.example.org.").compare(
  70. *test::createRdataUsingLexer(RRType::MX(), RRClass::IN(),
  71. "10 mx2")));
  72. // Exceptions cause NULL to be returned.
  73. EXPECT_FALSE(test::createRdataUsingLexer(RRType::MX(), RRClass::IN(),
  74. "10 mx. example.com."));
  75. // 65536 is larger than maximum possible preference
  76. EXPECT_FALSE(test::createRdataUsingLexer(RRType::MX(), RRClass::IN(),
  77. "65536 mx.example.com."));
  78. // Extra text at end of line
  79. EXPECT_FALSE(test::createRdataUsingLexer(RRType::MX(), RRClass::IN(),
  80. "10 mx.example.com. extra."));
  81. }
  82. TEST_F(Rdata_MX_Test, toWireRenderer) {
  83. renderer.writeName(Name("example.com"));
  84. rdata_mx.toWire(renderer);
  85. vector<unsigned char> data;
  86. UnitTestUtil::readWireData("rdata_mx_toWire1", data);
  87. EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, renderer.getData(),
  88. renderer.getLength(), &data[0], data.size());
  89. }
  90. TEST_F(Rdata_MX_Test, toWireBuffer) {
  91. Name("example.com").toWire(obuffer);
  92. rdata_mx.toWire(obuffer);
  93. vector<unsigned char> data;
  94. UnitTestUtil::readWireData("rdata_mx_toWire2", data);
  95. EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, obuffer.getData(),
  96. obuffer.getLength(), &data[0], data.size());
  97. }
  98. TEST_F(Rdata_MX_Test, toText) {
  99. EXPECT_EQ("10 mx.example.com.", rdata_mx.toText());
  100. }
  101. TEST_F(Rdata_MX_Test, getMXName) {
  102. EXPECT_EQ(Name("mx.example.com."), rdata_mx.getMXName());
  103. }
  104. TEST_F(Rdata_MX_Test, getMXPref) {
  105. EXPECT_EQ(10, rdata_mx.getMXPref());
  106. }
  107. TEST_F(Rdata_MX_Test, compare) {
  108. generic::MX small1(1, Name("mx.example.com"));
  109. generic::MX small2(10, Name("mx.example.com"));
  110. generic::MX large1(65535, Name("mx.example.com"));
  111. generic::MX large2(256, Name("mx.example.com"));
  112. // trivial case: self equivalence
  113. // cppcheck-suppress uselessCallsCompare
  114. EXPECT_EQ(0, small1.compare(small1));
  115. // confirm these are compared as unsigned values
  116. EXPECT_GT(0, small1.compare(large1));
  117. EXPECT_LT(0, large1.compare(small1));
  118. // confirm these are compared in network byte order
  119. EXPECT_GT(0, small2.compare(large2));
  120. EXPECT_LT(0, large2.compare(small2));
  121. // comparison attempt between incompatible RR types should be rejected
  122. EXPECT_THROW(rdata_mx.compare(*rdata_nomatch), bad_cast);
  123. }
  124. }