]>
git.ipfire.org Git - thirdparty/pdns.git/blob - pdns/test-zoneparser_tng_cc.cc
1 #ifndef BOOST_TEST_DYN_LINK
2 #define BOOST_TEST_DYN_LINK
5 #define BOOST_TEST_NO_MAIN
10 #include <boost/test/unit_test.hpp>
11 #include <boost/assign/list_of.hpp>
13 #include <boost/iostreams/device/file.hpp>
15 #include "zoneparser-tng.hh"
16 #include "dnsrecords.hh"
21 BOOST_AUTO_TEST_SUITE(test_zoneparser_tng_cc
)
23 BOOST_AUTO_TEST_CASE(test_tng_record_types
) {
26 std::ostringstream pathbuf
;
27 const char* p
= std::getenv("SRCDIR");
30 pathbuf
<< p
<< "/../regression-tests/zones/unit.test";
31 ZoneParserTNG
zp(pathbuf
.str(), DNSName("unit.test"));
34 ifstream
ifs(pathbuf
.str());
37 // make sure these concur.
38 std::string host
, type
, data
;
40 std::getline(ifs
, host
, ' ');
41 std::getline(ifs
, type
, ' ');
42 pdns::checked_stoi_into(ttl
, type
);
43 std::getline(ifs
, type
, ' ');
44 std::getline(ifs
, type
, ' ');
45 std::getline(ifs
, data
, '\n');
47 BOOST_CHECK_EQUAL(rr
.qname
.toString(), host
);
48 BOOST_CHECK_EQUAL(rr
.ttl
, ttl
);
49 BOOST_CHECK_EQUAL(rr
.qtype
.toString(), type
);
50 if (rr
.qtype
== QType::SOA
)
51 continue; // FIXME400 remove trailing dots from data
52 if (*(rr
.content
.rbegin()) != '.' && *(data
.rbegin()) == '.')
53 BOOST_CHECK_EQUAL(rr
.content
, std::string(data
.begin(),data
.end()-1));
55 BOOST_CHECK_EQUAL(rr
.content
, data
);
59 BOOST_AUTO_TEST_CASE(test_tng_record_generate
) {
62 std::ostringstream pathbuf
;
63 const char* p
= std::getenv("SRCDIR");
66 pathbuf
<< p
<< "/../regression-tests/zones/unit2.test";
70 ZoneParserTNG
zp(pathbuf
.str(), DNSName("unit2.test"));
72 const vector
<string
> expected
= {
73 "0.01.0003.000005.00000007.unit2.test.",
74 "1.02.0004.000006.00000008.unit2.test.",
75 "2.03.0005.000007.00000009.unit2.test.",
76 "3.04.0006.000008.0000000a.unit2.test.",
77 "4.05.0007.000009.0000000b.unit2.test.",
78 "5.06.0008.00000A.0000000c.unit2.test.",
79 "6.07.0009.00000B.0000000d.unit2.test.",
80 "7.10.0010.00000C.0000000e.unit2.test.",
81 "8.11.0011.00000D.0000000f.unit2.test.",
82 "9.12.0012.00000E.00000010.unit2.test.",
83 "10.13.0013.00000F.00000011.unit2.test.",
84 "11.14.0014.000010.00000012.unit2.test.",
85 "12.15.0015.000011.00000013.unit2.test.",
86 "13.16.0016.000012.00000014.unit2.test.",
87 "14.17.0017.000013.00000015.unit2.test.",
88 "15.20.0018.000014.00000016.unit2.test.",
89 "16.21.0019.000015.00000017.unit2.test."
92 for (auto const & exp
: expected
) {
95 BOOST_CHECK_EQUAL(rr
.qname
.toString(), exp
);
96 BOOST_CHECK_EQUAL(rr
.ttl
, 86400U);
97 BOOST_CHECK_EQUAL(rr
.qclass
, 1U);
98 BOOST_CHECK_EQUAL(rr
.qtype
.toString(), "A");
99 BOOST_CHECK_EQUAL(rr
.content
, "1.2.3.4");
104 /* GENERATE with a step of 2, and the template radix defaulting to 'd' */
105 ZoneParserTNG
zp(std::vector
<std::string
>({"$GENERATE 0-4/2 $.${1,2,o}.${3,4}.${5,6,X}.${7,8,x} 86400 IN A 1.2.3.4"}), DNSName("unit2.test"));
107 const vector
<string
> expected
= {
108 "0.01.0003.000005.00000007.unit2.test.",
109 "2.03.0005.000007.00000009.unit2.test.",
110 "4.05.0007.000009.0000000b.unit2.test.",
113 for (auto const & exp
: expected
) {
114 DNSResourceRecord rr
;
116 BOOST_CHECK_EQUAL(rr
.qname
.toString(), exp
);
117 BOOST_CHECK_EQUAL(rr
.ttl
, 86400U);
118 BOOST_CHECK_EQUAL(rr
.qclass
, 1U);
119 BOOST_CHECK_EQUAL(rr
.qtype
.toString(), "A");
120 BOOST_CHECK_EQUAL(rr
.content
, "1.2.3.4");
123 DNSResourceRecord rr
;
124 BOOST_CHECK(!zp
.get(rr
));
129 /* GENERATE with a larger initial counter and a large stop */
130 ZoneParserTNG
zp(std::vector
<std::string
>({"$GENERATE 4294967294-4294967295/2 $ 86400 IN A 1.2.3.4"}), DNSName("unit2.test"));
132 const vector
<string
> expected
= {
133 "4294967294.unit2.test.",
136 for (auto const & exp
: expected
) {
137 DNSResourceRecord rr
;
139 BOOST_CHECK_EQUAL(rr
.qname
.toString(), exp
);
140 BOOST_CHECK_EQUAL(rr
.ttl
, 86400U);
141 BOOST_CHECK_EQUAL(rr
.qclass
, 1U);
142 BOOST_CHECK_EQUAL(rr
.qtype
.toString(), "A");
143 BOOST_CHECK_EQUAL(rr
.content
, "1.2.3.4");
146 DNSResourceRecord rr
;
147 BOOST_CHECK(!zp
.get(rr
));
152 /* test invalid generate parameters: stop greater than start */
153 ZoneParserTNG
zp(std::vector
<std::string
>({"$GENERATE 5-4 $.${1,2,o}.${3,4,d}.${5,6,X}.${7,8,x} 86400 IN A 1.2.3.4"}), DNSName("test"));
154 DNSResourceRecord rr
;
155 BOOST_CHECK_THROW(zp
.get(rr
), std::exception
);
159 /* test invalid generate parameters: no stop */
160 ZoneParserTNG
zp(std::vector
<std::string
>({"$GENERATE 5 $.${1,2,o}.${3,4,d}.${5,6,X}.${7,8,x} 86400 IN A 1.2.3.4"}), DNSName("test"));
161 DNSResourceRecord rr
;
162 BOOST_CHECK_THROW(zp
.get(rr
), std::exception
);
166 /* test invalid generate parameters: invalid step */
167 ZoneParserTNG
zp(std::vector
<std::string
>({"$GENERATE 0-4/0 $.${1,2,o}.${3,4,d}.${5,6,X}.${7,8,x} 86400 IN A 1.2.3.4"}), DNSName("test"));
168 DNSResourceRecord rr
;
169 BOOST_CHECK_THROW(zp
.get(rr
), std::exception
);
173 /* test invalid generate parameters: negative counter */
174 ZoneParserTNG
zp(std::vector
<std::string
>({"$GENERATE -1-4/1 $.${1,2,o}.${3,4,d}.${5,6,X}.${7,8,x} 86400 IN A 1.2.3.4"}), DNSName("test"));
175 DNSResourceRecord rr
;
176 BOOST_CHECK_THROW(zp
.get(rr
), std::exception
);
179 /* test invalid generate parameters: counter out of bounds */
180 ZoneParserTNG
zp(std::vector
<std::string
>({"$GENERATE 4294967296-4/1 $.${1,2,o}.${3,4,d}.${5,6,X}.${7,8,x} 86400 IN A 1.2.3.4"}), DNSName("test"));
181 DNSResourceRecord rr
;
182 BOOST_CHECK_THROW(zp
.get(rr
), std::exception
);
186 /* test invalid generate parameters: negative stop */
187 ZoneParserTNG
zp(std::vector
<std::string
>({"$GENERATE 0--4/1 $.${1,2,o}.${3,4,d}.${5,6,X}.${7,8,x} 86400 IN A 1.2.3.4"}), DNSName("test"));
188 DNSResourceRecord rr
;
189 BOOST_CHECK_THROW(zp
.get(rr
), std::exception
);
193 /* test invalid generate parameters: stop out of bounds */
194 ZoneParserTNG
zp(std::vector
<std::string
>({"$GENERATE 0-4294967296/1 $.${1,2,o}.${3,4,d}.${5,6,X}.${7,8,x} 86400 IN A 1.2.3.4"}), DNSName("test"));
195 DNSResourceRecord rr
;
196 BOOST_CHECK_THROW(zp
.get(rr
), std::exception
);
200 /* test invalid generate parameters: negative step */
201 ZoneParserTNG
zp(std::vector
<std::string
>({"$GENERATE 0-4/-1 $.${1,2,o}.${3,4,d}.${5,6,X}.${7,8,x} 86400 IN A 1.2.3.4"}), DNSName("test"));
202 DNSResourceRecord rr
;
203 BOOST_CHECK_THROW(zp
.get(rr
), std::exception
);
207 /* test invalid generate parameters: no offset */
208 ZoneParserTNG
zp(std::vector
<std::string
>({"$GENERATE 0-4/1 $.${}.${3,4,d}.${5,6,X}.${7,8,x} 86400 IN A 1.2.3.4"}), DNSName("test"));
209 DNSResourceRecord rr
;
210 BOOST_CHECK_THROW(zp
.get(rr
), PDNSException
);
214 /* test invalid generate parameters: invalid offset */
215 ZoneParserTNG
zp(std::vector
<std::string
>({"$GENERATE 0-4/1 $.${a,2,o}.${3,4,d}.${5,6,X}.${7,8,x} 86400 IN A 1.2.3.4"}), DNSName("test"));
216 DNSResourceRecord rr
;
217 BOOST_CHECK_THROW(zp
.get(rr
), PDNSException
);
221 BOOST_AUTO_TEST_CASE(test_tng_upgrade
) {
224 ZoneParserTNG
zp(std::vector
<std::string
>({"foo.test. 86400 IN TYPE1 \\# 4 c0000304"}), DNSName("test"), true);
225 DNSResourceRecord rr
;
228 BOOST_CHECK_EQUAL(rr
.qtype
.toString(), QType(QType::A
).toString());
229 BOOST_CHECK_EQUAL(rr
.content
, std::string("192.0.3.4"));
232 BOOST_AUTO_TEST_SUITE_END();