rdata_mx_unittest.cc 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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. // there's nothing to specialize
  31. };
  32. const generic::MX rdata_mx(10, Name("mx.example.com"));
  33. TEST_F(Rdata_MX_Test, createFromText) {
  34. const generic::MX rdata_mx2("10 mx.example.com");
  35. EXPECT_EQ(0, rdata_mx2.compare(rdata_mx));
  36. }
  37. TEST_F(Rdata_MX_Test, badText) {
  38. EXPECT_THROW(const generic::MX rdata_mx("99999999 mx."), InvalidRdataText);
  39. EXPECT_THROW(const generic::MX rdata_mx("10"), InvalidRdataText);
  40. EXPECT_THROW(const generic::MX rdata_mx("SPOON"), InvalidRdataText);
  41. EXPECT_THROW(const generic::MX rdata_mx("10 mx. example.com."),
  42. InvalidRdataText);
  43. }
  44. TEST_F(Rdata_MX_Test, copy) {
  45. const generic::MX rdata_mx2(rdata_mx);
  46. EXPECT_EQ(0, rdata_mx.compare(rdata_mx2));
  47. }
  48. TEST_F(Rdata_MX_Test, createFromWire) {
  49. EXPECT_EQ(0, rdata_mx.compare(
  50. *rdataFactoryFromFile(RRType("MX"), RRClass("IN"),
  51. "rdata_mx_fromWire")));
  52. // TBD: more tests
  53. }
  54. TEST_F(Rdata_MX_Test, createFromLexer) {
  55. EXPECT_EQ(0, rdata_mx.compare(
  56. *test::createRdataUsingLexer(RRType::MX(), RRClass::IN(),
  57. "10 mx.example.com")));
  58. // Exceptions cause NULL to be returned.
  59. EXPECT_FALSE(test::createRdataUsingLexer(RRType::MX(), RRClass::IN(),
  60. "10 mx. example.com"));
  61. }
  62. TEST_F(Rdata_MX_Test, toWireRenderer) {
  63. renderer.writeName(Name("example.com"));
  64. rdata_mx.toWire(renderer);
  65. vector<unsigned char> data;
  66. UnitTestUtil::readWireData("rdata_mx_toWire1", data);
  67. EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, renderer.getData(),
  68. renderer.getLength(), &data[0], data.size());
  69. }
  70. TEST_F(Rdata_MX_Test, toWireBuffer) {
  71. Name("example.com").toWire(obuffer);
  72. rdata_mx.toWire(obuffer);
  73. vector<unsigned char> data;
  74. UnitTestUtil::readWireData("rdata_mx_toWire2", data);
  75. EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, obuffer.getData(),
  76. obuffer.getLength(), &data[0], data.size());
  77. }
  78. TEST_F(Rdata_MX_Test, toText) {
  79. EXPECT_EQ("10 mx.example.com.", rdata_mx.toText());
  80. }
  81. TEST_F(Rdata_MX_Test, getMXName) {
  82. EXPECT_EQ(Name("mx.example.com."), rdata_mx.getMXName());
  83. }
  84. TEST_F(Rdata_MX_Test, getMXPref) {
  85. EXPECT_EQ(10, rdata_mx.getMXPref());
  86. }
  87. TEST_F(Rdata_MX_Test, compare) {
  88. generic::MX small1(1, Name("mx.example.com"));
  89. generic::MX small2(10, Name("mx.example.com"));
  90. generic::MX large1(65535, Name("mx.example.com"));
  91. generic::MX large2(256, Name("mx.example.com"));
  92. // trivial case: self equivalence
  93. // cppcheck-suppress uselessCallsCompare
  94. EXPECT_EQ(0, small1.compare(small1));
  95. // confirm these are compared as unsigned values
  96. EXPECT_GT(0, small1.compare(large1));
  97. EXPECT_LT(0, large1.compare(small1));
  98. // confirm these are compared in network byte order
  99. EXPECT_GT(0, small2.compare(large2));
  100. EXPECT_LT(0, large2.compare(small2));
  101. // comparison attempt between incompatible RR types should be rejected
  102. EXPECT_THROW(rdata_mx.compare(*rdata_nomatch), bad_cast);
  103. }
  104. }