blob: ac50913e5ae1f9b53085e0cdb6366ed3492c0e9d [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
Junxiao Shi8a1f1702017-07-03 00:05:08 +0000231 Interest req = makeControlCommandRequest("/localhost/nfd/faces/create", FaceType::getParameters());
Yanbiao Li73860e32015-08-19 16:30:16 -0700232
233 bool hasCallbackFired = false;
Junxiao Shi8a1f1702017-07-03 00:05:08 +0000234 this->node1.face.onSendData.connect([this, req, &hasCallbackFired] (const Data& response) {
235 if (!req.getName().isPrefixOf(response.getName())) {
Eric Newberry42602412016-08-27 09:33:18 -0700236 return;
237 }
Yanbiao Li73860e32015-08-19 16:30:16 -0700238
Eric Newberry42602412016-08-27 09:33:18 -0700239 ControlResponse actual(response.getContent().blockFromValue());
Davide Pesaventoa3c9ddb2017-04-10 22:15:24 -0400240 ControlResponse expected(CreateResult::getExpected());
Eric Newberry42602412016-08-27 09:33:18 -0700241 BOOST_TEST_MESSAGE(actual.getText());
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000242 BOOST_CHECK_EQUAL(expected.getCode(), actual.getCode());
Yanbiao Li73860e32015-08-19 16:30:16 -0700243
Eric Newberry42602412016-08-27 09:33:18 -0700244 if (actual.getBody().hasWire()) {
Davide Pesaventoa3c9ddb2017-04-10 22:15:24 -0400245 ControlParameters expectedParams(FaceType::getParameters());
Eric Newberry42602412016-08-27 09:33:18 -0700246 ControlParameters actualParams(actual.getBody());
Yanbiao Li73860e32015-08-19 16:30:16 -0700247
Eric Newberry42602412016-08-27 09:33:18 -0700248 BOOST_CHECK(actualParams.hasFaceId());
249 BOOST_CHECK_EQUAL(expectedParams.getFacePersistency(), actualParams.getFacePersistency());
250
Eric Newberryb5aa7f52016-09-03 20:36:12 -0700251 if (actual.getCode() == 200) {
252 if (expectedParams.hasFlags()) {
Eric Newberryf40551a2016-09-05 15:41:16 -0700253 BOOST_CHECK_EQUAL(expectedParams.getFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED),
254 actualParams.getFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED));
Eric Newberryb5aa7f52016-09-03 20:36:12 -0700255 }
256 else {
Eric Newberryf40551a2016-09-05 15:41:16 -0700257 // local fields are disabled by default
258 BOOST_CHECK_EQUAL(actualParams.getFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED), false);
Eric Newberryb5aa7f52016-09-03 20:36:12 -0700259 }
260 }
261 else {
Yanbiao Li73860e32015-08-19 16:30:16 -0700262 BOOST_CHECK_EQUAL(expectedParams.getUri(), actualParams.getUri());
Yanbiao Li73860e32015-08-19 16:30:16 -0700263 }
Eric Newberry42602412016-08-27 09:33:18 -0700264 }
Eric Newberryb5aa7f52016-09-03 20:36:12 -0700265
266 if (actual.getCode() != 200) {
Junxiao Shi38c7d9e2017-04-13 14:22:50 +0000267 FaceUri uri;
268 if (uri.parse(FaceType::getParameters().getUri())) {
269 // ensure face not created
270 auto& faceTable = this->node1.manager.m_faceTable;
271 BOOST_CHECK(std::none_of(faceTable.begin(), faceTable.end(), [uri] (Face& face) {
272 return face.getRemoteUri() == uri;
273 }));
274 }
275 else {
276 // do not check malformed FaceUri
277 }
Eric Newberryb5aa7f52016-09-03 20:36:12 -0700278 }
279
Eric Newberry42602412016-08-27 09:33:18 -0700280 hasCallbackFired = true;
281 });
Yanbiao Li73860e32015-08-19 16:30:16 -0700282
Junxiao Shi8a1f1702017-07-03 00:05:08 +0000283 this->node1.face.receive(req);
Junxiao Shib84e6742016-07-19 13:16:22 +0000284 this->advanceClocks(time::milliseconds(1), 5);
Yanbiao Li73860e32015-08-19 16:30:16 -0700285
286 BOOST_CHECK(hasCallbackFired);
287}
288
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000289BOOST_FIXTURE_TEST_CASE(ExistingFace, FaceManagerCommandFixture)
Yanbiao Li73860e32015-08-19 16:30:16 -0700290{
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000291 using FaceType = UdpFacePersistent;
Yanbiao Li73860e32015-08-19 16:30:16 -0700292
293 {
294 // create face
Junxiao Shi8a1f1702017-07-03 00:05:08 +0000295 Interest req = makeControlCommandRequest("/localhost/nfd/faces/create", FaceType::getParameters());
296 this->node1.face.receive(req);
Junxiao Shib84e6742016-07-19 13:16:22 +0000297 this->advanceClocks(time::milliseconds(1), 5);
Yanbiao Li73860e32015-08-19 16:30:16 -0700298 }
299
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000300 // find the created face
Davide Pesaventoa3c9ddb2017-04-10 22:15:24 -0400301 auto foundFace = this->node1.findFaceByUri(FaceType::getParameters().getUri());
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000302 BOOST_REQUIRE(foundFace != nullptr);
Yanbiao Li73860e32015-08-19 16:30:16 -0700303
304 {
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000305 // re-create face
Junxiao Shi8a1f1702017-07-03 00:05:08 +0000306 Interest req = makeControlCommandRequest("/localhost/nfd/faces/create", FaceType::getParameters());
Yanbiao Li73860e32015-08-19 16:30:16 -0700307
308 bool hasCallbackFired = false;
Junxiao Shib84e6742016-07-19 13:16:22 +0000309 this->node1.face.onSendData.connect(
Junxiao Shi8a1f1702017-07-03 00:05:08 +0000310 [this, req, &hasCallbackFired, foundFace] (const Data& response) {
311 if (!req.getName().isPrefixOf(response.getName())) {
Yanbiao Li73860e32015-08-19 16:30:16 -0700312 return;
313 }
314
315 ControlResponse actual(response.getContent().blockFromValue());
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000316 BOOST_REQUIRE_EQUAL(actual.getCode(), 409);
Yanbiao Li73860e32015-08-19 16:30:16 -0700317
Yanbiao Li73860e32015-08-19 16:30:16 -0700318 ControlParameters actualParams(actual.getBody());
Yanbiao Li58ba3f92017-02-15 14:27:18 +0000319 BOOST_CHECK_EQUAL(foundFace->getId(), actualParams.getFaceId());
320 BOOST_CHECK_EQUAL(foundFace->getRemoteUri().toString(), actualParams.getUri());
321 BOOST_CHECK_EQUAL(foundFace->getPersistency(), actualParams.getFacePersistency());
Yanbiao Li73860e32015-08-19 16:30:16 -0700322
323 hasCallbackFired = true;
324 });
325
Junxiao Shi8a1f1702017-07-03 00:05:08 +0000326 this->node1.face.receive(req);
Junxiao Shib84e6742016-07-19 13:16:22 +0000327 this->advanceClocks(time::milliseconds(1), 5);
Yanbiao Li73860e32015-08-19 16:30:16 -0700328
329 BOOST_CHECK(hasCallbackFired);
330 }
331}
332
333BOOST_AUTO_TEST_SUITE_END() // CreateFace
334BOOST_AUTO_TEST_SUITE_END() // TestFaceManager
335BOOST_AUTO_TEST_SUITE_END() // Mgmt
336
Weiwei Liuf5aee942016-03-19 07:00:42 +0000337} // namespace tests
338} // namespace nfd