ares-test-parse-soa.cc
Go to the documentation of this file.
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 
10 TEST_F(LibraryTest, ParseSoaReplyOK) {
11  DNSPacket pkt;
12  pkt.set_qid(0x1234).set_response().set_aa()
13  .add_question(new DNSQuestion("example.com", 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 
32 TEST_F(LibraryTest, ParseSoaReplyErrors) {
33  DNSPacket pkt;
34  pkt.set_qid(0x1234).set_response().set_aa()
35  .add_question(new DNSQuestion("example.com", 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", T_SOA));
47 
48 #ifdef DISABLED
49  // Question != answer
50  pkt.questions_.clear();
51  pkt.add_question(new DNSQuestion("Axample.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 #endif
57 
58  // Two questions
59  pkt.add_question(new DNSQuestion("example.com", 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", 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++) {
87  }
88 }
89 
90 TEST_F(LibraryTest, ParseSoaReplyAllocFail) {
91  DNSPacket pkt;
92  pkt.set_qid(0x1234).set_response().set_aa()
93  .add_question(new DNSQuestion("example.com", 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
ASSERT_NE
#define ASSERT_NE(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2060
ARES_ENOMEM
#define ARES_ENOMEM
Definition: ares.h:117
ares::DNSPacket
Definition: dns-proto.h:188
ares::DNSPacket::set_aa
DNSPacket & set_aa(bool v=true)
Definition: dns-proto.h:213
ares_soa_reply::minttl
unsigned int minttl
Definition: ares.h:587
test
Definition: spinlock_test.cc:36
ares_soa_reply::refresh
unsigned int refresh
Definition: ares.h:584
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
ares::DNSPacket::set_qid
DNSPacket & set_qid(int qid)
Definition: dns-proto.h:211
ares_soa_reply::hostmaster
char * hostmaster
Definition: ares.h:582
ares::DNSPacket::answers_
std::vector< std::unique_ptr< DNSRR > > answers_
Definition: dns-proto.h:237
EXPECT_EQ
#define EXPECT_EQ(a, b)
Definition: iomgr/time_averaged_stats_test.cc:27
ares::DNSPacket::add_question
DNSPacket & add_question(DNSQuestion *q)
Definition: dns-proto.h:194
ares_soa_reply::serial
unsigned int serial
Definition: ares.h:583
ARES_EBADRESP
#define ARES_EBADRESP
Definition: ares.h:112
ares_soa_reply
Definition: ares.h:580
T_SOA
#define T_SOA
Definition: ares_nameser.h:325
ares_soa_reply::retry
unsigned int retry
Definition: ares.h:585
ares_soa_reply::expire
unsigned int expire
Definition: ares.h:586
ares::DNSPacket::data
std::vector< byte > data() const
Definition: dns-proto.cc:592
data
char data[kBufferLength]
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1006
ares-test.h
ARES_SUCCESS
#define ARES_SUCCESS
Definition: ares.h:98
ares::DNSSoaRR
Definition: dns-proto.h:141
ares::DNSPacket::add_answer
DNSPacket & add_answer(DNSRR *q)
Definition: dns-proto.h:198
ares::DNSPacket::questions_
std::vector< std::unique_ptr< DNSQuestion > > questions_
Definition: dns-proto.h:236
ares_free_data
CARES_EXTERN void ares_free_data(void *dataptr)
Definition: ares_data.c:41
ares::DNSPacket::set_response
DNSPacket & set_response(bool v=true)
Definition: dns-proto.h:212
ares_parse_soa_reply
CARES_EXTERN int ares_parse_soa_reply(const unsigned char *abuf, int alen, struct ares_soa_reply **soa_out)
Definition: ares_parse_soa_reply.c:38
ares::DNSMxRR
Definition: dns-proto.h:122
len
int len
Definition: abseil-cpp/absl/base/internal/low_level_alloc_test.cc:46
ares::test::TEST_F
TEST_F(LibraryTest, OptionsChannelInit)
Definition: ares-test-init.cc:55
ares::DNSQuestion
Definition: dns-proto.h:45
ares_soa_reply::nsname
char * nsname
Definition: ares.h:581
ares
Definition: ares-test-ai.h:9
ares::test::LibraryTest
Definition: ares-test.h:60
dns-proto.h


grpc
Author(s):
autogenerated on Fri May 16 2025 02:57:42