blob: de68fe603a1d5fdee7510db5d3cc177ead9f67b3 [file] [log] [blame]
Junxiao Shi38f4ce92016-08-04 10:01:52 +00001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Junxiao Shi1f481fa2017-01-26 15:14:43 +00003 * Copyright (c) 2014-2017, Regents of the University of California,
Junxiao Shi38f4ce92016-08-04 10:01:52 +00004 * 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
Junxiao Shi331ade72016-08-19 14:07:19 +000026#include "nfdc/face-module.hpp"
Junxiao Shi38f4ce92016-08-04 10:01:52 +000027
Junxiao Shi1f481fa2017-01-26 15:14:43 +000028#include "execute-command-fixture.hpp"
29#include "status-fixture.hpp"
Junxiao Shi38f4ce92016-08-04 10:01:52 +000030
31namespace nfd {
32namespace tools {
Junxiao Shi331ade72016-08-19 14:07:19 +000033namespace nfdc {
Junxiao Shi38f4ce92016-08-04 10:01:52 +000034namespace tests {
35
Junxiao Shi1d7fef52017-02-02 05:33:14 +000036using ndn::nfd::FaceQueryFilter;
37
Junxiao Shi331ade72016-08-19 14:07:19 +000038BOOST_AUTO_TEST_SUITE(Nfdc)
Junxiao Shi1f481fa2017-01-26 15:14:43 +000039BOOST_AUTO_TEST_SUITE(TestFaceModule)
40
Junxiao Shi36e54292017-02-17 18:43:16 +000041BOOST_FIXTURE_TEST_SUITE(ListCommand, ExecuteCommandFixture)
42
43const std::string NONQUERY_OUTPUT =
44 "faceid=134 remote=udp4://233.252.0.4:6363 local=udp4://192.0.2.1:6363"
45 " counters={in={22562i 22031d 63n 2522915B} out={30121i 20940d 1218n 1353592B}}"
46 " flags={non-local permanent multi-access}\n"
47 "faceid=745 remote=fd://75 local=unix:///var/run/nfd.sock"
48 " counters={in={18998i 26701d 147n 4672308B} out={34779i 17028d 1176n 8957187B}}"
49 " flags={local on-demand point-to-point local-fields}\n";
50
51BOOST_AUTO_TEST_CASE(NormalNonQuery)
52{
53 this->processInterest = [this] (const Interest& interest) {
54 FaceStatus payload1;
55 payload1.setFaceId(134)
56 .setRemoteUri("udp4://233.252.0.4:6363")
57 .setLocalUri("udp4://192.0.2.1:6363")
58 .setFaceScope(ndn::nfd::FACE_SCOPE_NON_LOCAL)
59 .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERMANENT)
60 .setLinkType(ndn::nfd::LINK_TYPE_MULTI_ACCESS)
61 .setNInInterests(22562)
62 .setNInDatas(22031)
63 .setNInNacks(63)
64 .setNOutInterests(30121)
65 .setNOutDatas(20940)
66 .setNOutNacks(1218)
67 .setNInBytes(2522915)
68 .setNOutBytes(1353592);
69 FaceStatus payload2;
70 payload2.setFaceId(745)
71 .setRemoteUri("fd://75")
72 .setLocalUri("unix:///var/run/nfd.sock")
73 .setFaceScope(ndn::nfd::FACE_SCOPE_LOCAL)
74 .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_ON_DEMAND)
75 .setLinkType(ndn::nfd::LINK_TYPE_POINT_TO_POINT)
76 .setFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED, true)
77 .setNInInterests(18998)
78 .setNInDatas(26701)
79 .setNInNacks(147)
80 .setNOutInterests(34779)
81 .setNOutDatas(17028)
82 .setNOutNacks(1176)
83 .setNInBytes(4672308)
84 .setNOutBytes(8957187);
85 this->sendDataset("/localhost/nfd/faces/list", payload1, payload2);
86 };
87
88 this->execute("face list");
89 BOOST_CHECK_EQUAL(exitCode, 0);
90 BOOST_CHECK(out.is_equal(NONQUERY_OUTPUT));
91 BOOST_CHECK(err.is_empty());
92}
93
94const std::string QUERY_OUTPUT =
95 "faceid=177 remote=tcp4://53.239.9.114:6363 local=tcp4://164.0.31.106:20396"
96 " counters={in={2325i 1110d 79n 4716834B} out={2278i 485d 841n 308108B}}"
97 " flags={non-local persistent point-to-point}\n";
98
99BOOST_AUTO_TEST_CASE(NormalQuery)
100{
101 this->processInterest = [this] (const Interest& interest) {
102 BOOST_CHECK(Name("/localhost/nfd/faces/query").isPrefixOf(interest.getName()));
103 BOOST_CHECK_EQUAL(interest.getName().size(), 5);
104 FaceQueryFilter filter(interest.getName().at(4).blockFromValue());
105 FaceQueryFilter expectedFilter;
106 expectedFilter.setRemoteUri("tcp4://53.239.9.114:6363")
107 .setLocalUri("tcp4://164.0.31.106:20396")
108 .setUriScheme("tcp4");
109 BOOST_CHECK_EQUAL(filter, expectedFilter);
110
111 FaceStatus payload;
112 payload.setFaceId(177)
113 .setRemoteUri("tcp4://53.239.9.114:6363")
114 .setLocalUri("tcp4://164.0.31.106:20396")
115 .setFaceScope(ndn::nfd::FACE_SCOPE_NON_LOCAL)
116 .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERSISTENT)
117 .setLinkType(ndn::nfd::LINK_TYPE_POINT_TO_POINT)
118 .setNInInterests(2325)
119 .setNInDatas(1110)
120 .setNInNacks(79)
121 .setNOutInterests(2278)
122 .setNOutDatas(485)
123 .setNOutNacks(841)
124 .setNInBytes(4716834)
125 .setNOutBytes(308108);
126 this->sendDataset(interest.getName(), payload);
127 };
128
129 this->execute("face list tcp://53.239.9.114 scheme tcp4 local tcp://164.0.31.106:20396");
130 BOOST_CHECK_EQUAL(exitCode, 0);
131 BOOST_CHECK(out.is_equal(QUERY_OUTPUT));
132 BOOST_CHECK(err.is_empty());
133}
134
135BOOST_AUTO_TEST_CASE(NotFound)
136{
137 this->processInterest = [this] (const Interest& interest) {
138 this->sendEmptyDataset(interest.getName());
139 };
140
141 this->execute("face list scheme udp6");
142 BOOST_CHECK_EQUAL(exitCode, 3);
143 BOOST_CHECK(out.is_empty());
144 BOOST_CHECK(err.is_equal("Face not found\n"));
145}
146
147BOOST_AUTO_TEST_CASE(Error)
148{
149 this->processInterest = nullptr; // no response
150
151 this->execute("face list local udp4://31.67.17.2:6363");
152 BOOST_CHECK_EQUAL(exitCode, 1);
153 BOOST_CHECK(out.is_empty());
154 BOOST_CHECK(err.is_equal("Error 10060 when querying face: Timeout\n"));
155}
156
157BOOST_AUTO_TEST_SUITE_END() // ListCommand
158
Junxiao Shi1f481fa2017-01-26 15:14:43 +0000159BOOST_FIXTURE_TEST_SUITE(ShowCommand, ExecuteCommandFixture)
160
Junxiao Shi1f481fa2017-01-26 15:14:43 +0000161const std::string NORMAL_OUTPUT = std::string(R"TEXT(
162 faceid=256
163 remote=udp4://84.67.35.111:6363
164 local=udp4://79.91.49.215:6363
165counters={in={28975i 28232d 212n 13307258B} out={19525i 30993d 1038n 6231946B}}
166 flags={non-local on-demand point-to-point}
167)TEXT").substr(1);
168
169BOOST_AUTO_TEST_CASE(Normal)
170{
171 this->processInterest = [this] (const Interest& interest) {
Junxiao Shi36e54292017-02-17 18:43:16 +0000172 BOOST_CHECK(Name("/localhost/nfd/faces/query").isPrefixOf(interest.getName()));
Junxiao Shi8f803f22017-02-10 03:04:28 +0000173 BOOST_CHECK_EQUAL(interest.getName().size(), 5);
174 FaceQueryFilter filter(interest.getName().at(4).blockFromValue());
175 BOOST_CHECK_EQUAL(filter, FaceQueryFilter().setFaceId(256));
Junxiao Shi1f481fa2017-01-26 15:14:43 +0000176
177 FaceStatus payload;
178 payload.setFaceId(256)
179 .setRemoteUri("udp4://84.67.35.111:6363")
180 .setLocalUri("udp4://79.91.49.215:6363")
181 .setFaceScope(ndn::nfd::FACE_SCOPE_NON_LOCAL)
182 .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_ON_DEMAND)
183 .setLinkType(ndn::nfd::LINK_TYPE_POINT_TO_POINT)
184 .setNInInterests(28975)
185 .setNInDatas(28232)
186 .setNInNacks(212)
187 .setNOutInterests(19525)
188 .setNOutDatas(30993)
189 .setNOutNacks(1038)
190 .setNInBytes(13307258)
191 .setNOutBytes(6231946);
192
Junxiao Shi8f803f22017-02-10 03:04:28 +0000193 this->sendDataset(interest.getName(), payload);
Junxiao Shi1f481fa2017-01-26 15:14:43 +0000194 };
195
196 this->execute("face show 256");
197 BOOST_CHECK_EQUAL(exitCode, 0);
198 BOOST_CHECK(out.is_equal(NORMAL_OUTPUT));
199 BOOST_CHECK(err.is_empty());
200}
201
202BOOST_AUTO_TEST_CASE(NotFound)
203{
204 this->processInterest = [this] (const Interest& interest) {
205 this->sendEmptyDataset(interest.getName());
206 };
207
208 this->execute("face show 256");
209 BOOST_CHECK_EQUAL(exitCode, 3);
210 BOOST_CHECK(out.is_empty());
Junxiao Shi8f803f22017-02-10 03:04:28 +0000211 BOOST_CHECK(err.is_equal("Face not found\n"));
Junxiao Shi1f481fa2017-01-26 15:14:43 +0000212}
213
214BOOST_AUTO_TEST_CASE(Error)
215{
216 this->processInterest = nullptr; // no response
217
218 this->execute("face show 256");
219 BOOST_CHECK_EQUAL(exitCode, 1);
220 BOOST_CHECK(out.is_empty());
Junxiao Shi8f803f22017-02-10 03:04:28 +0000221 BOOST_CHECK(err.is_equal("Error 10060 when querying face: Timeout\n"));
Junxiao Shi1f481fa2017-01-26 15:14:43 +0000222}
223
224BOOST_AUTO_TEST_SUITE_END() // ShowCommand
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000225
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000226class ExecuteFaceCreateCommandFixture : public ExecuteCommandFixture
227{
228protected:
229 void
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000230 respond409(const Interest& interest, FacePersistency persistency)
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000231 {
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000232 MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/faces/create");
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000233 ControlParameters body;
234 body.setFaceId(1172)
235 .setUri("udp4://100.77.30.65:6363")
236 .setFacePersistency(persistency)
237 .setFlags(0);
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000238 this->failCommand(interest, 409, "conflict-409", body);
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000239 }
240};
Junxiao Shi1d7fef52017-02-02 05:33:14 +0000241
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000242BOOST_FIXTURE_TEST_SUITE(CreateCommand, ExecuteFaceCreateCommandFixture)
243
244BOOST_AUTO_TEST_CASE(Creating)
Junxiao Shi1d7fef52017-02-02 05:33:14 +0000245{
246 this->processInterest = [this] (const Interest& interest) {
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000247 ControlParameters req = MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/faces/create");
Junxiao Shi1d7fef52017-02-02 05:33:14 +0000248 BOOST_REQUIRE(req.hasUri());
249 BOOST_CHECK_EQUAL(req.getUri(), "udp4://159.242.33.78:6363");
Junxiao Shi0d976922017-04-01 14:35:21 +0000250 BOOST_CHECK(!req.hasLocalUri());
Junxiao Shi1d7fef52017-02-02 05:33:14 +0000251 BOOST_REQUIRE(req.hasFacePersistency());
252 BOOST_CHECK_EQUAL(req.getFacePersistency(), FacePersistency::FACE_PERSISTENCY_PERSISTENT);
253
254 ControlParameters resp;
255 resp.setFaceId(2130)
Junxiao Shi1d7fef52017-02-02 05:33:14 +0000256 .setFacePersistency(FacePersistency::FACE_PERSISTENCY_PERSISTENT);
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000257 this->succeedCommand(interest, resp);
Junxiao Shi1d7fef52017-02-02 05:33:14 +0000258 };
259
260 this->execute("face create udp://159.242.33.78");
261 BOOST_CHECK_EQUAL(exitCode, 0);
262 BOOST_CHECK(out.is_equal("face-created id=2130 remote=udp4://159.242.33.78:6363 persistency=persistent\n"));
263 BOOST_CHECK(err.is_empty());
264}
265
Junxiao Shi0d976922017-04-01 14:35:21 +0000266BOOST_AUTO_TEST_CASE(CreatingWithLocalUri)
267{
268 this->processInterest = [this] (const Interest& interest) {
269 ControlParameters req = MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/faces/create");
270 BOOST_REQUIRE(req.hasUri());
271 BOOST_CHECK_EQUAL(req.getUri(), "udp4://22.91.89.51:19903");
272 BOOST_REQUIRE(req.hasLocalUri());
273 BOOST_CHECK_EQUAL(req.getLocalUri(), "udp4://98.68.23.71:6363");
274 BOOST_REQUIRE(req.hasFacePersistency());
275 BOOST_CHECK_EQUAL(req.getFacePersistency(), FacePersistency::FACE_PERSISTENCY_PERMANENT);
276
277 ControlParameters resp;
278 resp.setFaceId(301)
279 .setFacePersistency(FacePersistency::FACE_PERSISTENCY_PERMANENT);
280 this->succeedCommand(interest, resp);
281 };
282
283 this->execute("face create udp://22.91.89.51:19903 permanent local udp://98.68.23.71");
284 BOOST_CHECK_EQUAL(exitCode, 0);
285 BOOST_CHECK(out.is_equal("face-created id=301 remote=udp4://22.91.89.51:19903 persistency=permanent\n"));
286 BOOST_CHECK(err.is_empty());
287}
288
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000289BOOST_AUTO_TEST_CASE(UpgradingPersistency)
290{
291 bool hasUpdateCommand = false;
292 this->processInterest = [this, &hasUpdateCommand] (const Interest& interest) {
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000293 if (parseCommand(interest, "/localhost/nfd/faces/create")) {
294 this->respond409(interest, FacePersistency::FACE_PERSISTENCY_ON_DEMAND);
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000295 return;
296 }
297
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000298 ControlParameters req = MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/faces/update");
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000299 hasUpdateCommand = true;
300 BOOST_REQUIRE(req.hasFaceId());
301 BOOST_CHECK_EQUAL(req.getFaceId(), 1172);
302 BOOST_REQUIRE(req.hasFacePersistency());
303 BOOST_CHECK_EQUAL(req.getFacePersistency(), FacePersistency::FACE_PERSISTENCY_PERSISTENT);
304 BOOST_CHECK(!req.hasFlags());
305
306 ControlParameters resp;
307 resp.setFaceId(1172)
308 .setFacePersistency(FacePersistency::FACE_PERSISTENCY_PERSISTENT)
309 .setFlags(0);
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000310 this->succeedCommand(interest, resp);
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000311 };
312
313 this->execute("face create udp://100.77.30.65");
314 BOOST_CHECK(hasUpdateCommand);
315 BOOST_CHECK_EQUAL(exitCode, 0);
316 BOOST_CHECK(out.is_equal("face-updated id=1172 remote=udp4://100.77.30.65:6363 persistency=persistent\n"));
317 BOOST_CHECK(err.is_empty());
318}
319
320BOOST_AUTO_TEST_CASE(NotDowngradingPersistency)
321{
322 this->processInterest = [this] (const Interest& interest) {
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000323 this->respond409(interest, FacePersistency::FACE_PERSISTENCY_PERMANENT);
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000324 // no command other than faces/create is expected
325 };
326
327 this->execute("face create udp://100.77.30.65");
328 BOOST_CHECK_EQUAL(exitCode, 0);
329 BOOST_CHECK(out.is_equal("face-exists id=1172 remote=udp4://100.77.30.65:6363 persistency=permanent\n"));
330 BOOST_CHECK(err.is_empty());
331}
332
333BOOST_AUTO_TEST_CASE(SamePersistency)
334{
335 this->processInterest = [this] (const Interest& interest) {
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000336 this->respond409(interest, FacePersistency::FACE_PERSISTENCY_PERSISTENT);
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000337 // no command other than faces/create is expected
338 };
339
340 this->execute("face create udp://100.77.30.65");
341 BOOST_CHECK_EQUAL(exitCode, 0);
342 BOOST_CHECK(out.is_equal("face-exists id=1172 remote=udp4://100.77.30.65:6363 persistency=persistent\n"));
343 BOOST_CHECK(err.is_empty());
344}
345
Junxiao Shi0d976922017-04-01 14:35:21 +0000346BOOST_AUTO_TEST_CASE(ErrorCanonizeRemote)
347{
348 this->execute("face create invalid://");
349 BOOST_CHECK_EQUAL(exitCode, 4);
350 BOOST_CHECK(out.is_empty());
351 BOOST_CHECK(err.is_equal("Error when canonizing 'invalid://': scheme not supported\n"));
352}
353
354BOOST_AUTO_TEST_CASE(ErrorCanonizeLocal)
355{
356 this->execute("face create udp4://24.37.20.47:6363 local invalid://");
357 BOOST_CHECK_EQUAL(exitCode, 4);
358 BOOST_CHECK(out.is_empty());
359 BOOST_CHECK(err.is_equal("Error when canonizing 'invalid://': scheme not supported\n"));
360}
361
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000362BOOST_AUTO_TEST_CASE(ErrorCreate)
Junxiao Shi1d7fef52017-02-02 05:33:14 +0000363{
364 this->processInterest = nullptr; // no response
365
366 this->execute("face create udp://159.242.33.78");
367 BOOST_CHECK_EQUAL(exitCode, 1);
368 BOOST_CHECK(out.is_empty());
369 BOOST_CHECK(err.is_equal("Error 10060 when creating face: request timed out\n"));
370}
371
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000372BOOST_AUTO_TEST_CASE(ErrorConflict)
373{
374 // Current NFD will not report a 409-conflict with a different remote FaceUri, but this is
375 // allowed by FaceMgmt protocol and nfdc should not attempt to upgrade persistency in this case.
376
377 this->processInterest = [this] (const Interest& interest) {
378 // conflict with udp4://100.77.30.65:6363
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000379 this->respond409(interest, FacePersistency::FACE_PERSISTENCY_ON_DEMAND);
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000380 };
381
382 this->execute("face create udp://20.53.73.45");
383 BOOST_CHECK_EQUAL(exitCode, 1);
384 BOOST_CHECK(out.is_empty());
385 BOOST_CHECK(err.is_equal("Error 409 when creating face: conflict-409\n"));
386}
387
388BOOST_AUTO_TEST_CASE(ErrorUpdate)
389{
390 this->processInterest = [this] (const Interest& interest) {
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000391 if (parseCommand(interest, "/localhost/nfd/faces/create")) {
392 this->respond409(interest, FacePersistency::FACE_PERSISTENCY_ON_DEMAND);
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000393 return;
394 }
395
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000396 MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/faces/update");
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000397 // no response to faces/update
398 };
399
400 this->execute("face create udp://100.77.30.65");
401 BOOST_CHECK_EQUAL(exitCode, 1);
402 BOOST_CHECK(out.is_empty());
403 BOOST_CHECK(err.is_equal("Error 10060 when upgrading face persistency: request timed out\n"));
404}
405
Junxiao Shi1d7fef52017-02-02 05:33:14 +0000406BOOST_AUTO_TEST_SUITE_END() // CreateCommand
407
Junxiao Shi05dd4442017-02-06 22:50:07 +0000408BOOST_FIXTURE_TEST_SUITE(DestroyCommand, ExecuteCommandFixture)
409
410BOOST_AUTO_TEST_CASE(NormalByFaceId)
411{
412 this->processInterest = [this] (const Interest& interest) {
Junxiao Shi918e5d42017-02-25 03:58:21 +0000413 if (this->respondFaceQuery(interest)) {
Junxiao Shi05dd4442017-02-06 22:50:07 +0000414 return;
415 }
416
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000417 ControlParameters req = MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/faces/destroy");
Junxiao Shi05dd4442017-02-06 22:50:07 +0000418 BOOST_REQUIRE(req.hasFaceId());
419 BOOST_CHECK_EQUAL(req.getFaceId(), 10156);
420
421 ControlParameters resp;
422 resp.setFaceId(10156);
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000423 this->succeedCommand(interest, resp);
Junxiao Shi05dd4442017-02-06 22:50:07 +0000424 };
425
426 this->execute("face destroy 10156");
427 BOOST_CHECK_EQUAL(exitCode, 0);
428 BOOST_CHECK(out.is_equal("face-destroyed id=10156 local=tcp4://151.26.163.27:22967 "
429 "remote=tcp4://198.57.27.40:6363 persistency=persistent\n"));
430 BOOST_CHECK(err.is_empty());
431}
432
433BOOST_AUTO_TEST_CASE(NormalByFaceUri)
434{
435 this->processInterest = [this] (const Interest& interest) {
Junxiao Shi918e5d42017-02-25 03:58:21 +0000436 if (this->respondFaceQuery(interest)) {
Junxiao Shi05dd4442017-02-06 22:50:07 +0000437 return;
438 }
439
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000440 ControlParameters req = MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/faces/destroy");
Junxiao Shi05dd4442017-02-06 22:50:07 +0000441 BOOST_REQUIRE(req.hasFaceId());
442 BOOST_CHECK_EQUAL(req.getFaceId(), 2249);
443
444 ControlParameters resp;
445 resp.setFaceId(2249);
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000446 this->succeedCommand(interest, resp);
Junxiao Shi05dd4442017-02-06 22:50:07 +0000447 };
448
449 this->execute("face destroy tcp://32.121.182.82");
450 BOOST_CHECK_EQUAL(exitCode, 0);
451 BOOST_CHECK(out.is_equal("face-destroyed id=2249 local=tcp4://30.99.87.98:31414 "
452 "remote=tcp4://32.121.182.82:6363 persistency=persistent\n"));
453 BOOST_CHECK(err.is_empty());
454}
455
456BOOST_AUTO_TEST_CASE(FaceNotExist)
457{
458 this->processInterest = [this] (const Interest& interest) {
Junxiao Shi918e5d42017-02-25 03:58:21 +0000459 BOOST_CHECK(this->respondFaceQuery(interest));
Junxiao Shi05dd4442017-02-06 22:50:07 +0000460 };
461
462 this->execute("face destroy 23728");
463 BOOST_CHECK_EQUAL(exitCode, 3);
464 BOOST_CHECK(out.is_empty());
465 BOOST_CHECK(err.is_equal("Face not found\n"));
466}
467
468BOOST_AUTO_TEST_CASE(Ambiguous)
469{
470 this->processInterest = [this] (const Interest& interest) {
Junxiao Shi918e5d42017-02-25 03:58:21 +0000471 BOOST_CHECK(this->respondFaceQuery(interest));
Junxiao Shi05dd4442017-02-06 22:50:07 +0000472 };
473
474 this->execute("face destroy udp4://225.131.75.231:56363");
475 BOOST_CHECK_EQUAL(exitCode, 5);
476 BOOST_CHECK(out.is_empty());
477 BOOST_CHECK(err.is_equal("Multiple faces match specified remote FaceUri. "
478 "Re-run the command with a FaceId: "
479 "6720 (local=udp4://202.83.168.28:56363), "
480 "31066 (local=udp4://25.90.26.32:56363)\n"));
481}
482
483BOOST_AUTO_TEST_CASE(ErrorCanonization)
484{
485 this->execute("face destroy udp6://32.38.164.64:10445");
486 BOOST_CHECK_EQUAL(exitCode, 4);
487 BOOST_CHECK(out.is_empty());
488 BOOST_CHECK(err.is_equal("Error during remote FaceUri canonization: "
489 "No endpoints match the specified address selector\n"));
490}
491
492BOOST_AUTO_TEST_CASE(ErrorDataset)
493{
494 this->processInterest = nullptr; // no response to dataset or command
495
496 this->execute("face destroy udp://159.242.33.78");
497 BOOST_CHECK_EQUAL(exitCode, 1);
498 BOOST_CHECK(out.is_empty());
499 BOOST_CHECK(err.is_equal("Error 10060 when querying face: Timeout\n"));
500}
501
502BOOST_AUTO_TEST_CASE(ErrorCommand)
503{
504 this->processInterest = [this] (const Interest& interest) {
Junxiao Shi918e5d42017-02-25 03:58:21 +0000505 if (this->respondFaceQuery(interest)) {
Junxiao Shi05dd4442017-02-06 22:50:07 +0000506 return;
507 }
508
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000509 MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/faces/destroy");
Junxiao Shi05dd4442017-02-06 22:50:07 +0000510 // no response to command
511 };
512
Junxiao Shi918e5d42017-02-25 03:58:21 +0000513 this->execute("face destroy 10156");
Junxiao Shi05dd4442017-02-06 22:50:07 +0000514 BOOST_CHECK_EQUAL(exitCode, 1);
515 BOOST_CHECK(out.is_empty());
516 BOOST_CHECK(err.is_equal("Error 10060 when destroying face: request timed out\n"));
517}
518
519BOOST_AUTO_TEST_SUITE_END() // DestroyCommand
520
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000521const std::string STATUS_XML = stripXmlSpaces(R"XML(
522 <faces>
523 <face>
524 <faceId>134</faceId>
525 <remoteUri>udp4://233.252.0.4:6363</remoteUri>
526 <localUri>udp4://192.0.2.1:6363</localUri>
527 <faceScope>non-local</faceScope>
528 <facePersistency>permanent</facePersistency>
529 <linkType>multi-access</linkType>
Eric Newberry6d932e82016-11-24 05:05:43 +0000530 <flags/>
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000531 <packetCounters>
532 <incomingPackets>
533 <nInterests>22562</nInterests>
534 <nDatas>22031</nDatas>
535 <nNacks>63</nNacks>
536 </incomingPackets>
537 <outgoingPackets>
538 <nInterests>30121</nInterests>
539 <nDatas>20940</nDatas>
540 <nNacks>1218</nNacks>
541 </outgoingPackets>
542 </packetCounters>
543 <byteCounters>
544 <incomingBytes>2522915</incomingBytes>
545 <outgoingBytes>1353592</outgoingBytes>
546 </byteCounters>
547 </face>
548 <face>
549 <faceId>745</faceId>
550 <remoteUri>fd://75</remoteUri>
551 <localUri>unix:///var/run/nfd.sock</localUri>
552 <faceScope>local</faceScope>
553 <facePersistency>on-demand</facePersistency>
554 <linkType>point-to-point</linkType>
Eric Newberry6d932e82016-11-24 05:05:43 +0000555 <flags>
556 <localFieldsEnabled/>
557 </flags>
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000558 <packetCounters>
559 <incomingPackets>
560 <nInterests>18998</nInterests>
561 <nDatas>26701</nDatas>
562 <nNacks>147</nNacks>
563 </incomingPackets>
564 <outgoingPackets>
565 <nInterests>34779</nInterests>
566 <nDatas>17028</nDatas>
567 <nNacks>1176</nNacks>
568 </outgoingPackets>
569 </packetCounters>
570 <byteCounters>
571 <incomingBytes>4672308</incomingBytes>
572 <outgoingBytes>8957187</outgoingBytes>
573 </byteCounters>
574 </face>
575 </faces>
576)XML");
577
578const std::string STATUS_TEXT =
579 "Faces:\n"
580 " faceid=134 remote=udp4://233.252.0.4:6363 local=udp4://192.0.2.1:6363"
581 " counters={in={22562i 22031d 63n 2522915B} out={30121i 20940d 1218n 1353592B}}"
Junxiao Shi1f481fa2017-01-26 15:14:43 +0000582 " flags={non-local permanent multi-access}\n"
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000583 " faceid=745 remote=fd://75 local=unix:///var/run/nfd.sock"
584 " counters={in={18998i 26701d 147n 4672308B} out={34779i 17028d 1176n 8957187B}}"
Junxiao Shi1f481fa2017-01-26 15:14:43 +0000585 " flags={local on-demand point-to-point local-fields}\n";
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000586
Junxiao Shi1f481fa2017-01-26 15:14:43 +0000587BOOST_FIXTURE_TEST_CASE(Status, StatusFixture<FaceModule>)
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000588{
589 this->fetchStatus();
590 FaceStatus payload1;
591 payload1.setFaceId(134)
592 .setRemoteUri("udp4://233.252.0.4:6363")
593 .setLocalUri("udp4://192.0.2.1:6363")
594 .setFaceScope(ndn::nfd::FACE_SCOPE_NON_LOCAL)
595 .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERMANENT)
596 .setLinkType(ndn::nfd::LINK_TYPE_MULTI_ACCESS)
597 .setNInInterests(22562)
598 .setNInDatas(22031)
599 .setNInNacks(63)
600 .setNOutInterests(30121)
601 .setNOutDatas(20940)
602 .setNOutNacks(1218)
603 .setNInBytes(2522915)
604 .setNOutBytes(1353592);
605 FaceStatus payload2;
606 payload2.setFaceId(745)
607 .setRemoteUri("fd://75")
608 .setLocalUri("unix:///var/run/nfd.sock")
609 .setFaceScope(ndn::nfd::FACE_SCOPE_LOCAL)
610 .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_ON_DEMAND)
611 .setLinkType(ndn::nfd::LINK_TYPE_POINT_TO_POINT)
Eric Newberry6d932e82016-11-24 05:05:43 +0000612 .setFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED, true)
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000613 .setNInInterests(18998)
614 .setNInDatas(26701)
615 .setNInNacks(147)
616 .setNOutInterests(34779)
617 .setNOutDatas(17028)
618 .setNOutNacks(1176)
619 .setNInBytes(4672308)
620 .setNOutBytes(8957187);
621 this->sendDataset("/localhost/nfd/faces/list", payload1, payload2);
622 this->prepareStatusOutput();
623
624 BOOST_CHECK(statusXml.is_equal(STATUS_XML));
625 BOOST_CHECK(statusText.is_equal(STATUS_TEXT));
626}
627
628BOOST_AUTO_TEST_SUITE_END() // TestFaceModule
Junxiao Shi331ade72016-08-19 14:07:19 +0000629BOOST_AUTO_TEST_SUITE_END() // Nfdc
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000630
631} // namespace tests
Junxiao Shi331ade72016-08-19 14:07:19 +0000632} // namespace nfdc
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000633} // namespace tools
634} // namespace nfd