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