ares-test-parse-naptr.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, ParseNaptrReplyOK) {
11  DNSPacket pkt;
12  pkt.set_qid(0x1234).set_response().set_aa()
13  .add_question(new DNSQuestion("example.com", T_NAPTR))
14  .add_answer(new DNSNaptrRR("example.com", 100,
15  10, 20, "SP", "service", "regexp", "replace"))
16  .add_answer(new DNSNaptrRR("example.com", 0x0010,
17  11, 21, "SP", "service2", "regexp2", "replace2"));
18  std::vector<byte> data = pkt.data();
19 
20  struct ares_naptr_reply* naptr = nullptr;
21  EXPECT_EQ(ARES_SUCCESS, ares_parse_naptr_reply(data.data(), data.size(), &naptr));
22  ASSERT_NE(nullptr, naptr);
23  EXPECT_EQ("SP", std::string((char*)naptr->flags));
24  EXPECT_EQ("service", std::string((char*)naptr->service));
25  EXPECT_EQ("regexp", std::string((char*)naptr->regexp));
26  EXPECT_EQ("replace", std::string((char*)naptr->replacement));
27  EXPECT_EQ(10, naptr->order);
28  EXPECT_EQ(20, naptr->preference);
29 
30  struct ares_naptr_reply* naptr2 = naptr->next;
31  ASSERT_NE(nullptr, naptr2);
32  EXPECT_EQ("SP", std::string((char*)naptr2->flags));
33  EXPECT_EQ("service2", std::string((char*)naptr2->service));
34  EXPECT_EQ("regexp2", std::string((char*)naptr2->regexp));
35  EXPECT_EQ("replace2", std::string((char*)naptr2->replacement));
36  EXPECT_EQ(11, naptr2->order);
37  EXPECT_EQ(21, naptr2->preference);
38  EXPECT_EQ(nullptr, naptr2->next);
39 
40  ares_free_data(naptr);
41 }
42 
43 TEST_F(LibraryTest, ParseNaptrReplyErrors) {
44  DNSPacket pkt;
45  pkt.set_qid(0x1234).set_response().set_aa()
46  .add_question(new DNSQuestion("example.com", T_NAPTR))
47  .add_answer(new DNSNaptrRR("example.com", 100,
48  10, 20, "SP", "service", "regexp", "replace"));
49  std::vector<byte> data;
50  struct ares_naptr_reply* naptr = nullptr;
51 
52  // No question.
53  pkt.questions_.clear();
54  data = pkt.data();
55  EXPECT_EQ(ARES_EBADRESP, ares_parse_naptr_reply(data.data(), data.size(), &naptr));
56  pkt.add_question(new DNSQuestion("example.com", T_NAPTR));
57 
58 #ifdef DISABLED
59  // Question != answer
60  pkt.questions_.clear();
61  pkt.add_question(new DNSQuestion("Axample.com", T_NAPTR));
62  data = pkt.data();
63  EXPECT_EQ(ARES_ENODATA, ares_parse_naptr_reply(data.data(), data.size(), &naptr));
64  pkt.questions_.clear();
65  pkt.add_question(new DNSQuestion("example.com", T_NAPTR));
66 #endif
67 
68  // Two questions
69  pkt.add_question(new DNSQuestion("example.com", T_NAPTR));
70  data = pkt.data();
71  EXPECT_EQ(ARES_EBADRESP, ares_parse_naptr_reply(data.data(), data.size(), &naptr));
72  pkt.questions_.clear();
73  pkt.add_question(new DNSQuestion("example.com", T_NAPTR));
74 
75  // Wrong sort of answer.
76  pkt.answers_.clear();
77  pkt.add_answer(new DNSMxRR("example.com", 100, 100, "mx1.example.com"));
78  data = pkt.data();
79  EXPECT_EQ(ARES_SUCCESS, ares_parse_naptr_reply(data.data(), data.size(), &naptr));
80  EXPECT_EQ(nullptr, naptr);
81  pkt.answers_.clear();
82  pkt.add_answer(new DNSNaptrRR("example.com", 100,
83  10, 20, "SP", "service", "regexp", "replace"));
84 
85  // No answer.
86  pkt.answers_.clear();
87  data = pkt.data();
88  EXPECT_EQ(ARES_ENODATA, ares_parse_naptr_reply(data.data(), data.size(), &naptr));
89  pkt.add_answer(new DNSNaptrRR("example.com", 100,
90  10, 20, "SP", "service", "regexp", "replace"));
91 
92  // Truncated packets.
93  data = pkt.data();
94  for (size_t len = 1; len < data.size(); len++) {
95  int rc = ares_parse_naptr_reply(data.data(), len, &naptr);
96  EXPECT_TRUE(rc == ARES_EBADRESP || rc == ARES_EBADNAME);
97  }
98 }
99 
100 TEST_F(LibraryTest, ParseNaptrReplyTooShort) {
101  std::vector<byte> data = {
102  0x12, 0x34, // qid
103  0x84, // response + query + AA + not-TC + not-RD
104  0x00, // not-RA + not-Z + not-AD + not-CD + rc=NoError
105  0x00, 0x01, // num questions
106  0x00, 0x01, // num answer RRs
107  0x00, 0x00, // num authority RRs
108  0x00, 0x00, // num additional RRs
109  // Question
110  0x07, 'e', 'x', 'a', 'm', 'p', 'l', 'e',
111  0x03, 'c', 'o', 'm',
112  0x00,
113  0x00, 0x23, // type NAPTR
114  0x00, 0x01, // class IN
115  // Answer 1
116  0x07, 'e', 'x', 'a', 'm', 'p', 'l', 'e',
117  0x03, 'c', 'o', 'm',
118  0x00,
119  0x00, 0x23, // RR type
120  0x00, 0x01, // class IN
121  0x01, 0x02, 0x03, 0x04, // TTL
122  0x00, 0x01, // rdata length
123  0x00, // Too short: expect 2 x int16 and 3 x name (min 1 byte each)
124  };
125  struct ares_naptr_reply* naptr = nullptr;
126  EXPECT_EQ(ARES_EBADRESP, ares_parse_naptr_reply(data.data(), data.size(), &naptr));
127 }
128 
129 TEST_F(LibraryTest, ParseNaptrReplyAllocFail) {
130  DNSPacket pkt;
131  pkt.set_qid(0x1234).set_response().set_aa()
132  .add_question(new DNSQuestion("example.com", T_NAPTR))
133  .add_answer(new DNSNaptrRR("example.com", 100,
134  10, 20, "SP", "service", "regexp", "replace"))
135  .add_answer(new DNSNaptrRR("example.com", 0x0010,
136  11, 21, "SP", "service2", "regexp2", "replace2"));
137  std::vector<byte> data = pkt.data();
138  struct ares_naptr_reply* naptr = nullptr;
139 
140  for (int ii = 1; ii <= 13; ii++) {
141  ClearFails();
142  SetAllocFail(ii);
143  EXPECT_EQ(ARES_ENOMEM, ares_parse_naptr_reply(data.data(), data.size(), &naptr));
144  }
145 }
146 
147 } // namespace test
148 } // 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
test
Definition: spinlock_test.cc:36
ares_parse_naptr_reply
CARES_EXTERN int ares_parse_naptr_reply(const unsigned char *abuf, int alen, struct ares_naptr_reply **naptr_out)
Definition: ares_parse_naptr_reply.c:38
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::DNSPacket::answers_
std::vector< std::unique_ptr< DNSRR > > answers_
Definition: dns-proto.h:237
ares_naptr_reply::regexp
unsigned char * regexp
Definition: ares.h:574
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_EBADRESP
#define ARES_EBADRESP
Definition: ares.h:112
ares_naptr_reply::service
unsigned char * service
Definition: ares.h:573
ARES_ENODATA
#define ARES_ENODATA
Definition: ares.h:101
ares_naptr_reply::next
struct ares_naptr_reply * next
Definition: ares.h:571
ares::DNSPacket::data
std::vector< byte > data() const
Definition: dns-proto.cc:592
ares_naptr_reply
Definition: ares.h:570
ares_naptr_reply::flags
unsigned char * flags
Definition: ares.h:572
data
char data[kBufferLength]
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1006
T_NAPTR
#define T_NAPTR
Definition: ares_nameser.h:412
ARES_EBADNAME
#define ARES_EBADNAME
Definition: ares.h:110
ares-test.h
ARES_SUCCESS
#define ARES_SUCCESS
Definition: ares.h:98
ares::DNSPacket::add_answer
DNSPacket & add_answer(DNSRR *q)
Definition: dns-proto.h:198
ares_naptr_reply::order
unsigned short order
Definition: ares.h:576
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
EXPECT_TRUE
#define EXPECT_TRUE(condition)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1967
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::DNSNaptrRR
Definition: dns-proto.h:158
ares::DNSQuestion
Definition: dns-proto.h:45
ares_naptr_reply::preference
unsigned short preference
Definition: ares.h:577
ares
Definition: ares-test-ai.h:9
ares::test::LibraryTest
Definition: ares-test.h:60
ares_naptr_reply::replacement
char * replacement
Definition: ares.h:575
dns-proto.h


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