ares-test-parse-soa.cc 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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, ParseSoaReplyOK) {
  8. DNSPacket pkt;
  9. pkt.set_qid(0x1234).set_response().set_aa()
  10. .add_question(new DNSQuestion("example.com", T_SOA))
  11. .add_answer(new DNSSoaRR("example.com", 100,
  12. "soa1.example.com", "fred.example.com",
  13. 1, 2, 3, 4, 5));
  14. std::vector<byte> data = pkt.data();
  15. struct ares_soa_reply* soa = nullptr;
  16. EXPECT_EQ(ARES_SUCCESS, ares_parse_soa_reply(data.data(), data.size(), &soa));
  17. ASSERT_NE(nullptr, soa);
  18. EXPECT_EQ("soa1.example.com", std::string(soa->nsname));
  19. EXPECT_EQ("fred.example.com", std::string(soa->hostmaster));
  20. EXPECT_EQ(1, soa->serial);
  21. EXPECT_EQ(2, soa->refresh);
  22. EXPECT_EQ(3, soa->retry);
  23. EXPECT_EQ(4, soa->expire);
  24. EXPECT_EQ(5, soa->minttl);
  25. ares_free_data(soa);
  26. }
  27. TEST_F(LibraryTest, ParseSoaReplyErrors) {
  28. DNSPacket pkt;
  29. pkt.set_qid(0x1234).set_response().set_aa()
  30. .add_question(new DNSQuestion("example.com", T_SOA))
  31. .add_answer(new DNSSoaRR("example.com", 100,
  32. "soa1.example.com", "fred.example.com",
  33. 1, 2, 3, 4, 5));
  34. std::vector<byte> data;
  35. struct ares_soa_reply* soa = nullptr;
  36. // No question.
  37. pkt.questions_.clear();
  38. data = pkt.data();
  39. EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), data.size(), &soa));
  40. pkt.add_question(new DNSQuestion("example.com", T_SOA));
  41. #ifdef DISABLED
  42. // Question != answer
  43. pkt.questions_.clear();
  44. pkt.add_question(new DNSQuestion("Axample.com", T_SOA));
  45. data = pkt.data();
  46. EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), data.size(), &soa));
  47. pkt.questions_.clear();
  48. pkt.add_question(new DNSQuestion("example.com", T_SOA));
  49. #endif
  50. // Two questions
  51. pkt.add_question(new DNSQuestion("example.com", T_SOA));
  52. data = pkt.data();
  53. EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), data.size(), &soa));
  54. pkt.questions_.clear();
  55. pkt.add_question(new DNSQuestion("example.com", T_SOA));
  56. // Wrong sort of answer.
  57. pkt.answers_.clear();
  58. pkt.add_answer(new DNSMxRR("example.com", 100, 100, "mx1.example.com"));
  59. data = pkt.data();
  60. EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), data.size(), &soa));
  61. pkt.answers_.clear();
  62. pkt.add_answer(new DNSSoaRR("example.com", 100,
  63. "soa1.example.com", "fred.example.com",
  64. 1, 2, 3, 4, 5));
  65. // No answer.
  66. pkt.answers_.clear();
  67. data = pkt.data();
  68. EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), data.size(), &soa));
  69. pkt.add_answer(new DNSSoaRR("example.com", 100,
  70. "soa1.example.com", "fred.example.com",
  71. 1, 2, 3, 4, 5));
  72. // Truncated packets.
  73. data = pkt.data();
  74. for (size_t len = 1; len < data.size(); len++) {
  75. EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), len, &soa));
  76. }
  77. }
  78. TEST_F(LibraryTest, ParseSoaReplyAllocFail) {
  79. DNSPacket pkt;
  80. pkt.set_qid(0x1234).set_response().set_aa()
  81. .add_question(new DNSQuestion("example.com", T_SOA))
  82. .add_answer(new DNSSoaRR("example.com", 100,
  83. "soa1.example.com", "fred.example.com",
  84. 1, 2, 3, 4, 5));
  85. std::vector<byte> data = pkt.data();
  86. struct ares_soa_reply* soa = nullptr;
  87. for (int ii = 1; ii <= 5; ii++) {
  88. ClearFails();
  89. SetAllocFail(ii);
  90. EXPECT_EQ(ARES_ENOMEM, ares_parse_soa_reply(data.data(), data.size(), &soa)) << ii;
  91. }
  92. }
  93. } // namespace test
  94. } // namespace ares