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 "Poco/CppUnit/TestCaller.h"
18#include "Poco/CppUnit/TestSuite.h"
19#include "Poco/Net/NetworkInterface.h"
20#include "Poco/Net/IPAddress.h"
21#include <iostream>
22#include <iomanip>
23
24
25using Poco::Net::NetworkInterface;
26using Poco::Net::IPAddress;
27using Poco::NotFoundException;
28
29
30NetworkInterfaceTest::NetworkInterfaceTest(const std::string& name): CppUnit::TestCase(name)
31{
32}
33
34
35NetworkInterfaceTest::~NetworkInterfaceTest()
36{
37}
38
39
40void 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 e;
82 #endif
83 }
84}
85
86
87void 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 e;
126 #endif
127 }
128}
129
130
131void 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 e;
146 #endif
147 }
148}
149
150
151void 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 e;
191 #endif
192 }
193}
194
195
196void 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 e;
211 #endif
212 }
213}
214
215
216void 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 e;
238 #endif
239 }
240}
241
242
243void 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 e;
258 #endif
259 }
260}
261
262
263void 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 typedef NetworkInterface::AddressList List;
279 const List& ipList = mapIt->second.addressList();
280 if (ipList.size() > 0)
281 {
282 List::const_iterator ipIt = ipList.begin();
283 List::const_iterator ipEnd = ipList.end();
284 for(; ipIt != ipEnd; ++ipIt, ++counter, ++listIt)
285 {
286 if(listIt == l.end()) fail("wrong number of list items");
287 NetworkInterface::MACAddress lmac = listIt->macAddress();
288 assertTrue (lmac == mac);
289 }
290 }
291 else
292 {
293 ++listIt;
294 ++counter;
295 }
296 }
297
298 assertTrue (counter == l.size());
299 }
300 catch(Poco::NotImplementedException e)
301 {
302 #if POCO_OS != POCO_OS_ANDROID
303 throw e;
304 #endif
305 }
306}
307
308
309void NetworkInterfaceTest::setUp()
310{
311}
312
313
314void NetworkInterfaceTest::tearDown()
315{
316}
317
318
319CppUnit::Test* NetworkInterfaceTest::suite()
320{
321 CppUnit::TestSuite* pSuite = new CppUnit::TestSuite("NetworkInterfaceTest");
322
323 CppUnit_addTest(pSuite, NetworkInterfaceTest, testList);
324 CppUnit_addTest(pSuite, NetworkInterfaceTest, testMap);
325 CppUnit_addTest(pSuite, NetworkInterfaceTest, testForName);
326 CppUnit_addTest(pSuite, NetworkInterfaceTest, testForAddress);
327 CppUnit_addTest(pSuite, NetworkInterfaceTest, testForIndex);
328 CppUnit_addTest(pSuite, NetworkInterfaceTest, testMapIpOnly);
329 CppUnit_addTest(pSuite, NetworkInterfaceTest, testMapUpOnly);
330 CppUnit_addTest(pSuite, NetworkInterfaceTest, testListMapConformance);
331
332 return pSuite;
333}
334
335
336#endif // POCO_NET_HAS_INTERFACE
337