blob: f4290ef7c98a8b3e9862e8dc4bc1b8ca9438bfeb [file] [log] [blame]
akmhoque3d06e792014-05-27 16:23:20 -05001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Ashlesh Gawandeeb582eb2014-05-01 14:25:20 -05002/**
Muktadir R Chowdhury800833b2016-07-29 13:43:59 -05003 * Copyright (c) 2014-2016, 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/>.
akmhoque3d06e792014-05-27 16:23:20 -050020 **/
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"
24#include <boost/test/unit_test.hpp>
25
26namespace nlsr {
27
28namespace 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);
akmhoquefdbddb12014-05-02 18:35:19 -050039 BOOST_CHECK_EQUAL(nhl1.getSize(), (uint32_t)1);
Ashlesh Gawandeeb582eb2014-05-01 14:25:20 -050040
41 nhl1.removeNextHop(np1);
akmhoquefdbddb12014-05-02 18:35:19 -050042 BOOST_CHECK_EQUAL(nhl1.getSize(), (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
56 BOOST_REQUIRE_EQUAL(hopList.getSize(), 1);
57
58 hopList.removeNextHop(hop2);
59 BOOST_CHECK_EQUAL(hopList.getSize(), 1);
60
61 hopList.removeNextHop(hop1);
62 BOOST_CHECK_EQUAL(hopList.getSize(), 0);
63}
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
78 BOOST_REQUIRE_EQUAL(hopList.getSize(), 1);
79
80 hopList.removeNextHop(hop2);
81 BOOST_CHECK_EQUAL(hopList.getSize(), 1);
82
83 hopList.removeNextHop(hop1);
84 BOOST_CHECK_EQUAL(hopList.getSize(), 0);
85}
86
Vince Lehmancec38852015-03-31 13:21:38 -050087BOOST_AUTO_TEST_CASE(TieBreaker)
88{
Vince Lehmanef21d8e2015-04-01 15:59:39 -050089 // equal-cost hops are sorted lexicographically
Vince Lehmancec38852015-03-31 13:21:38 -050090 NextHop hopA;
91 hopA.setRouteCost(25);
Vince Lehmanef21d8e2015-04-01 15:59:39 -050092 hopA.setConnectingFaceUri("AAAZZ");
Vince Lehmancec38852015-03-31 13:21:38 -050093
94 NextHop hopZ;
95 hopZ.setRouteCost(25);
Vince Lehmanef21d8e2015-04-01 15:59:39 -050096 hopZ.setConnectingFaceUri("ZZA");
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
105 list.reset();
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
113 // equal-cost and lexicographically equal hops are sorted by the length of their face uris
114 NextHop longUriHop;
115 longUriHop.setRouteCost(25);
116 longUriHop.setConnectingFaceUri("AAAAAA");
117
118 NextHop shortUriHop;
119 shortUriHop.setRouteCost(25);
120 shortUriHop.setConnectingFaceUri("AAA");
121
122 list.reset();
123 list.addNextHop(longUriHop);
124 list.addNextHop(shortUriHop);
125
126 it = list.begin();
127 BOOST_CHECK_EQUAL(it->getConnectingFaceUri(), shortUriHop.getConnectingFaceUri());
128}
129
130BOOST_AUTO_TEST_CASE(SortOnAddAndRemove)
131{
132 NexthopList list;
133
134 NextHop hopA("A", 10);
135 NextHop hopB("B", 5);
136 NextHop hopC("C", 25);
137
138 list.addNextHop(hopA);
139 list.addNextHop(hopB);
140 list.addNextHop(hopC);
141
142 BOOST_REQUIRE_EQUAL(list.getSize(), 3);
143
144 double lastCost = 0;
145 for (const auto& hop : list) {
146 BOOST_CHECK(hop.getRouteCost() > lastCost);
147 lastCost = hop.getRouteCost();
148 }
149
150 // removing a hop keep the list sorted
151 list.removeNextHop(hopA);
152
153 BOOST_REQUIRE_EQUAL(list.getSize(), 2);
154
155 lastCost = 0;
156 for (const auto& hop : list) {
157 BOOST_CHECK(hop.getRouteCost() > lastCost);
158 lastCost = hop.getRouteCost();
159 }
Vince Lehmancec38852015-03-31 13:21:38 -0500160}
161
Ashlesh Gawandeeb582eb2014-05-01 14:25:20 -0500162BOOST_AUTO_TEST_SUITE_END()
163
Nick Gordonfad8e252016-08-11 14:21:38 -0500164} // namespace test
165} // namespace nlsr