Socket/Protocols/INet: Updated INet4SocketAddress to use INet4Address
[senf.git] / Socket / Protocols / INet / INetAddressing.test.cc
1 // $Id$
2 //
3 // Copyright (C) 2006
4 // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
5 // Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
6 //     Stefan Bund <stefan.bund@fokus.fraunhofer.de>
7 //
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 2 of the License, or
11 // (at your option) any later version.
12 //
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 // GNU General Public License for more details.
17 //
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the
20 // Free Software Foundation, Inc.,
21 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22
23 // Unit tests
24
25 //#include "INetAddressing.test.hh"
26 //#include "INetAddressing.test.ih"
27
28 // Custom includes
29 #include "INetAddressing.hh"
30
31 #include <boost/test/auto_unit_test.hpp>
32 #include <boost/test/test_tools.hpp>
33
34 #define prefix_
35 ///////////////////////////////cc.p////////////////////////////////////////
36
37 BOOST_AUTO_UNIT_TEST(inet4Address)
38 {
39     using senf::INet4SocketAddress;
40     using senf::INet4Address;
41
42     {
43         INet4SocketAddress addr;
44         
45         BOOST_CHECK( ! addr );
46
47         addr = INet4SocketAddress("127.0.0.1:12345");
48         BOOST_CHECK ( addr != INet4SocketAddress() );
49     }
50
51     {
52         INet4SocketAddress addr1("127.0.0.1:12345");
53         INet4SocketAddress addr3(INet4Address::Loopback,12345);
54     }
55
56     BOOST_CHECK_EQUAL( INet4SocketAddress("127.0.0.1:12345"), 
57                        INet4SocketAddress(INet4Address::Loopback,12345) );
58
59     BOOST_CHECK_THROW( INet4SocketAddress("127.0.0.1"), INet4SocketAddress::SyntaxException );
60     BOOST_CHECK_THROW( INet4SocketAddress("foo@bar:12345"), INet4Address::SyntaxException );
61     BOOST_CHECK_THROW( INet4SocketAddress("127.0.0.1:1234a"), INet4SocketAddress::SyntaxException );
62
63     BOOST_CHECK_EQUAL( INet4SocketAddress("127.0.0.1:12345").address(), INet4Address::Loopback );
64     BOOST_CHECK_EQUAL( INet4SocketAddress("127.0.0.1:12345").port(), 12345u );
65     BOOST_CHECK_EQUAL( boost::lexical_cast<std::string>(INet4SocketAddress("127.0.0.1:12345")),
66                        "127.0.0.1:12345" );
67
68     {
69         INet4SocketAddress addr("127.0.0.1:12345");
70         BOOST_CHECK_EQUAL( reinterpret_cast< ::sockaddr_in * >(addr.sockaddr_p())->sin_port,
71                            htons(12345) );
72         BOOST_CHECK_EQUAL( reinterpret_cast< ::sockaddr_in * >(addr.sockaddr_p())->sin_addr.s_addr,
73                            htonl(INADDR_LOOPBACK) );
74
75         std::stringstream s;
76         s << addr;
77         BOOST_CHECK_EQUAL( s.str(), "127.0.0.1:12345" );
78     }
79 }
80
81 BOOST_AUTO_UNIT_TEST(inet6Address)
82 {
83     using senf::INet6Address;
84     using senf::INet6SocketAddress;
85
86     {
87         INet6Address addr1 ("0102:0304:0506:0708:090A:0B0C:0D0E:0F00");
88         BOOST_CHECK_EQUAL( addr1.addr().s6_addr[0], 1 );
89         BOOST_CHECK_EQUAL( addr1.addr().s6_addr[1], 2 );
90         BOOST_CHECK_EQUAL( addr1.addr().s6_addr[2], 3 );
91         BOOST_CHECK_EQUAL( addr1.addr().s6_addr[3], 4 );
92         BOOST_CHECK_EQUAL( addr1.addr().s6_addr[4], 5 );
93         BOOST_CHECK_EQUAL( addr1.addr().s6_addr[5], 6 );
94         BOOST_CHECK_EQUAL( addr1.addr().s6_addr[6], 7 );
95         BOOST_CHECK_EQUAL( addr1.addr().s6_addr[7], 8 );
96         BOOST_CHECK_EQUAL( addr1.addr().s6_addr[8], 9 );
97         BOOST_CHECK_EQUAL( addr1.addr().s6_addr[9], 10 );
98         BOOST_CHECK_EQUAL( addr1.addr().s6_addr[10], 11 );
99         BOOST_CHECK_EQUAL( addr1.addr().s6_addr[11], 12 );
100         BOOST_CHECK_EQUAL( addr1.addr().s6_addr[12], 13 );
101         BOOST_CHECK_EQUAL( addr1.addr().s6_addr[13], 14 );
102         BOOST_CHECK_EQUAL( addr1.addr().s6_addr[14], 15 );
103         BOOST_CHECK_EQUAL( addr1.addr().s6_addr[15], 0 );
104         INet6Address addr2;
105         BOOST_CHECK_EQUAL( addr2, "::" );
106         addr2 = "::1";
107         BOOST_CHECK( addr1 != addr2 );
108         addr1 ="::1";
109         BOOST_CHECK_EQUAL( addr1, addr2 );
110         BOOST_CHECK_EQUAL( addr1.address(),"::1" );
111         addr1.clear();
112         addr2 = "::";
113         BOOST_CHECK_EQUAL( addr1, addr2 );
114         BOOST_CHECK_THROW( addr1 = "", INet6Address::SyntaxException );
115         BOOST_CHECK_EQUAL( boost::lexical_cast<std::string>(addr1), "::" );
116         unsigned char data[] = { 0x12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x21, 0 };
117         INet6Address addr3 (std::make_pair(&data[0],&data[0]+sizeof(data)-1));
118         BOOST_CHECK_EQUAL( addr3, "1200::21" );
119         BOOST_CHECK_THROW( INet6Address(std::make_pair(&data[0],&data[0]+sizeof(data))),
120                            INet6Address::SyntaxException );
121         BOOST_CHECK_THROW( INet6Address(std::make_pair(&data[0],&data[0]+sizeof(data)-2)),
122                            INet6Address::SyntaxException );
123     }
124
125     {
126         INet6SocketAddress addr;
127         BOOST_CHECK_EQUAL( addr.host(), "::" );
128         BOOST_CHECK_EQUAL( addr.port(), 0u );
129         BOOST_CHECK_EQUAL( addr.iface(), "" );
130         addr = "[12::21]:12345";
131         BOOST_CHECK_EQUAL( addr.host(), "12::21" );
132         BOOST_CHECK_EQUAL( addr.port(), 12345u );
133         BOOST_CHECK_EQUAL( addr.iface(), "" );
134         BOOST_CHECK_EQUAL( addr, INet6SocketAddress("[12::21]:12345") );
135     }
136
137     {
138         INet6SocketAddress addr ("::1", 1);
139         BOOST_CHECK_EQUAL( addr, "[::1]:1" );
140         BOOST_CHECK_EQUAL( addr.iface(), "" );
141     }
142
143     {
144         INet6SocketAddress addr ("::1", 1, "lo");
145         BOOST_CHECK_EQUAL( addr, "[::1@lo]:1" );
146         BOOST_CHECK_EQUAL( addr.iface(), "lo" );
147         addr.iface("");
148         BOOST_CHECK_EQUAL( addr.iface(), "" );
149         addr.port(100u);
150         BOOST_CHECK_EQUAL( addr.port(), 100u );
151         addr.host("::2");
152         BOOST_CHECK_EQUAL( addr.host(), "::2" );
153         BOOST_CHECK_THROW( addr = "", INet6SocketAddress::SyntaxException );
154         BOOST_CHECK_THROW( addr = "[::1]", INet6SocketAddress::SyntaxException );
155         BOOST_CHECK_THROW( addr = "[::1]1234", INet6SocketAddress::SyntaxException );
156         addr = "[12::21@lo]:12345";
157         BOOST_CHECK_EQUAL( addr.address(), "[12::21@lo]:12345" );
158         BOOST_CHECK_EQUAL( addr.host(), "12::21" );
159         BOOST_CHECK_EQUAL( addr.port(), 12345u );
160         BOOST_CHECK_EQUAL( addr.iface(), "lo" );
161         BOOST_CHECK_EQUAL( boost::lexical_cast<std::string>(addr), "[12::21@lo]:12345" );
162     }
163 }
164
165 ///////////////////////////////cc.e////////////////////////////////////////
166 #undef prefix_
167
168 \f
169 // Local Variables:
170 // mode: c++
171 // fill-column: 100
172 // c-file-style: "senf"
173 // indent-tabs-mode: nil
174 // ispell-local-dictionary: "american"
175 // compile-command: "scons -u test"
176 // comment-column: 40
177 // End: