blob: a0a510e517af60ac6d39807cb49fb6050a1fffef [file] [log] [blame]
susmit91e1d7c2016-10-03 16:16:57 -06001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Junxiao Shi2760adc2017-07-06 05:44:52 +00002/*
Alexander Afanasyev3bdc1de2018-04-03 17:33:31 -04003 * Copyright (c) 2014-2018, Regents of the University of California,
susmit91e1d7c2016-10-03 16:16:57 -06004 * Arizona Board of Regents,
5 * Colorado State University,
6 * University Pierre & Marie Curie, Sorbonne University,
7 * Washington University in St. Louis,
8 * Beijing Institute of Technology,
9 * The University of Memphis.
10 *
11 * This file is part of NFD (Named Data Networking Forwarding Daemon).
12 * See AUTHORS.md for complete list of NFD authors and contributors.
13 *
14 * NFD is free software: you can redistribute it and/or modify it under the terms
15 * of the GNU General Public License as published by the Free Software Foundation,
16 * either version 3 of the License, or (at your option) any later version.
17 *
18 * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
19 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
20 * PURPOSE. See the GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License along with
23 * NFD, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
24 */
25
Alexander Afanasyeve4d745d2018-04-08 17:55:56 -040026#include "core/network-predicate.hpp"
Davide Pesaventoa3148082018-04-12 18:21:54 -040027#include "core/config-file.hpp"
susmit91e1d7c2016-10-03 16:16:57 -060028
29#include "tests/test-common.hpp"
30
Junxiao Shia5765d62017-08-09 04:07:46 +000031#include <ndn-cxx/net/ethernet.hpp>
Junxiao Shi2760adc2017-07-06 05:44:52 +000032#include <ndn-cxx/net/network-monitor-stub.hpp>
susmit91e1d7c2016-10-03 16:16:57 -060033#include <boost/property_tree/info_parser.hpp>
34#include <sstream>
35
36namespace nfd {
37namespace tests {
38
Alexander Afanasyeve4d745d2018-04-08 17:55:56 -040039BOOST_AUTO_TEST_SUITE(TestNetworkPredicate)
40
41template<class T>
42class NetworkPredicateBaseFixture : public BaseFixture
43{
44public:
45 void
46 parseConfig(const std::string& config)
47 {
48 std::istringstream input(config);
49 boost::property_tree::ptree ptree;
50 boost::property_tree::read_info(input, ptree);
51
52 for (const auto& i : ptree) {
53 if (i.first == "whitelist") {
54 predicate.parseWhitelist(i.second);
55 }
56 else if (i.first == "blacklist") {
57 predicate.parseBlacklist(i.second);
58 }
59 }
60 }
61
62protected:
63 T predicate;
64};
65
66class NetworkInterfacePredicateFixture : public NetworkPredicateBaseFixture<NetworkInterfacePredicate>
susmit91e1d7c2016-10-03 16:16:57 -060067{
68protected:
69 NetworkInterfacePredicateFixture()
70 {
71 using namespace boost::asio::ip;
Junxiao Shi2760adc2017-07-06 05:44:52 +000072 using namespace ndn::net;
Junxiao Shia5765d62017-08-09 04:07:46 +000073 namespace ethernet = ndn::ethernet;
Junxiao Shi2760adc2017-07-06 05:44:52 +000074
75 netifs.push_back(NetworkMonitorStub::makeNetworkInterface());
76 netifs.back()->setIndex(0);
77 netifs.back()->setName("eth0");
78 netifs.back()->setEthernetAddress(ethernet::Address::fromString("3e:15:c2:8b:65:00"));
79 netifs.back()->addNetworkAddress(NetworkAddress(AddressFamily::V4,
80 address_v4::from_string("129.82.100.1"), address_v4::from_string("129.82.255.255"),
81 16, AddressScope::GLOBAL, 0));
Alexander Afanasyeve4d745d2018-04-08 17:55:56 -040082 netifs.back()->addNetworkAddress(NetworkAddress(AddressFamily::V6,
Alexander Afanasyev3bdc1de2018-04-03 17:33:31 -040083 address_v6::from_string("2001:db8:1::1"), address_v6::from_string("2001:db8:1::ffff:ffff:ffff:ffff"),
84 64, AddressScope::GLOBAL, 0));
Junxiao Shi2760adc2017-07-06 05:44:52 +000085 netifs.back()->setFlags(IFF_UP);
86
87 netifs.push_back(NetworkMonitorStub::makeNetworkInterface());
88 netifs.back()->setIndex(1);
89 netifs.back()->setName("eth1");
90 netifs.back()->setEthernetAddress(ethernet::Address::fromString("3e:15:c2:8b:65:01"));
91 netifs.back()->addNetworkAddress(NetworkAddress(AddressFamily::V4,
92 address_v4::from_string("192.168.2.1"), address_v4::from_string("192.168.2.255"),
93 24, AddressScope::GLOBAL, 0));
Alexander Afanasyeve4d745d2018-04-08 17:55:56 -040094 netifs.back()->addNetworkAddress(NetworkAddress(AddressFamily::V6,
Alexander Afanasyev3bdc1de2018-04-03 17:33:31 -040095 address_v6::from_string("2001:db8:2::1"), address_v6::from_string("2001:db8:2::ffff:ffff:ffff:ffff"),
96 64, AddressScope::GLOBAL, 0));
Junxiao Shi2760adc2017-07-06 05:44:52 +000097 netifs.back()->setFlags(IFF_UP);
98
99 netifs.push_back(NetworkMonitorStub::makeNetworkInterface());
100 netifs.back()->setIndex(2);
101 netifs.back()->setName("eth2");
102 netifs.back()->setEthernetAddress(ethernet::Address::fromString("3e:15:c2:8b:65:02"));
103 netifs.back()->addNetworkAddress(NetworkAddress(AddressFamily::V4,
104 address_v4::from_string("198.51.100.1"), address_v4::from_string("198.51.100.255"),
105 24, AddressScope::GLOBAL, 0));
106 netifs.back()->addNetworkAddress(NetworkAddress(AddressFamily::V6,
107 address_v6::from_string("2001:db8::1"), address_v6::from_string("2001:db8::ffff"),
108 112, AddressScope::GLOBAL, 0));
109 netifs.back()->setFlags(IFF_MULTICAST | IFF_BROADCAST | IFF_UP);
110
111 netifs.push_back(NetworkMonitorStub::makeNetworkInterface());
112 netifs.back()->setIndex(3);
113 netifs.back()->setName("enp68s0f1");
114 netifs.back()->setEthernetAddress(ethernet::Address::fromString("3e:15:c2:8b:65:03"));
115 netifs.back()->addNetworkAddress(NetworkAddress(AddressFamily::V4,
116 address_v4::from_string("192.168.2.3"), address_v4::from_string("192.168.2.255"),
117 24, AddressScope::GLOBAL, 0));
118 netifs.back()->setFlags(IFF_UP);
susmit91e1d7c2016-10-03 16:16:57 -0600119 }
120
susmit91e1d7c2016-10-03 16:16:57 -0600121protected:
Junxiao Shi2760adc2017-07-06 05:44:52 +0000122 std::vector<shared_ptr<ndn::net::NetworkInterface>> netifs;
susmit91e1d7c2016-10-03 16:16:57 -0600123};
124
Alexander Afanasyeve4d745d2018-04-08 17:55:56 -0400125BOOST_FIXTURE_TEST_SUITE(NetworkInterface, NetworkInterfacePredicateFixture)
susmit91e1d7c2016-10-03 16:16:57 -0600126
127BOOST_AUTO_TEST_CASE(Default)
128{
129 parseConfig("");
130
Junxiao Shi2760adc2017-07-06 05:44:52 +0000131 BOOST_CHECK_EQUAL(predicate(*netifs[0]), true);
132 BOOST_CHECK_EQUAL(predicate(*netifs[1]), true);
133 BOOST_CHECK_EQUAL(predicate(*netifs[2]), true);
134 BOOST_CHECK_EQUAL(predicate(*netifs[3]), true);
susmit91e1d7c2016-10-03 16:16:57 -0600135}
136
137BOOST_AUTO_TEST_CASE(EmptyWhitelist)
138{
139 parseConfig("whitelist\n"
140 "{\n"
141 "}");
142
Junxiao Shi2760adc2017-07-06 05:44:52 +0000143 BOOST_CHECK_EQUAL(predicate(*netifs[0]), false);
144 BOOST_CHECK_EQUAL(predicate(*netifs[1]), false);
145 BOOST_CHECK_EQUAL(predicate(*netifs[2]), false);
146 BOOST_CHECK_EQUAL(predicate(*netifs[3]), false);
susmit91e1d7c2016-10-03 16:16:57 -0600147}
148
149BOOST_AUTO_TEST_CASE(WildcardBlacklist)
150{
151 parseConfig("blacklist\n"
152 "{\n"
153 " *\n"
154 "}");
155
Junxiao Shi2760adc2017-07-06 05:44:52 +0000156 BOOST_CHECK_EQUAL(predicate(*netifs[0]), false);
157 BOOST_CHECK_EQUAL(predicate(*netifs[1]), false);
158 BOOST_CHECK_EQUAL(predicate(*netifs[2]), false);
159 BOOST_CHECK_EQUAL(predicate(*netifs[3]), false);
susmit91e1d7c2016-10-03 16:16:57 -0600160}
161
162BOOST_AUTO_TEST_CASE(IfnameWhitelist)
163{
164 parseConfig("whitelist\n"
165 "{\n"
166 " ifname eth0\n"
167 " ifname eth1\n"
168 "}");
169
Junxiao Shi2760adc2017-07-06 05:44:52 +0000170 BOOST_CHECK_EQUAL(predicate(*netifs[0]), true);
171 BOOST_CHECK_EQUAL(predicate(*netifs[1]), true);
172 BOOST_CHECK_EQUAL(predicate(*netifs[2]), false);
173 BOOST_CHECK_EQUAL(predicate(*netifs[3]), false);
susmit91e1d7c2016-10-03 16:16:57 -0600174}
175
176BOOST_AUTO_TEST_CASE(IfnameBlacklist)
177{
178 parseConfig("blacklist\n"
179 "{\n"
180 " ifname eth0\n"
181 " ifname eth1\n"
182 "}");
183
Junxiao Shi2760adc2017-07-06 05:44:52 +0000184 BOOST_CHECK_EQUAL(predicate(*netifs[0]), false);
185 BOOST_CHECK_EQUAL(predicate(*netifs[1]), false);
186 BOOST_CHECK_EQUAL(predicate(*netifs[2]), true);
187 BOOST_CHECK_EQUAL(predicate(*netifs[3]), true);
susmit21f22e62017-03-25 15:44:45 -0500188}
189
190BOOST_AUTO_TEST_CASE(IfnameWildcardStart)
191{
192 parseConfig("whitelist\n"
193 "{\n"
194 " ifname enp*\n"
195 "}");
196
Junxiao Shi2760adc2017-07-06 05:44:52 +0000197 BOOST_CHECK_EQUAL(predicate(*netifs[0]), false);
198 BOOST_CHECK_EQUAL(predicate(*netifs[1]), false);
199 BOOST_CHECK_EQUAL(predicate(*netifs[2]), false);
200 BOOST_CHECK_EQUAL(predicate(*netifs[3]), true);
susmit21f22e62017-03-25 15:44:45 -0500201}
202
203BOOST_AUTO_TEST_CASE(IfnameWildcardMiddle)
204{
205 parseConfig("whitelist\n"
206 "{\n"
207 " ifname *th*\n"
208 "}");
209
Junxiao Shi2760adc2017-07-06 05:44:52 +0000210 BOOST_CHECK_EQUAL(predicate(*netifs[0]), true);
211 BOOST_CHECK_EQUAL(predicate(*netifs[1]), true);
212 BOOST_CHECK_EQUAL(predicate(*netifs[2]), true);
213 BOOST_CHECK_EQUAL(predicate(*netifs[3]), false);
susmit21f22e62017-03-25 15:44:45 -0500214}
215
216BOOST_AUTO_TEST_CASE(IfnameWildcardDouble)
217{
218 parseConfig("whitelist\n"
219 "{\n"
220 " ifname eth**\n"
221 "}");
222
Junxiao Shi2760adc2017-07-06 05:44:52 +0000223 BOOST_CHECK_EQUAL(predicate(*netifs[0]), true);
224 BOOST_CHECK_EQUAL(predicate(*netifs[1]), true);
225 BOOST_CHECK_EQUAL(predicate(*netifs[2]), true);
226 BOOST_CHECK_EQUAL(predicate(*netifs[3]), false);
susmit21f22e62017-03-25 15:44:45 -0500227}
228
229BOOST_AUTO_TEST_CASE(IfnameWildcardOnly)
230{
231 parseConfig("whitelist\n"
232 "{\n"
233 " ifname *\n"
234 "}");
235
Junxiao Shi2760adc2017-07-06 05:44:52 +0000236 BOOST_CHECK_EQUAL(predicate(*netifs[0]), true);
237 BOOST_CHECK_EQUAL(predicate(*netifs[1]), true);
238 BOOST_CHECK_EQUAL(predicate(*netifs[2]), true);
239 BOOST_CHECK_EQUAL(predicate(*netifs[3]), true);
susmit21f22e62017-03-25 15:44:45 -0500240}
241
242BOOST_AUTO_TEST_CASE(IfnameQuestionMark)
243{
244 parseConfig("whitelist\n"
245 "{\n"
246 " ifname eth?\n"
247 "}");
248
Junxiao Shi2760adc2017-07-06 05:44:52 +0000249 BOOST_CHECK_EQUAL(predicate(*netifs[0]), true);
250 BOOST_CHECK_EQUAL(predicate(*netifs[1]), true);
251 BOOST_CHECK_EQUAL(predicate(*netifs[2]), true);
252 BOOST_CHECK_EQUAL(predicate(*netifs[3]), false);
susmit91e1d7c2016-10-03 16:16:57 -0600253}
254
255BOOST_AUTO_TEST_CASE(IfnameMalformed)
256{
257 BOOST_CHECK_THROW(
258 parseConfig("whitelist\n"
259 "{\n"
260 " ifname\n"
261 "}"),
262 ConfigFile::Error);
263}
264
265BOOST_AUTO_TEST_CASE(EtherWhitelist)
266{
267 parseConfig("whitelist\n"
268 "{\n"
269 " ether 3e:15:c2:8b:65:00\n"
270 " ether 3e:15:c2:8b:65:01\n"
271 "}");
272
Junxiao Shi2760adc2017-07-06 05:44:52 +0000273 BOOST_CHECK_EQUAL(predicate(*netifs[0]), true);
274 BOOST_CHECK_EQUAL(predicate(*netifs[1]), true);
275 BOOST_CHECK_EQUAL(predicate(*netifs[2]), false);
276 BOOST_CHECK_EQUAL(predicate(*netifs[3]), false);
susmit91e1d7c2016-10-03 16:16:57 -0600277}
278
279BOOST_AUTO_TEST_CASE(EtherBlacklist)
280{
281 parseConfig("blacklist\n"
282 "{\n"
283 " ether 3e:15:c2:8b:65:00\n"
284 " ether 3e:15:c2:8b:65:01\n"
285 "}");
286
Junxiao Shi2760adc2017-07-06 05:44:52 +0000287 BOOST_CHECK_EQUAL(predicate(*netifs[0]), false);
288 BOOST_CHECK_EQUAL(predicate(*netifs[1]), false);
289 BOOST_CHECK_EQUAL(predicate(*netifs[2]), true);
290 BOOST_CHECK_EQUAL(predicate(*netifs[3]), true);
susmit91e1d7c2016-10-03 16:16:57 -0600291}
292
293BOOST_AUTO_TEST_CASE(EtherMalformed)
294{
295 BOOST_CHECK_THROW(
296 parseConfig("blacklist\n"
297 "{\n"
298 " ether foo\n"
299 "}"),
300 ConfigFile::Error);
301}
302
Alexander Afanasyev3bdc1de2018-04-03 17:33:31 -0400303BOOST_AUTO_TEST_CASE(Subnet4Whitelist)
susmit91e1d7c2016-10-03 16:16:57 -0600304{
305 parseConfig("whitelist\n"
306 "{\n"
307 " subnet 192.168.0.0/16\n"
308 "}");
309
Junxiao Shi2760adc2017-07-06 05:44:52 +0000310 BOOST_CHECK_EQUAL(predicate(*netifs[0]), false);
311 BOOST_CHECK_EQUAL(predicate(*netifs[1]), true);
312 BOOST_CHECK_EQUAL(predicate(*netifs[2]), false);
313 BOOST_CHECK_EQUAL(predicate(*netifs[3]), true);
susmit91e1d7c2016-10-03 16:16:57 -0600314}
315
Alexander Afanasyev3bdc1de2018-04-03 17:33:31 -0400316BOOST_AUTO_TEST_CASE(Subnet4Blacklist)
susmit91e1d7c2016-10-03 16:16:57 -0600317{
318 parseConfig("blacklist\n"
319 "{\n"
320 " subnet 192.168.0.0/16\n"
321 "}");
322
Junxiao Shi2760adc2017-07-06 05:44:52 +0000323 BOOST_CHECK_EQUAL(predicate(*netifs[0]), true);
324 BOOST_CHECK_EQUAL(predicate(*netifs[1]), false);
325 BOOST_CHECK_EQUAL(predicate(*netifs[2]), true);
326 BOOST_CHECK_EQUAL(predicate(*netifs[3]), false);
susmit91e1d7c2016-10-03 16:16:57 -0600327}
328
Alexander Afanasyev3bdc1de2018-04-03 17:33:31 -0400329BOOST_AUTO_TEST_CASE(Subnet6Whitelist)
330{
331 parseConfig("whitelist\n"
332 "{\n"
333 " subnet 2001:db8:2::1/120\n"
334 "}");
335
336 BOOST_CHECK_EQUAL(predicate(*netifs[0]), false);
337 BOOST_CHECK_EQUAL(predicate(*netifs[1]), true);
338 BOOST_CHECK_EQUAL(predicate(*netifs[2]), false);
339 BOOST_CHECK_EQUAL(predicate(*netifs[3]), false);
340}
341
342BOOST_AUTO_TEST_CASE(Subnet6Blacklist)
343{
344 parseConfig("blacklist\n"
345 "{\n"
346 " subnet 2001:db8:2::1/120\n"
347 "}");
348
349 BOOST_CHECK_EQUAL(predicate(*netifs[0]), true);
350 BOOST_CHECK_EQUAL(predicate(*netifs[1]), false);
351 BOOST_CHECK_EQUAL(predicate(*netifs[2]), true);
352 BOOST_CHECK_EQUAL(predicate(*netifs[3]), true);
353}
354
susmit91e1d7c2016-10-03 16:16:57 -0600355BOOST_AUTO_TEST_CASE(SubnetMalformed)
356{
357 BOOST_CHECK_THROW(
358 parseConfig("blacklist\n"
359 "{\n"
360 " subnet 266.0.0.91/\n"
361 "}"),
362 ConfigFile::Error);
363}
364
Alexander Afanasyeve4d745d2018-04-08 17:55:56 -0400365BOOST_AUTO_TEST_CASE(UnrecognizedKey)
366{
367 BOOST_CHECK_THROW(
368 parseConfig("blacklist\n"
369 "{\n"
370 " key unrecognized\n"
371 "}"),
372 ConfigFile::Error);
373}
374
375BOOST_AUTO_TEST_SUITE_END() // NetworkInterface
376
377class IpAddressPredicateFixture : public NetworkPredicateBaseFixture<IpAddressPredicate>
378{
379protected:
380 IpAddressPredicateFixture()
381 {
382 using namespace boost::asio::ip;
383
384 addrs.push_back(address_v4::from_string("129.82.100.1"));
385 addrs.push_back(address_v6::from_string("2001:db8:1::1"));
386 addrs.push_back(address_v4::from_string("192.168.2.1"));
387 addrs.push_back(address_v6::from_string("2001:db8:2::1"));
388 }
389
390protected:
391 std::vector<boost::asio::ip::address> addrs;
392};
393
394BOOST_FIXTURE_TEST_SUITE(IpAddress, IpAddressPredicateFixture)
395
396BOOST_AUTO_TEST_CASE(Default)
397{
398 parseConfig("");
399
400 BOOST_CHECK_EQUAL(predicate(addrs[0]), true);
401 BOOST_CHECK_EQUAL(predicate(addrs[1]), true);
402 BOOST_CHECK_EQUAL(predicate(addrs[2]), true);
403 BOOST_CHECK_EQUAL(predicate(addrs[3]), true);
404}
405
406BOOST_AUTO_TEST_CASE(EmptyWhitelist)
407{
408 parseConfig("whitelist\n"
409 "{\n"
410 "}");
411
412 BOOST_CHECK_EQUAL(predicate(addrs[0]), false);
413 BOOST_CHECK_EQUAL(predicate(addrs[1]), false);
414 BOOST_CHECK_EQUAL(predicate(addrs[2]), false);
415 BOOST_CHECK_EQUAL(predicate(addrs[3]), false);
416}
417
418BOOST_AUTO_TEST_CASE(WildcardBlacklist)
419{
420 parseConfig("blacklist\n"
421 "{\n"
422 " *\n"
423 "}");
424
425 BOOST_CHECK_EQUAL(predicate(addrs[0]), false);
426 BOOST_CHECK_EQUAL(predicate(addrs[1]), false);
427 BOOST_CHECK_EQUAL(predicate(addrs[2]), false);
428 BOOST_CHECK_EQUAL(predicate(addrs[3]), false);
429}
430
431BOOST_AUTO_TEST_CASE(Subnet4Whitelist)
432{
433 parseConfig("whitelist\n"
434 "{\n"
435 " subnet 192.168.0.0/16\n"
436 "}");
437
438 BOOST_CHECK_EQUAL(predicate(addrs[0]), false);
439 BOOST_CHECK_EQUAL(predicate(addrs[1]), false);
440 BOOST_CHECK_EQUAL(predicate(addrs[2]), true);
441 BOOST_CHECK_EQUAL(predicate(addrs[3]), false);
442}
443
444BOOST_AUTO_TEST_CASE(Subnet4Blacklist)
445{
446 parseConfig("blacklist\n"
447 "{\n"
448 " subnet 192.168.0.0/16\n"
449 "}");
450
451 BOOST_CHECK_EQUAL(predicate(addrs[0]), true);
452 BOOST_CHECK_EQUAL(predicate(addrs[1]), true);
453 BOOST_CHECK_EQUAL(predicate(addrs[2]), false);
454 BOOST_CHECK_EQUAL(predicate(addrs[3]), true);
455}
456
457BOOST_AUTO_TEST_CASE(Subnet6Whitelist)
458{
459 parseConfig("whitelist\n"
460 "{\n"
461 " subnet 2001:db8:2::1/120\n"
462 "}");
463
464 BOOST_CHECK_EQUAL(predicate(addrs[0]), false);
465 BOOST_CHECK_EQUAL(predicate(addrs[1]), false);
466 BOOST_CHECK_EQUAL(predicate(addrs[2]), false);
467 BOOST_CHECK_EQUAL(predicate(addrs[3]), true);
468}
469
470BOOST_AUTO_TEST_CASE(Subnet6Blacklist)
471{
472 parseConfig("blacklist\n"
473 "{\n"
474 " subnet 2001:db8:2::1/120\n"
475 "}");
476
477 BOOST_CHECK_EQUAL(predicate(addrs[0]), true);
478 BOOST_CHECK_EQUAL(predicate(addrs[1]), true);
479 BOOST_CHECK_EQUAL(predicate(addrs[2]), true);
480 BOOST_CHECK_EQUAL(predicate(addrs[3]), false);
481}
482
483BOOST_AUTO_TEST_CASE(UnrecognizedKey)
484{
485 BOOST_CHECK_THROW(
486 parseConfig("blacklist\n"
487 "{\n"
488 " ether 3e:15:c2:8b:65:00\n"
489 "}"),
490 ConfigFile::Error);
491
492 BOOST_CHECK_THROW(
493 parseConfig("blacklist\n"
494 "{\n"
495 " ifname eth**\n"
496 "}"),
497 ConfigFile::Error);
498
499 BOOST_CHECK_THROW(
500 parseConfig("blacklist\n"
501 "{\n"
502 " key unrecognized\n"
503 "}"),
504 ConfigFile::Error);
505}
506
507BOOST_AUTO_TEST_SUITE_END() // IpAddress
508
509BOOST_AUTO_TEST_SUITE_END() // TestNetworkPredicate
susmit91e1d7c2016-10-03 16:16:57 -0600510
511} // namespace tests
512} // namespace nfd