blob: a3f46181f38dde023ee68234acbc810688cb6496 [file] [log] [blame]
Junxiao Shi38f4ce92016-08-04 10:01:52 +00001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Eric Newberry84d3adc2017-08-09 23:31:40 -04002/*
Eric Newberryde332452018-01-30 11:45:32 -07003 * Copyright (c) 2014-2018, 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"
Eric Newberry4f8dd962018-06-17 21:32:07 -070045 " congestion={base-marking-interval=12345ms default-threshold=54321B} mtu=1024"
Junxiao Shi36e54292017-02-17 18:43:16 +000046 " counters={in={22562i 22031d 63n 2522915B} out={30121i 20940d 1218n 1353592B}}"
47 " flags={non-local permanent multi-access}\n"
48 "faceid=745 remote=fd://75 local=unix:///var/run/nfd.sock"
Eric Newberry4f8dd962018-06-17 21:32:07 -070049 " congestion={base-marking-interval=100ms default-threshold=65536B} mtu=8800"
Junxiao Shi36e54292017-02-17 18:43:16 +000050 " counters={in={18998i 26701d 147n 4672308B} out={34779i 17028d 1176n 8957187B}}"
Eric Newberryde332452018-01-30 11:45:32 -070051 " flags={local on-demand point-to-point local-fields lp-reliability congestion-marking}\n";
Junxiao Shi36e54292017-02-17 18:43:16 +000052
53BOOST_AUTO_TEST_CASE(NormalNonQuery)
54{
55 this->processInterest = [this] (const Interest& interest) {
56 FaceStatus payload1;
57 payload1.setFaceId(134)
58 .setRemoteUri("udp4://233.252.0.4:6363")
59 .setLocalUri("udp4://192.0.2.1:6363")
60 .setFaceScope(ndn::nfd::FACE_SCOPE_NON_LOCAL)
61 .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERMANENT)
62 .setLinkType(ndn::nfd::LINK_TYPE_MULTI_ACCESS)
Eric Newberryde332452018-01-30 11:45:32 -070063 .setBaseCongestionMarkingInterval(12345_ms)
64 .setDefaultCongestionThreshold(54321)
Eric Newberry4f8dd962018-06-17 21:32:07 -070065 .setMtu(1024)
Junxiao Shi36e54292017-02-17 18:43:16 +000066 .setNInInterests(22562)
Junxiao Shif03d4792017-04-06 16:41:22 +000067 .setNInData(22031)
Junxiao Shi36e54292017-02-17 18:43:16 +000068 .setNInNacks(63)
69 .setNOutInterests(30121)
Junxiao Shif03d4792017-04-06 16:41:22 +000070 .setNOutData(20940)
Junxiao Shi36e54292017-02-17 18:43:16 +000071 .setNOutNacks(1218)
72 .setNInBytes(2522915)
73 .setNOutBytes(1353592);
74 FaceStatus payload2;
75 payload2.setFaceId(745)
76 .setRemoteUri("fd://75")
77 .setLocalUri("unix:///var/run/nfd.sock")
78 .setFaceScope(ndn::nfd::FACE_SCOPE_LOCAL)
79 .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_ON_DEMAND)
80 .setLinkType(ndn::nfd::LINK_TYPE_POINT_TO_POINT)
Eric Newberryde332452018-01-30 11:45:32 -070081 .setBaseCongestionMarkingInterval(100_ms)
82 .setDefaultCongestionThreshold(65536)
Eric Newberry4f8dd962018-06-17 21:32:07 -070083 .setMtu(8800)
Junxiao Shi36e54292017-02-17 18:43:16 +000084 .setFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED, true)
Eric Newberry84d3adc2017-08-09 23:31:40 -040085 .setFlagBit(ndn::nfd::BIT_LP_RELIABILITY_ENABLED, true)
Eric Newberryde332452018-01-30 11:45:32 -070086 .setFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED, true)
Junxiao Shi36e54292017-02-17 18:43:16 +000087 .setNInInterests(18998)
Junxiao Shif03d4792017-04-06 16:41:22 +000088 .setNInData(26701)
Junxiao Shi36e54292017-02-17 18:43:16 +000089 .setNInNacks(147)
90 .setNOutInterests(34779)
Junxiao Shif03d4792017-04-06 16:41:22 +000091 .setNOutData(17028)
Junxiao Shi36e54292017-02-17 18:43:16 +000092 .setNOutNacks(1176)
93 .setNInBytes(4672308)
94 .setNOutBytes(8957187);
95 this->sendDataset("/localhost/nfd/faces/list", payload1, payload2);
96 };
97
98 this->execute("face list");
99 BOOST_CHECK_EQUAL(exitCode, 0);
100 BOOST_CHECK(out.is_equal(NONQUERY_OUTPUT));
101 BOOST_CHECK(err.is_empty());
102}
103
104const std::string QUERY_OUTPUT =
105 "faceid=177 remote=tcp4://53.239.9.114:6363 local=tcp4://164.0.31.106:20396"
Eric Newberry4f8dd962018-06-17 21:32:07 -0700106 " congestion={base-marking-interval=555ms default-threshold=10000B} mtu=2000"
Junxiao Shi36e54292017-02-17 18:43:16 +0000107 " counters={in={2325i 1110d 79n 4716834B} out={2278i 485d 841n 308108B}}"
108 " flags={non-local persistent point-to-point}\n";
109
110BOOST_AUTO_TEST_CASE(NormalQuery)
111{
112 this->processInterest = [this] (const Interest& interest) {
113 BOOST_CHECK(Name("/localhost/nfd/faces/query").isPrefixOf(interest.getName()));
114 BOOST_CHECK_EQUAL(interest.getName().size(), 5);
115 FaceQueryFilter filter(interest.getName().at(4).blockFromValue());
116 FaceQueryFilter expectedFilter;
117 expectedFilter.setRemoteUri("tcp4://53.239.9.114:6363")
118 .setLocalUri("tcp4://164.0.31.106:20396")
119 .setUriScheme("tcp4");
120 BOOST_CHECK_EQUAL(filter, expectedFilter);
121
122 FaceStatus payload;
123 payload.setFaceId(177)
124 .setRemoteUri("tcp4://53.239.9.114:6363")
125 .setLocalUri("tcp4://164.0.31.106:20396")
126 .setFaceScope(ndn::nfd::FACE_SCOPE_NON_LOCAL)
127 .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERSISTENT)
128 .setLinkType(ndn::nfd::LINK_TYPE_POINT_TO_POINT)
Eric Newberryde332452018-01-30 11:45:32 -0700129 .setBaseCongestionMarkingInterval(555_ms)
130 .setDefaultCongestionThreshold(10000)
Eric Newberry4f8dd962018-06-17 21:32:07 -0700131 .setMtu(2000)
Junxiao Shi36e54292017-02-17 18:43:16 +0000132 .setNInInterests(2325)
Junxiao Shif03d4792017-04-06 16:41:22 +0000133 .setNInData(1110)
Junxiao Shi36e54292017-02-17 18:43:16 +0000134 .setNInNacks(79)
135 .setNOutInterests(2278)
Junxiao Shif03d4792017-04-06 16:41:22 +0000136 .setNOutData(485)
Junxiao Shi36e54292017-02-17 18:43:16 +0000137 .setNOutNacks(841)
138 .setNInBytes(4716834)
139 .setNOutBytes(308108);
140 this->sendDataset(interest.getName(), payload);
141 };
142
143 this->execute("face list tcp://53.239.9.114 scheme tcp4 local tcp://164.0.31.106:20396");
144 BOOST_CHECK_EQUAL(exitCode, 0);
145 BOOST_CHECK(out.is_equal(QUERY_OUTPUT));
146 BOOST_CHECK(err.is_empty());
147}
148
149BOOST_AUTO_TEST_CASE(NotFound)
150{
151 this->processInterest = [this] (const Interest& interest) {
152 this->sendEmptyDataset(interest.getName());
153 };
154
155 this->execute("face list scheme udp6");
156 BOOST_CHECK_EQUAL(exitCode, 3);
157 BOOST_CHECK(out.is_empty());
158 BOOST_CHECK(err.is_equal("Face not found\n"));
159}
160
161BOOST_AUTO_TEST_CASE(Error)
162{
163 this->processInterest = nullptr; // no response
164
165 this->execute("face list local udp4://31.67.17.2:6363");
166 BOOST_CHECK_EQUAL(exitCode, 1);
167 BOOST_CHECK(out.is_empty());
Eric Newberry359135c2018-06-26 21:02:12 -0700168 BOOST_CHECK(err.is_equal("Error 10060 when querying face: Timeout exceeded\n"));
Junxiao Shi36e54292017-02-17 18:43:16 +0000169}
170
171BOOST_AUTO_TEST_SUITE_END() // ListCommand
172
Junxiao Shi1f481fa2017-01-26 15:14:43 +0000173BOOST_FIXTURE_TEST_SUITE(ShowCommand, ExecuteCommandFixture)
174
Eric Newberryde332452018-01-30 11:45:32 -0700175const std::string NORMAL_ALL_CONGESTION_OUTPUT = std::string(R"TEXT(
176 faceid=256
177 remote=udp4://84.67.35.111:6363
178 local=udp4://79.91.49.215:6363
179congestion={base-marking-interval=123ms default-threshold=10000B}
Eric Newberry4f8dd962018-06-17 21:32:07 -0700180 mtu=4000
Eric Newberryde332452018-01-30 11:45:32 -0700181 counters={in={28975i 28232d 212n 13307258B} out={19525i 30993d 1038n 6231946B}}
182 flags={non-local on-demand point-to-point}
Junxiao Shi1f481fa2017-01-26 15:14:43 +0000183)TEXT").substr(1);
184
Eric Newberryde332452018-01-30 11:45:32 -0700185BOOST_AUTO_TEST_CASE(NormalAllCongestionParams)
186{
187 this->processInterest = [this] (const Interest& interest) {
188 BOOST_CHECK(Name("/localhost/nfd/faces/query").isPrefixOf(interest.getName()));
189 BOOST_CHECK_EQUAL(interest.getName().size(), 5);
190 FaceQueryFilter filter(interest.getName().at(4).blockFromValue());
191 BOOST_CHECK_EQUAL(filter, FaceQueryFilter().setFaceId(256));
192
193 FaceStatus payload;
194 payload.setFaceId(256)
195 .setRemoteUri("udp4://84.67.35.111:6363")
196 .setLocalUri("udp4://79.91.49.215:6363")
197 .setFaceScope(ndn::nfd::FACE_SCOPE_NON_LOCAL)
198 .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_ON_DEMAND)
Eric Newberry4f8dd962018-06-17 21:32:07 -0700199 .setMtu(4000)
Eric Newberryde332452018-01-30 11:45:32 -0700200 .setLinkType(ndn::nfd::LINK_TYPE_POINT_TO_POINT)
201 .setBaseCongestionMarkingInterval(123_ms)
202 .setDefaultCongestionThreshold(10000)
203 .setNInInterests(28975)
204 .setNInData(28232)
205 .setNInNacks(212)
206 .setNOutInterests(19525)
207 .setNOutData(30993)
208 .setNOutNacks(1038)
209 .setNInBytes(13307258)
210 .setNOutBytes(6231946);
211
212 this->sendDataset(interest.getName(), payload);
213 };
214
215 this->execute("face show 256");
216 BOOST_CHECK_EQUAL(exitCode, 0);
217 BOOST_CHECK(out.is_equal(NORMAL_ALL_CONGESTION_OUTPUT));
218 BOOST_CHECK(err.is_empty());
219}
220
221const std::string NORMAL_INTERVAL_CONGESTION_OUTPUT = std::string(R"TEXT(
222 faceid=256
223 remote=udp4://84.67.35.111:6363
224 local=udp4://79.91.49.215:6363
225congestion={base-marking-interval=123ms}
Eric Newberry4f8dd962018-06-17 21:32:07 -0700226 mtu=3000
Eric Newberryde332452018-01-30 11:45:32 -0700227 counters={in={28975i 28232d 212n 13307258B} out={19525i 30993d 1038n 6231946B}}
228 flags={non-local on-demand point-to-point}
229)TEXT").substr(1);
230
231BOOST_AUTO_TEST_CASE(NormalIntervalCongestionParams)
232{
233 this->processInterest = [this] (const Interest& interest) {
234 BOOST_CHECK(Name("/localhost/nfd/faces/query").isPrefixOf(interest.getName()));
235 BOOST_CHECK_EQUAL(interest.getName().size(), 5);
236 FaceQueryFilter filter(interest.getName().at(4).blockFromValue());
237 BOOST_CHECK_EQUAL(filter, FaceQueryFilter().setFaceId(256));
238
239 FaceStatus payload;
240 payload.setFaceId(256)
241 .setRemoteUri("udp4://84.67.35.111:6363")
242 .setLocalUri("udp4://79.91.49.215:6363")
243 .setFaceScope(ndn::nfd::FACE_SCOPE_NON_LOCAL)
244 .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_ON_DEMAND)
245 .setLinkType(ndn::nfd::LINK_TYPE_POINT_TO_POINT)
246 .setBaseCongestionMarkingInterval(123_ms)
Eric Newberry4f8dd962018-06-17 21:32:07 -0700247 .setMtu(3000)
Eric Newberryde332452018-01-30 11:45:32 -0700248 .setNInInterests(28975)
249 .setNInData(28232)
250 .setNInNacks(212)
251 .setNOutInterests(19525)
252 .setNOutData(30993)
253 .setNOutNacks(1038)
254 .setNInBytes(13307258)
255 .setNOutBytes(6231946);
256
257 this->sendDataset(interest.getName(), payload);
258 };
259
260 this->execute("face show 256");
261 BOOST_CHECK_EQUAL(exitCode, 0);
262 BOOST_CHECK(out.is_equal(NORMAL_INTERVAL_CONGESTION_OUTPUT));
263 BOOST_CHECK(err.is_empty());
264}
265
266const std::string NORMAL_THRESHOLD_CONGESTION_OUTPUT = std::string(R"TEXT(
267 faceid=256
268 remote=udp4://84.67.35.111:6363
269 local=udp4://79.91.49.215:6363
270congestion={default-threshold=10000B}
Eric Newberry4f8dd962018-06-17 21:32:07 -0700271 mtu=5000
Eric Newberryde332452018-01-30 11:45:32 -0700272 counters={in={28975i 28232d 212n 13307258B} out={19525i 30993d 1038n 6231946B}}
273 flags={non-local on-demand point-to-point}
274)TEXT").substr(1);
275
276BOOST_AUTO_TEST_CASE(NormalThresholdCongestionParams)
277{
278 this->processInterest = [this] (const Interest& interest) {
279 BOOST_CHECK(Name("/localhost/nfd/faces/query").isPrefixOf(interest.getName()));
280 BOOST_CHECK_EQUAL(interest.getName().size(), 5);
281 FaceQueryFilter filter(interest.getName().at(4).blockFromValue());
282 BOOST_CHECK_EQUAL(filter, FaceQueryFilter().setFaceId(256));
283
284 FaceStatus payload;
285 payload.setFaceId(256)
286 .setRemoteUri("udp4://84.67.35.111:6363")
287 .setLocalUri("udp4://79.91.49.215:6363")
288 .setFaceScope(ndn::nfd::FACE_SCOPE_NON_LOCAL)
289 .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_ON_DEMAND)
Eric Newberry4f8dd962018-06-17 21:32:07 -0700290 .setMtu(5000)
Eric Newberryde332452018-01-30 11:45:32 -0700291 .setLinkType(ndn::nfd::LINK_TYPE_POINT_TO_POINT)
292 .setDefaultCongestionThreshold(10000)
293 .setNInInterests(28975)
294 .setNInData(28232)
295 .setNInNacks(212)
296 .setNOutInterests(19525)
297 .setNOutData(30993)
298 .setNOutNacks(1038)
299 .setNInBytes(13307258)
300 .setNOutBytes(6231946);
301
302 this->sendDataset(interest.getName(), payload);
303 };
304
305 this->execute("face show 256");
306 BOOST_CHECK_EQUAL(exitCode, 0);
307 BOOST_CHECK(out.is_equal(NORMAL_THRESHOLD_CONGESTION_OUTPUT));
308 BOOST_CHECK(err.is_empty());
309}
310
311const std::string NORMAL_NO_CONGESTION_OUTPUT = std::string(R"TEXT(
312 faceid=256
313 remote=udp4://84.67.35.111:6363
314 local=udp4://79.91.49.215:6363
Eric Newberry4f8dd962018-06-17 21:32:07 -0700315 mtu=6000
Eric Newberryde332452018-01-30 11:45:32 -0700316 counters={in={28975i 28232d 212n 13307258B} out={19525i 30993d 1038n 6231946B}}
317 flags={non-local on-demand point-to-point}
318)TEXT").substr(1);
319
320BOOST_AUTO_TEST_CASE(NormalNoCongestionParams)
Junxiao Shi1f481fa2017-01-26 15:14:43 +0000321{
322 this->processInterest = [this] (const Interest& interest) {
Junxiao Shi36e54292017-02-17 18:43:16 +0000323 BOOST_CHECK(Name("/localhost/nfd/faces/query").isPrefixOf(interest.getName()));
Junxiao Shi8f803f22017-02-10 03:04:28 +0000324 BOOST_CHECK_EQUAL(interest.getName().size(), 5);
325 FaceQueryFilter filter(interest.getName().at(4).blockFromValue());
326 BOOST_CHECK_EQUAL(filter, FaceQueryFilter().setFaceId(256));
Junxiao Shi1f481fa2017-01-26 15:14:43 +0000327
328 FaceStatus payload;
329 payload.setFaceId(256)
330 .setRemoteUri("udp4://84.67.35.111:6363")
331 .setLocalUri("udp4://79.91.49.215:6363")
332 .setFaceScope(ndn::nfd::FACE_SCOPE_NON_LOCAL)
333 .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_ON_DEMAND)
Eric Newberry4f8dd962018-06-17 21:32:07 -0700334 .setMtu(6000)
Junxiao Shi1f481fa2017-01-26 15:14:43 +0000335 .setLinkType(ndn::nfd::LINK_TYPE_POINT_TO_POINT)
336 .setNInInterests(28975)
Junxiao Shif03d4792017-04-06 16:41:22 +0000337 .setNInData(28232)
Junxiao Shi1f481fa2017-01-26 15:14:43 +0000338 .setNInNacks(212)
339 .setNOutInterests(19525)
Junxiao Shif03d4792017-04-06 16:41:22 +0000340 .setNOutData(30993)
Junxiao Shi1f481fa2017-01-26 15:14:43 +0000341 .setNOutNacks(1038)
342 .setNInBytes(13307258)
343 .setNOutBytes(6231946);
344
Junxiao Shi8f803f22017-02-10 03:04:28 +0000345 this->sendDataset(interest.getName(), payload);
Junxiao Shi1f481fa2017-01-26 15:14:43 +0000346 };
347
348 this->execute("face show 256");
349 BOOST_CHECK_EQUAL(exitCode, 0);
Eric Newberryde332452018-01-30 11:45:32 -0700350 BOOST_CHECK(out.is_equal(NORMAL_NO_CONGESTION_OUTPUT));
Junxiao Shi1f481fa2017-01-26 15:14:43 +0000351 BOOST_CHECK(err.is_empty());
352}
353
354BOOST_AUTO_TEST_CASE(NotFound)
355{
356 this->processInterest = [this] (const Interest& interest) {
357 this->sendEmptyDataset(interest.getName());
358 };
359
360 this->execute("face show 256");
361 BOOST_CHECK_EQUAL(exitCode, 3);
362 BOOST_CHECK(out.is_empty());
Junxiao Shi8f803f22017-02-10 03:04:28 +0000363 BOOST_CHECK(err.is_equal("Face not found\n"));
Junxiao Shi1f481fa2017-01-26 15:14:43 +0000364}
365
366BOOST_AUTO_TEST_CASE(Error)
367{
368 this->processInterest = nullptr; // no response
369
370 this->execute("face show 256");
371 BOOST_CHECK_EQUAL(exitCode, 1);
372 BOOST_CHECK(out.is_empty());
Eric Newberry359135c2018-06-26 21:02:12 -0700373 BOOST_CHECK(err.is_equal("Error 10060 when querying face: Timeout exceeded\n"));
Junxiao Shi1f481fa2017-01-26 15:14:43 +0000374}
375
376BOOST_AUTO_TEST_SUITE_END() // ShowCommand
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000377
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000378class ExecuteFaceCreateCommandFixture : public ExecuteCommandFixture
379{
380protected:
381 void
Eric Newberry4f8dd962018-06-17 21:32:07 -0700382 respond409(const Interest& interest, FacePersistency persistency, optional<uint64_t> mtu = {},
Eric Newberryde332452018-01-30 11:45:32 -0700383 bool enableLpReliability = false,
384 bool enableCongestionMarking = false)
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000385 {
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000386 MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/faces/create");
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000387 ControlParameters body;
388 body.setFaceId(1172)
389 .setUri("udp4://100.77.30.65:6363")
Junxiao Shi1cce2a32017-05-02 02:39:55 +0000390 .setLocalUri("udp4://68.62.26.57:24087")
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000391 .setFacePersistency(persistency)
392 .setFlags(0);
Eric Newberry4f8dd962018-06-17 21:32:07 -0700393 if (mtu) {
394 body.setMtu(*mtu);
395 }
Eric Newberry84d3adc2017-08-09 23:31:40 -0400396 if (enableLpReliability) {
397 body.setFlagBit(ndn::nfd::BIT_LP_RELIABILITY_ENABLED, true, false);
398 }
Eric Newberryde332452018-01-30 11:45:32 -0700399 if (enableCongestionMarking) {
400 body.setFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED, true, false);
401 }
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000402 this->failCommand(interest, 409, "conflict-409", body);
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000403 }
404};
Junxiao Shi1d7fef52017-02-02 05:33:14 +0000405
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000406BOOST_FIXTURE_TEST_SUITE(CreateCommand, ExecuteFaceCreateCommandFixture)
407
408BOOST_AUTO_TEST_CASE(Creating)
Junxiao Shi1d7fef52017-02-02 05:33:14 +0000409{
410 this->processInterest = [this] (const Interest& interest) {
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000411 ControlParameters req = MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/faces/create");
Junxiao Shi1d7fef52017-02-02 05:33:14 +0000412 BOOST_REQUIRE(req.hasUri());
413 BOOST_CHECK_EQUAL(req.getUri(), "udp4://159.242.33.78:6363");
Junxiao Shi0d976922017-04-01 14:35:21 +0000414 BOOST_CHECK(!req.hasLocalUri());
Junxiao Shi1d7fef52017-02-02 05:33:14 +0000415 BOOST_REQUIRE(req.hasFacePersistency());
416 BOOST_CHECK_EQUAL(req.getFacePersistency(), FacePersistency::FACE_PERSISTENCY_PERSISTENT);
417
418 ControlParameters resp;
419 resp.setFaceId(2130)
Junxiao Shi1cce2a32017-05-02 02:39:55 +0000420 .setUri("udp4://159.242.33.78:6363")
421 .setLocalUri("udp4://179.63.153.45:28835")
Junxiao Shi5c1bb362017-05-11 16:03:38 +0000422 .setFacePersistency(FacePersistency::FACE_PERSISTENCY_PERSISTENT)
423 .setFlags(0);
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000424 this->succeedCommand(interest, resp);
Junxiao Shi1d7fef52017-02-02 05:33:14 +0000425 };
426
427 this->execute("face create udp://159.242.33.78");
428 BOOST_CHECK_EQUAL(exitCode, 0);
Junxiao Shi1cce2a32017-05-02 02:39:55 +0000429 BOOST_CHECK(out.is_equal("face-created id=2130 local=udp4://179.63.153.45:28835 "
Eric Newberry84d3adc2017-08-09 23:31:40 -0400430 "remote=udp4://159.242.33.78:6363 persistency=persistent "
Eric Newberryde332452018-01-30 11:45:32 -0700431 "reliability=off congestion-marking=off\n"));
Junxiao Shi1d7fef52017-02-02 05:33:14 +0000432 BOOST_CHECK(err.is_empty());
433}
434
Eric Newberry84d3adc2017-08-09 23:31:40 -0400435BOOST_AUTO_TEST_CASE(CreatingWithParams)
Junxiao Shi0d976922017-04-01 14:35:21 +0000436{
437 this->processInterest = [this] (const Interest& interest) {
438 ControlParameters req = MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/faces/create");
439 BOOST_REQUIRE(req.hasUri());
440 BOOST_CHECK_EQUAL(req.getUri(), "udp4://22.91.89.51:19903");
441 BOOST_REQUIRE(req.hasLocalUri());
442 BOOST_CHECK_EQUAL(req.getLocalUri(), "udp4://98.68.23.71:6363");
443 BOOST_REQUIRE(req.hasFacePersistency());
444 BOOST_CHECK_EQUAL(req.getFacePersistency(), FacePersistency::FACE_PERSISTENCY_PERMANENT);
Eric Newberry4f8dd962018-06-17 21:32:07 -0700445 BOOST_REQUIRE(req.hasBaseCongestionMarkingInterval());
446 BOOST_CHECK_EQUAL(req.getBaseCongestionMarkingInterval(), 100_ms);
447 BOOST_REQUIRE(req.hasDefaultCongestionThreshold());
448 BOOST_CHECK_EQUAL(req.getDefaultCongestionThreshold(), 65536);
449 BOOST_REQUIRE(req.hasMtu());
450 BOOST_CHECK_EQUAL(req.getMtu(), 10000);
Eric Newberry84d3adc2017-08-09 23:31:40 -0400451 BOOST_CHECK(req.hasFlags());
452 BOOST_CHECK(req.getFlagBit(ndn::nfd::BIT_LP_RELIABILITY_ENABLED));
Junxiao Shi0d976922017-04-01 14:35:21 +0000453
454 ControlParameters resp;
455 resp.setFaceId(301)
Junxiao Shi1cce2a32017-05-02 02:39:55 +0000456 .setUri("udp4://22.91.89.51:19903")
457 .setLocalUri("udp4://98.68.23.71:6363")
Junxiao Shi5c1bb362017-05-11 16:03:38 +0000458 .setFacePersistency(FacePersistency::FACE_PERSISTENCY_PERMANENT)
Eric Newberryde332452018-01-30 11:45:32 -0700459 .setBaseCongestionMarkingInterval(100_ms)
460 .setDefaultCongestionThreshold(65536)
Eric Newberry4f8dd962018-06-17 21:32:07 -0700461 .setMtu(8800)
Eric Newberryde332452018-01-30 11:45:32 -0700462 .setFlagBit(ndn::nfd::BIT_LP_RELIABILITY_ENABLED, true, false)
463 .setFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED, true, false);
Junxiao Shi0d976922017-04-01 14:35:21 +0000464 this->succeedCommand(interest, resp);
465 };
466
Eric Newberryde332452018-01-30 11:45:32 -0700467 this->execute("face create udp://22.91.89.51:19903 permanent local udp://98.68.23.71 reliability on "
468 "congestion-marking on congestion-marking-interval 100 "
Eric Newberry4f8dd962018-06-17 21:32:07 -0700469 "default-congestion-threshold 65536 mtu 10000");
Junxiao Shi0d976922017-04-01 14:35:21 +0000470 BOOST_CHECK_EQUAL(exitCode, 0);
Junxiao Shi1cce2a32017-05-02 02:39:55 +0000471 BOOST_CHECK(out.is_equal("face-created id=301 local=udp4://98.68.23.71:6363 "
Eric Newberry84d3adc2017-08-09 23:31:40 -0400472 "remote=udp4://22.91.89.51:19903 persistency=permanent "
Eric Newberryde332452018-01-30 11:45:32 -0700473 "reliability=on congestion-marking=on "
Eric Newberry4f8dd962018-06-17 21:32:07 -0700474 "congestion-marking-interval=100ms default-congestion-threshold=65536B "
475 "mtu=8800\n"));
Junxiao Shi0d976922017-04-01 14:35:21 +0000476 BOOST_CHECK(err.is_empty());
477}
478
Eric Newberry4f8dd962018-06-17 21:32:07 -0700479BOOST_AUTO_TEST_CASE(MtuExistingFace)
480{
Davide Pesaventod657d532018-06-26 22:41:28 -0400481 this->processInterest = [this] (const Interest& interest) {
Eric Newberry4f8dd962018-06-17 21:32:07 -0700482 this->respond409(interest, FacePersistency::FACE_PERSISTENCY_ON_DEMAND, 4000);
483 // no command other than faces/create is expected
484 };
485
486 this->execute("face create udp://100.77.30.65 mtu 5000");
487 BOOST_CHECK_EQUAL(exitCode, 1);
488 BOOST_CHECK(out.is_empty());
489 BOOST_CHECK(err.is_equal("Error 409 when creating face: conflict-409\n"));
490}
491
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000492BOOST_AUTO_TEST_CASE(UpgradingPersistency)
493{
494 bool hasUpdateCommand = false;
495 this->processInterest = [this, &hasUpdateCommand] (const Interest& interest) {
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000496 if (parseCommand(interest, "/localhost/nfd/faces/create")) {
497 this->respond409(interest, FacePersistency::FACE_PERSISTENCY_ON_DEMAND);
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000498 return;
499 }
500
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000501 ControlParameters req = MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/faces/update");
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000502 hasUpdateCommand = true;
503 BOOST_REQUIRE(req.hasFaceId());
504 BOOST_CHECK_EQUAL(req.getFaceId(), 1172);
505 BOOST_REQUIRE(req.hasFacePersistency());
506 BOOST_CHECK_EQUAL(req.getFacePersistency(), FacePersistency::FACE_PERSISTENCY_PERSISTENT);
507 BOOST_CHECK(!req.hasFlags());
508
509 ControlParameters resp;
510 resp.setFaceId(1172)
511 .setFacePersistency(FacePersistency::FACE_PERSISTENCY_PERSISTENT)
512 .setFlags(0);
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000513 this->succeedCommand(interest, resp);
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000514 };
515
516 this->execute("face create udp://100.77.30.65");
517 BOOST_CHECK(hasUpdateCommand);
518 BOOST_CHECK_EQUAL(exitCode, 0);
Junxiao Shi1cce2a32017-05-02 02:39:55 +0000519 BOOST_CHECK(out.is_equal("face-updated id=1172 local=udp4://68.62.26.57:24087 "
Eric Newberry84d3adc2017-08-09 23:31:40 -0400520 "remote=udp4://100.77.30.65:6363 persistency=persistent "
Eric Newberryde332452018-01-30 11:45:32 -0700521 "reliability=off congestion-marking=off\n"));
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000522 BOOST_CHECK(err.is_empty());
523}
524
Eric Newberry4f8dd962018-06-17 21:32:07 -0700525BOOST_AUTO_TEST_CASE(UpgradingPersistencySameMtu)
526{
527 bool hasUpdateCommand = false;
528 this->processInterest = [this, &hasUpdateCommand] (const Interest& interest) {
529 if (parseCommand(interest, "/localhost/nfd/faces/create")) {
530 this->respond409(interest, FacePersistency::FACE_PERSISTENCY_ON_DEMAND, 8800);
531 return;
532 }
533
534 ControlParameters req = MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/faces/update");
535 hasUpdateCommand = true;
536 BOOST_REQUIRE(req.hasFaceId());
537 BOOST_CHECK_EQUAL(req.getFaceId(), 1172);
538 BOOST_REQUIRE(req.hasFacePersistency());
539 BOOST_CHECK_EQUAL(req.getFacePersistency(), FacePersistency::FACE_PERSISTENCY_PERSISTENT);
540 BOOST_CHECK(!req.hasFlags());
541
542 ControlParameters resp;
543 resp.setFaceId(1172)
544 .setFacePersistency(FacePersistency::FACE_PERSISTENCY_PERSISTENT)
545 .setFlags(0);
546 this->succeedCommand(interest, resp);
547 };
548
549 this->execute("face create udp://100.77.30.65 mtu 8800");
550 BOOST_CHECK(hasUpdateCommand);
551 BOOST_CHECK_EQUAL(exitCode, 0);
552 BOOST_CHECK(out.is_equal("face-updated id=1172 local=udp4://68.62.26.57:24087 "
553 "remote=udp4://100.77.30.65:6363 persistency=persistent "
554 "reliability=off congestion-marking=off\n"));
555 BOOST_CHECK(err.is_empty());
556}
557
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000558BOOST_AUTO_TEST_CASE(NotDowngradingPersistency)
559{
560 this->processInterest = [this] (const Interest& interest) {
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000561 this->respond409(interest, FacePersistency::FACE_PERSISTENCY_PERMANENT);
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000562 // no command other than faces/create is expected
563 };
564
565 this->execute("face create udp://100.77.30.65");
566 BOOST_CHECK_EQUAL(exitCode, 0);
Junxiao Shi1cce2a32017-05-02 02:39:55 +0000567 BOOST_CHECK(out.is_equal("face-exists id=1172 local=udp4://68.62.26.57:24087 "
Eric Newberry84d3adc2017-08-09 23:31:40 -0400568 "remote=udp4://100.77.30.65:6363 persistency=permanent "
Eric Newberryde332452018-01-30 11:45:32 -0700569 "reliability=off congestion-marking=off\n"));
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000570 BOOST_CHECK(err.is_empty());
571}
572
573BOOST_AUTO_TEST_CASE(SamePersistency)
574{
575 this->processInterest = [this] (const Interest& interest) {
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000576 this->respond409(interest, FacePersistency::FACE_PERSISTENCY_PERSISTENT);
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000577 // no command other than faces/create is expected
578 };
579
580 this->execute("face create udp://100.77.30.65");
581 BOOST_CHECK_EQUAL(exitCode, 0);
Junxiao Shi1cce2a32017-05-02 02:39:55 +0000582 BOOST_CHECK(out.is_equal("face-exists id=1172 local=udp4://68.62.26.57:24087 "
Eric Newberry84d3adc2017-08-09 23:31:40 -0400583 "remote=udp4://100.77.30.65:6363 persistency=persistent "
Eric Newberryde332452018-01-30 11:45:32 -0700584 "reliability=off congestion-marking=off\n"));
Eric Newberry84d3adc2017-08-09 23:31:40 -0400585 BOOST_CHECK(err.is_empty());
586}
587
588BOOST_AUTO_TEST_CASE(EnablingReliability)
589{
590 bool hasUpdateCommand = false;
591 this->processInterest = [this, &hasUpdateCommand] (const Interest& interest) {
592 if (parseCommand(interest, "/localhost/nfd/faces/create")) {
593 this->respond409(interest, FacePersistency::FACE_PERSISTENCY_PERSISTENT);
594 return;
595 }
596
597 ControlParameters req = MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/faces/update");
598 hasUpdateCommand = true;
599 BOOST_REQUIRE(req.hasFaceId());
600 BOOST_CHECK_EQUAL(req.getFaceId(), 1172);
601 BOOST_CHECK(req.hasFlagBit(ndn::nfd::BIT_LP_RELIABILITY_ENABLED));
602 BOOST_CHECK(req.getFlagBit(ndn::nfd::BIT_LP_RELIABILITY_ENABLED));
603
604 ControlParameters resp;
605 resp.setFaceId(1172)
606 .setFacePersistency(FacePersistency::FACE_PERSISTENCY_PERSISTENT)
607 .setFlagBit(ndn::nfd::BIT_LP_RELIABILITY_ENABLED, true, false);
608 this->succeedCommand(interest, resp);
609 };
610
611 this->execute("face create udp://100.77.30.65 reliability on");
612 BOOST_CHECK_EQUAL(exitCode, 0);
613 BOOST_CHECK(out.is_equal("face-updated id=1172 local=udp4://68.62.26.57:24087 "
614 "remote=udp4://100.77.30.65:6363 persistency=persistent "
Eric Newberryde332452018-01-30 11:45:32 -0700615 "reliability=on congestion-marking=off\n"));
Eric Newberry84d3adc2017-08-09 23:31:40 -0400616 BOOST_CHECK(err.is_empty());
617}
618
619BOOST_AUTO_TEST_CASE(DisablingReliability)
620{
621 bool hasUpdateCommand = false;
622 this->processInterest = [this, &hasUpdateCommand] (const Interest& interest) {
623 if (parseCommand(interest, "/localhost/nfd/faces/create")) {
Eric Newberry4f8dd962018-06-17 21:32:07 -0700624 this->respond409(interest, FacePersistency::FACE_PERSISTENCY_PERSISTENT, {}, true);
Eric Newberry84d3adc2017-08-09 23:31:40 -0400625 return;
626 }
627
628 ControlParameters req = MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/faces/update");
629 hasUpdateCommand = true;
630 BOOST_REQUIRE(req.hasFaceId());
631 BOOST_CHECK_EQUAL(req.getFaceId(), 1172);
632 BOOST_CHECK(req.hasFlagBit(ndn::nfd::BIT_LP_RELIABILITY_ENABLED));
633 BOOST_CHECK(!req.getFlagBit(ndn::nfd::BIT_LP_RELIABILITY_ENABLED));
634
635 ControlParameters resp;
636 resp.setFaceId(1172)
637 .setFacePersistency(FacePersistency::FACE_PERSISTENCY_PERSISTENT)
638 .setFlagBit(ndn::nfd::BIT_LP_RELIABILITY_ENABLED, false, false);
639 this->succeedCommand(interest, resp);
640 };
641
642 this->execute("face create udp://100.77.30.65 reliability off");
643 BOOST_CHECK_EQUAL(exitCode, 0);
644 BOOST_CHECK(out.is_equal("face-updated id=1172 local=udp4://68.62.26.57:24087 "
645 "remote=udp4://100.77.30.65:6363 persistency=persistent "
Eric Newberryde332452018-01-30 11:45:32 -0700646 "reliability=off congestion-marking=off\n"));
647 BOOST_CHECK(err.is_empty());
648}
649
650BOOST_AUTO_TEST_CASE(EnablingCongestionMarking)
651{
652 bool hasUpdateCommand = false;
653 this->processInterest = [this, &hasUpdateCommand] (const Interest& interest) {
654 if (parseCommand(interest, "/localhost/nfd/faces/create")) {
655 this->respond409(interest, FacePersistency::FACE_PERSISTENCY_PERSISTENT);
656 return;
657 }
658
659 ControlParameters req = MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/faces/update");
660 hasUpdateCommand = true;
661 BOOST_REQUIRE(req.hasFaceId());
662 BOOST_CHECK_EQUAL(req.getFaceId(), 1172);
663 BOOST_CHECK(req.hasFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED));
664 BOOST_CHECK(req.getFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED));
665 BOOST_CHECK(!req.hasBaseCongestionMarkingInterval());
666 BOOST_CHECK(!req.hasDefaultCongestionThreshold());
667
668 ControlParameters resp;
669 resp.setFaceId(1172)
670 .setFacePersistency(FacePersistency::FACE_PERSISTENCY_PERSISTENT)
671 .setBaseCongestionMarkingInterval(100_ms)
672 .setDefaultCongestionThreshold(65536)
673 .setFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED, true, false);
674 this->succeedCommand(interest, resp);
675 };
676
677 this->execute("face create udp://100.77.30.65 congestion-marking on");
678 BOOST_CHECK_EQUAL(exitCode, 0);
679 BOOST_CHECK(out.is_equal("face-updated id=1172 local=udp4://68.62.26.57:24087 "
680 "remote=udp4://100.77.30.65:6363 persistency=persistent "
681 "reliability=off congestion-marking=on "
682 "congestion-marking-interval=100ms default-congestion-threshold=65536B\n"));
683 BOOST_CHECK(err.is_empty());
684}
685
686BOOST_AUTO_TEST_CASE(DisablingCongestionMarking)
687{
688 bool hasUpdateCommand = false;
689 this->processInterest = [this, &hasUpdateCommand] (const Interest& interest) {
690 if (parseCommand(interest, "/localhost/nfd/faces/create")) {
Eric Newberry4f8dd962018-06-17 21:32:07 -0700691 this->respond409(interest, FacePersistency::FACE_PERSISTENCY_PERSISTENT, {}, false, true);
Eric Newberryde332452018-01-30 11:45:32 -0700692 return;
693 }
694
695 ControlParameters req = MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/faces/update");
696 hasUpdateCommand = true;
697 BOOST_REQUIRE(req.hasFaceId());
698 BOOST_CHECK_EQUAL(req.getFaceId(), 1172);
699 BOOST_CHECK(req.hasFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED));
700 BOOST_CHECK(!req.getFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED));
701 BOOST_CHECK(!req.hasBaseCongestionMarkingInterval());
702 BOOST_CHECK(!req.hasDefaultCongestionThreshold());
703
704 ControlParameters resp;
705 resp.setFaceId(1172)
706 .setFacePersistency(FacePersistency::FACE_PERSISTENCY_PERSISTENT)
707 .setBaseCongestionMarkingInterval(100_ms)
708 .setDefaultCongestionThreshold(65536)
709 .setFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED, false, false);
710 this->succeedCommand(interest, resp);
711 };
712
713 this->execute("face create udp://100.77.30.65 congestion-marking off");
714 BOOST_CHECK_EQUAL(exitCode, 0);
715 BOOST_CHECK(out.is_equal("face-updated id=1172 local=udp4://68.62.26.57:24087 "
716 "remote=udp4://100.77.30.65:6363 persistency=persistent "
717 "reliability=off congestion-marking=off "
718 "congestion-marking-interval=100ms default-congestion-threshold=65536B\n"));
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000719 BOOST_CHECK(err.is_empty());
720}
721
Junxiao Shi0d976922017-04-01 14:35:21 +0000722BOOST_AUTO_TEST_CASE(ErrorCanonizeRemote)
723{
724 this->execute("face create invalid://");
725 BOOST_CHECK_EQUAL(exitCode, 4);
726 BOOST_CHECK(out.is_empty());
727 BOOST_CHECK(err.is_equal("Error when canonizing 'invalid://': scheme not supported\n"));
728}
729
730BOOST_AUTO_TEST_CASE(ErrorCanonizeLocal)
731{
732 this->execute("face create udp4://24.37.20.47:6363 local invalid://");
733 BOOST_CHECK_EQUAL(exitCode, 4);
734 BOOST_CHECK(out.is_empty());
735 BOOST_CHECK(err.is_equal("Error when canonizing 'invalid://': scheme not supported\n"));
736}
737
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000738BOOST_AUTO_TEST_CASE(ErrorCreate)
Junxiao Shi1d7fef52017-02-02 05:33:14 +0000739{
740 this->processInterest = nullptr; // no response
741
742 this->execute("face create udp://159.242.33.78");
743 BOOST_CHECK_EQUAL(exitCode, 1);
744 BOOST_CHECK(out.is_empty());
745 BOOST_CHECK(err.is_equal("Error 10060 when creating face: request timed out\n"));
746}
747
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000748BOOST_AUTO_TEST_CASE(ErrorConflict)
749{
750 // Current NFD will not report a 409-conflict with a different remote FaceUri, but this is
751 // allowed by FaceMgmt protocol and nfdc should not attempt to upgrade persistency in this case.
752
753 this->processInterest = [this] (const Interest& interest) {
754 // conflict with udp4://100.77.30.65:6363
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000755 this->respond409(interest, FacePersistency::FACE_PERSISTENCY_ON_DEMAND);
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000756 };
757
758 this->execute("face create udp://20.53.73.45");
759 BOOST_CHECK_EQUAL(exitCode, 1);
760 BOOST_CHECK(out.is_empty());
761 BOOST_CHECK(err.is_equal("Error 409 when creating face: conflict-409\n"));
762}
763
764BOOST_AUTO_TEST_CASE(ErrorUpdate)
765{
766 this->processInterest = [this] (const Interest& interest) {
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000767 if (parseCommand(interest, "/localhost/nfd/faces/create")) {
768 this->respond409(interest, FacePersistency::FACE_PERSISTENCY_ON_DEMAND);
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000769 return;
770 }
771
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000772 MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/faces/update");
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000773 // no response to faces/update
774 };
775
776 this->execute("face create udp://100.77.30.65");
777 BOOST_CHECK_EQUAL(exitCode, 1);
778 BOOST_CHECK(out.is_empty());
779 BOOST_CHECK(err.is_equal("Error 10060 when upgrading face persistency: request timed out\n"));
780}
781
Junxiao Shi1d7fef52017-02-02 05:33:14 +0000782BOOST_AUTO_TEST_SUITE_END() // CreateCommand
783
Junxiao Shi05dd4442017-02-06 22:50:07 +0000784BOOST_FIXTURE_TEST_SUITE(DestroyCommand, ExecuteCommandFixture)
785
786BOOST_AUTO_TEST_CASE(NormalByFaceId)
787{
788 this->processInterest = [this] (const Interest& interest) {
Junxiao Shi918e5d42017-02-25 03:58:21 +0000789 if (this->respondFaceQuery(interest)) {
Junxiao Shi05dd4442017-02-06 22:50:07 +0000790 return;
791 }
792
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000793 ControlParameters req = MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/faces/destroy");
Junxiao Shi05dd4442017-02-06 22:50:07 +0000794 BOOST_REQUIRE(req.hasFaceId());
795 BOOST_CHECK_EQUAL(req.getFaceId(), 10156);
796
797 ControlParameters resp;
798 resp.setFaceId(10156);
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000799 this->succeedCommand(interest, resp);
Junxiao Shi05dd4442017-02-06 22:50:07 +0000800 };
801
802 this->execute("face destroy 10156");
803 BOOST_CHECK_EQUAL(exitCode, 0);
804 BOOST_CHECK(out.is_equal("face-destroyed id=10156 local=tcp4://151.26.163.27:22967 "
Eric Newberry84d3adc2017-08-09 23:31:40 -0400805 "remote=tcp4://198.57.27.40:6363 persistency=persistent "
Eric Newberryde332452018-01-30 11:45:32 -0700806 "reliability=off congestion-marking=off\n"));
Junxiao Shi05dd4442017-02-06 22:50:07 +0000807 BOOST_CHECK(err.is_empty());
808}
809
810BOOST_AUTO_TEST_CASE(NormalByFaceUri)
811{
812 this->processInterest = [this] (const Interest& interest) {
Junxiao Shi918e5d42017-02-25 03:58:21 +0000813 if (this->respondFaceQuery(interest)) {
Junxiao Shi05dd4442017-02-06 22:50:07 +0000814 return;
815 }
816
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000817 ControlParameters req = MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/faces/destroy");
Junxiao Shi05dd4442017-02-06 22:50:07 +0000818 BOOST_REQUIRE(req.hasFaceId());
819 BOOST_CHECK_EQUAL(req.getFaceId(), 2249);
820
821 ControlParameters resp;
822 resp.setFaceId(2249);
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000823 this->succeedCommand(interest, resp);
Junxiao Shi05dd4442017-02-06 22:50:07 +0000824 };
825
826 this->execute("face destroy tcp://32.121.182.82");
827 BOOST_CHECK_EQUAL(exitCode, 0);
828 BOOST_CHECK(out.is_equal("face-destroyed id=2249 local=tcp4://30.99.87.98:31414 "
Eric Newberry84d3adc2017-08-09 23:31:40 -0400829 "remote=tcp4://32.121.182.82:6363 persistency=persistent "
Eric Newberryde332452018-01-30 11:45:32 -0700830 "reliability=off congestion-marking=off\n"));
Junxiao Shi05dd4442017-02-06 22:50:07 +0000831 BOOST_CHECK(err.is_empty());
832}
833
834BOOST_AUTO_TEST_CASE(FaceNotExist)
835{
836 this->processInterest = [this] (const Interest& interest) {
Junxiao Shi918e5d42017-02-25 03:58:21 +0000837 BOOST_CHECK(this->respondFaceQuery(interest));
Junxiao Shi05dd4442017-02-06 22:50:07 +0000838 };
839
840 this->execute("face destroy 23728");
841 BOOST_CHECK_EQUAL(exitCode, 3);
842 BOOST_CHECK(out.is_empty());
843 BOOST_CHECK(err.is_equal("Face not found\n"));
844}
845
846BOOST_AUTO_TEST_CASE(Ambiguous)
847{
848 this->processInterest = [this] (const Interest& interest) {
Junxiao Shi918e5d42017-02-25 03:58:21 +0000849 BOOST_CHECK(this->respondFaceQuery(interest));
Junxiao Shi05dd4442017-02-06 22:50:07 +0000850 };
851
852 this->execute("face destroy udp4://225.131.75.231:56363");
853 BOOST_CHECK_EQUAL(exitCode, 5);
854 BOOST_CHECK(out.is_empty());
855 BOOST_CHECK(err.is_equal("Multiple faces match specified remote FaceUri. "
856 "Re-run the command with a FaceId: "
857 "6720 (local=udp4://202.83.168.28:56363), "
858 "31066 (local=udp4://25.90.26.32:56363)\n"));
859}
860
861BOOST_AUTO_TEST_CASE(ErrorCanonization)
862{
863 this->execute("face destroy udp6://32.38.164.64:10445");
864 BOOST_CHECK_EQUAL(exitCode, 4);
865 BOOST_CHECK(out.is_empty());
866 BOOST_CHECK(err.is_equal("Error during remote FaceUri canonization: "
Eric Newberry7d8695d2017-05-29 15:49:10 -0700867 "IPv4/v6 mismatch\n"));
Junxiao Shi05dd4442017-02-06 22:50:07 +0000868}
869
870BOOST_AUTO_TEST_CASE(ErrorDataset)
871{
872 this->processInterest = nullptr; // no response to dataset or command
873
874 this->execute("face destroy udp://159.242.33.78");
875 BOOST_CHECK_EQUAL(exitCode, 1);
876 BOOST_CHECK(out.is_empty());
Eric Newberry359135c2018-06-26 21:02:12 -0700877 BOOST_CHECK(err.is_equal("Error 10060 when querying face: Timeout exceeded\n"));
Junxiao Shi05dd4442017-02-06 22:50:07 +0000878}
879
880BOOST_AUTO_TEST_CASE(ErrorCommand)
881{
882 this->processInterest = [this] (const Interest& interest) {
Junxiao Shi918e5d42017-02-25 03:58:21 +0000883 if (this->respondFaceQuery(interest)) {
Junxiao Shi05dd4442017-02-06 22:50:07 +0000884 return;
885 }
886
Junxiao Shi1a25a6e2017-03-06 03:09:47 +0000887 MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/faces/destroy");
Junxiao Shi05dd4442017-02-06 22:50:07 +0000888 // no response to command
889 };
890
Junxiao Shi918e5d42017-02-25 03:58:21 +0000891 this->execute("face destroy 10156");
Junxiao Shi05dd4442017-02-06 22:50:07 +0000892 BOOST_CHECK_EQUAL(exitCode, 1);
893 BOOST_CHECK(out.is_empty());
894 BOOST_CHECK(err.is_equal("Error 10060 when destroying face: request timed out\n"));
895}
896
897BOOST_AUTO_TEST_SUITE_END() // DestroyCommand
898
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000899const std::string STATUS_XML = stripXmlSpaces(R"XML(
900 <faces>
901 <face>
902 <faceId>134</faceId>
903 <remoteUri>udp4://233.252.0.4:6363</remoteUri>
904 <localUri>udp4://192.0.2.1:6363</localUri>
905 <faceScope>non-local</faceScope>
906 <facePersistency>permanent</facePersistency>
907 <linkType>multi-access</linkType>
Eric Newberryde332452018-01-30 11:45:32 -0700908 <congestion/>
Eric Newberry6d932e82016-11-24 05:05:43 +0000909 <flags/>
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000910 <packetCounters>
911 <incomingPackets>
912 <nInterests>22562</nInterests>
Junxiao Shif03d4792017-04-06 16:41:22 +0000913 <nData>22031</nData>
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000914 <nNacks>63</nNacks>
915 </incomingPackets>
916 <outgoingPackets>
917 <nInterests>30121</nInterests>
Junxiao Shif03d4792017-04-06 16:41:22 +0000918 <nData>20940</nData>
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000919 <nNacks>1218</nNacks>
920 </outgoingPackets>
921 </packetCounters>
922 <byteCounters>
923 <incomingBytes>2522915</incomingBytes>
924 <outgoingBytes>1353592</outgoingBytes>
925 </byteCounters>
926 </face>
927 <face>
928 <faceId>745</faceId>
929 <remoteUri>fd://75</remoteUri>
930 <localUri>unix:///var/run/nfd.sock</localUri>
931 <faceScope>local</faceScope>
932 <facePersistency>on-demand</facePersistency>
933 <linkType>point-to-point</linkType>
Eric Newberryde332452018-01-30 11:45:32 -0700934 <congestion>
935 <baseMarkingInterval>PT0.100S</baseMarkingInterval>
936 <defaultThreshold>65536</defaultThreshold>
937 </congestion>
Eric Newberry4f8dd962018-06-17 21:32:07 -0700938 <mtu>8800</mtu>
Eric Newberry6d932e82016-11-24 05:05:43 +0000939 <flags>
940 <localFieldsEnabled/>
Eric Newberry84d3adc2017-08-09 23:31:40 -0400941 <lpReliabilityEnabled/>
Eric Newberryde332452018-01-30 11:45:32 -0700942 <congestionMarkingEnabled/>
Eric Newberry6d932e82016-11-24 05:05:43 +0000943 </flags>
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000944 <packetCounters>
945 <incomingPackets>
946 <nInterests>18998</nInterests>
Junxiao Shif03d4792017-04-06 16:41:22 +0000947 <nData>26701</nData>
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000948 <nNacks>147</nNacks>
949 </incomingPackets>
950 <outgoingPackets>
951 <nInterests>34779</nInterests>
Junxiao Shif03d4792017-04-06 16:41:22 +0000952 <nData>17028</nData>
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000953 <nNacks>1176</nNacks>
954 </outgoingPackets>
955 </packetCounters>
956 <byteCounters>
957 <incomingBytes>4672308</incomingBytes>
958 <outgoingBytes>8957187</outgoingBytes>
959 </byteCounters>
960 </face>
961 </faces>
962)XML");
963
964const std::string STATUS_TEXT =
965 "Faces:\n"
966 " faceid=134 remote=udp4://233.252.0.4:6363 local=udp4://192.0.2.1:6363"
967 " counters={in={22562i 22031d 63n 2522915B} out={30121i 20940d 1218n 1353592B}}"
Junxiao Shi1f481fa2017-01-26 15:14:43 +0000968 " flags={non-local permanent multi-access}\n"
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000969 " faceid=745 remote=fd://75 local=unix:///var/run/nfd.sock"
Eric Newberry4f8dd962018-06-17 21:32:07 -0700970 " congestion={base-marking-interval=100ms default-threshold=65536B} mtu=8800"
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000971 " counters={in={18998i 26701d 147n 4672308B} out={34779i 17028d 1176n 8957187B}}"
Eric Newberryde332452018-01-30 11:45:32 -0700972 " flags={local on-demand point-to-point local-fields lp-reliability congestion-marking}\n";
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000973
Junxiao Shi1f481fa2017-01-26 15:14:43 +0000974BOOST_FIXTURE_TEST_CASE(Status, StatusFixture<FaceModule>)
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000975{
976 this->fetchStatus();
977 FaceStatus payload1;
978 payload1.setFaceId(134)
979 .setRemoteUri("udp4://233.252.0.4:6363")
980 .setLocalUri("udp4://192.0.2.1:6363")
981 .setFaceScope(ndn::nfd::FACE_SCOPE_NON_LOCAL)
982 .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERMANENT)
983 .setLinkType(ndn::nfd::LINK_TYPE_MULTI_ACCESS)
984 .setNInInterests(22562)
Junxiao Shif03d4792017-04-06 16:41:22 +0000985 .setNInData(22031)
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000986 .setNInNacks(63)
987 .setNOutInterests(30121)
Junxiao Shif03d4792017-04-06 16:41:22 +0000988 .setNOutData(20940)
Junxiao Shi38f4ce92016-08-04 10:01:52 +0000989 .setNOutNacks(1218)
990 .setNInBytes(2522915)
991 .setNOutBytes(1353592);
992 FaceStatus payload2;
993 payload2.setFaceId(745)
994 .setRemoteUri("fd://75")
995 .setLocalUri("unix:///var/run/nfd.sock")
996 .setFaceScope(ndn::nfd::FACE_SCOPE_LOCAL)
997 .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_ON_DEMAND)
998 .setLinkType(ndn::nfd::LINK_TYPE_POINT_TO_POINT)
Eric Newberryde332452018-01-30 11:45:32 -0700999 .setBaseCongestionMarkingInterval(100_ms)
1000 .setDefaultCongestionThreshold(65536)
Eric Newberry4f8dd962018-06-17 21:32:07 -07001001 .setMtu(8800)
Eric Newberry6d932e82016-11-24 05:05:43 +00001002 .setFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED, true)
Eric Newberry84d3adc2017-08-09 23:31:40 -04001003 .setFlagBit(ndn::nfd::BIT_LP_RELIABILITY_ENABLED, true)
Eric Newberryde332452018-01-30 11:45:32 -07001004 .setFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED, true)
Junxiao Shi38f4ce92016-08-04 10:01:52 +00001005 .setNInInterests(18998)
Junxiao Shif03d4792017-04-06 16:41:22 +00001006 .setNInData(26701)
Junxiao Shi38f4ce92016-08-04 10:01:52 +00001007 .setNInNacks(147)
1008 .setNOutInterests(34779)
Junxiao Shif03d4792017-04-06 16:41:22 +00001009 .setNOutData(17028)
Junxiao Shi38f4ce92016-08-04 10:01:52 +00001010 .setNOutNacks(1176)
1011 .setNInBytes(4672308)
1012 .setNOutBytes(8957187);
1013 this->sendDataset("/localhost/nfd/faces/list", payload1, payload2);
1014 this->prepareStatusOutput();
1015
1016 BOOST_CHECK(statusXml.is_equal(STATUS_XML));
1017 BOOST_CHECK(statusText.is_equal(STATUS_TEXT));
1018}
1019
1020BOOST_AUTO_TEST_SUITE_END() // TestFaceModule
Junxiao Shi331ade72016-08-19 14:07:19 +00001021BOOST_AUTO_TEST_SUITE_END() // Nfdc
Junxiao Shi38f4ce92016-08-04 10:01:52 +00001022
1023} // namespace tests
Junxiao Shi331ade72016-08-19 14:07:19 +00001024} // namespace nfdc
Junxiao Shi38f4ce92016-08-04 10:01:52 +00001025} // namespace tools
1026} // namespace nfd