1 //
2 // NetworkInterfaceTest.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 "NetworkInterfaceTest.h"
12
13
14 #ifdef POCO_NET_HAS_INTERFACE
15
16
17 #include "CppUnit/TestCaller.h"
18 #include "CppUnit/TestSuite.h"
19 #include "Poco/Net/NetworkInterface.h"
20 #include "Poco/Net/IPAddress.h"
21 #include <iostream>
22 #include <iomanip>
23
24
25 using Poco::Net::NetworkInterface;
26 using Poco::Net::IPAddress;
27 using Poco::NotFoundException;
28
29
NetworkInterfaceTest(const std::string & name)30 NetworkInterfaceTest::NetworkInterfaceTest(const std::string& name): CppUnit::TestCase(name)
31 {
32 }
33
34
~NetworkInterfaceTest()35 NetworkInterfaceTest::~NetworkInterfaceTest()
36 {
37 }
38
39
testMap()40 void NetworkInterfaceTest::testMap()
41 {
42 try
43 {
44 NetworkInterface::Map m = NetworkInterface::map(false, false);
45 assertTrue (!m.empty());
46 for (NetworkInterface::Map::const_iterator it = m.begin(); it != m.end(); ++it)
47 {
48 std::cout << std::endl << "=============" << std::endl;
49
50 std::cout << "Index: " << it->second.index() << std::endl;
51 std::cout << "Name: " << it->second.name() << std::endl;
52 std::cout << "DisplayName: " << it->second.displayName() << std::endl;
53 std::cout << "Status: " << (it->second.isUp() ? "Up" : "Down") << std::endl;
54
55 NetworkInterface::MACAddress mac(it->second.macAddress());
56 if (!mac.empty() && (it->second.type() != NetworkInterface::NI_TYPE_SOFTWARE_LOOPBACK))
57 std::cout << "MAC Address: (" << it->second.type() << ") " << mac << std::endl;
58
59 typedef NetworkInterface::AddressList List;
60 const List& ipList = it->second.addressList();
61 List::const_iterator ipIt = ipList.begin();
62 List::const_iterator ipEnd = ipList.end();
63 for (int counter = 0; ipIt != ipEnd; ++ipIt, ++counter)
64 {
65 std::cout << std::endl << "----------" << std::endl;
66 std::cout << "Address " << counter << std::endl;
67 std::cout << "----------" << std::endl;
68 std::cout << "Address: " << ipIt->get<NetworkInterface::IP_ADDRESS>() << std::endl;
69 IPAddress addr = ipIt->get<NetworkInterface::SUBNET_MASK>();
70 if (!addr.isWildcard()) std::cout << "Subnet: " << addr << " (/" << addr.prefixLength() << ")" << std::endl;
71 addr = ipIt->get<NetworkInterface::BROADCAST_ADDRESS>();
72 if (!addr.isWildcard()) std::cout << "Broadcast: " << addr << std::endl;
73 }
74
75 std::cout << "=============" << std::endl << std::endl;
76 }
77 }
78 catch (Poco::NotImplementedException e)
79 {
80 #if POCO_OS != POCO_OS_ANDROID
81 throw;
82 #endif
83 }
84 }
85
86
testList()87 void NetworkInterfaceTest::testList()
88 {
89 try
90 {
91 NetworkInterface::List list = NetworkInterface::list(false, false);
92 assertTrue (!list.empty());
93 for (NetworkInterface::List::const_iterator it = list.begin(); it != list.end(); ++it)
94 {
95 std::cout << std::endl << "==============" << std::endl;
96
97 std::cout << "Index: " << it->index() << std::endl;
98 std::cout << "Name: " << it->name() << std::endl;
99 std::cout << "DisplayName: " << it->displayName() << std::endl;
100 std::cout << "Status: " << (it->isUp() ? "Up" : "Down") << std::endl;
101
102 NetworkInterface::MACAddress mac(it->macAddress());
103 if (!mac.empty() && (it->type() != NetworkInterface::NI_TYPE_SOFTWARE_LOOPBACK))
104 std::cout << "MAC Address: (" << it->type() << ") " << mac << std::endl;
105
106 typedef NetworkInterface::AddressList AddrList;
107 const AddrList& ipList = it->addressList();
108 AddrList::const_iterator ipIt = ipList.begin();
109 AddrList::const_iterator ipEnd = ipList.end();
110 for (int counter = 0; ipIt != ipEnd; ++ipIt, ++counter)
111 {
112 std::cout << "IP Address: " << ipIt->get<NetworkInterface::IP_ADDRESS>() << std::endl;
113 IPAddress addr = ipIt->get<NetworkInterface::SUBNET_MASK>();
114 if (!addr.isWildcard()) std::cout << "Subnet: " << ipIt->get<NetworkInterface::SUBNET_MASK>() << " (/" << ipIt->get<NetworkInterface::SUBNET_MASK>().prefixLength() << ")" << std::endl;
115 addr = ipIt->get<NetworkInterface::BROADCAST_ADDRESS>();
116 if (!addr.isWildcard()) std::cout << "Broadcast: " << ipIt->get<NetworkInterface::BROADCAST_ADDRESS>() << std::endl;
117 }
118
119 std::cout << "==============" << std::endl << std::endl;
120 }
121 }
122 catch (Poco::NotImplementedException e)
123 {
124 #if POCO_OS != POCO_OS_ANDROID
125 throw;
126 #endif
127 }
128 }
129
130
testForName()131 void NetworkInterfaceTest::testForName()
132 {
133 try
134 {
135 NetworkInterface::Map map = NetworkInterface::map();
136 for (NetworkInterface::Map::const_iterator it = map.begin(); it != map.end(); ++it)
137 {
138 NetworkInterface ifc = NetworkInterface::forName(it->second.name());
139 assertTrue (ifc.name() == it->second.name());
140 }
141 }
142 catch (Poco::NotImplementedException e)
143 {
144 #if POCO_OS != POCO_OS_ANDROID
145 throw;
146 #endif
147 }
148 }
149
150
testForAddress()151 void NetworkInterfaceTest::testForAddress()
152 {
153 try
154 {
155 NetworkInterface::Map map = NetworkInterface::map();
156 for (NetworkInterface::Map::const_iterator it = map.begin(); it != map.end(); ++it)
157 {
158 // not all interfaces have IP configured
159 if (it->second.addressList().empty()) continue;
160
161 if (it->second.supportsIPv4())
162 {
163 NetworkInterface ifc = NetworkInterface::forAddress(it->second.firstAddress(IPAddress::IPv4));
164 assertTrue (ifc.firstAddress(IPAddress::IPv4) == it->second.firstAddress(IPAddress::IPv4));
165
166 IPAddress addr(IPAddress::IPv4);
167 assertTrue (addr.isWildcard());
168 it->second.firstAddress(addr, IPAddress::IPv4);
169 assertTrue (!addr.isWildcard());
170 }
171 else
172 {
173 try
174 {
175 it->second.firstAddress(IPAddress::IPv4);
176 fail ("must throw");
177 }
178 catch (NotFoundException&) { }
179
180 IPAddress addr(IPAddress::IPv4);
181 assertTrue (addr.isWildcard());
182 it->second.firstAddress(addr, IPAddress::IPv4);
183 assertTrue (addr.isWildcard());
184 }
185 }
186 }
187 catch (Poco::NotImplementedException e)
188 {
189 #if POCO_OS != POCO_OS_ANDROID
190 throw;
191 #endif
192 }
193 }
194
195
testForIndex()196 void NetworkInterfaceTest::testForIndex()
197 {
198 try
199 {
200 NetworkInterface::Map map = NetworkInterface::map();
201 for (NetworkInterface::Map::const_iterator it = map.begin(); it != map.end(); ++it)
202 {
203 NetworkInterface ifc = NetworkInterface::forIndex(it->second.index());
204 assertTrue (ifc.index() == it->second.index());
205 }
206 }
207 catch (Poco::NotImplementedException e)
208 {
209 #if POCO_OS != POCO_OS_ANDROID
210 throw;
211 #endif
212 }
213 }
214
215
testMapIpOnly()216 void NetworkInterfaceTest::testMapIpOnly()
217 {
218 try
219 {
220 NetworkInterface::Map m = NetworkInterface::map(true, false);
221 assertTrue (!m.empty());
222
223 std::cout << std::endl;
224 for (NetworkInterface::Map::const_iterator it = m.begin(); it != m.end(); ++it)
225 {
226 assertTrue (it->second.supportsIPv4() || it->second.supportsIPv6());
227 std::cout << "Interface: (" << it->second.index() << ")" << std::endl;
228 std::cout << "Address: " << it->second.address() << std::endl;
229 NetworkInterface::MACAddress mac(it->second.macAddress());
230 if (!mac.empty() && (it->second.type() != NetworkInterface::NI_TYPE_SOFTWARE_LOOPBACK))
231 std::cout << "MAC Address:" << mac << std::endl;
232 }
233 }
234 catch (Poco::NotImplementedException e)
235 {
236 #if POCO_OS != POCO_OS_ANDROID
237 throw;
238 #endif
239 }
240 }
241
242
testMapUpOnly()243 void NetworkInterfaceTest::testMapUpOnly()
244 {
245 try
246 {
247 NetworkInterface::Map m = NetworkInterface::map(false, true);
248 assertTrue (!m.empty());
249 for (NetworkInterface::Map::const_iterator it = m.begin(); it != m.end(); ++it)
250 {
251 assertTrue (it->second.isUp());
252 }
253 }
254 catch (Poco::NotImplementedException e)
255 {
256 #if POCO_OS != POCO_OS_ANDROID
257 throw;
258 #endif
259 }
260 }
261
262
testListMapConformance()263 void NetworkInterfaceTest::testListMapConformance()
264 {
265 try
266 {
267 NetworkInterface::Map m = NetworkInterface::map(false, false);
268 assertTrue (!m.empty());
269 NetworkInterface::List l = NetworkInterface::list(false, false);
270 assertTrue (!l.empty());
271
272 int counter = 0;
273 NetworkInterface::Map::const_iterator mapIt = m.begin();
274 NetworkInterface::List::const_iterator listIt = l.begin();
275 for (; mapIt != m.end(); ++mapIt)
276 {
277 NetworkInterface::MACAddress mac(mapIt->second.macAddress());
278
279 typedef NetworkInterface::AddressList List;
280 const List& ipList = mapIt->second.addressList();
281 if (ipList.size() > 0)
282 {
283 List::const_iterator ipIt = ipList.begin();
284 List::const_iterator ipEnd = ipList.end();
285 for(; ipIt != ipEnd; ++ipIt, ++counter, ++listIt)
286 {
287 if(listIt == l.end()) fail("wrong number of list items");
288 NetworkInterface::MACAddress lmac = listIt->macAddress();
289 assertTrue (lmac == mac);
290 }
291 }
292 else
293 {
294 ++listIt;
295 ++counter;
296 }
297 }
298
299 assertTrue (counter == l.size());
300 }
301 catch (Poco::NotImplementedException e)
302 {
303 #if POCO_OS != POCO_OS_ANDROID
304 throw;
305 #endif
306 }
307 }
308
309
setUp()310 void NetworkInterfaceTest::setUp()
311 {
312 }
313
314
tearDown()315 void NetworkInterfaceTest::tearDown()
316 {
317 }
318
319
suite()320 CppUnit::Test* NetworkInterfaceTest::suite()
321 {
322 CppUnit::TestSuite* pSuite = new CppUnit::TestSuite("NetworkInterfaceTest");
323
324 CppUnit_addTest(pSuite, NetworkInterfaceTest, testList);
325 CppUnit_addTest(pSuite, NetworkInterfaceTest, testMap);
326 CppUnit_addTest(pSuite, NetworkInterfaceTest, testForName);
327 CppUnit_addTest(pSuite, NetworkInterfaceTest, testForAddress);
328 CppUnit_addTest(pSuite, NetworkInterfaceTest, testForIndex);
329 CppUnit_addTest(pSuite, NetworkInterfaceTest, testMapIpOnly);
330 CppUnit_addTest(pSuite, NetworkInterfaceTest, testMapUpOnly);
331 CppUnit_addTest(pSuite, NetworkInterfaceTest, testListMapConformance);
332
333 return pSuite;
334 }
335
336
337 #endif // POCO_NET_HAS_INTERFACE
338