rdata_naptr_unittest.cc 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. // Copyright (C) 2011 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. using namespace isc::dns::rdata::generic;
  30. namespace {
  31. class Rdata_NAPTR_Test : public RdataTest {
  32. };
  33. // 10 100 "S" "SIP+D2U" "" _sip._udp.example.com.
  34. static uint8_t naptr_rdata[] = {0x00,0x0a,0x00,0x64,0x01,0x53,0x07,0x53,0x49,
  35. 0x50,0x2b,0x44,0x32,0x55,0x00,0x04,0x5f,0x73,0x69,0x70,0x04,0x5f,0x75,0x64,
  36. 0x70,0x07,0x65,0x78,0x61,0x6d,0x70,0x6c,0x65,0x03,0x63,0x6f,0x6d,0x00};
  37. static const char *naptr_str =
  38. "10 100 \"S\" \"SIP+D2U\" \"\" _sip._udp.example.com.";
  39. static const char *naptr_str2 =
  40. "10 100 S SIP+D2U \"\" _sip._udp.example.com.";
  41. static const char *naptr_str_small1 =
  42. "9 100 \"S\" \"SIP+D2U\" \"\" _sip._udp.example.com.";
  43. static const char *naptr_str_small2 =
  44. "10 90 \"S\" \"SIP+D2U\" \"\" _sip._udp.example.com.";
  45. static const char *naptr_str_small3 =
  46. "10 100 \"R\" \"SIP+D2U\" \"\" _sip._udp.example.com.";
  47. static const char *naptr_str_small4 =
  48. "10 100 \"S\" \"SIP+C2U\" \"\" _sip._udp.example.com.";
  49. static const char *naptr_str_small5 =
  50. "10 100 \"S\" \"SIP+D2U\" \"\" _rip._udp.example.com.";
  51. static const char *naptr_str_large1 =
  52. "11 100 \"S\" \"SIP+D2U\" \"\" _sip._udp.example.com.";
  53. static const char *naptr_str_large2 =
  54. "10 110 \"S\" \"SIP+D2U\" \"\" _sip._udp.example.com.";
  55. static const char *naptr_str_large3 =
  56. "10 100 \"T\" \"SIP+D2U\" \"\" _sip._udp.example.com.";
  57. static const char *naptr_str_large4 =
  58. "10 100 \"S\" \"SIP+E2U\" \"\" _sip._udp.example.com.";
  59. static const char *naptr_str_large5 =
  60. "10 100 \"S\" \"SIP+D2U\" \"\" _tip._udp.example.com.";
  61. TEST_F(Rdata_NAPTR_Test, createFromText) {
  62. NAPTR naptr(naptr_str);
  63. EXPECT_EQ(10, naptr.getOrder());
  64. EXPECT_EQ(100, naptr.getPreference());
  65. EXPECT_EQ(string("S"), naptr.getFlags());
  66. EXPECT_EQ(string("SIP+D2U"), naptr.getServices());
  67. EXPECT_EQ(string(""), naptr.getRegexp());
  68. EXPECT_EQ(Name("_sip._udp.example.com."), naptr.getReplacement());
  69. // Test <char-string> that separated by space
  70. NAPTR naptr2(naptr_str2);
  71. EXPECT_EQ(string("S"), naptr2.getFlags());
  72. EXPECT_EQ(string("SIP+D2U"), naptr2.getServices());
  73. }
  74. TEST_F(Rdata_NAPTR_Test, badText) {
  75. // Order number cannot exceed 65535
  76. EXPECT_THROW(const NAPTR naptr("65536 10 S SIP \"\" _sip._udp.example.com."),
  77. InvalidRdataText);
  78. // Preference number cannot exceed 65535
  79. EXPECT_THROW(const NAPTR naptr("100 65536 S SIP \"\" _sip._udp.example.com."),
  80. InvalidRdataText);
  81. // No regexp given
  82. EXPECT_THROW(const NAPTR naptr("100 10 S SIP _sip._udp.example.com."),
  83. InvalidRdataText);
  84. // The double quotes seperator must match
  85. EXPECT_THROW(const NAPTR naptr("100 10 \"S SIP \"\" _sip._udp.example.com."),
  86. InvalidRdataText);
  87. // Order or preference cannot be missed
  88. EXPECT_THROW(const NAPTR naptr("10 \"S\" SIP \"\" _sip._udp.example.com."),
  89. InvalidRdataText);
  90. // Unquoted fields must be seperated by spaces
  91. EXPECT_THROW(const NAPTR naptr("100 10S SIP \"\" _sip._udp.example.com."),
  92. InvalidRdataText);
  93. EXPECT_THROW(const NAPTR naptr("10010 \"S\" \"SIP\" \"\" _sip._udp.example.com."),
  94. InvalidRdataText);
  95. EXPECT_THROW(const NAPTR naptr("100 10 SSIP \"\" _sip._udp.example.com."),
  96. InvalidRdataText);
  97. // Field cannot be missing
  98. EXPECT_THROW(const NAPTR naptr("100 10 \"S\""), InvalidRdataText);
  99. // The <character-string> cannot exceed 255 characters
  100. string naptr_str;
  101. naptr_str += "100 10 ";
  102. for (int i = 0; i < 257; ++i) {
  103. naptr_str += 'A';
  104. }
  105. naptr_str += " SIP \"\" _sip._udp.example.com.";
  106. EXPECT_THROW(const NAPTR naptr(naptr_str), CharStringTooLong);
  107. }
  108. TEST_F(Rdata_NAPTR_Test, createFromWire) {
  109. InputBuffer input_buffer(naptr_rdata, sizeof(naptr_rdata));
  110. NAPTR naptr(input_buffer, sizeof(naptr_rdata));
  111. EXPECT_EQ(10, naptr.getOrder());
  112. EXPECT_EQ(100, naptr.getPreference());
  113. EXPECT_EQ(string("S"), naptr.getFlags());
  114. EXPECT_EQ(string("SIP+D2U"), naptr.getServices());
  115. EXPECT_EQ(string(""), naptr.getRegexp());
  116. EXPECT_EQ(Name("_sip._udp.example.com."), naptr.getReplacement());
  117. }
  118. TEST_F(Rdata_NAPTR_Test, createFromWireTooLongDataLen) {
  119. static uint8_t naptr_rdata_long[] = {
  120. 0x00,0x0a,0x00,0x64,0x01,0x53,0x07,0x53,0x49,0x50,0x2b,0x44,0x32,0x55,
  121. 0x00,0x04,0x5f,0x73,0x69,0x70,0x04,0x5f,0x75,0x64,0x70,0x07,0x65,0x78,
  122. 0x61,0x6d,0x70,0x6c,0x65,0x03,0x63,0x6f,0x6d,0x00,0xff,0xff,0xff,0xff};
  123. InputBuffer input_buffer(naptr_rdata_long, sizeof(naptr_rdata_long));
  124. EXPECT_THROW(NAPTR naptr(input_buffer, sizeof(naptr_rdata_long)),
  125. isc::dns::DNSMessageFORMERR);
  126. }
  127. TEST_F(Rdata_NAPTR_Test, createFromWireTooShortDataLen) {
  128. // missing data (just set rdata_len too low)
  129. for (size_t i = 0; i < sizeof(naptr_rdata); ++i) {
  130. // Just use existing correct buffer but set rdata_len too low
  131. InputBuffer input_buffer(naptr_rdata, sizeof(naptr_rdata));
  132. EXPECT_THROW(NAPTR naptr(input_buffer, i),
  133. isc::dns::DNSMessageFORMERR);
  134. }
  135. }
  136. TEST_F(Rdata_NAPTR_Test, createFromLexer) {
  137. const NAPTR rdata_naptr(naptr_str);
  138. EXPECT_EQ(0, rdata_naptr.compare(
  139. *test::createRdataUsingLexer(RRType::NAPTR(), RRClass::IN(),
  140. naptr_str)));
  141. // Exceptions cause NULL to be returned.
  142. EXPECT_FALSE(test::createRdataUsingLexer(RRType::NAPTR(), RRClass::IN(),
  143. "65536 10 S SIP \"\" "
  144. "_sip._udp.example.com."));
  145. }
  146. TEST_F(Rdata_NAPTR_Test, toWire) {
  147. NAPTR naptr(naptr_str);
  148. naptr.toWire(obuffer);
  149. EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, obuffer.getData(),
  150. obuffer.getLength(), naptr_rdata, sizeof(naptr_rdata));
  151. }
  152. TEST_F(Rdata_NAPTR_Test, toWireRenderer) {
  153. NAPTR naptr(naptr_str);
  154. naptr.toWire(renderer);
  155. EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, renderer.getData(),
  156. renderer.getLength(), naptr_rdata,
  157. sizeof(naptr_rdata));
  158. }
  159. TEST_F(Rdata_NAPTR_Test, toText) {
  160. NAPTR naptr(naptr_str);
  161. EXPECT_EQ(naptr_str, naptr.toText());
  162. // will add quotes even if they were not in the original input
  163. EXPECT_EQ("10 100 \"S\" \"SIP+D2U\" \".*\" _sip._udp.example.com.",
  164. NAPTR("10 100 S SIP+D2U .* _sip._udp.example.com.").toText());
  165. // will not add additional quotes
  166. EXPECT_EQ("10 100 \"S\" \"SIP+D2U\" \".*\" _sip._udp.example.com.",
  167. NAPTR("10 100 \"S\" \"SIP+D2U\" \".*\" _sip._udp.example.com.")
  168. .toText());
  169. }
  170. TEST_F(Rdata_NAPTR_Test, compare) {
  171. NAPTR naptr(naptr_str);
  172. NAPTR naptr_small1(naptr_str_small1);
  173. NAPTR naptr_small2(naptr_str_small2);
  174. NAPTR naptr_small3(naptr_str_small3);
  175. NAPTR naptr_small4(naptr_str_small4);
  176. NAPTR naptr_small5(naptr_str_small5);
  177. NAPTR naptr_large1(naptr_str_large1);
  178. NAPTR naptr_large2(naptr_str_large2);
  179. NAPTR naptr_large3(naptr_str_large3);
  180. NAPTR naptr_large4(naptr_str_large4);
  181. NAPTR naptr_large5(naptr_str_large5);
  182. EXPECT_EQ(0, naptr.compare(NAPTR(naptr_str)));
  183. EXPECT_EQ(1, naptr.compare(naptr_small1));
  184. EXPECT_EQ(1, naptr.compare(naptr_small2));
  185. EXPECT_EQ(1, naptr.compare(naptr_small3));
  186. EXPECT_EQ(1, naptr.compare(naptr_small4));
  187. EXPECT_EQ(1, naptr.compare(naptr_small5));
  188. EXPECT_EQ(-1, naptr.compare(naptr_large1));
  189. EXPECT_EQ(-1, naptr.compare(naptr_large2));
  190. EXPECT_EQ(-1, naptr.compare(naptr_large3));
  191. EXPECT_EQ(-1, naptr.compare(naptr_large4));
  192. EXPECT_EQ(-1, naptr.compare(naptr_large5));
  193. EXPECT_EQ(-1, naptr_small1.compare(naptr));
  194. EXPECT_EQ(-1, naptr_small2.compare(naptr));
  195. EXPECT_EQ(-1, naptr_small3.compare(naptr));
  196. EXPECT_EQ(-1, naptr_small4.compare(naptr));
  197. EXPECT_EQ(-1, naptr_small5.compare(naptr));
  198. EXPECT_EQ(1, naptr_large1.compare(naptr));
  199. EXPECT_EQ(1, naptr_large2.compare(naptr));
  200. EXPECT_EQ(1, naptr_large3.compare(naptr));
  201. EXPECT_EQ(1, naptr_large4.compare(naptr));
  202. EXPECT_EQ(1, naptr_large5.compare(naptr));
  203. }
  204. TEST_F(Rdata_NAPTR_Test, copy) {
  205. NAPTR naptr(naptr_str);
  206. NAPTR naptr2(naptr);
  207. NAPTR naptr3 = naptr;
  208. EXPECT_EQ(0, naptr.compare(naptr2));
  209. EXPECT_EQ(0, naptr.compare(naptr3));
  210. naptr3 = naptr;
  211. EXPECT_EQ(0, naptr.compare(naptr3));
  212. }
  213. }