rdata_in_aaaa_unittest.cc 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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/exceptions.h>
  16. #include <dns/messagerenderer.h>
  17. #include <dns/rdata.h>
  18. #include <dns/rdataclass.h>
  19. #include <dns/rrclass.h>
  20. #include <dns/rrtype.h>
  21. #include <gtest/gtest.h>
  22. #include <dns/tests/unittest_util.h>
  23. #include <dns/tests/rdata_unittest.h>
  24. using isc::UnitTestUtil;
  25. using namespace std;
  26. using namespace isc::dns;
  27. using namespace isc::util;
  28. using namespace isc::dns::rdata;
  29. namespace {
  30. class Rdata_IN_AAAA_Test : public RdataTest {
  31. // there's nothing to specialize
  32. };
  33. const in::AAAA rdata_in_aaaa("2001:db8::1234");
  34. const uint8_t wiredata_in_aaaa[] = {
  35. 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  36. 0x00, 0x00, 0x12, 0x34 };
  37. TEST_F(Rdata_IN_AAAA_Test, createFromText) {
  38. rdata_in_aaaa.compare(in::AAAA(string("2001:db8::1234")));
  39. EXPECT_THROW(in::AAAA("192.0.2.1"), InvalidRdataText);
  40. EXPECT_THROW(in::AAAA("xxx"), InvalidRdataText);
  41. }
  42. TEST_F(Rdata_IN_AAAA_Test, createFromWire) {
  43. // Valid data
  44. EXPECT_EQ(0, rdata_in_aaaa.compare(
  45. *rdataFactoryFromFile(RRType::AAAA(), RRClass::IN(),
  46. "rdata_in_aaaa_fromWire")));
  47. // RDLENGTH is too short
  48. EXPECT_THROW(rdataFactoryFromFile(RRType::AAAA(), RRClass::IN(),
  49. "rdata_in_aaaa_fromWire", 18),
  50. DNSMessageFORMERR);
  51. // RDLENGTH is too long
  52. EXPECT_THROW(rdataFactoryFromFile(RRType::AAAA(), RRClass::IN(),
  53. "rdata_in_aaaa_fromWire", 36),
  54. DNSMessageFORMERR);
  55. // buffer too short.
  56. EXPECT_THROW(rdataFactoryFromFile(RRType::AAAA(), RRClass::IN(),
  57. "rdata_in_aaaa_fromWire", 55),
  58. DNSMessageFORMERR);
  59. }
  60. TEST_F(Rdata_IN_AAAA_Test, toWireBuffer) {
  61. rdata_in_aaaa.toWire(obuffer);
  62. EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData,
  63. obuffer.getData(), obuffer.getLength(),
  64. wiredata_in_aaaa, sizeof(wiredata_in_aaaa));
  65. }
  66. TEST_F(Rdata_IN_AAAA_Test, toWireRenderer) {
  67. rdata_in_aaaa.toWire(renderer);
  68. EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData,
  69. renderer.getData(), renderer.getLength(),
  70. wiredata_in_aaaa, sizeof(wiredata_in_aaaa));
  71. }
  72. TEST_F(Rdata_IN_AAAA_Test, toText) {
  73. EXPECT_EQ("2001:db8::1234", rdata_in_aaaa.toText());
  74. }
  75. TEST_F(Rdata_IN_AAAA_Test, compare) {
  76. in::AAAA small1("::1");
  77. in::AAAA small2("1:2:3:4:5:6:7:8");
  78. in::AAAA large1("ffff::");
  79. in::AAAA large2("8:7:6:5:4:3:2:1");
  80. // trivial case: self equivalence
  81. EXPECT_EQ(0, small1.compare(small1));
  82. // confirm these are compared as unsigned values
  83. EXPECT_GT(0, small1.compare(large1));
  84. EXPECT_LT(0, large1.compare(small1));
  85. // confirm these are compared in network byte order
  86. EXPECT_GT(0, small2.compare(large2));
  87. EXPECT_LT(0, large2.compare(small2));
  88. // comparison attempt between incompatible RR types should be rejected
  89. EXPECT_THROW(rdata_in_aaaa.compare(*RdataTest::rdata_nomatch), bad_cast);
  90. }
  91. }