blob: 5801104f05cd2c231dad001ff905ff67f5b32ce9 [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/*
Junxiao Shi6593a432023-08-21 10:50:28 +00003 * Copyright (c) 2014-2023, The University of Memphis,
Vince Lehmancec38852015-03-31 13:21:38 -05004 * Regents of the University of California,
5 * Arizona Board of Regents.
akmhoque3d06e792014-05-27 16:23:20 -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/>.
Ashlesh Gawande0421bc62020-05-08 20:42:19 -070020 */
Vince Lehmancec38852015-03-31 13:21:38 -050021
Ashlesh Gawandeeb582eb2014-05-01 14:25:20 -050022#include "route/nexthop-list.hpp"
23#include "route/nexthop.hpp"
Ashlesh Gawande6f0f35d2021-08-21 23:52:14 -070024#include "route/fib.hpp"
Davide Pesaventocb065f12019-12-27 01:03:34 -050025#include "tests/boost-test.hpp"
Ashlesh Gawandeeb582eb2014-05-01 14:25:20 -050026
27namespace nlsr {
Ashlesh Gawandeeb582eb2014-05-01 14:25:20 -050028namespace test {
29
30BOOST_AUTO_TEST_SUITE(TestNhl)
31
32BOOST_AUTO_TEST_CASE(NhlAddNextHop)
33{
34 NextHop np1;
35
36 NexthopList nhl1;
37
38 nhl1.addNextHop(np1);
Nick Gordonff9a6272017-10-12 13:38:29 -050039 BOOST_CHECK_EQUAL(nhl1.size(), (uint32_t)1);
Ashlesh Gawandeeb582eb2014-05-01 14:25:20 -050040
41 nhl1.removeNextHop(np1);
Nick Gordonff9a6272017-10-12 13:38:29 -050042 BOOST_CHECK_EQUAL(nhl1.size(), (uint32_t)0);
Ashlesh Gawandeeb582eb2014-05-01 14:25:20 -050043}
44
Vince Lehman20fe4a92014-09-09 15:57:59 -050045BOOST_AUTO_TEST_CASE(LinkStateRemoveNextHop)
Vince Lehman145064a2014-08-23 11:44:16 -050046{
47 NextHop hop1;
48 hop1.setRouteCost(12.34);
49
50 NexthopList hopList;
51 hopList.addNextHop(hop1);
52
53 NextHop hop2;
Vince Lehman20fe4a92014-09-09 15:57:59 -050054 hop2.setRouteCost(13.01);
55
Nick Gordonff9a6272017-10-12 13:38:29 -050056 BOOST_REQUIRE_EQUAL(hopList.size(), 1);
Vince Lehman20fe4a92014-09-09 15:57:59 -050057
58 hopList.removeNextHop(hop2);
Nick Gordonff9a6272017-10-12 13:38:29 -050059 BOOST_CHECK_EQUAL(hopList.size(), 1);
Vince Lehman20fe4a92014-09-09 15:57:59 -050060
61 hopList.removeNextHop(hop1);
Nick Gordonff9a6272017-10-12 13:38:29 -050062 BOOST_CHECK_EQUAL(hopList.size(), 0);
Vince Lehman20fe4a92014-09-09 15:57:59 -050063}
64
65BOOST_AUTO_TEST_CASE(HyperbolicRemoveNextHop)
66{
67 NextHop hop1;
68 hop1.setHyperbolic(true);
69 hop1.setRouteCost(12.34);
70
71 NexthopList hopList;
72 hopList.addNextHop(hop1);
73
74 NextHop hop2;
75 hop2.setHyperbolic(true);
Vince Lehman145064a2014-08-23 11:44:16 -050076 hop2.setRouteCost(12.35);
77
Nick Gordonff9a6272017-10-12 13:38:29 -050078 BOOST_REQUIRE_EQUAL(hopList.size(), 1);
Vince Lehman145064a2014-08-23 11:44:16 -050079
80 hopList.removeNextHop(hop2);
Nick Gordonff9a6272017-10-12 13:38:29 -050081 BOOST_CHECK_EQUAL(hopList.size(), 1);
Vince Lehman145064a2014-08-23 11:44:16 -050082
83 hopList.removeNextHop(hop1);
Nick Gordonff9a6272017-10-12 13:38:29 -050084 BOOST_CHECK_EQUAL(hopList.size(), 0);
Vince Lehman145064a2014-08-23 11:44:16 -050085}
86
Vince Lehmancec38852015-03-31 13:21:38 -050087BOOST_AUTO_TEST_CASE(TieBreaker)
88{
Junxiao Shi6593a432023-08-21 10:50:28 +000089 // equal-cost hops are sorted consistently
Vince Lehmancec38852015-03-31 13:21:38 -050090 NextHop hopA;
91 hopA.setRouteCost(25);
Junxiao Shi6593a432023-08-21 10:50:28 +000092 hopA.setConnectingFaceUri(ndn::FaceUri("udp4://192.168.3.1:6363"));
Vince Lehmancec38852015-03-31 13:21:38 -050093
94 NextHop hopZ;
95 hopZ.setRouteCost(25);
Junxiao Shi6593a432023-08-21 10:50:28 +000096 hopZ.setConnectingFaceUri(ndn::FaceUri("udp4://192.168.3.9:6363"));
Vince Lehmancec38852015-03-31 13:21:38 -050097
98 NexthopList list;
99 list.addNextHop(hopA);
100 list.addNextHop(hopZ);
101
Vince Lehmancec38852015-03-31 13:21:38 -0500102 NexthopList::iterator it = list.begin();
103 BOOST_CHECK_EQUAL(it->getConnectingFaceUri(), hopA.getConnectingFaceUri());
104
Ashlesh Gawande0421bc62020-05-08 20:42:19 -0700105 list.clear();
Vince Lehmancec38852015-03-31 13:21:38 -0500106 list.addNextHop(hopZ);
107 list.addNextHop(hopA);
108
Vince Lehmancec38852015-03-31 13:21:38 -0500109 it = list.begin();
110 BOOST_CHECK_EQUAL(it->getConnectingFaceUri(), hopA.getConnectingFaceUri());
Vince Lehmanef21d8e2015-04-01 15:59:39 -0500111}
112
113BOOST_AUTO_TEST_CASE(SortOnAddAndRemove)
114{
115 NexthopList list;
116
Junxiao Shi6593a432023-08-21 10:50:28 +0000117 NextHop hopA(ndn::FaceUri("udp4://192.168.3.1:6363"), 10);
118 NextHop hopB(ndn::FaceUri("udp4://192.168.3.2:6363"), 5);
119 NextHop hopC(ndn::FaceUri("udp4://192.168.3.3:6363"), 25);
Vince Lehmanef21d8e2015-04-01 15:59:39 -0500120
121 list.addNextHop(hopA);
122 list.addNextHop(hopB);
123 list.addNextHop(hopC);
124
Nick Gordonff9a6272017-10-12 13:38:29 -0500125 BOOST_REQUIRE_EQUAL(list.size(), 3);
Vince Lehmanef21d8e2015-04-01 15:59:39 -0500126
127 double lastCost = 0;
128 for (const auto& hop : list) {
129 BOOST_CHECK(hop.getRouteCost() > lastCost);
130 lastCost = hop.getRouteCost();
131 }
132
133 // removing a hop keep the list sorted
134 list.removeNextHop(hopA);
135
Nick Gordonff9a6272017-10-12 13:38:29 -0500136 BOOST_REQUIRE_EQUAL(list.size(), 2);
Vince Lehmanef21d8e2015-04-01 15:59:39 -0500137
138 lastCost = 0;
139 for (const auto& hop : list) {
140 BOOST_CHECK(hop.getRouteCost() > lastCost);
141 lastCost = hop.getRouteCost();
142 }
Vince Lehmancec38852015-03-31 13:21:38 -0500143}
144
Nick Gordon608061b2017-07-06 12:45:04 -0500145/* If there are two NextHops going to the same neighbor, then the list
146 should always select the one with the cheaper cost. This would be
147 caused by a Name being advertised by two different routers, which
148 are reachable through the same neighbor.
149 */
150BOOST_AUTO_TEST_CASE(UseCheaperNextHop)
151{
152 NexthopList list;
153
Junxiao Shi6593a432023-08-21 10:50:28 +0000154 NextHop hopA(ndn::FaceUri("udp4://10.0.0.1:6363"), 10);
155 NextHop hopB(ndn::FaceUri("udp4://10.0.0.1:6363"), 5);
Nick Gordon608061b2017-07-06 12:45:04 -0500156
157 list.addNextHop(hopA);
158 list.addNextHop(hopB);
159
Nick Gordonff9a6272017-10-12 13:38:29 -0500160 BOOST_REQUIRE_EQUAL(list.size(), 1);
Nick Gordon608061b2017-07-06 12:45:04 -0500161
162 for (const auto& hop : list) {
163 BOOST_CHECK_EQUAL(hop, hopB);
164 }
165}
166
Ashlesh Gawande6f0f35d2021-08-21 23:52:14 -0700167/* Fib needs a NexthopList to be sorted by FaceUri when updating
168 to avoid removing prefixes that were just installed. The above
169 test does not apply to this scenario as the NexthopList
170 sorted by cost is given to the Fib::update.
171 */
172BOOST_AUTO_TEST_CASE(NextHopListDiffForFibUpdate) // #5179
173{
174 // If default sorter is used then difference results in
175 // the same hops to remove as those that were added
176 NexthopList nhl1;
Junxiao Shi6593a432023-08-21 10:50:28 +0000177 nhl1.addNextHop(NextHop(ndn::FaceUri("udp4://10.0.0.13:6363"), 28));
178 nhl1.addNextHop(NextHop(ndn::FaceUri("udp4://10.0.0.9:6363"), 38));
179 nhl1.addNextHop(NextHop(ndn::FaceUri("udp4://10.0.0.26:6363"), 44));
Ashlesh Gawande6f0f35d2021-08-21 23:52:14 -0700180
181 NexthopList nhl2;
Junxiao Shi6593a432023-08-21 10:50:28 +0000182 nhl2.addNextHop(NextHop(ndn::FaceUri("udp4://10.0.0.9:6363"), 21));
183 nhl2.addNextHop(NextHop(ndn::FaceUri("udp4://10.0.0.13:6363"), 26));
184 nhl2.addNextHop(NextHop(ndn::FaceUri("udp4://10.0.0.26:6363"), 42));
Ashlesh Gawande6f0f35d2021-08-21 23:52:14 -0700185
Junxiao Shi6593a432023-08-21 10:50:28 +0000186 std::set<NextHop> hopsToRemove;
Ashlesh Gawande6f0f35d2021-08-21 23:52:14 -0700187 std::set_difference(nhl2.begin(), nhl2.end(),
188 nhl1.begin(), nhl1.end(),
Junxiao Shi6593a432023-08-21 10:50:28 +0000189 std::inserter(hopsToRemove, hopsToRemove.begin()));
Ashlesh Gawande6f0f35d2021-08-21 23:52:14 -0700190
191 BOOST_CHECK_EQUAL(hopsToRemove.size(), 3);
192
193 // Sorted by FaceUri
194 NextHopsUriSortedSet nhs1;
Junxiao Shi6593a432023-08-21 10:50:28 +0000195 nhs1.addNextHop(NextHop(ndn::FaceUri("udp4://10.0.0.13:6363"), 28));
196 nhs1.addNextHop(NextHop(ndn::FaceUri("udp4://10.0.0.9:6363"), 38));
197 nhs1.addNextHop(NextHop(ndn::FaceUri("udp4://10.0.0.26:6363"), 44));
Ashlesh Gawande6f0f35d2021-08-21 23:52:14 -0700198
199 NextHopsUriSortedSet nhs2;
Junxiao Shi6593a432023-08-21 10:50:28 +0000200 nhs2.addNextHop(NextHop(ndn::FaceUri("udp4://10.0.0.9:6363"), 21));
201 nhs2.addNextHop(NextHop(ndn::FaceUri("udp4://10.0.0.13:6363"), 26));
202 nhs2.addNextHop(NextHop(ndn::FaceUri("udp4://10.0.0.26:6363"), 42));
Ashlesh Gawande6f0f35d2021-08-21 23:52:14 -0700203
204 std::set<NextHop, NextHopUriSortedComparator> hopsToRemove2;
205 std::set_difference(nhs2.begin(), nhs2.end(),
206 nhs1.begin(), nhs1.end(),
207 std::inserter(hopsToRemove2, hopsToRemove2.begin()),
208 NextHopUriSortedComparator());
209
210 BOOST_CHECK_EQUAL(hopsToRemove2.size(), 0);
211}
212
Ashlesh Gawandeeb582eb2014-05-01 14:25:20 -0500213BOOST_AUTO_TEST_SUITE_END()
214
Nick Gordonfad8e252016-08-11 14:21:38 -0500215} // namespace test
216} // namespace nlsr