1 | // |
2 | // SocketAddressTest.cpp |
3 | // |
4 | // Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH. |
5 | // and Contributors. |
6 | // |
7 | // SPDX-License-Identifier: BSL-1.0 |
8 | // |
9 | |
10 | |
11 | #include "SocketAddressTest.h" |
12 | #include "Poco/CppUnit/TestCaller.h" |
13 | #include "Poco/CppUnit/TestSuite.h" |
14 | #include "Poco/Net/SocketAddress.h" |
15 | #include "Poco/Net/NetException.h" |
16 | |
17 | |
18 | using Poco::Net::SocketAddress; |
19 | using Poco::Net::IPAddress; |
20 | using Poco::Net::InvalidAddressException; |
21 | using Poco::Net::HostNotFoundException; |
22 | using Poco::Net::ServiceNotFoundException; |
23 | using Poco::Net::NoAddressFoundException; |
24 | using Poco::Net::AddressFamilyMismatchException; |
25 | using Poco::InvalidArgumentException; |
26 | |
27 | |
28 | SocketAddressTest::SocketAddressTest(const std::string& name): CppUnit::TestCase(name) |
29 | { |
30 | } |
31 | |
32 | |
33 | SocketAddressTest::~SocketAddressTest() |
34 | { |
35 | } |
36 | |
37 | |
38 | void SocketAddressTest::testSocketAddress() |
39 | { |
40 | SocketAddress wild; |
41 | assertTrue (wild.host().isWildcard()); |
42 | assertTrue (wild.port() == 0); |
43 | |
44 | SocketAddress sa1("192.168.1.100" , 100); |
45 | assertTrue (sa1.af() == AF_INET); |
46 | assertTrue (sa1.family() == SocketAddress::IPv4); |
47 | assertTrue (sa1.host().toString() == "192.168.1.100" ); |
48 | assertTrue (sa1.port() == 100); |
49 | assertTrue (sa1.toString() == "192.168.1.100:100" ); |
50 | |
51 | SocketAddress sa2("192.168.1.100" , "100" ); |
52 | assertTrue (sa2.host().toString() == "192.168.1.100" ); |
53 | assertTrue (sa2.port() == 100); |
54 | |
55 | #if !defined(_WIN32_WCE) |
56 | SocketAddress sa3("192.168.1.100" , "ftp" ); |
57 | assertTrue (sa3.host().toString() == "192.168.1.100" ); |
58 | assertTrue (sa3.port() == 21); |
59 | #endif |
60 | |
61 | try |
62 | { |
63 | SocketAddress sa3("192.168.1.100" , "f00bar" ); |
64 | fail("bad service name - must throw" ); |
65 | } |
66 | catch (ServiceNotFoundException&) |
67 | { |
68 | } |
69 | |
70 | SocketAddress sa4("pocoproject.org" , 80); |
71 | assertTrue (sa4.host().toString() == "104.130.199.50" ); |
72 | assertTrue (sa4.port() == 80); |
73 | |
74 | try |
75 | { |
76 | SocketAddress sa5("192.168.2.260" , 80); |
77 | fail("invalid address - must throw" ); |
78 | } |
79 | catch (HostNotFoundException&) |
80 | { |
81 | } |
82 | catch (NoAddressFoundException&) |
83 | { |
84 | } |
85 | |
86 | try |
87 | { |
88 | SocketAddress sa6("192.168.2.120" , "80000" ); |
89 | fail("invalid port - must throw" ); |
90 | } |
91 | catch (ServiceNotFoundException&) |
92 | { |
93 | } |
94 | |
95 | SocketAddress sa7("192.168.2.120:88" ); |
96 | assertTrue (sa7.host().toString() == "192.168.2.120" ); |
97 | assertTrue (sa7.port() == 88); |
98 | |
99 | SocketAddress sa8("[192.168.2.120]:88" ); |
100 | assertTrue (sa8.host().toString() == "192.168.2.120" ); |
101 | assertTrue (sa8.port() == 88); |
102 | |
103 | try |
104 | { |
105 | SocketAddress sa9("[192.168.2.260]" ); |
106 | fail("invalid address - must throw" ); |
107 | } |
108 | catch (InvalidArgumentException&) |
109 | { |
110 | } |
111 | |
112 | try |
113 | { |
114 | SocketAddress sa9("[192.168.2.260:88" ); |
115 | fail("invalid address - must throw" ); |
116 | } |
117 | catch (InvalidArgumentException&) |
118 | { |
119 | } |
120 | |
121 | SocketAddress sa10("www6.pocoproject.org" , 80); |
122 | assertTrue (sa10.host().toString() == "104.130.199.50" || sa10.host().toString() == "[2001:4801:7828:101:be76:4eff:fe10:1455]" ); |
123 | |
124 | SocketAddress sa11(SocketAddress::IPv4, "www6.pocoproject.org" , 80); |
125 | assertTrue (sa11.host().toString() == "104.130.199.50" ); |
126 | |
127 | #ifdef POCO_HAVE_IPv6 |
128 | try |
129 | { |
130 | SocketAddress sa12(SocketAddress::IPv6, "www6.pocoproject.org" , 80); |
131 | assertTrue (sa12.host().toString() == "2001:4801:7828:101:be76:4eff:fe10:1455" ); |
132 | } |
133 | catch (AddressFamilyMismatchException&) |
134 | { |
135 | // may happen if no IPv6 address is configured on the system |
136 | } |
137 | #endif |
138 | } |
139 | |
140 | |
141 | void SocketAddressTest::testSocketRelationals() |
142 | { |
143 | SocketAddress sa1("192.168.1.100" , 100); |
144 | SocketAddress sa2("192.168.1.100:100" ); |
145 | assertTrue (sa1 == sa2); |
146 | |
147 | SocketAddress sa3("192.168.1.101" , "99" ); |
148 | assertTrue (sa2 < sa3); |
149 | |
150 | SocketAddress sa4("192.168.1.101" , "102" ); |
151 | assertTrue (sa3 < sa4); |
152 | } |
153 | |
154 | |
155 | void SocketAddressTest::testSocketAddress6() |
156 | { |
157 | #ifdef POCO_HAVE_IPv6 |
158 | SocketAddress sa1("FE80::E6CE:8FFF:FE4A:EDD0" , 100); |
159 | assertTrue (sa1.af() == AF_INET6); |
160 | assertTrue (sa1.family() == SocketAddress::IPv6); |
161 | assertTrue (sa1.host().toString() == "fe80::e6ce:8fff:fe4a:edd0" ); |
162 | assertTrue (sa1.port() == 100); |
163 | assertTrue (sa1.toString() == "[fe80::e6ce:8fff:fe4a:edd0]:100" ); |
164 | |
165 | SocketAddress sa2("[FE80::E6CE:8FFF:FE4A:EDD0]:100" ); |
166 | assertTrue (sa2.af() == AF_INET6); |
167 | assertTrue (sa2.family() == SocketAddress::IPv6); |
168 | assertTrue (sa2.host().toString() == "fe80::e6ce:8fff:fe4a:edd0" ); |
169 | assertTrue (sa2.port() == 100); |
170 | assertTrue (sa2.toString() == "[fe80::e6ce:8fff:fe4a:edd0]:100" ); |
171 | #endif |
172 | } |
173 | |
174 | |
175 | void SocketAddressTest::testSocketAddressUnixLocal() |
176 | { |
177 | #ifdef POCO_OS_FAMILY_UNIX |
178 | SocketAddress sa1(SocketAddress::UNIX_LOCAL, "/tmp/sock1" ); |
179 | assertTrue (sa1.af() == AF_UNIX); |
180 | assertTrue (sa1.family() == SocketAddress::UNIX_LOCAL); |
181 | assertTrue (sa1.toString() == "/tmp/sock1" ); |
182 | |
183 | SocketAddress sa2(SocketAddress::UNIX_LOCAL, "/tmp/sock2" ); |
184 | assertTrue (sa1 != sa2); |
185 | assertTrue (sa1 < sa2); |
186 | |
187 | SocketAddress sa3(SocketAddress::UNIX_LOCAL, "/tmp/sock1" ); |
188 | assertTrue (sa1 == sa3); |
189 | assertTrue (!(sa1 < sa3)); |
190 | |
191 | SocketAddress sa4("/tmp/sock1" ); |
192 | assertTrue (sa1 == sa4); |
193 | assertTrue (sa4.toString() == "/tmp/sock1" ); |
194 | #endif |
195 | } |
196 | |
197 | |
198 | void SocketAddressTest::testSocketAddressLinuxAbstract() |
199 | { |
200 | #if POCO_OS == POCO_OS_LINUX || POCO_OS == POCO_OS_ANDROID |
201 | std::string path("sock1.pocoproject.org" ); |
202 | path.insert(0, 1, '\0'); |
203 | SocketAddress sa1(SocketAddress::UNIX_LOCAL, path); |
204 | assertTrue(sa1.af() == AF_UNIX); |
205 | assertTrue(sa1.family() == SocketAddress::UNIX_LOCAL); |
206 | assertTrue(sa1.toString() == path); |
207 | |
208 | std::string path2("sock2.pocoproject.org" ); |
209 | path2.insert(0, 1, '\0'); |
210 | |
211 | SocketAddress sa2(SocketAddress::UNIX_LOCAL, path2); |
212 | assertTrue(sa1 != sa2); |
213 | assertTrue(sa1 < sa2); |
214 | |
215 | SocketAddress sa3(SocketAddress::UNIX_LOCAL, path); |
216 | assertTrue(sa1 == sa3); |
217 | assertTrue(!(sa1 < sa3)); |
218 | |
219 | SocketAddress sa4(path); |
220 | assertTrue(sa1 == sa4); |
221 | assertTrue(sa4.toString() == path); |
222 | |
223 | SocketAddress sa5(sa1); |
224 | assertTrue(sa1 == sa5); |
225 | assertTrue(sa1.length() == sa5.length()); |
226 | |
227 | sa5 = sa1; |
228 | assertTrue(sa1 == sa5); |
229 | assertTrue(sa1.length() == sa5.length()); |
230 | #endif |
231 | } |
232 | |
233 | |
234 | void SocketAddressTest::setUp() |
235 | { |
236 | } |
237 | |
238 | |
239 | void SocketAddressTest::tearDown() |
240 | { |
241 | } |
242 | |
243 | |
244 | CppUnit::Test* SocketAddressTest::suite() |
245 | { |
246 | CppUnit::TestSuite* pSuite = new CppUnit::TestSuite("SocketAddressTest" ); |
247 | |
248 | CppUnit_addTest(pSuite, SocketAddressTest, testSocketAddress); |
249 | CppUnit_addTest(pSuite, SocketAddressTest, testSocketRelationals); |
250 | CppUnit_addTest(pSuite, SocketAddressTest, testSocketAddress6); |
251 | CppUnit_addTest(pSuite, SocketAddressTest, testSocketAddressUnixLocal); |
252 | CppUnit_addTest(pSuite, SocketAddressTest, testSocketAddressLinuxAbstract); |
253 | |
254 | return pSuite; |
255 | } |
256 | |