rdata_encoder_unittest.cc 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. // Copyright (C) 2012 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 <dns/name.h>
  15. #include <dns/labelsequence.h>
  16. #include <dns/messagerenderer.h>
  17. #include <dns/rdata.h>
  18. #include <dns/rrclass.h>
  19. #include <dns/rrtype.h>
  20. #include <datasrc/memory/rdata_encoder.h>
  21. #include <util/unittests/wiredata.h>
  22. #include <gtest/gtest.h>
  23. #include <boost/bind.hpp>
  24. #include <set>
  25. #include <string>
  26. #include <vector>
  27. using namespace isc::dns;
  28. using namespace isc::dns::rdata;
  29. using namespace isc::datasrc::memory;
  30. using isc::util::unittests::matchWireData;
  31. using std::string;
  32. using std::vector;
  33. namespace {
  34. struct TestRdata {
  35. const char* const rrclass;
  36. const char* const rrtype;
  37. const char* const rdata;
  38. };
  39. const TestRdata test_rdata_list[] = {
  40. {"IN", "A", "192.0.2.1"},
  41. {"IN", "NS", "ns.example.com"},
  42. {NULL, NULL, NULL}
  43. };
  44. void
  45. renderNameField(MessageRenderer* renderer, bool additional_required,
  46. const LabelSequence& labels, RdataNameAttributes attributes)
  47. {
  48. EXPECT_EQ(additional_required,
  49. (attributes & NAMEATTR_ADDITIONAL) != 0);
  50. renderer->writeName(labels, (attributes & NAMEATTR_COMPRESSIBLE) != 0);
  51. }
  52. void
  53. renderDataField(MessageRenderer* renderer, const uint8_t* data,
  54. size_t data_len)
  55. {
  56. renderer->writeData(data, data_len);
  57. }
  58. TEST(RdataFieldSpec, checkData) {
  59. const Name dummy_name("example.com");
  60. MessageRenderer expected_renderer, actual_renderer;
  61. vector<uint8_t> encoded_data;
  62. vector<uint16_t> varlen_list;
  63. std::set<RRType> need_additionals;
  64. need_additionals.insert(RRType::NS());
  65. need_additionals.insert(RRType::MX());
  66. need_additionals.insert(RRType::SRV());
  67. for (size_t i = 1; test_rdata_list[i].rrclass != NULL; ++i) {
  68. SCOPED_TRACE(string(test_rdata_list->rrclass) + "/" +
  69. test_rdata_list->rrtype);
  70. expected_renderer.clear();
  71. actual_renderer.clear();
  72. expected_renderer.writeName(dummy_name);
  73. actual_renderer.writeName(dummy_name);
  74. const RRClass rrclass(test_rdata_list[i].rrclass);
  75. const RRType rrtype(test_rdata_list[i].rrtype);
  76. const ConstRdataPtr rdata = createRdata(rrtype, rrclass,
  77. test_rdata_list[i].rdata);
  78. rdata->toWire(expected_renderer);
  79. const bool additional_required =
  80. (need_additionals.find(rrtype) != need_additionals.end());
  81. encodeRdata(*rdata, rrclass, rrtype, encoded_data, varlen_list);
  82. foreachRdataField(rrclass, rrtype, encoded_data, varlen_list,
  83. boost::bind(renderNameField, &actual_renderer,
  84. additional_required, _1, _2),
  85. boost::bind(renderDataField, &actual_renderer,
  86. _1, _2));
  87. matchWireData(expected_renderer.getData(),
  88. expected_renderer.getLength(),
  89. actual_renderer.getData(),
  90. actual_renderer.getLength());
  91. }
  92. }
  93. }