ares-test-parse-ns.cc 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #include "ares-test.h"
  2. #include "dns-proto.h"
  3. #include <sstream>
  4. #include <vector>
  5. namespace ares {
  6. namespace test {
  7. TEST_F(LibraryTest, ParseNsReplyOK) {
  8. DNSPacket pkt;
  9. pkt.set_qid(0x1234).set_response().set_aa()
  10. .add_question(new DNSQuestion("example.com", T_NS))
  11. .add_answer(new DNSNsRR("example.com", 100, "ns.example.com"));
  12. std::vector<byte> data = pkt.data();
  13. struct hostent *host = nullptr;
  14. EXPECT_EQ(ARES_SUCCESS, ares_parse_ns_reply(data.data(), data.size(), &host));
  15. ASSERT_NE(nullptr, host);
  16. std::stringstream ss;
  17. ss << HostEnt(host);
  18. EXPECT_EQ("{'example.com' aliases=[ns.example.com] addrs=[]}", ss.str());
  19. ares_free_hostent(host);
  20. }
  21. TEST_F(LibraryTest, ParseNsReplyMultiple) {
  22. DNSPacket pkt;
  23. pkt.set_qid(10501).set_response().set_rd().set_ra()
  24. .add_question(new DNSQuestion("google.com", T_NS))
  25. .add_answer(new DNSNsRR("google.com", 59, "ns1.google.com"))
  26. .add_answer(new DNSNsRR("google.com", 59, "ns2.google.com"))
  27. .add_answer(new DNSNsRR("google.com", 59, "ns3.google.com"))
  28. .add_answer(new DNSNsRR("google.com", 59, "ns4.google.com"))
  29. .add_additional(new DNSARR("ns4.google.com", 247, {216,239,38,10}))
  30. .add_additional(new DNSARR("ns2.google.com", 247, {216,239,34,10}))
  31. .add_additional(new DNSARR("ns1.google.com", 247, {216,239,32,10}))
  32. .add_additional(new DNSARR("ns3.google.com", 247, {216,239,36,10}));
  33. std::vector<byte> data = pkt.data();
  34. struct hostent *host = nullptr;
  35. EXPECT_EQ(ARES_SUCCESS, ares_parse_ns_reply(data.data(), data.size(), &host));
  36. ASSERT_NE(nullptr, host);
  37. std::stringstream ss;
  38. ss << HostEnt(host);
  39. EXPECT_EQ("{'google.com' aliases=[ns1.google.com, ns2.google.com, ns3.google.com, ns4.google.com] addrs=[]}", ss.str());
  40. ares_free_hostent(host);
  41. }
  42. TEST_F(LibraryTest, ParseNsReplyErrors) {
  43. DNSPacket pkt;
  44. pkt.set_qid(0x1234).set_response().set_aa()
  45. .add_question(new DNSQuestion("example.com", T_NS))
  46. .add_answer(new DNSNsRR("example.com", 100, "ns.example.com"));
  47. std::vector<byte> data;
  48. struct hostent *host = nullptr;
  49. // No question.
  50. pkt.questions_.clear();
  51. data = pkt.data();
  52. EXPECT_EQ(ARES_EBADRESP, ares_parse_ns_reply(data.data(), data.size(), &host));
  53. pkt.add_question(new DNSQuestion("example.com", T_NS));
  54. #ifdef DISABLED
  55. // Question != answer
  56. pkt.questions_.clear();
  57. pkt.add_question(new DNSQuestion("Axample.com", T_NS));
  58. data = pkt.data();
  59. EXPECT_EQ(ARES_ENODATA, ares_parse_ns_reply(data.data(), data.size(), &host));
  60. pkt.questions_.clear();
  61. pkt.add_question(new DNSQuestion("example.com", T_NS));
  62. #endif
  63. // Two questions.
  64. pkt.add_question(new DNSQuestion("example.com", T_NS));
  65. data = pkt.data();
  66. EXPECT_EQ(ARES_EBADRESP, ares_parse_ns_reply(data.data(), data.size(), &host));
  67. pkt.questions_.clear();
  68. pkt.add_question(new DNSQuestion("example.com", T_NS));
  69. // Wrong sort of answer.
  70. pkt.answers_.clear();
  71. pkt.add_answer(new DNSMxRR("example.com", 100, 100, "mx1.example.com"));
  72. data = pkt.data();
  73. EXPECT_EQ(ARES_ENODATA, ares_parse_ns_reply(data.data(), data.size(), &host));
  74. pkt.answers_.clear();
  75. pkt.add_answer(new DNSNsRR("example.com", 100, "ns.example.com"));
  76. // No answer.
  77. pkt.answers_.clear();
  78. data = pkt.data();
  79. EXPECT_EQ(ARES_ENODATA, ares_parse_ns_reply(data.data(), data.size(), &host));
  80. pkt.add_answer(new DNSNsRR("example.com", 100, "ns.example.com"));
  81. // Truncated packets.
  82. data = pkt.data();
  83. for (size_t len = 1; len < data.size(); len++) {
  84. EXPECT_EQ(ARES_EBADRESP, ares_parse_ns_reply(data.data(), len, &host));
  85. }
  86. }
  87. TEST_F(LibraryTest, ParseNsReplyAllocFail) {
  88. DNSPacket pkt;
  89. pkt.set_qid(0x1234).set_response().set_aa()
  90. .add_question(new DNSQuestion("example.com", T_NS))
  91. .add_answer(new DNSCnameRR("example.com", 300, "c.example.com"))
  92. .add_answer(new DNSNsRR("c.example.com", 100, "ns.example.com"));
  93. std::vector<byte> data = pkt.data();
  94. struct hostent *host = nullptr;
  95. for (int ii = 1; ii <= 8; ii++) {
  96. ClearFails();
  97. SetAllocFail(ii);
  98. EXPECT_EQ(ARES_ENOMEM, ares_parse_ns_reply(data.data(), data.size(), &host)) << ii;
  99. }
  100. }
  101. } // namespace test
  102. } // namespace ares