]>
Commit | Line | Data |
---|---|---|
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 | |
21 | BOOST_AUTO_TEST_SUITE(test_zoneparser_tng_cc) | |
22 | ||
23 | BOOST_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 | ||
59 | BOOST_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 |
221 | BOOST_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 | 232 | BOOST_AUTO_TEST_SUITE_END(); |