blob: 15ad958dd88e64962ce8ed98e723faf3f72aae5d [file] [log] [blame]
akmhoque3d06e792014-05-27 16:23:20 -05001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Ashlesh Gawande0421bc62020-05-08 20:42:19 -07002/*
Davide Pesaventoe28d8752022-03-19 03:55:25 -04003 * Copyright (c) 2014-2022, The University of Memphis,
Nick Gordonf8b5bcd2016-08-11 15:06:50 -05004 * Regents of the University of California
akmhoque3d06e792014-05-27 16:23:20 -05005 *
6 * This file is part of NLSR (Named-data Link State Routing).
7 * See AUTHORS.md for complete list of NLSR authors and contributors.
8 *
9 * NLSR is free software: you can redistribute it and/or modify it under the terms
10 * of the GNU General Public License as published by the Free Software Foundation,
11 * either version 3 of the License, or (at your option) any later version.
12 *
13 * NLSR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
14 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along with
18 * NLSR, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
Ashlesh Gawande0421bc62020-05-08 20:42:19 -070019 */
Vince Lehman7c603292014-09-11 17:48:16 -050020
Ashlesh Gawandeeb582eb2014-05-01 14:25:20 -050021#include "route/routing-table.hpp"
Ashlesh Gawande85998a12017-12-07 22:22:13 -060022#include "nlsr.hpp"
Ashlesh Gawandeeb582eb2014-05-01 14:25:20 -050023#include "route/routing-table-entry.hpp"
24#include "route/nexthop.hpp"
Davide Pesaventocb065f12019-12-27 01:03:34 -050025
Davide Pesavento8de8a8b2022-05-12 01:26:43 -040026#include "tests/io-key-chain-fixture.hpp"
Davide Pesaventocb065f12019-12-27 01:03:34 -050027#include "tests/test-common.hpp"
Ashlesh Gawandeeb582eb2014-05-01 14:25:20 -050028
29namespace nlsr {
Ashlesh Gawandeeb582eb2014-05-01 14:25:20 -050030namespace test {
31
Davide Pesavento8de8a8b2022-05-12 01:26:43 -040032class RoutingTableFixture : public IoKeyChainFixture
Ashlesh Gawandeeb582eb2014-05-01 14:25:20 -050033{
Davide Pesavento8de8a8b2022-05-12 01:26:43 -040034private:
35 ndn::Scheduler m_scheduler{m_io};
Ashlesh Gawande0421bc62020-05-08 20:42:19 -070036
37public:
Davide Pesavento8de8a8b2022-05-12 01:26:43 -040038 ndn::util::DummyClientFace face{m_io, m_keyChain, {true, true}};
39 ConfParameter conf{face, m_keyChain};
40 DummyConfFileProcessor confProcessor{conf};
Ashlesh Gawande85998a12017-12-07 22:22:13 -060041
Davide Pesavento8de8a8b2022-05-12 01:26:43 -040042 Lsdb lsdb{face, m_keyChain, conf};
43 RoutingTable rt{m_scheduler, lsdb, conf};
Ashlesh Gawande0421bc62020-05-08 20:42:19 -070044};
Ashlesh Gawandeeb582eb2014-05-01 14:25:20 -050045
Ashlesh Gawande0421bc62020-05-08 20:42:19 -070046BOOST_AUTO_TEST_SUITE(TestRoutingTable)
47
48BOOST_FIXTURE_TEST_CASE(RoutingTableAddNextHop, RoutingTableFixture)
49{
Ashlesh Gawandeeb582eb2014-05-01 14:25:20 -050050 NextHop nh1;
Ashlesh Gawandeeb582eb2014-05-01 14:25:20 -050051 const std::string DEST_ROUTER = "destRouter";
Ashlesh Gawande0421bc62020-05-08 20:42:19 -070052 rt.addNextHop(DEST_ROUTER, nh1);
Ashlesh Gawandeeb582eb2014-05-01 14:25:20 -050053
Ashlesh Gawande0421bc62020-05-08 20:42:19 -070054 BOOST_CHECK_EQUAL(rt.findRoutingTableEntry(DEST_ROUTER)->getDestination(), DEST_ROUTER);
55}
56
57const uint8_t RoutingTableData1[] =
58{
59 // Header
60 0x90, 0x20,
61 // Routing table entry
62 0x91, 0x1e,
63 // Destination
64 0x07, 0x07, 0x08, 0x05, 0x64, 0x65, 0x73, 0x74, 0x31, 0x8f, 0x13,
65 // Nexthop
66 0x8d, 0x07, 0x6e, 0x65, 0x78, 0x74, 0x68, 0x6f, 0x70, 0x86, 0x08, 0x3f, 0xfa, 0x66,
67 0x66, 0x66, 0x66, 0x66, 0x66
68};
69
70const uint8_t RoutingTableData2[] =
71{
72 // Header
73 0x90, 0x00
74};
75
76BOOST_FIXTURE_TEST_CASE(RoutingTableEncode1, RoutingTableFixture)
77{
78 NextHop nexthops;
79 nexthops.setConnectingFaceUri("nexthop");
80 nexthops.setRouteCost(1.65);
81 rt.addNextHop("dest1", nexthops);
82
83 auto wire = rt.wireEncode();
84 BOOST_REQUIRE_EQUAL_COLLECTIONS(RoutingTableData1,
85 RoutingTableData1 + sizeof(RoutingTableData1),
86 wire.begin(), wire.end());
87}
88
89BOOST_FIXTURE_TEST_CASE(RoutingTableEncode2, RoutingTableFixture)
90{
91 auto wire = rt.wireEncode();
92 BOOST_REQUIRE_EQUAL_COLLECTIONS(RoutingTableData2,
93 RoutingTableData2 + sizeof(RoutingTableData2),
94 wire.begin(), wire.end());
95}
96
97BOOST_FIXTURE_TEST_CASE(RoutingTableDecode1, RoutingTableFixture)
98{
Davide Pesaventoe28d8752022-03-19 03:55:25 -040099 RoutingTableStatus rtStatus(ndn::Block{RoutingTableData1});
Ashlesh Gawande0421bc62020-05-08 20:42:19 -0700100
101 auto it1 = rtStatus.m_rTable.begin();
102
103 ndn::Name des1 = it1->getDestination();
104 BOOST_CHECK_EQUAL(des1, "dest1");
105
106 auto it2 = it1->getNexthopList().begin();
107 BOOST_CHECK_EQUAL(it2->getConnectingFaceUri(), "nexthop");
108 BOOST_CHECK_EQUAL(it2->getRouteCost(), 1.65);
109
110 BOOST_CHECK_EQUAL(rtStatus.m_rTable.size(), 1);
111}
112
113BOOST_FIXTURE_TEST_CASE(RoutingTableOutputStream, RoutingTableFixture)
114{
115 NextHop nexthops;
116 nexthops.setConnectingFaceUri("nexthop");
117 nexthops.setRouteCost(99);
118 rt.addNextHop("dest1", nexthops);
119
120 std::ostringstream os;
121 os << rt;
122
123 BOOST_CHECK_EQUAL(os.str(),
124 "Routing Table:\n"
125 " Destination: /dest1\n"
126 " NextHop(Uri: nexthop, Cost: 99)\n");
Ashlesh Gawandeeb582eb2014-05-01 14:25:20 -0500127}
128
Ashlesh Gawande5d93aa52020-06-13 18:57:45 -0700129BOOST_FIXTURE_TEST_CASE(UpdateFromLsdb, RoutingTableFixture)
130{
131 ndn::time::system_clock::TimePoint testTimePoint = ndn::time::system_clock::now() + 3600_s;
132 ndn::Name router2("/router2");
133 AdjLsa adjLsa(router2, 12, testTimePoint, 2, conf.getAdjacencyList());
134 std::shared_ptr<Lsa> lsaPtr = std::make_shared<AdjLsa>(adjLsa);
135 BOOST_CHECK(!rt.m_isRouteCalculationScheduled);
136 lsdb.installLsa(lsaPtr);
137 BOOST_CHECK(rt.m_isRouteCalculationScheduled);
138
139 // After 15_s (by default) routing table calculation is done
140 advanceClocks(15_s);
141 BOOST_CHECK(!rt.m_isRouteCalculationScheduled);
142
143 // Update to installed LSA
144 std::shared_ptr<Lsa> lsaPtr2 = std::make_shared<AdjLsa>(adjLsa);
145 auto adjPtr = std::static_pointer_cast<AdjLsa>(lsaPtr2);
146 adjPtr->addAdjacent(Adjacent("router3"));
147 adjPtr->setSeqNo(13);
148 lsdb.installLsa(lsaPtr2);
149 BOOST_CHECK(rt.m_isRouteCalculationScheduled);
150
151 // Insert a neighbor so that AdjLsa can be installed
152 AdjacencyList adjl;
153 Adjacent ownAdj(conf.getRouterPrefix());
154 ownAdj.setStatus(Adjacent::STATUS_ACTIVE);
155 adjl.insert(ownAdj);
156 AdjLsa adjLsa4("/router4", 12, testTimePoint, 2, adjl);
157 lsaPtr = std::make_shared<AdjLsa>(adjLsa4);
158 lsdb.installLsa(lsaPtr);
159
160 Adjacent adj("/router4");
161 adj.setStatus(Adjacent::STATUS_ACTIVE);
162 conf.getAdjacencyList().insert(adj);
163 lsdb.scheduleAdjLsaBuild();
164 BOOST_CHECK_EQUAL(rt.m_rTable.size(), 0);
165 advanceClocks(15_s);
166 BOOST_CHECK_EQUAL(rt.m_rTable.size(), 1);
167
168 rt.wireEncode();
169 BOOST_CHECK(rt.m_wire.isValid());
170 BOOST_CHECK_GT(rt.m_wire.size(), 0);
171
172 // Remove own Adj Lsa - Make sure routing table is wiped out
173 conf.getAdjacencyList().setStatusOfNeighbor("/router4", Adjacent::STATUS_INACTIVE);
174 conf.getAdjacencyList().setTimedOutInterestCount("/router4", HELLO_RETRIES_MAX);
175 lsdb.scheduleAdjLsaBuild();
176 advanceClocks(15_s);
177 BOOST_CHECK_EQUAL(rt.m_rTable.size(), 0);
178 BOOST_CHECK(!rt.m_wire.isValid());
179
180 // Check that HR routing is scheduled, once Coordinate LSA is added
181 BOOST_CHECK(!rt.m_isRouteCalculationScheduled);
182 rt.m_hyperbolicState = HYPERBOLIC_STATE_ON;
183 CoordinateLsa clsa("router5", 12, testTimePoint, 2.5, {30.0});
184 auto clsaPtr = std::make_shared<CoordinateLsa>(clsa);
185 lsdb.installLsa(clsaPtr);
186 BOOST_CHECK(rt.m_isRouteCalculationScheduled);
187
188 Adjacent router5("/router5");
189 router5.setStatus(Adjacent::STATUS_ACTIVE);
190 conf.getAdjacencyList().insert(router5);
191 conf.getAdjacencyList().setStatusOfNeighbor("/router5", Adjacent::STATUS_ACTIVE);
192 advanceClocks(15_s);
193 rt.wireEncode();
194 BOOST_CHECK(rt.m_wire.isValid());
195 BOOST_CHECK_GT(rt.m_wire.size(), 0);
196 BOOST_CHECK(!rt.m_isRouteCalculationScheduled);
197
198 // Emulate HelloProtocol neighbor down
199 conf.getAdjacencyList().setStatusOfNeighbor("/router5", Adjacent::STATUS_INACTIVE);
200 rt.scheduleRoutingTableCalculation();
201 advanceClocks(15_s);
202 BOOST_CHECK_EQUAL(rt.m_rTable.size(), 0);
203 BOOST_CHECK(!rt.m_wire.isValid());
204}
205
Ashlesh Gawandeeb582eb2014-05-01 14:25:20 -0500206BOOST_AUTO_TEST_SUITE_END()
207
Nick Gordonfad8e252016-08-11 14:21:38 -0500208} // namespace test
209} // namespace nlsr