mavtables  0.2.1
MAVLink router and firewall.
test_IPAddress.cpp
Go to the documentation of this file.
1 // MAVLink router and firewall.
2 // Copyright (C) 2017-2018 Michael R. Shannon <mrshannon.aerospace@gmail.com>
3 //
4 // This program is free software; you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation; either version 2 of the License, or
7 // (at your option) any later version.
8 //
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with this program. If not, see <http://www.gnu.org/licenses/>.
16 
17 
18 #include <stdexcept>
19 #include <utility>
20 
21 #include <catch.hpp>
22 
23 #include "IPAddress.hpp"
24 #include "utility.hpp"
25 
26 
27 TEST_CASE("IPAddress's store an address and a port number.", "[IPAddress]")
28 {
29  IPAddress a(0x00000000, 0);
30  IPAddress b(0xFFFFFFFF, 65535);
31  REQUIRE(a.address() == 0x00000000);
32  REQUIRE(a.port() == 0);
33  REQUIRE(b.address() == 0xFFFFFFFF);
34  REQUIRE(b.port() == 65535);
35 }
36 
37 
38 TEST_CASE("IPAddress's are comparable.", "[IPAddress]")
39 {
40  SECTION("with ==")
41  {
42  REQUIRE(IPAddress(0x00000000, 0) == IPAddress(0x00000000, 0));
43  REQUIRE(IPAddress(0x88888888, 8) == IPAddress(0x88888888, 8));
44  REQUIRE(IPAddress(0xFFFFFFFF, 65535) == IPAddress(0xFFFFFFFF, 65535));
45  REQUIRE_FALSE(IPAddress(0x00000000, 0) == IPAddress(0x00000000, 1));
46  REQUIRE_FALSE(IPAddress(0x00000000, 0) == IPAddress(0x00000001, 0));
47  REQUIRE_FALSE(
48  IPAddress(0xFFFFFFFF, 65535) == IPAddress(0xFFFFFFFF, 65534));
49  REQUIRE_FALSE(
50  IPAddress(0xFFFFFFFF, 65535) == IPAddress(0xFFFFFFFE, 65535));
51  }
52  SECTION("with !=")
53  {
54  REQUIRE(IPAddress(0x00000000, 0) != IPAddress(0x00000000, 1));
55  REQUIRE(IPAddress(0x00000000, 0) != IPAddress(0x00000001, 0));
56  REQUIRE(IPAddress(0xFFFFFFFF, 65535) != IPAddress(0xFFFFFFFF, 65534));
57  REQUIRE(IPAddress(0xFFFFFFFF, 65535) != IPAddress(0xFFFFFFFE, 65535));
58  REQUIRE_FALSE(IPAddress(0x00000000, 0) != IPAddress(0x00000000, 0));
59  REQUIRE_FALSE(IPAddress(0x88888888, 8) != IPAddress(0x88888888, 8));
60  REQUIRE_FALSE(
61  IPAddress(0xFFFFFFFF, 65535) != IPAddress(0xFFFFFFFF, 65535));
62  }
63  SECTION("with <")
64  {
65  REQUIRE(IPAddress(0x00000000, 0) < IPAddress(0x00000000, 1));
66  REQUIRE(IPAddress(0x00000000, 0) < IPAddress(0x00000001, 0));
67  REQUIRE(IPAddress(0x00000000, 1) < IPAddress(0x00000001, 0));
68  REQUIRE(IPAddress(0xFFFFFFFF, 65534) < IPAddress(0xFFFFFFFF, 65535));
69  REQUIRE(IPAddress(0xFFFFFFFE, 65535) < IPAddress(0xFFFFFFFF, 65535));
70  REQUIRE(IPAddress(0x00000000, 0) < IPAddress(0xFFFFFFFF, 65535));
71  REQUIRE_FALSE(IPAddress(0x00000000, 1) < IPAddress(0x00000000, 0));
72  REQUIRE_FALSE(IPAddress(0x00000001, 0) < IPAddress(0x00000000, 0));
73  REQUIRE_FALSE(IPAddress(0x00000001, 0) < IPAddress(0x00000000, 1));
74  REQUIRE_FALSE(
75  IPAddress(0xFFFFFFFF, 65535) < IPAddress(0xFFFFFFFF, 65534));
76  REQUIRE_FALSE(
77  IPAddress(0xFFFFFFFF, 65535) < IPAddress(0xFFFFFFFE, 65535));
78  REQUIRE_FALSE(IPAddress(0x00000000, 0) < IPAddress(0x00000000, 0));
79  REQUIRE_FALSE(IPAddress(0x88888888, 8) < IPAddress(0x88888888, 8));
80  REQUIRE_FALSE(
81  IPAddress(0xFFFFFFFF, 65535) < IPAddress(0xFFFFFFFF, 65535));
82  REQUIRE_FALSE(IPAddress(0xFFFFFFFF, 65535) < IPAddress(0x00000000, 0));
83  }
84  SECTION("with >")
85  {
86  REQUIRE(IPAddress(0x00000000, 1) > IPAddress(0x00000000, 0));
87  REQUIRE(IPAddress(0x00000001, 0) > IPAddress(0x00000000, 0));
88  REQUIRE(IPAddress(0x00000001, 0) > IPAddress(0x00000000, 1));
89  REQUIRE(IPAddress(0xFFFFFFFF, 65535) > IPAddress(0xFFFFFFFF, 65534));
90  REQUIRE(IPAddress(0xFFFFFFFF, 65535) > IPAddress(0xFFFFFFFE, 65535));
91  REQUIRE(IPAddress(0xFFFFFFFF, 65535) > IPAddress(0x00000000, 0));
92  REQUIRE_FALSE(IPAddress(0x00000000, 0) > IPAddress(0x00000000, 1));
93  REQUIRE_FALSE(IPAddress(0x00000000, 0) > IPAddress(0x00000001, 0));
94  REQUIRE_FALSE(IPAddress(0x00000000, 1) > IPAddress(0x00000001, 0));
95  REQUIRE_FALSE(
96  IPAddress(0xFFFFFFFF, 65534) > IPAddress(0xFFFFFFFF, 65535));
97  REQUIRE_FALSE(
98  IPAddress(0xFFFFFFFE, 65535) > IPAddress(0xFFFFFFFF, 65535));
99  REQUIRE_FALSE(IPAddress(0x00000000, 0) > IPAddress(0x00000000, 0));
100  REQUIRE_FALSE(IPAddress(0x88888888, 8) > IPAddress(0x88888888, 8));
101  REQUIRE_FALSE(
102  IPAddress(0xFFFFFFFF, 65535) > IPAddress(0xFFFFFFFF, 65535));
103  REQUIRE_FALSE(IPAddress(0x00000000, 0) > IPAddress(0xFFFFFFFF, 65535));
104  }
105  SECTION("with <=")
106  {
107  REQUIRE(IPAddress(0x00000000, 0) <= IPAddress(0x00000000, 0));
108  REQUIRE(IPAddress(0x88888888, 8) <= IPAddress(0x88888888, 8));
109  REQUIRE(IPAddress(0xFFFFFFFF, 65535) <= IPAddress(0xFFFFFFFF, 65535));
110  REQUIRE(IPAddress(0x00000000, 0) <= IPAddress(0x00000000, 1));
111  REQUIRE(IPAddress(0x00000000, 0) <= IPAddress(0x00000001, 0));
112  REQUIRE(IPAddress(0x00000000, 1) <= IPAddress(0x00000001, 0));
113  REQUIRE(IPAddress(0xFFFFFFFF, 65534) <= IPAddress(0xFFFFFFFF, 65535));
114  REQUIRE(IPAddress(0xFFFFFFFE, 65535) <= IPAddress(0xFFFFFFFF, 65535));
115  REQUIRE(IPAddress(0x00000000, 0) <= IPAddress(0xFFFFFFFF, 65535));
116  REQUIRE_FALSE(IPAddress(0x00000000, 1) <= IPAddress(0x00000000, 0));
117  REQUIRE_FALSE(IPAddress(0x00000001, 0) <= IPAddress(0x00000000, 0));
118  REQUIRE_FALSE(IPAddress(0x00000001, 0) <= IPAddress(0x00000000, 1));
119  REQUIRE_FALSE(
120  IPAddress(0xFFFFFFFF, 65535) <= IPAddress(0xFFFFFFFF, 65534));
121  REQUIRE_FALSE(
122  IPAddress(0xFFFFFFFF, 65535) <= IPAddress(0xFFFFFFFE, 65535));
123  REQUIRE_FALSE(IPAddress(0xFFFFFFFF, 65535) <= IPAddress(0x00000000, 0));
124  }
125  SECTION("with >=")
126  {
127  REQUIRE(IPAddress(0x00000000, 0) >= IPAddress(0x00000000, 0));
128  REQUIRE(IPAddress(0x88888888, 8) >= IPAddress(0x88888888, 8));
129  REQUIRE(IPAddress(0xFFFFFFFF, 65535) >= IPAddress(0xFFFFFFFF, 65535));
130  REQUIRE(IPAddress(0x00000000, 1) >= IPAddress(0x00000000, 0));
131  REQUIRE(IPAddress(0x00000001, 0) >= IPAddress(0x00000000, 0));
132  REQUIRE(IPAddress(0x00000001, 0) >= IPAddress(0x00000000, 1));
133  REQUIRE(IPAddress(0xFFFFFFFF, 65535) >= IPAddress(0xFFFFFFFF, 65534));
134  REQUIRE(IPAddress(0xFFFFFFFF, 65535) >= IPAddress(0xFFFFFFFE, 65535));
135  REQUIRE(IPAddress(0xFFFFFFFF, 65535) >= IPAddress(0x00000000, 0));
136  REQUIRE_FALSE(IPAddress(0x00000000, 0) >= IPAddress(0x00000000, 1));
137  REQUIRE_FALSE(IPAddress(0x00000000, 0) >= IPAddress(0x00000001, 0));
138  REQUIRE_FALSE(IPAddress(0x00000000, 1) >= IPAddress(0x00000001, 0));
139  REQUIRE_FALSE(
140  IPAddress(0xFFFFFFFF, 65534) >= IPAddress(0xFFFFFFFF, 65535));
141  REQUIRE_FALSE(
142  IPAddress(0xFFFFFFFE, 65535) >= IPAddress(0xFFFFFFFF, 65535));
143  REQUIRE_FALSE(IPAddress(0x00000000, 0) >= IPAddress(0xFFFFFFFF, 65535));
144  }
145 }
146 
147 
148 TEST_CASE("IPAddress's can be constructed from an address and port.",
149  "[IPAddress]")
150 {
151  REQUIRE(IPAddress(0x00000000, 0) == IPAddress(0x00000000, 0));
152  REQUIRE(IPAddress(0x12345678, 123) == IPAddress(0x12345678, 123));
153  REQUIRE(IPAddress(0xFFFFFFFF, 65535) == IPAddress(0xFFFFFFFF, 65535));
154  SECTION("And ensures address and port are within range.")
155  {
156  // Fails on ARMv7.
157  // REQUIRE_THROWS_AS(
158  // IPAddress(static_cast<unsigned long>(-1), 0), std::out_of_range);
159  REQUIRE_THROWS_AS(
160  IPAddress(0, static_cast<unsigned int>(-1)), std::out_of_range);
161  // This causes a compilation error on ARMv7.
162  // REQUIRE_THROWS_AS(IPAddress(0x1FFFFFFFF, 65535), std::out_of_range);
163  REQUIRE_THROWS_AS(IPAddress(0xFFFFFFFF, 65536), std::out_of_range);
164  }
165 }
166 
167 
168 TEST_CASE("IPAddress's can be constructed from strings.", "[IPAddress]")
169 {
170  SECTION("Without a port number.")
171  {
172  REQUIRE(IPAddress("192.168.32.128") == IPAddress(0xC0A82080));
173  }
174  SECTION("With a port number.")
175  {
176  REQUIRE(IPAddress("192.168.32.128:443") == IPAddress(0xC0A82080, 443));
177  }
178  SECTION("And will raise std::invalid_argument if it cannot be parsed.")
179  {
180  // Errors.
181  REQUIRE_THROWS_AS(IPAddress("-1.2.3.4"), std::invalid_argument);
182  REQUIRE_THROWS_AS(IPAddress("1.-2.3.4"), std::invalid_argument);
183  REQUIRE_THROWS_AS(IPAddress("1.2.-3.4"), std::invalid_argument);
184  REQUIRE_THROWS_AS(IPAddress("1.2.3.-4"), std::invalid_argument);
185  REQUIRE_THROWS_AS(IPAddress("+1.2.3.4"), std::invalid_argument);
186  REQUIRE_THROWS_AS(IPAddress("1.+2.3.4"), std::invalid_argument);
187  REQUIRE_THROWS_AS(IPAddress("1.2.+3.4"), std::invalid_argument);
188  REQUIRE_THROWS_AS(IPAddress("1.2.3.+4"), std::invalid_argument);
189  REQUIRE_THROWS_AS(IPAddress("1"), std::invalid_argument);
190  REQUIRE_THROWS_AS(IPAddress("1."), std::invalid_argument);
191  REQUIRE_THROWS_AS(IPAddress("1.2"), std::invalid_argument);
192  REQUIRE_THROWS_AS(IPAddress("1.2."), std::invalid_argument);
193  REQUIRE_THROWS_AS(IPAddress("1.2.3"), std::invalid_argument);
194  REQUIRE_THROWS_AS(IPAddress("1.2.3."), std::invalid_argument);
195  REQUIRE_THROWS_AS(IPAddress("1.2.3.4."), std::invalid_argument);
196  REQUIRE_THROWS_AS(IPAddress("1.2.3.4.5"), std::invalid_argument);
197  REQUIRE_THROWS_AS(IPAddress("a.2.3.4"), std::invalid_argument);
198  REQUIRE_THROWS_AS(IPAddress("1.b.3.4"), std::invalid_argument);
199  REQUIRE_THROWS_AS(IPAddress("1.2.c.4"), std::invalid_argument);
200  REQUIRE_THROWS_AS(IPAddress("1.2.3.d"), std::invalid_argument);
201  REQUIRE_THROWS_AS(
202  IPAddress("192.168.32.128.443"), std::invalid_argument);
203  REQUIRE_THROWS_AS(IPAddress("192.168.128:443"), std::invalid_argument);
204  REQUIRE_THROWS_AS(
205  IPAddress("192:168:32:128:443"), std::invalid_argument);
206  REQUIRE_THROWS_AS(
207  IPAddress("192.1b8.32.128:443"), std::invalid_argument);
208  // Check error string.
209  REQUIRE_THROWS_WITH(
210  IPAddress("-1.2.3.4"), "Invalid IP address string.");
211  REQUIRE_THROWS_WITH(
212  IPAddress("1.-2.3.4"), "Invalid IP address string.");
213  REQUIRE_THROWS_WITH(
214  IPAddress("1.2.-3.4"), "Invalid IP address string.");
215  REQUIRE_THROWS_WITH(
216  IPAddress("1.2.3.-4"), "Invalid IP address string.");
217  REQUIRE_THROWS_WITH(
218  IPAddress("+1.2.3.4"), "Invalid IP address string.");
219  REQUIRE_THROWS_WITH(
220  IPAddress("1.+2.3.4"), "Invalid IP address string.");
221  REQUIRE_THROWS_WITH(
222  IPAddress("1.2.+3.4"), "Invalid IP address string.");
223  REQUIRE_THROWS_WITH(
224  IPAddress("1.2.3.+4"), "Invalid IP address string.");
225  REQUIRE_THROWS_WITH(
226  IPAddress("1"), "Invalid IP address string.");
227  REQUIRE_THROWS_WITH(
228  IPAddress("1."), "Invalid IP address string.");
229  REQUIRE_THROWS_WITH(
230  IPAddress("1.2"), "Invalid IP address string.");
231  REQUIRE_THROWS_WITH(
232  IPAddress("1.2."), "Invalid IP address string.");
233  REQUIRE_THROWS_WITH(
234  IPAddress("1.2.3"), "Invalid IP address string.");
235  REQUIRE_THROWS_WITH(
236  IPAddress("1.2.3."), "Invalid IP address string.");
237  REQUIRE_THROWS_WITH(
238  IPAddress("1.2.3.4."), "Invalid IP address string.");
239  REQUIRE_THROWS_WITH(
240  IPAddress("1.2.3.4.5"), "Invalid IP address string.");
241  REQUIRE_THROWS_WITH(
242  IPAddress("a.2.3.4"), "Invalid IP address string.");
243  REQUIRE_THROWS_WITH(
244  IPAddress("1.b.3.4"), "Invalid IP address string.");
245  REQUIRE_THROWS_WITH(
246  IPAddress("1.2.c.4"), "Invalid IP address string.");
247  REQUIRE_THROWS_WITH(
248  IPAddress("1.2.3.d"), "Invalid IP address string.");
249  REQUIRE_THROWS_WITH(
250  IPAddress("192.168.32.128.443"), "Invalid IP address string.");
251  REQUIRE_THROWS_WITH(
252  IPAddress("192.168.128:443"), "Invalid IP address string.");
253  REQUIRE_THROWS_WITH(
254  IPAddress("192:168:32:128:443"), "Invalid IP address string.");
255  REQUIRE_THROWS_WITH(
256  IPAddress("192.1b8.32.128:443"), "Invalid IP address string.");
257  }
258  SECTION("And ensures address and port are within range.")
259  {
260  // Errors
261  // The following 2 tests had to be removed because they do not work on
262  // systems that use 16 bit integers.
263  // REQUIRE_THROWS_AS(IPAddress("1.2.3.4:-1"), std::out_of_range);
264  // REQUIRE_THROWS_AS(IPAddress("1.2.3.4:65536"), std::out_of_range);
265  REQUIRE_THROWS_AS(IPAddress("256.2.3.4"), std::out_of_range);
266  REQUIRE_THROWS_AS(IPAddress("1.256.3.4"), std::out_of_range);
267  REQUIRE_THROWS_AS(IPAddress("1.2.256.4"), std::out_of_range);
268  REQUIRE_THROWS_AS(IPAddress("1.2.3.256"), std::out_of_range);
269  // Check error string.
270  REQUIRE_THROWS_WITH(
271  IPAddress("256.2.3.4"),
272  "Address octet (256) is outside of the allowed range (0 - 255).");
273  REQUIRE_THROWS_WITH(
274  IPAddress("1.256.3.4"),
275  "Address octet (256) is outside of the allowed range (0 - 255).");
276  REQUIRE_THROWS_WITH(
277  IPAddress("1.2.256.4"),
278  "Address octet (256) is outside of the allowed range (0 - 255).");
279  REQUIRE_THROWS_WITH(
280  IPAddress("1.2.3.256"),
281  "Address octet (256) is outside of the allowed range (0 - 255).");
282  }
283 }
284 
285 
286 TEST_CASE("IPAddress's are copyable.", "[IPAddress]")
287 {
288  IPAddress address_a(0x00000000, 0);
289  IPAddress address_b(0xFFFFFFFF, 65535);
290  IPAddress address_a_copy = address_a;
291  IPAddress address_b_copy(address_b);
292  REQUIRE(&address_a != &address_a_copy);
293  REQUIRE(address_a == address_a_copy);
294  REQUIRE(&address_b != &address_b_copy);
295  REQUIRE(address_b == address_b_copy);
296 }
297 
298 
299 TEST_CASE("The port of an IP address can be changed during a copy.",
300  "[IPAddress]")
301 {
302  IPAddress address_a(0x00000000, 0);
303  IPAddress address_b(0xFFFFFFFF, 65535);
304  IPAddress address_a_copy(address_a, 65535);
305  IPAddress address_b_copy(address_b, 0);
306  REQUIRE(&address_a != &address_a_copy);
307  REQUIRE(address_a.address() == address_a_copy.address());
308  REQUIRE(address_a.port() == 0);
309  REQUIRE(address_a_copy.port() == 65535);
310  REQUIRE(&address_b != &address_b_copy);
311  REQUIRE(address_b.address() == address_b_copy.address());
312  REQUIRE(address_b.port() == 65535);
313  REQUIRE(address_b_copy.port() == 0);
314  SECTION("And ensures port number is within range.")
315  {
316  REQUIRE_THROWS_AS(
317  IPAddress(address_a, static_cast<unsigned int>(-1)),
318  std::out_of_range);
319  REQUIRE_THROWS_AS(
320  IPAddress(address_b, static_cast<unsigned int>(-1)),
321  std::out_of_range);
322  REQUIRE_THROWS_AS(IPAddress(address_a, 65536), std::out_of_range);
323  REQUIRE_THROWS_AS(IPAddress(address_b, 65536), std::out_of_range);
324  }
325 }
326 
327 
328 TEST_CASE("IPAddress's are movable.", "[IPAddress]")
329 {
330  IPAddress address_a(0x00000000, 0);
331  IPAddress address_b(0xFFFFFFFF, 65535);
332  IPAddress address_a_moved = std::move(address_a);
333  IPAddress address_b_moved(std::move(address_b));
334  REQUIRE(address_a_moved == IPAddress(0x00000000, 0));
335  REQUIRE(address_b_moved == IPAddress(0xFFFFFFFF, 65535));
336 }
337 
338 
339 TEST_CASE("IPAddress's are assignable.", "[IPAddress]")
340 {
341  IPAddress address_a(0x00000000, 0);
342  IPAddress address_b(0xFFFFFFFF, 65535);
343  REQUIRE(address_a == IPAddress(0x00000000, 0));
345  REQUIRE(address_a == IPAddress(0xFFFFFFFF, 65535));
346 }
347 
348 
349 TEST_CASE("IPAddress's are assignable (by move semantics).", "[IPAddress]")
350 {
351  IPAddress address_a(0x00000000, 0);
352  IPAddress address_b(0xFFFFFFFF, 65535);
353  REQUIRE(address_a == IPAddress(0x00000000, 0));
354  address_a = std::move(address_b);
355  REQUIRE(address_a == IPAddress(0xFFFFFFFF, 65535));
356 }
357 
358 
359 TEST_CASE("IPAddress's are printable", "[IPAddress]")
360 {
361  SECTION("Without a port number.")
362  {
363  REQUIRE(str(IPAddress("192.168.32.128")) == "192.168.32.128");
364  }
365  SECTION("With a port number.")
366  {
367  REQUIRE(str(IPAddress("192.168.32.128:443")) == "192.168.32.128:443");
368  }
369 }
370 
371 
372 TEST_CASE("dnslookup finds IPAddress's by domain name.", "[IPAddress]")
373 {
374  SECTION("When they are available.")
375  {
376  REQUIRE(dnslookup("localhost") == IPAddress("127.0.0.1"));
377  }
378  SECTION("And throws DNSLookupError otherwise.")
379  {
380  REQUIRE_THROWS_AS(dnslookup("abc.efg"), DNSLookupError);
381  }
382 }
std::string str(const T &object)
Definition: utility.hpp:128
unsigned int port() const
Definition: IPAddress.cpp:215
TEST_CASE("IPAddress's store an address and a port number.", "[IPAddress]")
address_a
IPAddress address_b(0xFFFFFFFF, 65535)
unsigned long address() const
Definition: IPAddress.cpp:205
IPAddress dnslookup(const std::string &url)
Definition: IPAddress.cpp:371