blob: 6be31ed4d9c2b8a1f3c7aff772011b12f591f9f4 [file] [log] [blame]
Vince Lehman09131122014-09-09 17:10:11 -05001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Junxiao Shi0b1b7d92019-05-22 15:37:18 +00002/*
Ashlesh Gawande7e3f6d72019-01-25 13:13:43 -06003 * Copyright (c) 2014-2019, The University of Memphis,
Vince Lehmanc2acdcb2015-04-29 11:14:35 -05004 * Regents of the University of California,
5 * Arizona Board of Regents.
Vince Lehman09131122014-09-09 17:10:11 -05006 *
7 * This file is part of NLSR (Named-data Link State Routing).
8 * See AUTHORS.md for complete list of NLSR authors and contributors.
9 *
10 * NLSR is free software: you can redistribute it and/or modify it under the terms
11 * of the GNU General Public License as published by the Free Software Foundation,
12 * either version 3 of the License, or (at your option) any later version.
13 *
14 * NLSR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
15 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
16 * PURPOSE. See the GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License along with
19 * NLSR, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
Junxiao Shi0b1b7d92019-05-22 15:37:18 +000020 */
Vince Lehman09131122014-09-09 17:10:11 -050021
Ashlesh Gawande3909aa12017-07-28 16:01:35 -050022#include "nlsr.hpp"
Vince Lehman02e32992015-03-11 12:31:20 -050023#include "test-common.hpp"
Vince Lehman199e9cf2015-04-07 13:22:16 -050024#include "control-commands.hpp"
Nick Gordonc0c6bcf2017-08-15 18:11:21 -050025#include "logger.hpp"
Vince Lehman09131122014-09-09 17:10:11 -050026
Junxiao Shi3e5120c2016-09-10 16:58:34 +000027#include <ndn-cxx/mgmt/nfd/face-event-notification.hpp>
Vince Lehman09131122014-09-09 17:10:11 -050028
29namespace nlsr {
30namespace test {
31
Ashlesh Gawande85998a12017-12-07 22:22:13 -060032using namespace ndn::time_literals;
Vince Lehman09131122014-09-09 17:10:11 -050033
Nick Gordond5c1a372016-10-31 13:56:23 -050034class NlsrFixture : public MockNfdMgmtFixture
Vince Lehmanf7eec4f2015-05-08 19:02:31 -050035{
36public:
37 NlsrFixture()
Ashlesh Gawande85998a12017-12-07 22:22:13 -060038 : conf(m_face)
39 , confProcessor(conf)
40 , nlsr(m_face, m_keyChain, conf)
41 , lsdb(nlsr.m_lsdb)
42 , neighbors(conf.getAdjacencyList())
Nick Gordond5c1a372016-10-31 13:56:23 -050043 , nSuccessCallbacks(0)
44 , nFailureCallbacks(0)
Vince Lehmanf7eec4f2015-05-08 19:02:31 -050045 {
Ashlesh Gawande85998a12017-12-07 22:22:13 -060046 addIdentity(conf.getRouterPrefix());
Vince Lehmanf7eec4f2015-05-08 19:02:31 -050047 }
48
49 void
50 receiveHelloData(const ndn::Name& sender, const ndn::Name& receiver)
51 {
52 ndn::Name dataName(sender);
53 dataName.append("NLSR").append("INFO").append(receiver.wireEncode()).appendVersion();
54
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -050055 ndn::Data data(dataName);
Vince Lehmanf7eec4f2015-05-08 19:02:31 -050056
57 nlsr.m_helloProtocol.onContentValidated(data);
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -050058 }
Vince Lehmanf7eec4f2015-05-08 19:02:31 -050059
60public:
Ashlesh Gawande85998a12017-12-07 22:22:13 -060061 ConfParameter conf;
62 DummyConfFileProcessor confProcessor;
Vince Lehmanf7eec4f2015-05-08 19:02:31 -050063 Nlsr nlsr;
64 Lsdb& lsdb;
65 AdjacencyList& neighbors;
Nick Gordond5c1a372016-10-31 13:56:23 -050066 uint32_t nSuccessCallbacks;
67 uint32_t nFailureCallbacks;
Vince Lehmanf7eec4f2015-05-08 19:02:31 -050068};
69
70BOOST_FIXTURE_TEST_SUITE(TestNlsr, NlsrFixture)
Vince Lehman09131122014-09-09 17:10:11 -050071
72BOOST_AUTO_TEST_CASE(HyperbolicOn_ZeroCostNeighbors)
73{
Vince Lehman09131122014-09-09 17:10:11 -050074 // Simulate loading configuration file
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -050075 Adjacent neighborA("/ndn/neighborA", ndn::FaceUri("udp4://10.0.0.1"), 25,
Nick Gordon727d4832017-10-13 18:04:25 -050076 Adjacent::STATUS_INACTIVE, 0, 0);
Vince Lehman09131122014-09-09 17:10:11 -050077 neighbors.insert(neighborA);
78
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -050079 Adjacent neighborB("/ndn/neighborB", ndn::FaceUri("udp4://10.0.0.2"), 10,
Nick Gordon727d4832017-10-13 18:04:25 -050080 Adjacent::STATUS_INACTIVE, 0, 0);
Vince Lehman09131122014-09-09 17:10:11 -050081 neighbors.insert(neighborB);
82
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -050083 Adjacent neighborC("/ndn/neighborC", ndn::FaceUri("udp4://10.0.0.3"), 17,
Nick Gordon727d4832017-10-13 18:04:25 -050084 Adjacent::STATUS_INACTIVE, 0, 0);
Vince Lehman09131122014-09-09 17:10:11 -050085 neighbors.insert(neighborC);
86
Ashlesh Gawande85998a12017-12-07 22:22:13 -060087 conf.setHyperbolicState(HYPERBOLIC_STATE_ON);
Vince Lehman09131122014-09-09 17:10:11 -050088
89 nlsr.initialize();
90
91 std::list<Adjacent> neighborList = neighbors.getAdjList();
92 for (std::list<Adjacent>::iterator it = neighborList.begin(); it != neighborList.end(); ++it) {
93 BOOST_CHECK_EQUAL(it->getLinkCost(), 0);
94 }
95}
96
97BOOST_AUTO_TEST_CASE(HyperbolicOff_LinkStateCost)
98{
Vince Lehman09131122014-09-09 17:10:11 -050099 // Simulate loading configuration file
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500100 Adjacent neighborA("/ndn/neighborA", ndn::FaceUri("udp4://10.0.0.1"), 25,
Nick Gordon727d4832017-10-13 18:04:25 -0500101 Adjacent::STATUS_INACTIVE, 0, 0);
Vince Lehman09131122014-09-09 17:10:11 -0500102 neighbors.insert(neighborA);
103
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500104 Adjacent neighborB("/ndn/neighborB", ndn::FaceUri("udp4://10.0.0.2"), 10,
Nick Gordon727d4832017-10-13 18:04:25 -0500105 Adjacent::STATUS_INACTIVE, 0, 0);
Vince Lehman09131122014-09-09 17:10:11 -0500106 neighbors.insert(neighborB);
107
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500108 Adjacent neighborC("/ndn/neighborC", ndn::FaceUri("udp4://10.0.0.3"), 17,
Nick Gordon727d4832017-10-13 18:04:25 -0500109 Adjacent::STATUS_INACTIVE, 0, 0);
Vince Lehman09131122014-09-09 17:10:11 -0500110 neighbors.insert(neighborC);
111
112 nlsr.initialize();
113
114 std::list<Adjacent> neighborList = neighbors.getAdjList();
115 for (std::list<Adjacent>::iterator it = neighborList.begin(); it != neighborList.end(); ++it) {
116 BOOST_CHECK(it->getLinkCost() != 0);
117 }
118}
119
Vince Lehman7b616582014-10-17 16:25:39 -0500120BOOST_AUTO_TEST_CASE(SetEventIntervals)
121{
Vince Lehman7b616582014-10-17 16:25:39 -0500122 // Simulate loading configuration file
Vince Lehman7b616582014-10-17 16:25:39 -0500123 conf.setAdjLsaBuildInterval(3);
124 conf.setFirstHelloInterval(6);
125 conf.setRoutingCalcInterval(9);
126
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600127 Nlsr nlsr2(m_face, m_keyChain, conf);
Vince Lehman7b616582014-10-17 16:25:39 -0500128
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600129 const Lsdb& lsdb = nlsr2.m_lsdb;
130 const RoutingTable& rt = nlsr2.m_routingTable;
Vince Lehman7b616582014-10-17 16:25:39 -0500131
Ashlesh Gawande15052402018-12-12 20:20:00 -0600132 BOOST_CHECK_EQUAL(lsdb.m_adjLsaBuildInterval, ndn::time::seconds(3));
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600133 BOOST_CHECK_EQUAL(conf.getFirstHelloInterval(), 6);
Vince Lehman7b616582014-10-17 16:25:39 -0500134 BOOST_CHECK_EQUAL(rt.getRoutingCalcInterval(), ndn::time::seconds(9));
135}
136
Nick Gordond5c1a372016-10-31 13:56:23 -0500137BOOST_AUTO_TEST_CASE(FaceCreateEvent)
138{
139 // Setting constants for the unit test
140 const uint32_t faceId = 1;
141 const std::string faceUri = "udp4://10.0.0.1:6363";
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500142
143 Adjacent neighbor("/ndn/neighborA", ndn::FaceUri(faceUri), 10,
Nick Gordon727d4832017-10-13 18:04:25 -0500144 Adjacent::STATUS_INACTIVE, 0, 0);
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500145
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600146 BOOST_REQUIRE_EQUAL(conf.getAdjacencyList().insert(neighbor), 0);
Nick Gordond5c1a372016-10-31 13:56:23 -0500147
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600148 this->advanceClocks(10_ms);
Nick Gordond5c1a372016-10-31 13:56:23 -0500149
150 // Build, sign, and send the Face Event
151 ndn::nfd::FaceEventNotification event;
152 event.setKind(ndn::nfd::FACE_EVENT_CREATED)
153 .setRemoteUri(faceUri)
154 .setFaceId(faceId);
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600155 auto data = std::make_shared<ndn::Data>("/localhost/nfd/faces/events/%FE%00");
Junxiao Shi0b1b7d92019-05-22 15:37:18 +0000156 data->setFreshnessPeriod(1_s);
Nick Gordond5c1a372016-10-31 13:56:23 -0500157 data->setContent(event.wireEncode());
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600158 m_keyChain.sign(*data);
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500159 m_face.receive(*data);
Nick Gordond5c1a372016-10-31 13:56:23 -0500160
161 // Move the clocks forward so that the Face processes the event.
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600162 this->advanceClocks(10_ms);
Nick Gordond5c1a372016-10-31 13:56:23 -0500163
164 // Need to explicitly provide a FaceUri object, because the
165 // conversion will attempt to create Name objects.
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600166 auto iterator = conf.getAdjacencyList().findAdjacent(ndn::FaceUri(faceUri));
167 BOOST_REQUIRE(iterator != conf.getAdjacencyList().end());
Nick Gordond5c1a372016-10-31 13:56:23 -0500168 BOOST_CHECK_EQUAL(iterator->getFaceId(), faceId);
169}
170
171BOOST_AUTO_TEST_CASE(FaceCreateEventNoMatch)
172{
173 // Setting constants for the unit test
174 const uint32_t faceId = 1;
175 const std::string eventUri = "udp4://10.0.0.1:6363";
176 const std::string neighborUri = "udp4://10.0.0.2:6363";
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500177
178 Adjacent neighbor("/ndn/neighborA", ndn::FaceUri(neighborUri), 10,
Nick Gordon727d4832017-10-13 18:04:25 -0500179 Adjacent::STATUS_INACTIVE, 0, 0);
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500180
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600181 conf.getAdjacencyList().insert(neighbor);
Nick Gordond5c1a372016-10-31 13:56:23 -0500182
183 // Build, sign, and send the Face Event
184 ndn::nfd::FaceEventNotification event;
185 event.setKind(ndn::nfd::FACE_EVENT_CREATED)
186 .setRemoteUri(eventUri)
187 .setFaceId(faceId);
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600188 auto data = std::make_shared<ndn::Data>("/localhost/nfd/faces/events/%FE%00");
Junxiao Shi0b1b7d92019-05-22 15:37:18 +0000189 data->setFreshnessPeriod(1_s);
Nick Gordond5c1a372016-10-31 13:56:23 -0500190 data->setContent(event.wireEncode());
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600191 m_keyChain.sign(*data);
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500192 m_face.receive(*data);
Nick Gordond5c1a372016-10-31 13:56:23 -0500193
194 // Move the clocks forward so that the Face processes the event.
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600195 this->advanceClocks(10_ms);
Nick Gordond5c1a372016-10-31 13:56:23 -0500196
197 // The Face URIs did not match, so this neighbor should be unconfigured.
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600198 auto iterator = conf.getAdjacencyList().findAdjacent(ndn::FaceUri(neighborUri));
199 BOOST_REQUIRE(iterator != conf.getAdjacencyList().end());
Nick Gordond5c1a372016-10-31 13:56:23 -0500200 BOOST_CHECK_EQUAL(iterator->getFaceId(), 0);
201}
202
203BOOST_AUTO_TEST_CASE(FaceCreateEventAlreadyConfigured)
204{
Ashlesh Gawande41878572019-09-29 00:16:02 -0500205 // So if NLSR gets the notification and registers prefixes it
206 // will change the Id to 1 and our tests will fail
207 // Need to disable registrationReply in dummy face and have own registration reply in the future
208 const uint32_t neighborFaceId = 1;
Nick Gordond5c1a372016-10-31 13:56:23 -0500209 const std::string faceUri = "udp4://10.0.0.1:6363";
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500210
211 Adjacent neighbor("/ndn/neighborA", ndn::FaceUri(faceUri), 10,
Ashlesh Gawande41878572019-09-29 00:16:02 -0500212 Adjacent::STATUS_ACTIVE, 0, 0);
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600213 conf.getAdjacencyList().insert(neighbor);
Nick Gordond5c1a372016-10-31 13:56:23 -0500214
Ashlesh Gawande41878572019-09-29 00:16:02 -0500215 // Let NLSR start the face monitor
216 this->advanceClocks(10_ms);
217
Nick Gordond5c1a372016-10-31 13:56:23 -0500218 // Build, sign, and send the Face Event
219 ndn::nfd::FaceEventNotification event;
220 event.setKind(ndn::nfd::FACE_EVENT_CREATED)
221 .setRemoteUri(faceUri)
Ashlesh Gawande41878572019-09-29 00:16:02 -0500222 .setFaceId(neighborFaceId); // Does not matter what we set here, dummy face always returns 1
Nick Gordond5c1a372016-10-31 13:56:23 -0500223 std::shared_ptr<ndn::Data> data = std::make_shared<ndn::Data>("/localhost/nfd/faces/events/%FE%00");
Junxiao Shi0b1b7d92019-05-22 15:37:18 +0000224 data->setFreshnessPeriod(1_s);
Nick Gordond5c1a372016-10-31 13:56:23 -0500225 data->setContent(event.wireEncode());
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600226 m_keyChain.sign(*data);
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500227 m_face.receive(*data);
Nick Gordond5c1a372016-10-31 13:56:23 -0500228
229 // Move the clocks forward so that the Face processes the event.
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600230 this->advanceClocks(10_ms);
Nick Gordond5c1a372016-10-31 13:56:23 -0500231
Ashlesh Gawande41878572019-09-29 00:16:02 -0500232 // Check that the neighbor is configured with the face id of 1
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600233 auto iterator = conf.getAdjacencyList().findAdjacent(ndn::FaceUri(faceUri));
234 BOOST_REQUIRE(iterator != conf.getAdjacencyList().end());
Nick Gordond5c1a372016-10-31 13:56:23 -0500235 BOOST_CHECK_EQUAL(iterator->getFaceId(), neighborFaceId);
Ashlesh Gawande41878572019-09-29 00:16:02 -0500236
237 // Resend same event notification again
238 m_face.sentInterests.clear();
239 data->setName("/localhost/nfd/faces/events/%FE%01");
240 m_keyChain.sign(*data);
241 m_face.receive(*data);
242 this->advanceClocks(10_ms);
243
244 for (const auto& interest : m_face.sentInterests) {
245 // Should not re-register prefix since this is the same event notification
246 if (ndn::Name("/localhost/nfd/rib/register").isPrefixOf(interest.getName())) {
247 BOOST_CHECK(false);
248 }
249 }
Nick Gordond5c1a372016-10-31 13:56:23 -0500250}
251
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500252BOOST_AUTO_TEST_CASE(FaceDestroyEvent)
Vince Lehman02e32992015-03-11 12:31:20 -0500253{
Vince Lehman02e32992015-03-11 12:31:20 -0500254 // Add active neighbors
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600255 AdjacencyList& neighbors = conf.getAdjacencyList();
Vince Lehman02e32992015-03-11 12:31:20 -0500256 uint64_t destroyFaceId = 128;
257
258 // Create a neighbor whose Face will be destroyed
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500259 Adjacent failNeighbor("/ndn/neighborA", ndn::FaceUri("udp4://10.0.0.1"),
260 10, Adjacent::STATUS_ACTIVE, 0, destroyFaceId);
Vince Lehman02e32992015-03-11 12:31:20 -0500261 neighbors.insert(failNeighbor);
262
263 // Create an additional neighbor so an adjacency LSA can be built after the face is destroyed
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500264 Adjacent otherNeighbor("/ndn/neighborB", ndn::FaceUri("udp4://10.0.0.2"),
265 10, Adjacent::STATUS_ACTIVE, 0, 256);
Vince Lehman02e32992015-03-11 12:31:20 -0500266 neighbors.insert(otherNeighbor);
267
268 nlsr.initialize();
269
270 // Simulate successful HELLO responses
Vince Lehman41b173e2015-05-07 14:13:26 -0500271 lsdb.scheduleAdjLsaBuild();
272
273 // Set up adjacency LSAs
274 // This router
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500275 Adjacent thisRouter(conf.getRouterPrefix(), ndn::FaceUri("udp4://10.0.0.3"),
276 10, Adjacent::STATUS_ACTIVE, 0, 256);
Vince Lehman41b173e2015-05-07 14:13:26 -0500277
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500278 AdjLsa ownAdjLsa(conf.getRouterPrefix(), 10,
279 ndn::time::system_clock::now(), 1, neighbors);
Vince Lehman41b173e2015-05-07 14:13:26 -0500280 lsdb.installAdjLsa(ownAdjLsa);
281
282 // Router that will fail
283 AdjacencyList failAdjacencies;
284 failAdjacencies.insert(thisRouter);
285
Ashlesh Gawanded02c3882015-12-29 16:02:51 -0600286 AdjLsa failAdjLsa("/ndn/neighborA", 10,
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500287 ndn::time::system_clock::now() + ndn::time::seconds(3600),
288 1, failAdjacencies);
Vince Lehman41b173e2015-05-07 14:13:26 -0500289
290 lsdb.installAdjLsa(failAdjLsa);
291
292 // Other router
293 AdjacencyList otherAdjacencies;
294 otherAdjacencies.insert(thisRouter);
295
Ashlesh Gawanded02c3882015-12-29 16:02:51 -0600296 AdjLsa otherAdjLsa("/ndn/neighborB", 10,
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500297 ndn::time::system_clock::now() + ndn::time::seconds(3600),
298 1, otherAdjacencies);
Vince Lehman41b173e2015-05-07 14:13:26 -0500299
300 lsdb.installAdjLsa(otherAdjLsa);
Vince Lehman02e32992015-03-11 12:31:20 -0500301
302 // Run the scheduler to build an adjacency LSA
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600303 this->advanceClocks(10_ms);
Vince Lehman02e32992015-03-11 12:31:20 -0500304
305 // Make sure an adjacency LSA was built
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600306 ndn::Name key = ndn::Name(conf.getRouterPrefix())
Nick Gordon727d4832017-10-13 18:04:25 -0500307 .append(std::to_string(Lsa::Type::ADJACENCY));
Vince Lehman41b173e2015-05-07 14:13:26 -0500308 AdjLsa* lsa = lsdb.findAdjLsa(key);
Vince Lehman02e32992015-03-11 12:31:20 -0500309 BOOST_REQUIRE(lsa != nullptr);
310
alvy46ccaae2015-06-25 14:13:39 -0500311 uint32_t lastAdjLsaSeqNo = lsa->getLsSeqNo();
Ashlesh Gawande15052402018-12-12 20:20:00 -0600312 nlsr.m_lsdb.m_sequencingManager.setAdjLsaSeq(lastAdjLsaSeqNo);
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600313
314 this->advanceClocks(1500_ms, 10);
Vince Lehman02e32992015-03-11 12:31:20 -0500315
316 // Make sure the routing table was calculated
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600317 RoutingTableEntry* rtEntry = nlsr.m_routingTable.findRoutingTableEntry(failNeighbor.getName());
Vince Lehman02e32992015-03-11 12:31:20 -0500318 BOOST_REQUIRE(rtEntry != nullptr);
Nick Gordonff9a6272017-10-12 13:38:29 -0500319 BOOST_REQUIRE_EQUAL(rtEntry->getNexthopList().size(), 1);
Vince Lehman02e32992015-03-11 12:31:20 -0500320
321 // Receive FaceEventDestroyed notification
322 ndn::nfd::FaceEventNotification event;
323 event.setKind(ndn::nfd::FACE_EVENT_DESTROYED)
324 .setFaceId(destroyFaceId);
325
dmcoomes9f936662017-03-02 10:33:09 -0600326 std::shared_ptr<ndn::Data> data = std::make_shared<ndn::Data>("/localhost/nfd/faces/events/%FE%00");
Junxiao Shi0b1b7d92019-05-22 15:37:18 +0000327 data->setFreshnessPeriod(1_s);
Vince Lehman02e32992015-03-11 12:31:20 -0500328 data->setContent(event.wireEncode());
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600329 m_keyChain.sign(*data);
Vince Lehman02e32992015-03-11 12:31:20 -0500330
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500331 m_face.receive(*data);
Vince Lehman02e32992015-03-11 12:31:20 -0500332
333 // Run the scheduler to build an adjacency LSA
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600334 this->advanceClocks(10_ms);
Vince Lehman02e32992015-03-11 12:31:20 -0500335
336 Adjacent updatedNeighbor = neighbors.getAdjacent(failNeighbor.getName());
337
338 BOOST_CHECK_EQUAL(updatedNeighbor.getFaceId(), 0);
339 BOOST_CHECK_EQUAL(updatedNeighbor.getInterestTimedOutNo(),
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600340 conf.getInterestRetryNumber());
Vince Lehman02e32992015-03-11 12:31:20 -0500341 BOOST_CHECK_EQUAL(updatedNeighbor.getStatus(), Adjacent::STATUS_INACTIVE);
alvy46ccaae2015-06-25 14:13:39 -0500342
343 lsa = lsdb.findAdjLsa(key);
344 BOOST_REQUIRE(lsa != nullptr);
345
346 BOOST_CHECK_EQUAL(lsa->getLsSeqNo(), lastAdjLsaSeqNo + 1);
Vince Lehman02e32992015-03-11 12:31:20 -0500347
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600348 this->advanceClocks(15_s, 10);
349
Vince Lehman02e32992015-03-11 12:31:20 -0500350 // Make sure the routing table was recalculated
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600351 rtEntry = nlsr.m_routingTable.findRoutingTableEntry(failNeighbor.getName());
Vince Lehman02e32992015-03-11 12:31:20 -0500352 BOOST_CHECK(rtEntry == nullptr);
353}
354
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500355BOOST_AUTO_TEST_CASE(GetCertificate)
Vince Lehmanc2acdcb2015-04-29 11:14:35 -0500356{
Vince Lehmanc2acdcb2015-04-29 11:14:35 -0500357 // Create certificate
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500358 ndn::Name identityName("/TestNLSR/identity");
359 identityName.appendVersion();
Vince Lehmanc2acdcb2015-04-29 11:14:35 -0500360
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600361 ndn::security::pib::Identity identity = m_keyChain.createIdentity(identityName);
Vince Lehmanc2acdcb2015-04-29 11:14:35 -0500362
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500363 ndn::security::v2::Certificate certificate =
364 identity.getDefaultKey().getDefaultCertificate();
365
366 const ndn::Name certKey = certificate.getKeyName();
Vince Lehmanc2acdcb2015-04-29 11:14:35 -0500367
368 BOOST_CHECK(nlsr.getCertificate(certKey) == nullptr);
369
370 // Certificate should be retrievable from the CertificateStore
371 nlsr.loadCertToPublish(certificate);
372
373 BOOST_CHECK(nlsr.getCertificate(certKey) != nullptr);
374
375 nlsr.getCertificateStore().clear();
Vince Lehmanc2acdcb2015-04-29 11:14:35 -0500376}
377
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500378BOOST_AUTO_TEST_CASE(BuildAdjLsaAfterHelloResponse)
379{
380 // Configure NLSR
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500381 conf.setAdjLsaBuildInterval(1);
382
383 // Add neighbors
384 // Router A
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500385 ndn::Name neighborAName("/ndn/site/%C1.Router/routerA");
386 Adjacent neighborA(neighborAName, ndn::FaceUri("udp4://10.0.0.1"),
387 0, Adjacent::STATUS_INACTIVE, 0, 0);
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500388 neighbors.insert(neighborA);
389
390 // Router B
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500391 ndn::Name neighborBName("/ndn/site/%C1.Router/routerB");
392 Adjacent neighborB(neighborBName, ndn::FaceUri("udp4://10.0.0.1"),
393 0, Adjacent::STATUS_INACTIVE, 0, 0);
394
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500395 neighbors.insert(neighborB);
396
397 nlsr.initialize();
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500398
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600399 this->advanceClocks(10_ms);
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500400
401 // Receive HELLO response from Router A
402 receiveHelloData(neighborAName, conf.getRouterPrefix());
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600403 this->advanceClocks(1_s, 10);
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500404
Nick Gordon727d4832017-10-13 18:04:25 -0500405 ndn::Name lsaKey = ndn::Name(conf.getRouterPrefix()).append(std::to_string(Lsa::Type::ADJACENCY));
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500406
407 // Adjacency LSA should be built even though other router is INACTIVE
408 AdjLsa* lsa = lsdb.findAdjLsa(lsaKey);
409 BOOST_REQUIRE(lsa != nullptr);
Nick Gordonff9a6272017-10-12 13:38:29 -0500410 BOOST_CHECK_EQUAL(lsa->getAdl().size(), 1);
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500411
412 // Receive HELLO response from Router B
413 receiveHelloData(neighborBName, conf.getRouterPrefix());
414
415 // Both routers become INACTIVE and HELLO Interests have timed out
416 for (Adjacent& adjacency : neighbors.getAdjList()) {
417 adjacency.setStatus(Adjacent::STATUS_INACTIVE);
418 adjacency.setInterestTimedOutNo(HELLO_RETRIES_DEFAULT);
419 }
420
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600421 this->advanceClocks(1_s, 10);
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500422
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500423 // Adjacency LSA should have been removed since this router's adjacencies are
424 // INACTIVE and have timed out
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500425 lsa = lsdb.findAdjLsa(lsaKey);
426 BOOST_CHECK(lsa == nullptr);
427
428 // Receive HELLO response from Router A and B
429 receiveHelloData(neighborAName, conf.getRouterPrefix());
430 receiveHelloData(neighborBName, conf.getRouterPrefix());
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600431 this->advanceClocks(1_s, 10);
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500432
433 // Adjacency LSA should be built
434 lsa = lsdb.findAdjLsa(lsaKey);
435 BOOST_REQUIRE(lsa != nullptr);
Nick Gordonff9a6272017-10-12 13:38:29 -0500436 BOOST_CHECK_EQUAL(lsa->getAdl().size(), 2);
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500437}
438
Nick Gordond5c1a372016-10-31 13:56:23 -0500439BOOST_AUTO_TEST_CASE(FaceDatasetFetchSuccess)
440{
441 bool hasResult = false;
Nick Gordond5c1a372016-10-31 13:56:23 -0500442
443 nlsr.initializeFaces([&hasResult] (const std::vector<ndn::nfd::FaceStatus>& faces) {
444 hasResult = true;
445 BOOST_CHECK_EQUAL(faces.size(), 2);
446 BOOST_CHECK_EQUAL(faces.front().getFaceId(), 25401);
447 BOOST_CHECK_EQUAL(faces.back().getFaceId(), 25402);
448 },
449 [] (uint32_t code, const std::string& reason) {});
450
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600451 this->advanceClocks(100_ms, 5);
Nick Gordond5c1a372016-10-31 13:56:23 -0500452
453 ndn::nfd::FaceStatus payload1;
454 payload1.setFaceId(25401);
455 ndn::nfd::FaceStatus payload2;
456 payload2.setFaceId(25402);
457 this->sendDataset("/localhost/nfd/faces/list", payload1, payload2);
458
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600459 this->advanceClocks(100_ms, 5);
Nick Gordond5c1a372016-10-31 13:56:23 -0500460 BOOST_CHECK(hasResult);
461}
462
463BOOST_AUTO_TEST_CASE(FaceDatasetFetchFailure)
464{
Nick Gordond5c1a372016-10-31 13:56:23 -0500465 nlsr.initializeFaces([](const std::vector<ndn::nfd::FaceStatus>& faces) {},
466 [this](uint32_t code, const std::string& reason){
467 this->nFailureCallbacks++;
468 });
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600469 this->advanceClocks(100_ms, 5);
Nick Gordond5c1a372016-10-31 13:56:23 -0500470
471 ndn::Name payload;
472 this->sendDataset("/localhost/nfd/faces/list", payload);
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600473 this->advanceClocks(100_ms, 5);
Nick Gordond5c1a372016-10-31 13:56:23 -0500474
475 BOOST_CHECK_EQUAL(nFailureCallbacks, 1);
476 BOOST_CHECK_EQUAL(nSuccessCallbacks, 0);
477}
478
479BOOST_AUTO_TEST_CASE(FaceDatasetProcess)
480{
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500481 Adjacent neighborA("/ndn/neighborA", ndn::FaceUri("udp4://192.168.0.100:6363"),
482 25, Adjacent::STATUS_INACTIVE, 0, 0);
Nick Gordond5c1a372016-10-31 13:56:23 -0500483 neighbors.insert(neighborA);
484
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500485 Adjacent neighborB("/ndn/neighborB", ndn::FaceUri("udp4://192.168.0.101:6363"),
486 10, Adjacent::STATUS_INACTIVE, 0, 0);
Nick Gordond5c1a372016-10-31 13:56:23 -0500487 neighbors.insert(neighborB);
488
489 ndn::nfd::FaceStatus payload1;
490 payload1.setFaceId(1)
491 .setRemoteUri("udp4://192.168.0.100:6363");
492 ndn::nfd::FaceStatus payload2;
493 payload2.setFaceId(2)
494 .setRemoteUri("udp4://192.168.0.101:6363");
495 std::vector<ndn::nfd::FaceStatus> faceStatuses = {payload1, payload2};
496
497 nlsr.processFaceDataset(faceStatuses);
Nick Gordond5c1a372016-10-31 13:56:23 -0500498
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600499 AdjacencyList adjList = conf.getAdjacencyList();
Nick Gordond5c1a372016-10-31 13:56:23 -0500500
501 BOOST_CHECK_EQUAL(adjList.getAdjacent("/ndn/neighborA").getFaceId(), payload1.getFaceId());
502 BOOST_CHECK_EQUAL(adjList.getAdjacent("/ndn/neighborB").getFaceId(), payload2.getFaceId());
503}
504
505BOOST_AUTO_TEST_CASE(UnconfiguredNeighbor)
506{
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500507 Adjacent neighborA("/ndn/neighborA", ndn::FaceUri("udp4://192.168.0.100:6363"), 25, Adjacent::STATUS_INACTIVE, 0, 0);
Nick Gordond5c1a372016-10-31 13:56:23 -0500508 neighbors.insert(neighborA);
509
510 ndn::nfd::FaceStatus payload;
511 payload.setFaceId(1)
512 .setRemoteUri("udp4://192.168.0.101:6363"); // Note dissimilar Face URI.
513 std::vector<ndn::nfd::FaceStatus> faceStatuses = {payload};
514
515 nlsr.processFaceDataset(faceStatuses);
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600516 this->advanceClocks(20_ms, 5);
Nick Gordond5c1a372016-10-31 13:56:23 -0500517
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600518 AdjacencyList adjList = conf.getAdjacencyList();
Nick Gordond5c1a372016-10-31 13:56:23 -0500519
520 BOOST_CHECK_EQUAL(adjList.getAdjacent("/ndn/neighborA").getFaceId(), 0);
521}
522
523BOOST_AUTO_TEST_CASE(FaceDatasetPeriodicFetch)
524{
525 int nNameMatches = 0;
526 ndn::Name datasetPrefix("/localhost/nfd/faces/list");
527 ndn::nfd::CommandOptions options;
528 ndn::time::milliseconds defaultTimeout = options.getTimeout();
529
Ashlesh Gawande3909aa12017-07-28 16:01:35 -0500530 int fetchInterval(1);
Nick Gordond5c1a372016-10-31 13:56:23 -0500531 conf.setFaceDatasetFetchInterval(fetchInterval);
532 conf.setFaceDatasetFetchTries(0);
533
534 nlsr.initializeFaces(std::bind(&Nlsr::processFaceDataset, &nlsr, _1),
535 std::bind(&Nlsr::onFaceDatasetFetchTimeout, &nlsr, _1, _2, 0));
536
537 // Elapse the default timeout time of the interest.
538 this->advanceClocks(defaultTimeout);
539
540 // Check that we have one interest for face list in the sent interests.
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600541 for (const auto& interest : m_face.sentInterests) {
Nick Gordond5c1a372016-10-31 13:56:23 -0500542 if (datasetPrefix.isPrefixOf(interest.getName())) {
543 nNameMatches++;
544 }
545 }
546 BOOST_CHECK_EQUAL(nNameMatches, 1);
547
548 // Elapse the clock by the reschedule time (that we set)
Ashlesh Gawande3909aa12017-07-28 16:01:35 -0500549 this->advanceClocks(ndn::time::seconds(fetchInterval));
Nick Gordond5c1a372016-10-31 13:56:23 -0500550 // Elapse the default timeout on the interest.
551 this->advanceClocks(defaultTimeout);
Nick Gordond5c1a372016-10-31 13:56:23 -0500552
553 // Check that we now have two interests
554 nNameMatches = 0;
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600555 for (const auto& interest : m_face.sentInterests) {
Nick Gordond5c1a372016-10-31 13:56:23 -0500556 if (datasetPrefix.isPrefixOf(interest.getName())) {
557 nNameMatches++;
558 }
559 }
560 BOOST_CHECK_EQUAL(nNameMatches, 2);
561}
562
Vince Lehman09131122014-09-09 17:10:11 -0500563BOOST_AUTO_TEST_SUITE_END()
564
Nick Gordonfad8e252016-08-11 14:21:38 -0500565} // namespace test
566} // namespace nlsr