4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
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
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.
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.
19 // The Original Code is Fraunhofer FOKUS code.
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.
26 // Stefan Bund <g0dil@berlios.de>
29 \brief INetAddressing unit tests */
31 //#include "INetAddressing.test.hh"
32 //#include "INetAddressing.test.ih"
35 #include "INetAddressing.hh"
36 #include <senf/Utils/String.hh>
37 #include <senf/Socket/Protocols/AddressExceptions.hh>
39 #include <senf/Utils/auto_unit_test.hh>
40 #include <boost/test/test_tools.hpp>
43 //-/////////////////////////////////////////////////////////////////////////////////////////////////
45 SENF_AUTO_UNIT_TEST(inet4SocketAddress)
47 using senf::INet4SocketAddress;
48 using senf::INet4Address;
49 using senf::AddressSyntaxException;
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") );
58 INet4SocketAddress addr1("127.0.0.1:12345");
59 INet4SocketAddress addr3(INet4Address::Loopback,12345);
62 BOOST_CHECK_EQUAL( INet4SocketAddress("127.0.0.1:12345"),
63 INet4SocketAddress(INet4Address::Loopback,12345) );
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 );
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" );
76 INet4SocketAddress addr("127.0.0.1:12345");
77 BOOST_CHECK_EQUAL( reinterpret_cast< ::sockaddr_in * >(addr.sockaddr_p())->sin_port,
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) );
84 std::stringstream str;
86 BOOST_CHECK( str.fail());
89 std::stringstream str ("foo:bar");
91 BOOST_CHECK( str.fail());
94 std::stringstream str;
96 BOOST_CHECK_EQUAL( str.str(), "127.0.0.1:12345" );
98 BOOST_CHECK( ! str.fail());
99 BOOST_CHECK_EQUAL(addr, INet4SocketAddress("127.0.0.1:12345"));
103 SENF_AUTO_UNIT_TEST(inet6SocketAddress)
105 using senf::INet6Address;
106 using senf::INet6SocketAddress;
107 using senf::AddressSyntaxException;
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") );
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 );
130 std::stringstream str;
132 BOOST_CHECK( str.fail());
135 std::stringstream str ("[::1]");
137 BOOST_CHECK( str.fail());
140 std::stringstream str;
142 BOOST_CHECK_EQUAL( str.str(), "[::ffff:1.2.3.4]:12345");
144 BOOST_CHECK( ! str.fail());
145 BOOST_CHECK_EQUAL(addr, INet6SocketAddress("[::ffff:1.2.3.4]:12345"));
150 INet6SocketAddress addr (INet6Address::from_string("::1"), 1);
151 BOOST_CHECK_EQUAL( addr, INet6SocketAddress("[::1]:1") );
152 BOOST_CHECK_EQUAL( addr.iface(), "" );
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" );
162 BOOST_CHECK_EQUAL( addr.iface(), "" );
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 );
181 //-/////////////////////////////////////////////////////////////////////////////////////////////////
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