switch to new MPL based Fraunhofer FOKUS Public License
[senf.git] / senf / Socket / Protocols / INet / INetAddressing.test.cc
1 // $Id$
2 //
3 // Copyright (C) 2006
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 //
6 // The contents of this file are subject to the Fraunhofer FOKUS Public License
7 // Version 1.0 (the "License"); you may not use this file except in compliance
8 // with the License. You may obtain a copy of the License at 
9 // http://senf.berlios.de/license.html
10 //
11 // The Fraunhofer FOKUS Public License Version 1.0 is based on, 
12 // but modifies the Mozilla Public License Version 1.1.
13 // See the full license text for the amendments.
14 //
15 // Software distributed under the License is distributed on an "AS IS" basis, 
16 // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 
17 // for the specific language governing rights and limitations under the License.
18 //
19 // The Original Code is Fraunhofer FOKUS code.
20 //
21 // The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V. 
22 // (registered association), Hansastraße 27 c, 80686 Munich, Germany.
23 // All Rights Reserved.
24 //
25 // Contributor(s):
26 //   Stefan Bund <g0dil@berlios.de>
27
28 /** \file
29     \brief INetAddressing unit tests */
30
31 //#include "INetAddressing.test.hh"
32 //#include "INetAddressing.test.ih"
33
34 // Custom includes
35 #include "INetAddressing.hh"
36 #include <senf/Utils/String.hh>
37 #include <senf/Socket/Protocols/AddressExceptions.hh>
38
39 #include <senf/Utils/auto_unit_test.hh>
40 #include <boost/test/test_tools.hpp>
41
42 #define prefix_
43 //-/////////////////////////////////////////////////////////////////////////////////////////////////
44
45 SENF_AUTO_UNIT_TEST(inet4SocketAddress)
46 {
47     using senf::INet4SocketAddress;
48     using senf::INet4Address;
49     using senf::AddressSyntaxException;
50
51     {
52         INet4SocketAddress addr;
53         BOOST_CHECK( ! addr );
54         addr = INet4SocketAddress("127.0.0.1:12345");
55         BOOST_CHECK ( addr != INet4SocketAddress("127.0.0.2:12345") );
56     }
57     {
58         INet4SocketAddress addr1("127.0.0.1:12345");
59         INet4SocketAddress addr3(INet4Address::Loopback,12345);
60     }
61
62     BOOST_CHECK_EQUAL( INet4SocketAddress("127.0.0.1:12345"),
63                        INet4SocketAddress(INet4Address::Loopback,12345) );
64
65     BOOST_CHECK_THROW( INet4SocketAddress("127.0.0.1"), AddressSyntaxException );
66     BOOST_CHECK_THROW( INet4SocketAddress("foo:bar"), AddressSyntaxException );
67     BOOST_CHECK_THROW( INet4SocketAddress(":12345"), AddressSyntaxException );
68     BOOST_CHECK_THROW( INet4SocketAddress("127.0.0.1:1234a"), AddressSyntaxException );
69
70     BOOST_CHECK_EQUAL( INet4SocketAddress(12345).port(), 12345u );
71     BOOST_CHECK_EQUAL( INet4SocketAddress(12345).address(), INet4Address::None );
72     BOOST_CHECK_EQUAL( INet4SocketAddress("127.0.0.1:12345").address(), INet4Address::Loopback );
73     BOOST_CHECK_EQUAL( INet4SocketAddress("127.0.0.1:12345").port(), 12345u );
74     BOOST_CHECK_EQUAL( senf::str(INet4SocketAddress("127.0.0.1:12345")), "127.0.0.1:12345" );
75
76     INet4SocketAddress addr("127.0.0.1:12345");
77     BOOST_CHECK_EQUAL( reinterpret_cast< ::sockaddr_in * >(addr.sockaddr_p())->sin_port,
78             htons(12345) );
79     BOOST_CHECK_EQUAL( reinterpret_cast< ::sockaddr_in * >(addr.sockaddr_p())->sin_addr.s_addr,
80             htonl(INADDR_LOOPBACK) );
81     BOOST_CHECK_EQUAL( addr, INet4SocketAddress(addr) );
82
83     {
84         std::stringstream str;
85         str >> addr;
86         BOOST_CHECK( str.fail());
87     }
88     {
89         std::stringstream str ("foo:bar");
90         str >> addr;
91         BOOST_CHECK( str.fail());
92     }
93     {
94         std::stringstream str;
95         str << addr;
96         BOOST_CHECK_EQUAL( str.str(), "127.0.0.1:12345" );
97         str >> addr;
98         BOOST_CHECK( ! str.fail());
99         BOOST_CHECK_EQUAL(addr, INet4SocketAddress("127.0.0.1:12345"));
100     }
101 }
102
103 SENF_AUTO_UNIT_TEST(inet6SocketAddress)
104 {
105     using senf::INet6Address;
106     using senf::INet6SocketAddress;
107     using senf::AddressSyntaxException;
108
109     {
110         INet6SocketAddress addr;
111         BOOST_CHECK( ! addr );
112         BOOST_CHECK_EQUAL( senf::str(addr.address()), "::" );
113         BOOST_CHECK_EQUAL( addr.port(), 0u );
114         BOOST_CHECK_EQUAL( addr.iface(), "" );
115         addr = INet6SocketAddress("[12::21]:12345");
116         BOOST_CHECK( addr == INet6SocketAddress("[12::21]:12345") );
117         BOOST_CHECK_EQUAL( addr, INet6SocketAddress(addr) );
118         SENF_CHECK_NOT_EQUAL( addr, INet6SocketAddress("[12::21%lo]:12345") );
119         BOOST_CHECK( addr );
120         BOOST_CHECK_EQUAL( addr.address(), INet6Address::from_string("12::21") );
121         BOOST_CHECK_EQUAL( addr.port(), 12345u );
122         BOOST_CHECK_EQUAL( addr.iface(), "" );
123         BOOST_CHECK_EQUAL( addr, INet6SocketAddress("[12::21]:12345") );
124         SENF_CHECK_NO_THROW( INet6SocketAddress("www.go6.net:80") );
125         addr = INet6SocketAddress("1.2.3.4:12345", INet6Address::ResolveINet4);
126         BOOST_CHECK_EQUAL( addr.address(), INet6Address::from_string("::ffff:1.2.3.4") );
127         BOOST_CHECK_EQUAL( addr.port(), 12345u );
128
129         {
130             std::stringstream str;
131             str >> addr;
132             BOOST_CHECK( str.fail());
133         }
134         {
135             std::stringstream str ("[::1]");
136             str >> addr;
137             BOOST_CHECK( str.fail());
138         }
139         {
140             std::stringstream str;
141             str << addr;
142             BOOST_CHECK_EQUAL( str.str(), "[::ffff:1.2.3.4]:12345");
143             str >> addr;
144             BOOST_CHECK( ! str.fail());
145             BOOST_CHECK_EQUAL(addr, INet6SocketAddress("[::ffff:1.2.3.4]:12345"));
146         }
147     }
148
149     {
150         INet6SocketAddress addr (INet6Address::from_string("::1"), 1);
151         BOOST_CHECK_EQUAL( addr, INet6SocketAddress("[::1]:1") );
152         BOOST_CHECK_EQUAL( addr.iface(), "" );
153     }
154
155     {
156         BOOST_CHECK_THROW( INet6SocketAddress(INet6Address::Loopback, 1, "invalid_iface"),
157                 AddressSyntaxException );
158         INet6SocketAddress addr (INet6Address::Loopback, 1, "lo");
159         BOOST_CHECK_EQUAL( addr, INet6SocketAddress("[::1%lo]:1") );
160         BOOST_CHECK_EQUAL( addr.iface(), "lo" );
161         addr.iface("");
162         BOOST_CHECK_EQUAL( addr.iface(), "" );
163         addr.port(100u);
164         BOOST_CHECK_EQUAL( addr.port(), 100u );
165         addr.address(INet6Address::from_string("::2"));
166         BOOST_CHECK_EQUAL( addr.address(), INet6Address::from_string("::2") );
167         BOOST_CHECK_THROW( INet6SocketAddress(""), AddressSyntaxException );
168         BOOST_CHECK_THROW( INet6SocketAddress("[::1]"), AddressSyntaxException );
169         BOOST_CHECK_THROW( INet6SocketAddress("[::1]1234"), AddressSyntaxException );
170         addr = INet6SocketAddress("[12::21%lo]:12345");
171         BOOST_CHECK_EQUAL( senf::str(addr), "[12::21%lo]:12345" );
172         BOOST_CHECK_EQUAL( addr.address(), INet6Address::from_string("12::21") );
173         BOOST_CHECK_EQUAL( addr.port(), 12345u );
174         BOOST_CHECK_EQUAL( addr.iface(), "lo" );
175         BOOST_CHECK_EQUAL( senf::str(addr), "[12::21%lo]:12345" );
176         BOOST_CHECK_EQUAL( INet6SocketAddress(12345).port(), 12345 );
177         BOOST_CHECK_EQUAL( INet6SocketAddress(12345).address(), INet6Address::None );
178     }
179 }
180
181 //-/////////////////////////////////////////////////////////////////////////////////////////////////
182 #undef prefix_
183
184 \f
185 // Local Variables:
186 // mode: c++
187 // fill-column: 100
188 // c-file-style: "senf"
189 // indent-tabs-mode: nil
190 // ispell-local-dictionary: "american"
191 // compile-command: "scons -u test"
192 // comment-column: 40
193 // End: