blob: ee892aff0ea8c0a38453b1dea3910d1ffd1ed7d6 [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)
Junxiao Shif03d4792017-04-06 16:41:22 +000062 .setNInData(22031)
Junxiao Shi36e54292017-02-17 18:43:16 +000063 .setNInNacks(63)
64 .setNOutInterests(30121)
Junxiao Shif03d4792017-04-06 16:41:22 +000065 .setNOutData(20940)
Junxiao Shi36e54292017-02-17 18:43:16 +000066 .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)
Junxiao Shif03d4792017-04-06 16:41:22 +000078 .setNInData(26701)
Junxiao Shi36e54292017-02-17 18:43:16 +000079 .setNInNacks(147)
80 .setNOutInterests(34779)
Junxiao Shif03d4792017-04-06 16:41:22 +000081 .setNOutData(17028)
Junxiao Shi36e54292017-02-17 18:43:16 +000082 .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)
Junxiao Shif03d4792017-04-06 16:41:22 +0000119 .setNInData(1110)
Junxiao Shi36e54292017-02-17 18:43:16 +0000120 .setNInNacks(79)
121 .setNOutInterests(2278)
Junxiao Shif03d4792017-04-06 16:41:22 +0000122 .setNOutData(485)
Junxiao Shi36e54292017-02-17 18:43:16 +0000123 .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)
Junxiao Shif03d4792017-04-06 16:41:22 +0000185 .setNInData(28232)
Junxiao Shi1f481fa2017-01-26 15:14:43 +0000186 .setNInNacks(212)
187 .setNOutInterests(19525)
Junxiao Shif03d4792017-04-06 16:41:22 +0000188 .setNOutData(30993)
Junxiao Shi1f481fa2017-01-26 15:14:43 +0000189 .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")
Junxiao Shi1cce2a32017-05-02 02:39:55 +0000236 .setLocalUri("udp4://68.62.26.57:24087")
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000237 .setFacePersistency(persistency)
238 .setFlags(0);
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000239 this->failCommand(interest, 409, "conflict-409", body);
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000240 }
241};
Junxiao Shi1d7fef52017-02-02 05:33:14 +0000242
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000243BOOST_FIXTURE_TEST_SUITE(CreateCommand, ExecuteFaceCreateCommandFixture)
244
245BOOST_AUTO_TEST_CASE(Creating)
Junxiao Shi1d7fef52017-02-02 05:33:14 +0000246{
247 this->processInterest = [this] (const Interest& interest) {
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000248 ControlParameters req = MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/faces/create");
Junxiao Shi1d7fef52017-02-02 05:33:14 +0000249 BOOST_REQUIRE(req.hasUri());
250 BOOST_CHECK_EQUAL(req.getUri(), "udp4://159.242.33.78:6363");
Junxiao Shi0d976922017-04-01 14:35:21 +0000251 BOOST_CHECK(!req.hasLocalUri());
Junxiao Shi1d7fef52017-02-02 05:33:14 +0000252 BOOST_REQUIRE(req.hasFacePersistency());
253 BOOST_CHECK_EQUAL(req.getFacePersistency(), FacePersistency::FACE_PERSISTENCY_PERSISTENT);
254
255 ControlParameters resp;
256 resp.setFaceId(2130)
Junxiao Shi1cce2a32017-05-02 02:39:55 +0000257 .setUri("udp4://159.242.33.78:6363")
258 .setLocalUri("udp4://179.63.153.45:28835")
Junxiao Shi1d7fef52017-02-02 05:33:14 +0000259 .setFacePersistency(FacePersistency::FACE_PERSISTENCY_PERSISTENT);
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000260 this->succeedCommand(interest, resp);
Junxiao Shi1d7fef52017-02-02 05:33:14 +0000261 };
262
263 this->execute("face create udp://159.242.33.78");
264 BOOST_CHECK_EQUAL(exitCode, 0);
Junxiao Shi1cce2a32017-05-02 02:39:55 +0000265 BOOST_CHECK(out.is_equal("face-created id=2130 local=udp4://179.63.153.45:28835 "
266 "remote=udp4://159.242.33.78:6363 persistency=persistent\n"));
Junxiao Shi1d7fef52017-02-02 05:33:14 +0000267 BOOST_CHECK(err.is_empty());
268}
269
Junxiao Shi0d976922017-04-01 14:35:21 +0000270BOOST_AUTO_TEST_CASE(CreatingWithLocalUri)
271{
272 this->processInterest = [this] (const Interest& interest) {
273 ControlParameters req = MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/faces/create");
274 BOOST_REQUIRE(req.hasUri());
275 BOOST_CHECK_EQUAL(req.getUri(), "udp4://22.91.89.51:19903");
276 BOOST_REQUIRE(req.hasLocalUri());
277 BOOST_CHECK_EQUAL(req.getLocalUri(), "udp4://98.68.23.71:6363");
278 BOOST_REQUIRE(req.hasFacePersistency());
279 BOOST_CHECK_EQUAL(req.getFacePersistency(), FacePersistency::FACE_PERSISTENCY_PERMANENT);
280
281 ControlParameters resp;
282 resp.setFaceId(301)
Junxiao Shi1cce2a32017-05-02 02:39:55 +0000283 .setUri("udp4://22.91.89.51:19903")
284 .setLocalUri("udp4://98.68.23.71:6363")
Junxiao Shi0d976922017-04-01 14:35:21 +0000285 .setFacePersistency(FacePersistency::FACE_PERSISTENCY_PERMANENT);
286 this->succeedCommand(interest, resp);
287 };
288
289 this->execute("face create udp://22.91.89.51:19903 permanent local udp://98.68.23.71");
290 BOOST_CHECK_EQUAL(exitCode, 0);
Junxiao Shi1cce2a32017-05-02 02:39:55 +0000291 BOOST_CHECK(out.is_equal("face-created id=301 local=udp4://98.68.23.71:6363 "
292 "remote=udp4://22.91.89.51:19903 persistency=permanent\n"));
Junxiao Shi0d976922017-04-01 14:35:21 +0000293 BOOST_CHECK(err.is_empty());
294}
295
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000296BOOST_AUTO_TEST_CASE(UpgradingPersistency)
297{
298 bool hasUpdateCommand = false;
299 this->processInterest = [this, &hasUpdateCommand] (const Interest& interest) {
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000300 if (parseCommand(interest, "/localhost/nfd/faces/create")) {
301 this->respond409(interest, FacePersistency::FACE_PERSISTENCY_ON_DEMAND);
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000302 return;
303 }
304
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000305 ControlParameters req = MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/faces/update");
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000306 hasUpdateCommand = true;
307 BOOST_REQUIRE(req.hasFaceId());
308 BOOST_CHECK_EQUAL(req.getFaceId(), 1172);
309 BOOST_REQUIRE(req.hasFacePersistency());
310 BOOST_CHECK_EQUAL(req.getFacePersistency(), FacePersistency::FACE_PERSISTENCY_PERSISTENT);
311 BOOST_CHECK(!req.hasFlags());
312
313 ControlParameters resp;
314 resp.setFaceId(1172)
315 .setFacePersistency(FacePersistency::FACE_PERSISTENCY_PERSISTENT)
316 .setFlags(0);
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000317 this->succeedCommand(interest, resp);
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000318 };
319
320 this->execute("face create udp://100.77.30.65");
321 BOOST_CHECK(hasUpdateCommand);
322 BOOST_CHECK_EQUAL(exitCode, 0);
Junxiao Shi1cce2a32017-05-02 02:39:55 +0000323 BOOST_CHECK(out.is_equal("face-updated id=1172 local=udp4://68.62.26.57:24087 "
324 "remote=udp4://100.77.30.65:6363 persistency=persistent\n"));
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000325 BOOST_CHECK(err.is_empty());
326}
327
328BOOST_AUTO_TEST_CASE(NotDowngradingPersistency)
329{
330 this->processInterest = [this] (const Interest& interest) {
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000331 this->respond409(interest, FacePersistency::FACE_PERSISTENCY_PERMANENT);
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000332 // no command other than faces/create is expected
333 };
334
335 this->execute("face create udp://100.77.30.65");
336 BOOST_CHECK_EQUAL(exitCode, 0);
Junxiao Shi1cce2a32017-05-02 02:39:55 +0000337 BOOST_CHECK(out.is_equal("face-exists id=1172 local=udp4://68.62.26.57:24087 "
338 "remote=udp4://100.77.30.65:6363 persistency=permanent\n"));
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000339 BOOST_CHECK(err.is_empty());
340}
341
342BOOST_AUTO_TEST_CASE(SamePersistency)
343{
344 this->processInterest = [this] (const Interest& interest) {
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000345 this->respond409(interest, FacePersistency::FACE_PERSISTENCY_PERSISTENT);
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000346 // no command other than faces/create is expected
347 };
348
349 this->execute("face create udp://100.77.30.65");
350 BOOST_CHECK_EQUAL(exitCode, 0);
Junxiao Shi1cce2a32017-05-02 02:39:55 +0000351 BOOST_CHECK(out.is_equal("face-exists id=1172 local=udp4://68.62.26.57:24087 "
352 "remote=udp4://100.77.30.65:6363 persistency=persistent\n"));
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000353 BOOST_CHECK(err.is_empty());
354}
355
Junxiao Shi0d976922017-04-01 14:35:21 +0000356BOOST_AUTO_TEST_CASE(ErrorCanonizeRemote)
357{
358 this->execute("face create invalid://");
359 BOOST_CHECK_EQUAL(exitCode, 4);
360 BOOST_CHECK(out.is_empty());
361 BOOST_CHECK(err.is_equal("Error when canonizing 'invalid://': scheme not supported\n"));
362}
363
364BOOST_AUTO_TEST_CASE(ErrorCanonizeLocal)
365{
366 this->execute("face create udp4://24.37.20.47:6363 local invalid://");
367 BOOST_CHECK_EQUAL(exitCode, 4);
368 BOOST_CHECK(out.is_empty());
369 BOOST_CHECK(err.is_equal("Error when canonizing 'invalid://': scheme not supported\n"));
370}
371
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000372BOOST_AUTO_TEST_CASE(ErrorCreate)
Junxiao Shi1d7fef52017-02-02 05:33:14 +0000373{
374 this->processInterest = nullptr; // no response
375
376 this->execute("face create udp://159.242.33.78");
377 BOOST_CHECK_EQUAL(exitCode, 1);
378 BOOST_CHECK(out.is_empty());
379 BOOST_CHECK(err.is_equal("Error 10060 when creating face: request timed out\n"));
380}
381
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000382BOOST_AUTO_TEST_CASE(ErrorConflict)
383{
384 // Current NFD will not report a 409-conflict with a different remote FaceUri, but this is
385 // allowed by FaceMgmt protocol and nfdc should not attempt to upgrade persistency in this case.
386
387 this->processInterest = [this] (const Interest& interest) {
388 // conflict with udp4://100.77.30.65:6363
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000389 this->respond409(interest, FacePersistency::FACE_PERSISTENCY_ON_DEMAND);
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000390 };
391
392 this->execute("face create udp://20.53.73.45");
393 BOOST_CHECK_EQUAL(exitCode, 1);
394 BOOST_CHECK(out.is_empty());
395 BOOST_CHECK(err.is_equal("Error 409 when creating face: conflict-409\n"));
396}
397
398BOOST_AUTO_TEST_CASE(ErrorUpdate)
399{
400 this->processInterest = [this] (const Interest& interest) {
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000401 if (parseCommand(interest, "/localhost/nfd/faces/create")) {
402 this->respond409(interest, FacePersistency::FACE_PERSISTENCY_ON_DEMAND);
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000403 return;
404 }
405
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000406 MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/faces/update");
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000407 // no response to faces/update
408 };
409
410 this->execute("face create udp://100.77.30.65");
411 BOOST_CHECK_EQUAL(exitCode, 1);
412 BOOST_CHECK(out.is_empty());
413 BOOST_CHECK(err.is_equal("Error 10060 when upgrading face persistency: request timed out\n"));
414}
415
Junxiao Shi1d7fef52017-02-02 05:33:14 +0000416BOOST_AUTO_TEST_SUITE_END() // CreateCommand
417
Junxiao Shi05dd4442017-02-06 22:50:07 +0000418BOOST_FIXTURE_TEST_SUITE(DestroyCommand, ExecuteCommandFixture)
419
420BOOST_AUTO_TEST_CASE(NormalByFaceId)
421{
422 this->processInterest = [this] (const Interest& interest) {
Junxiao Shi918e5d42017-02-25 03:58:21 +0000423 if (this->respondFaceQuery(interest)) {
Junxiao Shi05dd4442017-02-06 22:50:07 +0000424 return;
425 }
426
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000427 ControlParameters req = MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/faces/destroy");
Junxiao Shi05dd4442017-02-06 22:50:07 +0000428 BOOST_REQUIRE(req.hasFaceId());
429 BOOST_CHECK_EQUAL(req.getFaceId(), 10156);
430
431 ControlParameters resp;
432 resp.setFaceId(10156);
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000433 this->succeedCommand(interest, resp);
Junxiao Shi05dd4442017-02-06 22:50:07 +0000434 };
435
436 this->execute("face destroy 10156");
437 BOOST_CHECK_EQUAL(exitCode, 0);
438 BOOST_CHECK(out.is_equal("face-destroyed id=10156 local=tcp4://151.26.163.27:22967 "
439 "remote=tcp4://198.57.27.40:6363 persistency=persistent\n"));
440 BOOST_CHECK(err.is_empty());
441}
442
443BOOST_AUTO_TEST_CASE(NormalByFaceUri)
444{
445 this->processInterest = [this] (const Interest& interest) {
Junxiao Shi918e5d42017-02-25 03:58:21 +0000446 if (this->respondFaceQuery(interest)) {
Junxiao Shi05dd4442017-02-06 22:50:07 +0000447 return;
448 }
449
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000450 ControlParameters req = MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/faces/destroy");
Junxiao Shi05dd4442017-02-06 22:50:07 +0000451 BOOST_REQUIRE(req.hasFaceId());
452 BOOST_CHECK_EQUAL(req.getFaceId(), 2249);
453
454 ControlParameters resp;
455 resp.setFaceId(2249);
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000456 this->succeedCommand(interest, resp);
Junxiao Shi05dd4442017-02-06 22:50:07 +0000457 };
458
459 this->execute("face destroy tcp://32.121.182.82");
460 BOOST_CHECK_EQUAL(exitCode, 0);
461 BOOST_CHECK(out.is_equal("face-destroyed id=2249 local=tcp4://30.99.87.98:31414 "
462 "remote=tcp4://32.121.182.82:6363 persistency=persistent\n"));
463 BOOST_CHECK(err.is_empty());
464}
465
466BOOST_AUTO_TEST_CASE(FaceNotExist)
467{
468 this->processInterest = [this] (const Interest& interest) {
Junxiao Shi918e5d42017-02-25 03:58:21 +0000469 BOOST_CHECK(this->respondFaceQuery(interest));
Junxiao Shi05dd4442017-02-06 22:50:07 +0000470 };
471
472 this->execute("face destroy 23728");
473 BOOST_CHECK_EQUAL(exitCode, 3);
474 BOOST_CHECK(out.is_empty());
475 BOOST_CHECK(err.is_equal("Face not found\n"));
476}
477
478BOOST_AUTO_TEST_CASE(Ambiguous)
479{
480 this->processInterest = [this] (const Interest& interest) {
Junxiao Shi918e5d42017-02-25 03:58:21 +0000481 BOOST_CHECK(this->respondFaceQuery(interest));
Junxiao Shi05dd4442017-02-06 22:50:07 +0000482 };
483
484 this->execute("face destroy udp4://225.131.75.231:56363");
485 BOOST_CHECK_EQUAL(exitCode, 5);
486 BOOST_CHECK(out.is_empty());
487 BOOST_CHECK(err.is_equal("Multiple faces match specified remote FaceUri. "
488 "Re-run the command with a FaceId: "
489 "6720 (local=udp4://202.83.168.28:56363), "
490 "31066 (local=udp4://25.90.26.32:56363)\n"));
491}
492
493BOOST_AUTO_TEST_CASE(ErrorCanonization)
494{
495 this->execute("face destroy udp6://32.38.164.64:10445");
496 BOOST_CHECK_EQUAL(exitCode, 4);
497 BOOST_CHECK(out.is_empty());
498 BOOST_CHECK(err.is_equal("Error during remote FaceUri canonization: "
499 "No endpoints match the specified address selector\n"));
500}
501
502BOOST_AUTO_TEST_CASE(ErrorDataset)
503{
504 this->processInterest = nullptr; // no response to dataset or command
505
506 this->execute("face destroy udp://159.242.33.78");
507 BOOST_CHECK_EQUAL(exitCode, 1);
508 BOOST_CHECK(out.is_empty());
509 BOOST_CHECK(err.is_equal("Error 10060 when querying face: Timeout\n"));
510}
511
512BOOST_AUTO_TEST_CASE(ErrorCommand)
513{
514 this->processInterest = [this] (const Interest& interest) {
Junxiao Shi918e5d42017-02-25 03:58:21 +0000515 if (this->respondFaceQuery(interest)) {
Junxiao Shi05dd4442017-02-06 22:50:07 +0000516 return;
517 }
518
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000519 MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/faces/destroy");
Junxiao Shi05dd4442017-02-06 22:50:07 +0000520 // no response to command
521 };
522
Junxiao Shi918e5d42017-02-25 03:58:21 +0000523 this->execute("face destroy 10156");
Junxiao Shi05dd4442017-02-06 22:50:07 +0000524 BOOST_CHECK_EQUAL(exitCode, 1);
525 BOOST_CHECK(out.is_empty());
526 BOOST_CHECK(err.is_equal("Error 10060 when destroying face: request timed out\n"));
527}
528
529BOOST_AUTO_TEST_SUITE_END() // DestroyCommand
530
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000531const std::string STATUS_XML = stripXmlSpaces(R"XML(
532 <faces>
533 <face>
534 <faceId>134</faceId>
535 <remoteUri>udp4://233.252.0.4:6363</remoteUri>
536 <localUri>udp4://192.0.2.1:6363</localUri>
537 <faceScope>non-local</faceScope>
538 <facePersistency>permanent</facePersistency>
539 <linkType>multi-access</linkType>
Eric Newberry6d932e82016-11-24 05:05:43 +0000540 <flags/>
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000541 <packetCounters>
542 <incomingPackets>
543 <nInterests>22562</nInterests>
Junxiao Shif03d4792017-04-06 16:41:22 +0000544 <nData>22031</nData>
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000545 <nNacks>63</nNacks>
546 </incomingPackets>
547 <outgoingPackets>
548 <nInterests>30121</nInterests>
Junxiao Shif03d4792017-04-06 16:41:22 +0000549 <nData>20940</nData>
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000550 <nNacks>1218</nNacks>
551 </outgoingPackets>
552 </packetCounters>
553 <byteCounters>
554 <incomingBytes>2522915</incomingBytes>
555 <outgoingBytes>1353592</outgoingBytes>
556 </byteCounters>
557 </face>
558 <face>
559 <faceId>745</faceId>
560 <remoteUri>fd://75</remoteUri>
561 <localUri>unix:///var/run/nfd.sock</localUri>
562 <faceScope>local</faceScope>
563 <facePersistency>on-demand</facePersistency>
564 <linkType>point-to-point</linkType>
Eric Newberry6d932e82016-11-24 05:05:43 +0000565 <flags>
566 <localFieldsEnabled/>
567 </flags>
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000568 <packetCounters>
569 <incomingPackets>
570 <nInterests>18998</nInterests>
Junxiao Shif03d4792017-04-06 16:41:22 +0000571 <nData>26701</nData>
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000572 <nNacks>147</nNacks>
573 </incomingPackets>
574 <outgoingPackets>
575 <nInterests>34779</nInterests>
Junxiao Shif03d4792017-04-06 16:41:22 +0000576 <nData>17028</nData>
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000577 <nNacks>1176</nNacks>
578 </outgoingPackets>
579 </packetCounters>
580 <byteCounters>
581 <incomingBytes>4672308</incomingBytes>
582 <outgoingBytes>8957187</outgoingBytes>
583 </byteCounters>
584 </face>
585 </faces>
586)XML");
587
588const std::string STATUS_TEXT =
589 "Faces:\n"
590 " faceid=134 remote=udp4://233.252.0.4:6363 local=udp4://192.0.2.1:6363"
591 " counters={in={22562i 22031d 63n 2522915B} out={30121i 20940d 1218n 1353592B}}"
Junxiao Shi1f481fa2017-01-26 15:14:43 +0000592 " flags={non-local permanent multi-access}\n"
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000593 " faceid=745 remote=fd://75 local=unix:///var/run/nfd.sock"
594 " counters={in={18998i 26701d 147n 4672308B} out={34779i 17028d 1176n 8957187B}}"
Junxiao Shi1f481fa2017-01-26 15:14:43 +0000595 " flags={local on-demand point-to-point local-fields}\n";
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000596
Junxiao Shi1f481fa2017-01-26 15:14:43 +0000597BOOST_FIXTURE_TEST_CASE(Status, StatusFixture<FaceModule>)
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000598{
599 this->fetchStatus();
600 FaceStatus payload1;
601 payload1.setFaceId(134)
602 .setRemoteUri("udp4://233.252.0.4:6363")
603 .setLocalUri("udp4://192.0.2.1:6363")
604 .setFaceScope(ndn::nfd::FACE_SCOPE_NON_LOCAL)
605 .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERMANENT)
606 .setLinkType(ndn::nfd::LINK_TYPE_MULTI_ACCESS)
607 .setNInInterests(22562)
Junxiao Shif03d4792017-04-06 16:41:22 +0000608 .setNInData(22031)
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000609 .setNInNacks(63)
610 .setNOutInterests(30121)
Junxiao Shif03d4792017-04-06 16:41:22 +0000611 .setNOutData(20940)
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000612 .setNOutNacks(1218)
613 .setNInBytes(2522915)
614 .setNOutBytes(1353592);
615 FaceStatus payload2;
616 payload2.setFaceId(745)
617 .setRemoteUri("fd://75")
618 .setLocalUri("unix:///var/run/nfd.sock")
619 .setFaceScope(ndn::nfd::FACE_SCOPE_LOCAL)
620 .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_ON_DEMAND)
621 .setLinkType(ndn::nfd::LINK_TYPE_POINT_TO_POINT)
Eric Newberry6d932e82016-11-24 05:05:43 +0000622 .setFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED, true)
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000623 .setNInInterests(18998)
Junxiao Shif03d4792017-04-06 16:41:22 +0000624 .setNInData(26701)
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000625 .setNInNacks(147)
626 .setNOutInterests(34779)
Junxiao Shif03d4792017-04-06 16:41:22 +0000627 .setNOutData(17028)
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000628 .setNOutNacks(1176)
629 .setNInBytes(4672308)
630 .setNOutBytes(8957187);
631 this->sendDataset("/localhost/nfd/faces/list", payload1, payload2);
632 this->prepareStatusOutput();
633
634 BOOST_CHECK(statusXml.is_equal(STATUS_XML));
635 BOOST_CHECK(statusText.is_equal(STATUS_TEXT));
636}
637
638BOOST_AUTO_TEST_SUITE_END() // TestFaceModule
Junxiao Shi331ade72016-08-19 14:07:19 +0000639BOOST_AUTO_TEST_SUITE_END() // Nfdc
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000640
641} // namespace tests
Junxiao Shi331ade72016-08-19 14:07:19 +0000642} // namespace nfdc
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000643} // namespace tools
644} // namespace nfd