blob: 428e517d21c6c956b8ebddbb382fa9f6780f706e [file] [log] [blame]
Yanbiao Li73860e32015-08-19 16:30:16 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Yanbiao Li58ba3f92017-02-15 14:27:18 +00003 * Copyright (c) 2014-2017, Regents of the University of California,
Yanbiao Li73860e32015-08-19 16:30:16 -07004 * Arizona Board of Regents,
5 * Colorado State University,
6 * University Pierre & Marie Curie, Sorbonne University,
7 * Washington University in St. Louis,
8 * Beijing Institute of Technology,
9 * The University of Memphis.
10 *
11 * This file is part of NFD (Named Data Networking Forwarding Daemon).
12 * See AUTHORS.md for complete list of NFD authors and contributors.
13 *
14 * NFD is free software: you can redistribute it and/or modify it under the terms
15 * of the GNU General Public License as published by the Free Software Foundation,
16 * either version 3 of the License, or (at your option) any later version.
17 *
18 * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
19 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
20 * PURPOSE. See the GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License along with
23 * NFD, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
24 */
25
Yanbiao Li58ba3f92017-02-15 14:27:18 +000026#include "mgmt/face-manager.hpp"
Eric Newberry42602412016-08-27 09:33:18 -070027#include "face-manager-command-fixture.hpp"
28#include "nfd-manager-common-fixture.hpp"
Junxiao Shib84e6742016-07-19 13:16:22 +000029
Yanbiao Li73860e32015-08-19 16:30:16 -070030namespace nfd {
31namespace tests {
32
Yanbiao Li73860e32015-08-19 16:30:16 -070033BOOST_AUTO_TEST_SUITE(Mgmt)
34BOOST_AUTO_TEST_SUITE(TestFaceManager)
35
36BOOST_FIXTURE_TEST_SUITE(CreateFace, BaseFixture)
37
Yanbiao Li73860e32015-08-19 16:30:16 -070038class TcpFaceOnDemand
39{
40public:
Davide Pesaventoa3c9ddb2017-04-10 22:15:24 -040041 static ControlParameters
Yanbiao Li73860e32015-08-19 16:30:16 -070042 getParameters()
43 {
44 return ControlParameters()
45 .setUri("tcp4://127.0.0.1:26363")
46 .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_ON_DEMAND);
47 }
48};
49
50class TcpFacePersistent
51{
52public:
Davide Pesaventoa3c9ddb2017-04-10 22:15:24 -040053 static ControlParameters
Yanbiao Li73860e32015-08-19 16:30:16 -070054 getParameters()
55 {
56 return ControlParameters()
57 .setUri("tcp4://127.0.0.1:26363")
58 .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERSISTENT);
59 }
60};
61
62class TcpFacePermanent
63{
64public:
Davide Pesaventoa3c9ddb2017-04-10 22:15:24 -040065 static ControlParameters
Yanbiao Li73860e32015-08-19 16:30:16 -070066 getParameters()
67 {
68 return ControlParameters()
69 .setUri("tcp4://127.0.0.1:26363")
70 .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERMANENT);
71 }
72};
73
74class UdpFaceOnDemand
75{
76public:
Davide Pesaventoa3c9ddb2017-04-10 22:15:24 -040077 static ControlParameters
Yanbiao Li73860e32015-08-19 16:30:16 -070078 getParameters()
79 {
80 return ControlParameters()
81 .setUri("udp4://127.0.0.1:26363")
82 .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_ON_DEMAND);
83 }
84};
85
Yanbiao Li73860e32015-08-19 16:30:16 -070086class UdpFacePersistent
87{
88public:
Davide Pesaventoa3c9ddb2017-04-10 22:15:24 -040089 static ControlParameters
Yanbiao Li73860e32015-08-19 16:30:16 -070090 getParameters()
91 {
92 return ControlParameters()
93 .setUri("udp4://127.0.0.1:26363")
94 .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERSISTENT);
95 }
96};
97
98class UdpFacePermanent
99{
100public:
Davide Pesaventoa3c9ddb2017-04-10 22:15:24 -0400101 static ControlParameters
Yanbiao Li73860e32015-08-19 16:30:16 -0700102 getParameters()
103 {
104 return ControlParameters()
105 .setUri("udp4://127.0.0.1:26363")
106 .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERMANENT);
107 }
108};
109
Eric Newberryb5aa7f52016-09-03 20:36:12 -0700110class UdpFaceConnectToSelf // face that will cause afterCreateFaceFailure to be invoked
111 // fails because remote endpoint is prohibited
Yanbiao Li73860e32015-08-19 16:30:16 -0700112{
113public:
Davide Pesaventoa3c9ddb2017-04-10 22:15:24 -0400114 static ControlParameters
Eric Newberryb5aa7f52016-09-03 20:36:12 -0700115 getParameters()
Yanbiao Li73860e32015-08-19 16:30:16 -0700116 {
Eric Newberryb5aa7f52016-09-03 20:36:12 -0700117 return ControlParameters()
118 .setUri("udp4://0.0.0.0:16363"); // cannot connect to self
Yanbiao Li73860e32015-08-19 16:30:16 -0700119 }
120};
121
Eric Newberryf40551a2016-09-05 15:41:16 -0700122class LocalTcpFaceLocalFieldsEnabled
123{
124public:
Davide Pesaventoa3c9ddb2017-04-10 22:15:24 -0400125 static ControlParameters
Eric Newberryf40551a2016-09-05 15:41:16 -0700126 getParameters()
127 {
128 return ControlParameters()
129 .setUri("tcp4://127.0.0.1:26363")
130 .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERSISTENT)
131 .setFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED, true);
132 }
133};
134
135class LocalTcpFaceLocalFieldsDisabled
136{
137public:
Davide Pesaventoa3c9ddb2017-04-10 22:15:24 -0400138 static ControlParameters
Eric Newberryf40551a2016-09-05 15:41:16 -0700139 getParameters()
140 {
141 return ControlParameters()
142 .setUri("tcp4://127.0.0.1:26363")
143 .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERSISTENT)
144 .setFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED, false);
145 }
146};
147
148class NonLocalUdpFaceLocalFieldsEnabled // won't work because non-local scope
149{
150public:
Davide Pesaventoa3c9ddb2017-04-10 22:15:24 -0400151 static ControlParameters
Eric Newberryf40551a2016-09-05 15:41:16 -0700152 getParameters()
153 {
154 return ControlParameters()
155 .setUri("udp4://127.0.0.1:26363")
156 .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERSISTENT)
157 .setFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED, true);
158 }
159};
160
161class NonLocalUdpFaceLocalFieldsDisabled
162{
163public:
Davide Pesaventoa3c9ddb2017-04-10 22:15:24 -0400164 static ControlParameters
Eric Newberryf40551a2016-09-05 15:41:16 -0700165 getParameters()
166 {
167 return ControlParameters()
168 .setUri("udp4://127.0.0.1:26363")
169 .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERSISTENT)
170 .setFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED, false);
171 }
172};
173
Junxiao Shi38c7d9e2017-04-13 14:22:50 +0000174class FaceUriMalformed
175{
176public:
177 static ControlParameters
178 getParameters()
179 {
180 return ControlParameters()
181 .setUri("tcp4://127.0.0.1:not-a-port");
182 }
183};
184
185class FaceUriNonCanonical
186{
187public:
188 static ControlParameters
189 getParameters()
190 {
191 return ControlParameters()
192 .setUri("udp://localhost");
193 }
194};
195
196class FaceUriUnsupportedScheme
197{
198public:
199 static ControlParameters
200 getParameters()
201 {
202 return ControlParameters()
203 .setUri("dev://eth0");
204 }
205};
206
Yanbiao Li73860e32015-08-19 16:30:16 -0700207namespace mpl = boost::mpl;
208
Eric Newberry42602412016-08-27 09:33:18 -0700209// pairs of CreateCommand and Success/Failure status
Davide Pesaventoa3c9ddb2017-04-10 22:15:24 -0400210using TestCases = mpl::vector<
211 mpl::pair<TcpFaceOnDemand, CommandFailure<406>>,
Eric Newberryb5aa7f52016-09-03 20:36:12 -0700212 mpl::pair<TcpFacePersistent, CommandSuccess>,
Davide Pesaventoa3c9ddb2017-04-10 22:15:24 -0400213 mpl::pair<TcpFacePermanent, CommandSuccess>,
Eric Newberryb5aa7f52016-09-03 20:36:12 -0700214 mpl::pair<UdpFaceOnDemand, CommandFailure<406>>,
215 mpl::pair<UdpFacePersistent, CommandSuccess>,
216 mpl::pair<UdpFacePermanent, CommandSuccess>,
Eric Newberryf40551a2016-09-05 15:41:16 -0700217 mpl::pair<UdpFaceConnectToSelf, CommandFailure<406>>,
218 mpl::pair<LocalTcpFaceLocalFieldsEnabled, CommandSuccess>,
219 mpl::pair<LocalTcpFaceLocalFieldsDisabled, CommandSuccess>,
220 mpl::pair<NonLocalUdpFaceLocalFieldsEnabled, CommandFailure<406>>,
Junxiao Shi38c7d9e2017-04-13 14:22:50 +0000221 mpl::pair<NonLocalUdpFaceLocalFieldsDisabled, CommandSuccess>,
222 mpl::pair<FaceUriMalformed, CommandFailure<400>>,
223 mpl::pair<FaceUriNonCanonical, CommandFailure<400>>,
224 mpl::pair<FaceUriUnsupportedScheme, CommandFailure<406>>>;
Yanbiao Li73860e32015-08-19 16:30:16 -0700225
Davide Pesaventoa3c9ddb2017-04-10 22:15:24 -0400226BOOST_FIXTURE_TEST_CASE_TEMPLATE(NewFace, T, TestCases, FaceManagerCommandFixture)
Yanbiao Li73860e32015-08-19 16:30:16 -0700227{
Davide Pesaventoa3c9ddb2017-04-10 22:15:24 -0400228 using FaceType = typename T::first;
229 using CreateResult = typename T::second;
Yanbiao Li73860e32015-08-19 16:30:16 -0700230
231 Name commandName("/localhost/nfd/faces");
232 commandName.append("create");
Davide Pesaventoa3c9ddb2017-04-10 22:15:24 -0400233 commandName.append(FaceType::getParameters().wireEncode());
Junxiao Shib84e6742016-07-19 13:16:22 +0000234 auto command = makeInterest(commandName);
Junxiao Shi221b6fe2016-07-14 18:21:56 +0000235 m_keyChain.sign(*command);
Yanbiao Li73860e32015-08-19 16:30:16 -0700236
237 bool hasCallbackFired = false;
Junxiao Shi221b6fe2016-07-14 18:21:56 +0000238 this->node1.face.onSendData.connect([this, command, &hasCallbackFired] (const Data& response) {
Eric Newberry42602412016-08-27 09:33:18 -0700239 if (!command->getName().isPrefixOf(response.getName())) {
240 return;
241 }
Yanbiao Li73860e32015-08-19 16:30:16 -0700242
Eric Newberry42602412016-08-27 09:33:18 -0700243 ControlResponse actual(response.getContent().blockFromValue());
Davide Pesaventoa3c9ddb2017-04-10 22:15:24 -0400244 ControlResponse expected(CreateResult::getExpected());
Eric Newberry42602412016-08-27 09:33:18 -0700245 BOOST_TEST_MESSAGE(actual.getText());
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000246 BOOST_CHECK_EQUAL(expected.getCode(), actual.getCode());
Yanbiao Li73860e32015-08-19 16:30:16 -0700247
Eric Newberry42602412016-08-27 09:33:18 -0700248 if (actual.getBody().hasWire()) {
Davide Pesaventoa3c9ddb2017-04-10 22:15:24 -0400249 ControlParameters expectedParams(FaceType::getParameters());
Eric Newberry42602412016-08-27 09:33:18 -0700250 ControlParameters actualParams(actual.getBody());
Yanbiao Li73860e32015-08-19 16:30:16 -0700251
Eric Newberry42602412016-08-27 09:33:18 -0700252 BOOST_CHECK(actualParams.hasFaceId());
253 BOOST_CHECK_EQUAL(expectedParams.getFacePersistency(), actualParams.getFacePersistency());
254
Eric Newberryb5aa7f52016-09-03 20:36:12 -0700255 if (actual.getCode() == 200) {
256 if (expectedParams.hasFlags()) {
Eric Newberryf40551a2016-09-05 15:41:16 -0700257 BOOST_CHECK_EQUAL(expectedParams.getFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED),
258 actualParams.getFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED));
Eric Newberryb5aa7f52016-09-03 20:36:12 -0700259 }
260 else {
Eric Newberryf40551a2016-09-05 15:41:16 -0700261 // local fields are disabled by default
262 BOOST_CHECK_EQUAL(actualParams.getFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED), false);
Eric Newberryb5aa7f52016-09-03 20:36:12 -0700263 }
264 }
265 else {
Yanbiao Li73860e32015-08-19 16:30:16 -0700266 BOOST_CHECK_EQUAL(expectedParams.getUri(), actualParams.getUri());
Yanbiao Li73860e32015-08-19 16:30:16 -0700267 }
Eric Newberry42602412016-08-27 09:33:18 -0700268 }
Eric Newberryb5aa7f52016-09-03 20:36:12 -0700269
270 if (actual.getCode() != 200) {
Junxiao Shi38c7d9e2017-04-13 14:22:50 +0000271 FaceUri uri;
272 if (uri.parse(FaceType::getParameters().getUri())) {
273 // ensure face not created
274 auto& faceTable = this->node1.manager.m_faceTable;
275 BOOST_CHECK(std::none_of(faceTable.begin(), faceTable.end(), [uri] (Face& face) {
276 return face.getRemoteUri() == uri;
277 }));
278 }
279 else {
280 // do not check malformed FaceUri
281 }
Eric Newberryb5aa7f52016-09-03 20:36:12 -0700282 }
283
Eric Newberry42602412016-08-27 09:33:18 -0700284 hasCallbackFired = true;
285 });
Yanbiao Li73860e32015-08-19 16:30:16 -0700286
Junxiao Shi221b6fe2016-07-14 18:21:56 +0000287 this->node1.face.receive(*command);
Junxiao Shib84e6742016-07-19 13:16:22 +0000288 this->advanceClocks(time::milliseconds(1), 5);
Yanbiao Li73860e32015-08-19 16:30:16 -0700289
290 BOOST_CHECK(hasCallbackFired);
291}
292
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000293BOOST_FIXTURE_TEST_CASE(ExistingFace, FaceManagerCommandFixture)
Yanbiao Li73860e32015-08-19 16:30:16 -0700294{
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000295 using FaceType = UdpFacePersistent;
Yanbiao Li73860e32015-08-19 16:30:16 -0700296
297 {
298 // create face
299
300 Name commandName("/localhost/nfd/faces");
301 commandName.append("create");
Davide Pesaventoa3c9ddb2017-04-10 22:15:24 -0400302 commandName.append(FaceType::getParameters().wireEncode());
Junxiao Shib84e6742016-07-19 13:16:22 +0000303 auto command = makeInterest(commandName);
Junxiao Shi221b6fe2016-07-14 18:21:56 +0000304 m_keyChain.sign(*command);
Yanbiao Li73860e32015-08-19 16:30:16 -0700305
Junxiao Shi221b6fe2016-07-14 18:21:56 +0000306 this->node1.face.receive(*command);
Junxiao Shib84e6742016-07-19 13:16:22 +0000307 this->advanceClocks(time::milliseconds(1), 5);
Yanbiao Li73860e32015-08-19 16:30:16 -0700308 }
309
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000310 // find the created face
Davide Pesaventoa3c9ddb2017-04-10 22:15:24 -0400311 auto foundFace = this->node1.findFaceByUri(FaceType::getParameters().getUri());
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000312 BOOST_REQUIRE(foundFace != nullptr);
Yanbiao Li73860e32015-08-19 16:30:16 -0700313
314 {
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000315 // re-create face
Yanbiao Li73860e32015-08-19 16:30:16 -0700316
317 Name commandName("/localhost/nfd/faces");
318 commandName.append("create");
Davide Pesaventoa3c9ddb2017-04-10 22:15:24 -0400319 commandName.append(FaceType::getParameters().wireEncode());
Junxiao Shib84e6742016-07-19 13:16:22 +0000320 auto command = makeInterest(commandName);
Junxiao Shi221b6fe2016-07-14 18:21:56 +0000321 m_keyChain.sign(*command);
Yanbiao Li73860e32015-08-19 16:30:16 -0700322
323 bool hasCallbackFired = false;
Junxiao Shib84e6742016-07-19 13:16:22 +0000324 this->node1.face.onSendData.connect(
325 [this, command, &hasCallbackFired, foundFace] (const Data& response) {
Yanbiao Li73860e32015-08-19 16:30:16 -0700326 if (!command->getName().isPrefixOf(response.getName())) {
327 return;
328 }
329
330 ControlResponse actual(response.getContent().blockFromValue());
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000331 BOOST_REQUIRE_EQUAL(actual.getCode(), 409);
Yanbiao Li73860e32015-08-19 16:30:16 -0700332
Yanbiao Li73860e32015-08-19 16:30:16 -0700333 ControlParameters actualParams(actual.getBody());
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000334 BOOST_CHECK_EQUAL(foundFace->getId(), actualParams.getFaceId());
335 BOOST_CHECK_EQUAL(foundFace->getRemoteUri().toString(), actualParams.getUri());
336 BOOST_CHECK_EQUAL(foundFace->getPersistency(), actualParams.getFacePersistency());
Yanbiao Li73860e32015-08-19 16:30:16 -0700337
338 hasCallbackFired = true;
339 });
340
Junxiao Shi221b6fe2016-07-14 18:21:56 +0000341 this->node1.face.receive(*command);
Junxiao Shib84e6742016-07-19 13:16:22 +0000342 this->advanceClocks(time::milliseconds(1), 5);
Yanbiao Li73860e32015-08-19 16:30:16 -0700343
344 BOOST_CHECK(hasCallbackFired);
345 }
346}
347
348BOOST_AUTO_TEST_SUITE_END() // CreateFace
349BOOST_AUTO_TEST_SUITE_END() // TestFaceManager
350BOOST_AUTO_TEST_SUITE_END() // Mgmt
351
Weiwei Liuf5aee942016-03-19 07:00:42 +0000352} // namespace tests
353} // namespace nfd