blob: 21c49cc81bd1528429f94915b9a419500a0a7adf [file] [log] [blame]
Junxiao Shicde37ad2015-12-24 01:02:05 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Junxiao Shi0ba6d642017-07-17 00:53:22 +00002/*
Davide Pesavento15b55052018-01-27 19:09:28 -05003 * Copyright (c) 2014-2018, Regents of the University of California,
Junxiao Shicde37ad2015-12-24 01:02:05 -07004 * 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
26#include "face/tcp-factory.hpp"
27
Junxiao Shi38b24c72017-01-05 02:59:31 +000028#include "face-system-fixture.hpp"
Davide Pesaventob15276f2017-07-15 16:27:13 -040029#include "factory-test-common.hpp"
Junxiao Shicde37ad2015-12-24 01:02:05 -070030#include "tests/limited-io.hpp"
31
32namespace nfd {
Junxiao Shi38b24c72017-01-05 02:59:31 +000033namespace face {
Junxiao Shicde37ad2015-12-24 01:02:05 -070034namespace tests {
35
Davide Pesavento4b89a6e2017-10-07 15:29:50 -040036class TcpFactoryFixture : public FaceSystemFactoryFixture<TcpFactory>
37{
38protected:
39 shared_ptr<TcpChannel>
40 createChannel(const std::string& localIp, const std::string& localPort)
41 {
Davide Pesavento9c33b902018-05-20 01:30:29 -040042 tcp::Endpoint endpoint(boost::asio::ip::address::from_string(localIp),
Davide Pesavento4b89a6e2017-10-07 15:29:50 -040043 boost::lexical_cast<uint16_t>(localPort));
44 return factory.createChannel(endpoint);
45 }
Alexander Afanasyevded17422018-04-03 19:00:23 -040046
47protected:
48 LimitedIo limitedIo;
Davide Pesavento4b89a6e2017-10-07 15:29:50 -040049};
Junxiao Shi0ba6d642017-07-17 00:53:22 +000050
Junxiao Shicde37ad2015-12-24 01:02:05 -070051BOOST_AUTO_TEST_SUITE(Face)
Junxiao Shi0ba6d642017-07-17 00:53:22 +000052BOOST_FIXTURE_TEST_SUITE(TestTcpFactory, TcpFactoryFixture)
Junxiao Shicde37ad2015-12-24 01:02:05 -070053
Junxiao Shi0ba6d642017-07-17 00:53:22 +000054BOOST_AUTO_TEST_SUITE(ProcessConfig)
Junxiao Shi38b24c72017-01-05 02:59:31 +000055
Davide Pesavento494a9552018-02-04 22:16:05 -050056BOOST_AUTO_TEST_CASE(Defaults)
57{
58 const std::string CONFIG = R"CONFIG(
59 face_system
60 {
61 tcp
62 }
63 )CONFIG";
64
65 parseConfig(CONFIG, true);
66 parseConfig(CONFIG, false);
67
68 checkChannelListEqual(factory, {"tcp4://0.0.0.0:6363", "tcp6://[::]:6363"});
69 auto channels = factory.getChannels();
70 BOOST_CHECK(std::all_of(channels.begin(), channels.end(),
71 [] (const shared_ptr<const Channel>& ch) { return ch->isListening(); }));
Alexander Afanasyevded17422018-04-03 19:00:23 -040072
73 BOOST_CHECK_EQUAL(factory.m_local.m_whitelist.size(), 2);
74 BOOST_CHECK_EQUAL(factory.m_local.m_whitelist.count("127.0.0.0/8"), 1);
75 BOOST_CHECK_EQUAL(factory.m_local.m_whitelist.count("::1/128"), 1);
76 BOOST_CHECK_EQUAL(factory.m_local.m_blacklist.size(), 0);
Davide Pesavento494a9552018-02-04 22:16:05 -050077}
78
79BOOST_AUTO_TEST_CASE(DisableListen)
Junxiao Shi38b24c72017-01-05 02:59:31 +000080{
81 const std::string CONFIG = R"CONFIG(
82 face_system
83 {
84 tcp
85 {
Davide Pesavento494a9552018-02-04 22:16:05 -050086 listen no
87 port 7001
88 }
89 }
90 )CONFIG";
91
92 parseConfig(CONFIG, true);
93 parseConfig(CONFIG, false);
94
95 checkChannelListEqual(factory, {"tcp4://0.0.0.0:7001", "tcp6://[::]:7001"});
96 auto channels = factory.getChannels();
97 BOOST_CHECK(std::none_of(channels.begin(), channels.end(),
98 [] (const shared_ptr<const Channel>& ch) { return ch->isListening(); }));
99}
100
101BOOST_AUTO_TEST_CASE(DisableV4)
102{
103 const std::string CONFIG = R"CONFIG(
104 face_system
105 {
106 tcp
107 {
108 port 7001
109 enable_v4 no
Junxiao Shi38b24c72017-01-05 02:59:31 +0000110 enable_v6 yes
111 }
112 }
113 )CONFIG";
114
Junxiao Shi1b65ca12017-01-21 23:04:41 +0000115 parseConfig(CONFIG, true);
116 parseConfig(CONFIG, false);
Junxiao Shi38b24c72017-01-05 02:59:31 +0000117
Davide Pesavento494a9552018-02-04 22:16:05 -0500118 checkChannelListEqual(factory, {"tcp6://[::]:7001"});
119}
120
121BOOST_AUTO_TEST_CASE(DisableV6)
122{
123 const std::string CONFIG = R"CONFIG(
124 face_system
125 {
126 tcp
127 {
128 port 7001
129 enable_v4 yes
130 enable_v6 no
131 }
132 }
133 )CONFIG";
134
135 parseConfig(CONFIG, true);
136 parseConfig(CONFIG, false);
137
138 checkChannelListEqual(factory, {"tcp4://0.0.0.0:7001"});
Junxiao Shi38b24c72017-01-05 02:59:31 +0000139}
140
Alexander Afanasyevded17422018-04-03 19:00:23 -0400141BOOST_AUTO_TEST_CASE(ConfigureLocal)
142{
143 const std::string CONFIG = R"CONFIG(
144 face_system
145 {
146 tcp
147 {
148 local {
149 whitelist {
150 subnet 127.0.0.0/8
151 }
152
153 blacklist {
154 subnet ::1/128
155 }
156 }
157 }
158 }
159 )CONFIG";
160
161 parseConfig(CONFIG, true);
162 parseConfig(CONFIG, false);
163
164 BOOST_CHECK_EQUAL(factory.m_local.m_whitelist.size(), 1);
165 BOOST_CHECK_EQUAL(factory.m_local.m_whitelist.count("127.0.0.0/8"), 1);
166 BOOST_CHECK_EQUAL(factory.m_local.m_blacklist.size(), 1);
167 BOOST_CHECK_EQUAL(factory.m_local.m_blacklist.count("::1/128"), 1);
168
169 createFace(factory,
170 FaceUri("tcp4://127.0.0.1:6363"),
171 {},
Eric Newberry812d6152018-06-06 15:06:01 -0700172 {ndn::nfd::FACE_PERSISTENCY_PERSISTENT, {}, {}, {}, false, false, false},
Alexander Afanasyevded17422018-04-03 19:00:23 -0400173 {CreateFaceExpectedResult::SUCCESS, 0, ""},
174 [] (const nfd::Face& face) {
175 BOOST_CHECK_EQUAL(face.getScope(), ndn::nfd::FACE_SCOPE_LOCAL);
176 });
177
178 limitedIo.run(1, 100_ms);
179}
180
181BOOST_AUTO_TEST_CASE(ConfigureNonLocal)
182{
183 const std::string CONFIG = R"CONFIG(
184 face_system
185 {
186 tcp
187 {
188 local {
189 whitelist {
190 *
191 }
192
193 blacklist {
194 subnet 127.0.0.0/8
195 subnet ::1/128
196 }
197 }
198 }
199 }
200 )CONFIG";
201
202 parseConfig(CONFIG, true);
203 parseConfig(CONFIG, false);
204
205 BOOST_CHECK_EQUAL(factory.m_local.m_whitelist.size(), 1);
206 BOOST_CHECK_EQUAL(factory.m_local.m_whitelist.count("*"), 1);
207 BOOST_CHECK_EQUAL(factory.m_local.m_blacklist.size(), 2);
208 BOOST_CHECK_EQUAL(factory.m_local.m_blacklist.count("127.0.0.0/8"), 1);
209 BOOST_CHECK_EQUAL(factory.m_local.m_blacklist.count("::1/128"), 1);
210
211 createFace(factory,
212 FaceUri("tcp4://127.0.0.1:6363"),
213 {},
Eric Newberry812d6152018-06-06 15:06:01 -0700214 {ndn::nfd::FACE_PERSISTENCY_PERSISTENT, {}, {}, {}, false, false, false},
Alexander Afanasyevded17422018-04-03 19:00:23 -0400215 {CreateFaceExpectedResult::SUCCESS, 0, ""},
216 [] (const nfd::Face& face) {
217 BOOST_CHECK_EQUAL(face.getScope(), ndn::nfd::FACE_SCOPE_NON_LOCAL);
218 });
219
220 limitedIo.run(1, 100_ms);
221}
222
Junxiao Shi38b24c72017-01-05 02:59:31 +0000223BOOST_AUTO_TEST_CASE(Omitted)
224{
225 const std::string CONFIG = R"CONFIG(
226 face_system
227 {
228 }
229 )CONFIG";
230
Junxiao Shi1b65ca12017-01-21 23:04:41 +0000231 parseConfig(CONFIG, true);
232 parseConfig(CONFIG, false);
Junxiao Shi38b24c72017-01-05 02:59:31 +0000233
Junxiao Shi38b24c72017-01-05 02:59:31 +0000234 BOOST_CHECK_EQUAL(factory.getChannels().size(), 0);
235}
236
Davide Pesavento494a9552018-02-04 22:16:05 -0500237BOOST_AUTO_TEST_CASE(AllDisabled)
238{
239 const std::string CONFIG = R"CONFIG(
240 face_system
241 {
242 tcp
243 {
244 enable_v4 no
245 enable_v6 no
246 }
247 }
248 )CONFIG";
249
250 BOOST_CHECK_THROW(parseConfig(CONFIG, true), ConfigFile::Error);
251 BOOST_CHECK_THROW(parseConfig(CONFIG, false), ConfigFile::Error);
252}
253
Junxiao Shi38b24c72017-01-05 02:59:31 +0000254BOOST_AUTO_TEST_CASE(BadListen)
255{
256 const std::string CONFIG = R"CONFIG(
257 face_system
258 {
259 tcp
260 {
261 listen hello
262 }
263 }
264 )CONFIG";
265
266 BOOST_CHECK_THROW(parseConfig(CONFIG, true), ConfigFile::Error);
267 BOOST_CHECK_THROW(parseConfig(CONFIG, false), ConfigFile::Error);
268}
269
Davide Pesavento494a9552018-02-04 22:16:05 -0500270BOOST_AUTO_TEST_CASE_EXPECTED_FAILURES(BadPort, 2) // Bug #4489
271BOOST_AUTO_TEST_CASE(BadPort)
Junxiao Shi38b24c72017-01-05 02:59:31 +0000272{
Davide Pesavento494a9552018-02-04 22:16:05 -0500273 // not a number
274 const std::string CONFIG1 = R"CONFIG(
Junxiao Shi38b24c72017-01-05 02:59:31 +0000275 face_system
276 {
277 tcp
278 {
Davide Pesavento494a9552018-02-04 22:16:05 -0500279 port hello
Junxiao Shi38b24c72017-01-05 02:59:31 +0000280 }
281 }
282 )CONFIG";
283
Davide Pesavento494a9552018-02-04 22:16:05 -0500284 BOOST_CHECK_THROW(parseConfig(CONFIG1, true), ConfigFile::Error);
285 BOOST_CHECK_THROW(parseConfig(CONFIG1, false), ConfigFile::Error);
286
287 // negative number
288 const std::string CONFIG2 = R"CONFIG(
289 face_system
290 {
291 tcp
292 {
293 port -1
294 }
295 }
296 )CONFIG";
297
298 BOOST_CHECK_THROW(parseConfig(CONFIG2, true), ConfigFile::Error);
299 BOOST_CHECK_THROW(parseConfig(CONFIG2, false), ConfigFile::Error);
300
301 // out of range
302 const std::string CONFIG3 = R"CONFIG(
303 face_system
304 {
305 tcp
306 {
307 port 65536
308 }
309 }
310 )CONFIG";
311
312 BOOST_CHECK_THROW(parseConfig(CONFIG3, true), ConfigFile::Error);
313 BOOST_CHECK_THROW(parseConfig(CONFIG3, false), ConfigFile::Error);
Junxiao Shi38b24c72017-01-05 02:59:31 +0000314}
315
316BOOST_AUTO_TEST_CASE(UnknownOption)
317{
318 const std::string CONFIG = R"CONFIG(
319 face_system
320 {
321 tcp
322 {
323 hello
324 }
325 }
326 )CONFIG";
327
328 BOOST_CHECK_THROW(parseConfig(CONFIG, true), ConfigFile::Error);
329 BOOST_CHECK_THROW(parseConfig(CONFIG, false), ConfigFile::Error);
330}
331
332BOOST_AUTO_TEST_SUITE_END() // ProcessConfig
333
Davide Pesaventob15276f2017-07-15 16:27:13 -0400334BOOST_AUTO_TEST_CASE(GetChannels)
Junxiao Shicde37ad2015-12-24 01:02:05 -0700335{
Davide Pesaventob15276f2017-07-15 16:27:13 -0400336 BOOST_CHECK_EQUAL(factory.getChannels().empty(), true);
337
338 std::set<std::string> expected;
Davide Pesavento4b89a6e2017-10-07 15:29:50 -0400339 expected.insert(createChannel("127.0.0.1", "20070")->getUri().toString());
340 expected.insert(createChannel("127.0.0.1", "20071")->getUri().toString());
341 expected.insert(createChannel("::1", "20071")->getUri().toString());
Davide Pesaventob15276f2017-07-15 16:27:13 -0400342 checkChannelListEqual(factory, expected);
343}
344
345BOOST_AUTO_TEST_CASE(CreateChannel)
346{
Davide Pesavento4b89a6e2017-10-07 15:29:50 -0400347 auto channel1 = createChannel("127.0.0.1", "20070");
348 auto channel1a = createChannel("127.0.0.1", "20070");
Junxiao Shicde37ad2015-12-24 01:02:05 -0700349 BOOST_CHECK_EQUAL(channel1, channel1a);
350 BOOST_CHECK_EQUAL(channel1->getUri().toString(), "tcp4://127.0.0.1:20070");
351
Davide Pesavento4b89a6e2017-10-07 15:29:50 -0400352 auto channel2 = createChannel("127.0.0.1", "20071");
Junxiao Shicde37ad2015-12-24 01:02:05 -0700353 BOOST_CHECK_NE(channel1, channel2);
354
Davide Pesavento4b89a6e2017-10-07 15:29:50 -0400355 auto channel3 = createChannel("::1", "20071");
Junxiao Shicde37ad2015-12-24 01:02:05 -0700356 BOOST_CHECK_NE(channel2, channel3);
357 BOOST_CHECK_EQUAL(channel3->getUri().toString(), "tcp6://[::1]:20071");
358}
359
Davide Pesaventob15276f2017-07-15 16:27:13 -0400360BOOST_AUTO_TEST_CASE(CreateFace)
Junxiao Shicde37ad2015-12-24 01:02:05 -0700361{
Eric Newberry42602412016-08-27 09:33:18 -0700362 createFace(factory,
363 FaceUri("tcp4://127.0.0.1:6363"),
Eric Newberry78e32b02017-04-01 14:34:44 +0000364 {},
Eric Newberry812d6152018-06-06 15:06:01 -0700365 {ndn::nfd::FACE_PERSISTENCY_PERSISTENT, {}, {}, {}, false, false, false},
Eric Newberry42602412016-08-27 09:33:18 -0700366 {CreateFaceExpectedResult::FAILURE, 504, "No channels available to connect"});
Junxiao Shicde37ad2015-12-24 01:02:05 -0700367
Davide Pesavento4b89a6e2017-10-07 15:29:50 -0400368 createChannel("127.0.0.1", "20071");
Junxiao Shicde37ad2015-12-24 01:02:05 -0700369
Eric Newberry42602412016-08-27 09:33:18 -0700370 createFace(factory,
Eric Newberry78e32b02017-04-01 14:34:44 +0000371 FaceUri("tcp4://127.0.0.1:6363"),
372 {},
Eric Newberry812d6152018-06-06 15:06:01 -0700373 {ndn::nfd::FACE_PERSISTENCY_PERSISTENT, {}, {}, {}, false, false, false},
Eric Newberry42602412016-08-27 09:33:18 -0700374 {CreateFaceExpectedResult::SUCCESS, 0, ""});
Davide Pesaventoa3c9ddb2017-04-10 22:15:24 -0400375
376 createFace(factory,
377 FaceUri("tcp4://127.0.0.1:6363"),
378 {},
Eric Newberry812d6152018-06-06 15:06:01 -0700379 {ndn::nfd::FACE_PERSISTENCY_PERMANENT, {}, {}, {}, false, false, false},
Davide Pesaventoa3c9ddb2017-04-10 22:15:24 -0400380 {CreateFaceExpectedResult::SUCCESS, 0, ""});
381
382 createFace(factory,
383 FaceUri("tcp4://127.0.0.1:20072"),
384 {},
Eric Newberry812d6152018-06-06 15:06:01 -0700385 {ndn::nfd::FACE_PERSISTENCY_PERMANENT, {}, {}, {}, false, false, false},
Eric Newberry2642cd22017-07-13 21:34:53 -0400386 {CreateFaceExpectedResult::SUCCESS, 0, ""});
387
388 createFace(factory,
389 FaceUri("tcp4://127.0.0.1:20073"),
390 {},
Eric Newberry812d6152018-06-06 15:06:01 -0700391 {ndn::nfd::FACE_PERSISTENCY_PERSISTENT, {}, {}, {}, false, true, false},
Eric Newberry0c3e57b2018-01-25 20:54:46 -0700392 {CreateFaceExpectedResult::SUCCESS, 0, ""});
393
394 createFace(factory,
395 FaceUri("tcp4://127.0.0.1:20073"),
396 {},
Eric Newberry812d6152018-06-06 15:06:01 -0700397 {ndn::nfd::FACE_PERSISTENCY_PERSISTENT, {}, {}, {}, false, false, true},
Davide Pesaventoa3c9ddb2017-04-10 22:15:24 -0400398 {CreateFaceExpectedResult::SUCCESS, 0, ""});
Junxiao Shicde37ad2015-12-24 01:02:05 -0700399}
400
Davide Pesaventob15276f2017-07-15 16:27:13 -0400401BOOST_AUTO_TEST_CASE(UnsupportedCreateFace)
Junxiao Shicde37ad2015-12-24 01:02:05 -0700402{
Davide Pesavento4b89a6e2017-10-07 15:29:50 -0400403 createChannel("127.0.0.1", "20071");
Junxiao Shicde37ad2015-12-24 01:02:05 -0700404
Eric Newberry42602412016-08-27 09:33:18 -0700405 createFace(factory,
Davide Pesavento46afec42017-05-28 14:28:47 -0400406 FaceUri("tcp4://127.0.0.1:20072"),
Eric Newberry42602412016-08-27 09:33:18 -0700407 FaceUri("tcp4://127.0.0.1:20071"),
Eric Newberry812d6152018-06-06 15:06:01 -0700408 {ndn::nfd::FACE_PERSISTENCY_PERSISTENT, {}, {}, {}, false, false, false},
Davide Pesavento46afec42017-05-28 14:28:47 -0400409 {CreateFaceExpectedResult::FAILURE, 406,
410 "Unicast TCP faces cannot be created with a LocalUri"});
411
412 createFace(factory,
413 FaceUri("tcp4://127.0.0.1:20072"),
Eric Newberry78e32b02017-04-01 14:34:44 +0000414 {},
Eric Newberry812d6152018-06-06 15:06:01 -0700415 {ndn::nfd::FACE_PERSISTENCY_ON_DEMAND, {}, {}, {}, false, false, false},
Eric Newberry42602412016-08-27 09:33:18 -0700416 {CreateFaceExpectedResult::FAILURE, 406,
Davide Pesavento46afec42017-05-28 14:28:47 -0400417 "Outgoing TCP faces do not support on-demand persistency"});
Eric Newberry78e32b02017-04-01 14:34:44 +0000418
419 createFace(factory,
Davide Pesavento46afec42017-05-28 14:28:47 -0400420 FaceUri("tcp4://198.51.100.100:6363"),
421 {},
Eric Newberry812d6152018-06-06 15:06:01 -0700422 {ndn::nfd::FACE_PERSISTENCY_PERSISTENT, {}, {}, {}, true, false, false},
Davide Pesavento46afec42017-05-28 14:28:47 -0400423 {CreateFaceExpectedResult::FAILURE, 406,
424 "Local fields can only be enabled on faces with local scope"});
Eric Newberry812d6152018-06-06 15:06:01 -0700425
426 createFace(factory,
427 FaceUri("tcp4://127.0.0.1:20072"),
428 {},
429 {ndn::nfd::FACE_PERSISTENCY_PERSISTENT, {}, {}, 1000, false, false, false},
430 {CreateFaceExpectedResult::FAILURE, 406,
431 "TCP faces do not support MTU overrides"});
Junxiao Shicde37ad2015-12-24 01:02:05 -0700432}
433
Davide Pesaventob15276f2017-07-15 16:27:13 -0400434class CreateFaceTimeoutFixture : public TcpFactoryFixture
Junxiao Shicde37ad2015-12-24 01:02:05 -0700435{
436public:
437 void
Davide Pesavento494a9552018-02-04 22:16:05 -0500438 onFaceCreated(const shared_ptr<nfd::Face>& newFace)
Junxiao Shicde37ad2015-12-24 01:02:05 -0700439 {
440 BOOST_CHECK_MESSAGE(false, "Timeout expected");
Davide Pesaventoa3c9ddb2017-04-10 22:15:24 -0400441 face = newFace;
Junxiao Shicde37ad2015-12-24 01:02:05 -0700442
443 limitedIo.afterOp();
444 }
445
446 void
447 onConnectFailed(const std::string& reason)
448 {
449 BOOST_CHECK_MESSAGE(true, reason);
450
451 limitedIo.afterOp();
452 }
453
454public:
Davide Pesavento494a9552018-02-04 22:16:05 -0500455 shared_ptr<nfd::Face> face;
Junxiao Shicde37ad2015-12-24 01:02:05 -0700456};
457
Davide Pesaventob15276f2017-07-15 16:27:13 -0400458BOOST_FIXTURE_TEST_CASE(CreateFaceTimeout, CreateFaceTimeoutFixture)
Junxiao Shicde37ad2015-12-24 01:02:05 -0700459{
Davide Pesavento4b89a6e2017-10-07 15:29:50 -0400460 createChannel("0.0.0.0", "20070");
Davide Pesavento15b55052018-01-27 19:09:28 -0500461 factory.createFace({FaceUri("tcp4://192.0.2.1:20070"), {}, {}},
Davide Pesaventob15276f2017-07-15 16:27:13 -0400462 bind(&CreateFaceTimeoutFixture::onFaceCreated, this, _1),
463 bind(&CreateFaceTimeoutFixture::onConnectFailed, this, _2));
Junxiao Shicde37ad2015-12-24 01:02:05 -0700464
Davide Pesavento15b55052018-01-27 19:09:28 -0500465 BOOST_REQUIRE_EQUAL(limitedIo.run(1, 10_s), LimitedIo::EXCEED_OPS);
Davide Pesaventoa3c9ddb2017-04-10 22:15:24 -0400466 BOOST_CHECK(face == nullptr);
Junxiao Shicde37ad2015-12-24 01:02:05 -0700467}
468
Junxiao Shicde37ad2015-12-24 01:02:05 -0700469BOOST_AUTO_TEST_SUITE_END() // TestTcpFactory
470BOOST_AUTO_TEST_SUITE_END() // Face
471
472} // namespace tests
Junxiao Shi38b24c72017-01-05 02:59:31 +0000473} // namespace face
Junxiao Shicde37ad2015-12-24 01:02:05 -0700474} // namespace nfd