]> git.ipfire.org Git - thirdparty/pdns.git/blame - pdns/test-zoneparser_tng_cc.cc
Merge pull request #14021 from Habbie/auth-lua-join-whitespace
[thirdparty/pdns.git] / pdns / test-zoneparser_tng_cc.cc
CommitLineData
1c2d079d 1#ifndef BOOST_TEST_DYN_LINK
108a4c3c 2#define BOOST_TEST_DYN_LINK
1c2d079d
FM
3#endif
4
108a4c3c 5#define BOOST_TEST_NO_MAIN
1c2d079d 6
870a0fe4
AT
7#ifdef HAVE_CONFIG_H
8#include "config.h"
9#endif
108a4c3c
AT
10#include <boost/test/unit_test.hpp>
11#include <boost/assign/list_of.hpp>
fa8fd4d2 12
108a4c3c 13#include <boost/iostreams/device/file.hpp>
108a4c3c
AT
14#include "dns.hh"
15#include "zoneparser-tng.hh"
c14af8a9 16#include "dnsrecords.hh"
a61e8e59 17#include "dnsname.hh"
108a4c3c 18#include <fstream>
a245e51c 19#include <cstdlib>
108a4c3c
AT
20
21BOOST_AUTO_TEST_SUITE(test_zoneparser_tng_cc)
22
23BOOST_AUTO_TEST_CASE(test_tng_record_types) {
c14af8a9 24 reportAllTypes();
c14af8a9 25
a245e51c 26 std::ostringstream pathbuf;
0d73f0ab 27 const char* p = std::getenv("SRCDIR");
28 if(!p)
29 p = ".";
30 pathbuf << p << "/../regression-tests/zones/unit.test";
eaedd091 31 ZoneParserTNG zp(pathbuf.str(), DNSName("unit.test"));
108a4c3c
AT
32 DNSResourceRecord rr;
33
e59c5996 34 ifstream ifs(pathbuf.str());
108a4c3c
AT
35
36 while(zp.get(rr)) {
37 // make sure these concur.
38 std::string host, type, data;
335da0ba 39 unsigned int ttl;
108a4c3c
AT
40 std::getline(ifs, host, ' ');
41 std::getline(ifs, type, ' ');
a0383aad 42 pdns::checked_stoi_into(ttl, type);
108a4c3c
AT
43 std::getline(ifs, type, ' ');
44 std::getline(ifs, type, ' ');
45 std::getline(ifs, data, '\n');
46 // see if these agree
d66269ef 47 BOOST_CHECK_EQUAL(rr.qname.toString(), host);
108a4c3c 48 BOOST_CHECK_EQUAL(rr.ttl, ttl);
d5fcd583 49 BOOST_CHECK_EQUAL(rr.qtype.toString(), type);
77e0833b 50 if (rr.qtype == QType::SOA)
3343ad1f 51 continue; // FIXME400 remove trailing dots from data
9da7b2be 52 if (*(rr.content.rbegin()) != '.' && *(data.rbegin()) == '.')
4c22f7c5
AT
53 BOOST_CHECK_EQUAL(rr.content, std::string(data.begin(),data.end()-1));
54 else
55 BOOST_CHECK_EQUAL(rr.content, data);
411368f8
OM
56 }
57}
58
59BOOST_AUTO_TEST_CASE(test_tng_record_generate) {
60 reportAllTypes();
61
62 std::ostringstream pathbuf;
63 const char* p = std::getenv("SRCDIR");
64 if(!p)
65 p = ".";
66 pathbuf << p << "/../regression-tests/zones/unit2.test";
1817fef6
RG
67
68 {
69 /* simple case */
70 ZoneParserTNG zp(pathbuf.str(), DNSName("unit2.test"));
71
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."
90 };
91
92 for (auto const & exp : expected) {
93 DNSResourceRecord rr;
94 zp.get(rr);
95 BOOST_CHECK_EQUAL(rr.qname.toString(), exp);
96 BOOST_CHECK_EQUAL(rr.ttl, 86400U);
97 BOOST_CHECK_EQUAL(rr.qclass, 1U);
d5fcd583 98 BOOST_CHECK_EQUAL(rr.qtype.toString(), "A");
1817fef6
RG
99 BOOST_CHECK_EQUAL(rr.content, "1.2.3.4");
100 }
101 }
102
103 {
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"));
106
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.",
111 };
112
113 for (auto const & exp : expected) {
114 DNSResourceRecord rr;
115 zp.get(rr);
116 BOOST_CHECK_EQUAL(rr.qname.toString(), exp);
117 BOOST_CHECK_EQUAL(rr.ttl, 86400U);
118 BOOST_CHECK_EQUAL(rr.qclass, 1U);
d5fcd583 119 BOOST_CHECK_EQUAL(rr.qtype.toString(), "A");
1817fef6
RG
120 BOOST_CHECK_EQUAL(rr.content, "1.2.3.4");
121 }
9da7b2be
RG
122 {
123 DNSResourceRecord rr;
124 BOOST_CHECK(!zp.get(rr));
125 }
126 }
127
128 {
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"));
131
132 const vector<string> expected = {
133 "4294967294.unit2.test.",
134 };
135
136 for (auto const & exp : expected) {
137 DNSResourceRecord rr;
138 zp.get(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");
144 }
145 {
146 DNSResourceRecord rr;
147 BOOST_CHECK(!zp.get(rr));
148 }
1817fef6
RG
149 }
150
151 {
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);
156 }
157
158 {
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);
163 }
164
165 {
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"));
411368f8 168 DNSResourceRecord rr;
9da7b2be
RG
169 BOOST_CHECK_THROW(zp.get(rr), std::exception);
170 }
171
e3fc3ebd 172 {
9da7b2be
RG
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);
177 }
e3fc3ebd
OM
178 {
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);
183 }
9da7b2be 184
e3fc3ebd 185 {
9da7b2be
RG
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);
190 }
191
e3fc3ebd
OM
192 {
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);
197 }
198
9da7b2be
RG
199 {
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;
1817fef6 203 BOOST_CHECK_THROW(zp.get(rr), std::exception);
411368f8 204 }
108a4c3c 205
1817fef6
RG
206 {
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);
211 }
212
213 {
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);
218 }
108a4c3c
AT
219}
220
8130f9bc
CH
221BOOST_AUTO_TEST_CASE(test_tng_upgrade) {
222 reportAllTypes();
223
224 ZoneParserTNG zp(std::vector<std::string>({"foo.test. 86400 IN TYPE1 \\# 4 c0000304"}), DNSName("test"), true);
225 DNSResourceRecord rr;
226 zp.get(rr);
227
d5fcd583 228 BOOST_CHECK_EQUAL(rr.qtype.toString(), QType(QType::A).toString());
8130f9bc
CH
229 BOOST_CHECK_EQUAL(rr.content, std::string("192.0.3.4"));
230}
231
108a4c3c 232BOOST_AUTO_TEST_SUITE_END();