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