Line data Source code
1 : // Copyright (c) 2011-2022 Made to Order Software Corp. All Rights Reserved
2 : //
3 : // https://snapwebsites.org/project/libaddr
4 : // contact@m2osw.com
5 : //
6 : // Permission is hereby granted, free of charge, to any
7 : // person obtaining a copy of this software and
8 : // associated documentation files (the "Software"), to
9 : // deal in the Software without restriction, including
10 : // without limitation the rights to use, copy, modify,
11 : // merge, publish, distribute, sublicense, and/or sell
12 : // copies of the Software, and to permit persons to whom
13 : // the Software is furnished to do so, subject to the
14 : // following conditions:
15 : //
16 : // The above copyright notice and this permission notice
17 : // shall be included in all copies or substantial
18 : // portions of the Software.
19 : //
20 : // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
21 : // ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
22 : // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
23 : // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
24 : // EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 : // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
26 : // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
27 : // ARISING FROM, OUT OF OR IN CONNECTION WITH THE
28 : // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29 : // SOFTWARE.
30 :
31 :
32 : /** \file
33 : * \brief Verify the interfaces function.
34 : *
35 : * This file implements a test that verifies the function that
36 : * reads the list of IP addresses as defined in your local
37 : * interfaces.
38 : */
39 :
40 : // self
41 : //
42 : #include "catch_main.h"
43 :
44 :
45 : // addr lib
46 : //
47 : #include <libaddr/iface.h>
48 :
49 :
50 : // C lib
51 : //
52 : #include <net/if.h>
53 :
54 :
55 : // last include
56 : //
57 : #include <snapdev/poison.h>
58 :
59 :
60 :
61 3 : CATCH_TEST_CASE( "ipv4::interfaces", "[ipv4]" )
62 : {
63 2 : CATCH_GIVEN("iface::get_local_addresses()")
64 : {
65 2 : addr::iface::vector_t list(addr::iface::get_local_addresses());
66 :
67 2 : CATCH_SECTION("verify list")
68 : {
69 1 : CATCH_REQUIRE_FALSE(list.empty()); // at least "lo"
70 :
71 : // add stuff like verify there is an "lo" entry?
72 15 : for(auto i : list)
73 : {
74 14 : CATCH_REQUIRE_FALSE(i.get_name().empty());
75 14 : CATCH_REQUIRE(i.get_flags() != 0);
76 :
77 14 : switch(i.get_address().get_network_type())
78 : {
79 14 : case addr::addr::network_type_t::NETWORK_TYPE_PRIVATE:
80 : case addr::addr::network_type_t::NETWORK_TYPE_PUBLIC:
81 : case addr::addr::network_type_t::NETWORK_TYPE_LOOPBACK:
82 : case addr::addr::network_type_t::NETWORK_TYPE_LINK_LOCAL:
83 14 : break;
84 :
85 0 : default:
86 0 : std::cerr << "unexpected interface type " << static_cast<int>(i.get_address().get_network_type()) << "\n";
87 0 : CATCH_REQUIRE(i.get_address().get_network_type() == addr::addr::network_type_t::NETWORK_TYPE_PUBLIC);
88 0 : break;
89 :
90 : }
91 :
92 14 : CATCH_REQUIRE(i.has_broadcast_address() == ((i.get_flags() & IFF_BROADCAST) != 0));
93 14 : CATCH_REQUIRE(i.has_destination_address() == ((i.get_flags() & IFF_POINTOPOINT) != 0));
94 :
95 14 : addr::addr const & b(i.get_broadcast_address());
96 14 : if(!i.has_broadcast_address())
97 : {
98 2 : CATCH_REQUIRE(b.is_default());
99 : }
100 :
101 14 : addr::addr const & d(i.get_destination_address());
102 14 : if(!i.has_destination_address())
103 : {
104 14 : CATCH_REQUIRE(d.is_default());
105 : }
106 : }
107 : }
108 : }
109 7 : }
110 :
111 :
112 : // vim: ts=4 sw=4 et
|