blob: d8ef5e133b53ee53f87911b096483af7401b95bd [file] [log] [blame]
Davide Pesavento22db5392017-04-14 00:56:43 -04001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Davide Pesavento87fc0f82018-04-11 23:43:51 -04002/*
Davide Pesaventocaa60cc2024-02-18 18:18:37 -05003 * Copyright (c) 2014-2024, Regents of the University of California,
Alexander Afanasyev7c10b3b2015-01-20 12:24:27 -08004 * 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.
Alexander Afanasyev3ecec502014-04-16 13:42:44 -070010 *
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/>.
Vince12e49462014-06-09 13:29:32 -050024 */
Alexander Afanasyev3ecec502014-04-16 13:42:44 -070025
26#include "rib/rib.hpp"
27
28#include "tests/test-common.hpp"
Davide Pesaventocf7db2f2019-03-24 23:17:28 -040029#include "tests/daemon/global-io-fixture.hpp"
Davide Pesavento1b077f62019-02-19 19:19:44 -050030#include "tests/daemon/rib/create-route.hpp"
Alexander Afanasyev3ecec502014-04-16 13:42:44 -070031
Davide Pesaventoa9b09b62022-06-04 14:07:25 -040032#include <boost/lexical_cast.hpp>
33
Davide Pesaventoe422f9e2022-06-03 01:30:23 -040034namespace nfd::tests {
Alexander Afanasyev3ecec502014-04-16 13:42:44 -070035
Davide Pesaventoe422f9e2022-06-03 01:30:23 -040036using rib::Route;
Davide Pesavento14e71f02019-03-28 17:35:25 -040037
Davide Pesaventocaa60cc2024-02-18 18:18:37 -050038BOOST_AUTO_TEST_SUITE(Rib)
Davide Pesavento14e71f02019-03-28 17:35:25 -040039BOOST_FIXTURE_TEST_SUITE(TestRib, GlobalIoFixture)
Alexander Afanasyev3ecec502014-04-16 13:42:44 -070040
Vince Lehman4387e782014-06-19 16:57:45 -050041BOOST_AUTO_TEST_CASE(Parent)
Vince12e49462014-06-09 13:29:32 -050042{
43 rib::Rib rib;
44
Vince12e49462014-06-09 13:29:32 -050045 Name name1("/");
Davide Pesavento22db5392017-04-14 00:56:43 -040046 rib.insert(name1, createRoute(1, 20));
Vince12e49462014-06-09 13:29:32 -050047
Vince12e49462014-06-09 13:29:32 -050048 Name name2("/hello");
Davide Pesavento22db5392017-04-14 00:56:43 -040049 rib.insert(name2, createRoute(2, 20));
Vince12e49462014-06-09 13:29:32 -050050
Vince12e49462014-06-09 13:29:32 -050051 Name name3("/hello/world");
Davide Pesavento22db5392017-04-14 00:56:43 -040052 rib.insert(name3, createRoute(3, 20));
Vince12e49462014-06-09 13:29:32 -050053
54 shared_ptr<rib::RibEntry> ribEntry = rib.findParent(name3);
Davide Pesavento22db5392017-04-14 00:56:43 -040055 BOOST_REQUIRE(ribEntry != nullptr);
Vince Lehman218be0a2015-01-15 17:25:20 -060056 BOOST_CHECK_EQUAL(ribEntry->getRoutes().front().faceId, 2);
Vince12e49462014-06-09 13:29:32 -050057
58 ribEntry = rib.findParent(name2);
Davide Pesavento22db5392017-04-14 00:56:43 -040059 BOOST_REQUIRE(ribEntry != nullptr);
Vince Lehman218be0a2015-01-15 17:25:20 -060060 BOOST_CHECK_EQUAL(ribEntry->getRoutes().front().faceId, 1);
Vince12e49462014-06-09 13:29:32 -050061
Vince12e49462014-06-09 13:29:32 -050062 Name name4("/hello/test/foo/bar");
Davide Pesavento22db5392017-04-14 00:56:43 -040063 rib.insert(name4, createRoute(3, 20));
Vince12e49462014-06-09 13:29:32 -050064
65 ribEntry = rib.findParent(name4);
Davide Pesavento22db5392017-04-14 00:56:43 -040066 BOOST_REQUIRE(ribEntry != nullptr);
Vince Lehman218be0a2015-01-15 17:25:20 -060067 BOOST_CHECK(ribEntry->getRoutes().front().faceId == 2);
Vince12e49462014-06-09 13:29:32 -050068}
69
Vince Lehman4387e782014-06-19 16:57:45 -050070BOOST_AUTO_TEST_CASE(Children)
Vince12e49462014-06-09 13:29:32 -050071{
72 rib::Rib rib;
73
Vince12e49462014-06-09 13:29:32 -050074 Name name1("/");
Davide Pesavento22db5392017-04-14 00:56:43 -040075 rib.insert(name1, createRoute(1, 20));
Vince12e49462014-06-09 13:29:32 -050076
Vince12e49462014-06-09 13:29:32 -050077 Name name2("/hello/world");
Davide Pesavento22db5392017-04-14 00:56:43 -040078 rib.insert(name2, createRoute(2, 20));
Vince12e49462014-06-09 13:29:32 -050079
Vince12e49462014-06-09 13:29:32 -050080 Name name3("/hello/test/foo/bar");
Davide Pesavento22db5392017-04-14 00:56:43 -040081 rib.insert(name3, createRoute(3, 20));
Vince12e49462014-06-09 13:29:32 -050082
83 BOOST_CHECK_EQUAL((rib.find(name1)->second)->getChildren().size(), 2);
84 BOOST_CHECK_EQUAL((rib.find(name2)->second)->getChildren().size(), 0);
85 BOOST_CHECK_EQUAL((rib.find(name3)->second)->getChildren().size(), 0);
86
Vince12e49462014-06-09 13:29:32 -050087 Name name4("/hello");
Davide Pesavento22db5392017-04-14 00:56:43 -040088 rib.insert(name4, createRoute(4, 20));
Vince12e49462014-06-09 13:29:32 -050089
90 BOOST_CHECK_EQUAL((rib.find(name1)->second)->getChildren().size(), 1);
91 BOOST_CHECK_EQUAL((rib.find(name2)->second)->getChildren().size(), 0);
92 BOOST_CHECK_EQUAL((rib.find(name3)->second)->getChildren().size(), 0);
93 BOOST_CHECK_EQUAL((rib.find(name4)->second)->getChildren().size(), 2);
94
95 BOOST_CHECK_EQUAL((rib.find(name1)->second)->getChildren().front()->getName(), "/hello");
96 BOOST_CHECK_EQUAL((rib.find(name4)->second)->getParent()->getName(), "/");
97
98 BOOST_REQUIRE(static_cast<bool>((rib.find(name2)->second)->getParent()));
99 BOOST_CHECK_EQUAL((rib.find(name2)->second)->getParent()->getName(), name4);
100 BOOST_REQUIRE(static_cast<bool>((rib.find(name3)->second)->getParent()));
101 BOOST_CHECK_EQUAL((rib.find(name3)->second)->getParent()->getName(), name4);
102}
103
Vince Lehman4387e782014-06-19 16:57:45 -0500104BOOST_AUTO_TEST_CASE(EraseFace)
Vince12e49462014-06-09 13:29:32 -0500105{
106 rib::Rib rib;
107
Davide Pesavento22db5392017-04-14 00:56:43 -0400108 Route route1 = createRoute(1, 20);
Vince12e49462014-06-09 13:29:32 -0500109 Name name1("/");
Vince Lehman218be0a2015-01-15 17:25:20 -0600110 rib.insert(name1, route1);
Vince12e49462014-06-09 13:29:32 -0500111
Davide Pesavento22db5392017-04-14 00:56:43 -0400112 Route route2 = createRoute(2, 20);
Vince12e49462014-06-09 13:29:32 -0500113 Name name2("/hello/world");
Vince Lehman218be0a2015-01-15 17:25:20 -0600114 rib.insert(name2, route2);
Vince12e49462014-06-09 13:29:32 -0500115
Davide Pesavento22db5392017-04-14 00:56:43 -0400116 Route route3 = createRoute(1, 20);
Vince12e49462014-06-09 13:29:32 -0500117 Name name3("/hello/world");
Vince Lehman218be0a2015-01-15 17:25:20 -0600118 rib.insert(name3, route3);
Vince12e49462014-06-09 13:29:32 -0500119
Davide Pesavento22db5392017-04-14 00:56:43 -0400120 Route route4 = createRoute(1, 20);
Vince12e49462014-06-09 13:29:32 -0500121 Name name4("/not/inserted");
Vince12e49462014-06-09 13:29:32 -0500122
Davide Pesavento22db5392017-04-14 00:56:43 -0400123 rib.erase(name4, route4);
Vince Lehman218be0a2015-01-15 17:25:20 -0600124 rib.erase(name1, route1);
Vince12e49462014-06-09 13:29:32 -0500125
126 BOOST_CHECK(rib.find(name1) == rib.end());
Vince Lehman218be0a2015-01-15 17:25:20 -0600127 BOOST_CHECK_EQUAL((rib.find(name2)->second)->getRoutes().size(), 2);
Vince12e49462014-06-09 13:29:32 -0500128
Vince Lehman218be0a2015-01-15 17:25:20 -0600129 rib.erase(name2, route2);
Vince12e49462014-06-09 13:29:32 -0500130
Vince Lehman218be0a2015-01-15 17:25:20 -0600131 BOOST_CHECK_EQUAL((rib.find(name2)->second)->getRoutes().size(), 1);
132 BOOST_CHECK_EQUAL((rib.find(name2)->second)->getRoutes().front().faceId, 1);
Vince12e49462014-06-09 13:29:32 -0500133
Vince Lehman218be0a2015-01-15 17:25:20 -0600134 rib.erase(name3, route3);
Vince12e49462014-06-09 13:29:32 -0500135
136 BOOST_CHECK(rib.find(name2) == rib.end());
137
Davide Pesavento22db5392017-04-14 00:56:43 -0400138 rib.erase(name4, route4);
Vince12e49462014-06-09 13:29:32 -0500139}
140
Vince Lehman4387e782014-06-19 16:57:45 -0500141BOOST_AUTO_TEST_CASE(EraseRibEntry)
Vince12e49462014-06-09 13:29:32 -0500142{
143 rib::Rib rib;
144
Vince12e49462014-06-09 13:29:32 -0500145 Name name1("/");
Davide Pesavento22db5392017-04-14 00:56:43 -0400146 rib.insert(name1, createRoute(1, 20));
Vince12e49462014-06-09 13:29:32 -0500147
Davide Pesavento22db5392017-04-14 00:56:43 -0400148 Route route2 = createRoute(2, 20);
Vince12e49462014-06-09 13:29:32 -0500149 Name name2("/hello");
Vince Lehman218be0a2015-01-15 17:25:20 -0600150 rib.insert(name2, route2);
Vince12e49462014-06-09 13:29:32 -0500151
Vince12e49462014-06-09 13:29:32 -0500152 Name name3("/hello/world");
Davide Pesavento22db5392017-04-14 00:56:43 -0400153 rib.insert(name3, createRoute(1, 20));
Vince12e49462014-06-09 13:29:32 -0500154
155 shared_ptr<rib::RibEntry> ribEntry1 = rib.find(name1)->second;
156 shared_ptr<rib::RibEntry> ribEntry2 = rib.find(name2)->second;
157 shared_ptr<rib::RibEntry> ribEntry3 = rib.find(name3)->second;
158
159 BOOST_CHECK(ribEntry1->getChildren().front() == ribEntry2);
160 BOOST_CHECK(ribEntry3->getParent() == ribEntry2);
161
Vince Lehman218be0a2015-01-15 17:25:20 -0600162 rib.erase(name2, route2);
Vince12e49462014-06-09 13:29:32 -0500163 BOOST_CHECK(ribEntry1->getChildren().front() == ribEntry3);
164 BOOST_CHECK(ribEntry3->getParent() == ribEntry1);
165}
166
Alexander Afanasyev3ecec502014-04-16 13:42:44 -0700167BOOST_AUTO_TEST_CASE(Basic)
168{
169 rib::Rib rib;
170
Vince Lehman218be0a2015-01-15 17:25:20 -0600171 Route route1;
Vince12e49462014-06-09 13:29:32 -0500172 Name name1("/hello/world");
Vince Lehman218be0a2015-01-15 17:25:20 -0600173 route1.faceId = 1;
Vince Lehman218be0a2015-01-15 17:25:20 -0600174 route1.cost = 10;
175 route1.flags = ndn::nfd::ROUTE_FLAG_CHILD_INHERIT | ndn::nfd::ROUTE_FLAG_CAPTURE;
Davide Pesavento14e71f02019-03-28 17:35:25 -0400176 route1.expires = time::steady_clock::now() + 1500_ms;
Alexander Afanasyev3ecec502014-04-16 13:42:44 -0700177
Vince Lehman218be0a2015-01-15 17:25:20 -0600178 rib.insert(name1, route1);
Alexander Afanasyev3ecec502014-04-16 13:42:44 -0700179 BOOST_CHECK_EQUAL(rib.size(), 1);
180
Vince Lehman218be0a2015-01-15 17:25:20 -0600181 rib.insert(name1, route1);
Alexander Afanasyev3ecec502014-04-16 13:42:44 -0700182 BOOST_CHECK_EQUAL(rib.size(), 1);
183
Vince Lehman218be0a2015-01-15 17:25:20 -0600184 Route route2;
Vince12e49462014-06-09 13:29:32 -0500185 Name name2("/hello/world");
Vince Lehman218be0a2015-01-15 17:25:20 -0600186 route2.faceId = 1;
Vince Lehman218be0a2015-01-15 17:25:20 -0600187 route2.cost = 100;
188 route2.flags = ndn::nfd::ROUTE_FLAG_CHILD_INHERIT;
Davide Pesavento14e71f02019-03-28 17:35:25 -0400189 route2.expires = time::steady_clock::now() + 0_s;
Alexander Afanasyev20d31442014-04-19 17:00:53 -0700190
Vince Lehman218be0a2015-01-15 17:25:20 -0600191 rib.insert(name2, route2);
Alexander Afanasyev20d31442014-04-19 17:00:53 -0700192 BOOST_CHECK_EQUAL(rib.size(), 1);
193
Vince Lehman218be0a2015-01-15 17:25:20 -0600194 route2.faceId = 2;
195 rib.insert(name2, route2);
Alexander Afanasyev3ecec502014-04-16 13:42:44 -0700196 BOOST_CHECK_EQUAL(rib.size(), 2);
197
Vince Lehman218be0a2015-01-15 17:25:20 -0600198 BOOST_CHECK(rib.find(name1)->second->hasFaceId(route1.faceId));
199 BOOST_CHECK(rib.find(name1)->second->hasFaceId(route2.faceId));
Vince12e49462014-06-09 13:29:32 -0500200
201 Name name3("/foo/bar");
Vince Lehman218be0a2015-01-15 17:25:20 -0600202 rib.insert(name3, route2);
Alexander Afanasyev3ecec502014-04-16 13:42:44 -0700203 BOOST_CHECK_EQUAL(rib.size(), 3);
204
Davide Pesavento22db5392017-04-14 00:56:43 -0400205 route2.origin = ndn::nfd::ROUTE_ORIGIN_AUTOCONF;
Vince Lehman218be0a2015-01-15 17:25:20 -0600206 rib.insert(name3, route2);
Alexander Afanasyev20d31442014-04-19 17:00:53 -0700207 BOOST_CHECK_EQUAL(rib.size(), 4);
208
Vince Lehman218be0a2015-01-15 17:25:20 -0600209 rib.erase(name3, route2);
Alexander Afanasyev20d31442014-04-19 17:00:53 -0700210 BOOST_CHECK_EQUAL(rib.size(), 3);
211
Vince12e49462014-06-09 13:29:32 -0500212 Name name4("/hello/world");
Vince Lehman218be0a2015-01-15 17:25:20 -0600213 rib.erase(name4, route2);
Alexander Afanasyev20d31442014-04-19 17:00:53 -0700214 BOOST_CHECK_EQUAL(rib.size(), 3);
215
Davide Pesavento22db5392017-04-14 00:56:43 -0400216 route2.origin = ndn::nfd::ROUTE_ORIGIN_APP;
Vince Lehman218be0a2015-01-15 17:25:20 -0600217 rib.erase(name4, route2);
Alexander Afanasyev3ecec502014-04-16 13:42:44 -0700218 BOOST_CHECK_EQUAL(rib.size(), 2);
219
Davide Pesavento22db5392017-04-14 00:56:43 -0400220 BOOST_CHECK(rib.find(name2, route2) == nullptr);
221 BOOST_CHECK(rib.find(name1, route1) != nullptr);
Alexander Afanasyev20d31442014-04-19 17:00:53 -0700222
Teng Lianga4e6ec32018-10-21 09:25:00 -0700223 Name name5("/hello/world/666");
224 Name name6("/hello/world/cs/ua/edu");
225 BOOST_CHECK(rib.findLongestPrefix(name1, route1) != nullptr);
226 BOOST_CHECK(rib.findLongestPrefix(name5, route1) != nullptr);
227 BOOST_CHECK(rib.findLongestPrefix(name6, route1) != nullptr);
228
Vince Lehman218be0a2015-01-15 17:25:20 -0600229 rib.erase(name1, route1);
Alexander Afanasyev3ecec502014-04-16 13:42:44 -0700230 BOOST_CHECK_EQUAL(rib.size(), 1);
Alexander Afanasyev3ecec502014-04-16 13:42:44 -0700231}
232
Davide Pesaventocaa60cc2024-02-18 18:18:37 -0500233BOOST_AUTO_TEST_CASE(Signals)
Nick Gordon89c4cca2016-11-02 15:42:32 +0000234{
235 rib::Rib rib;
236
237 Route route;
238 Name name("/hello/world");
239
Davide Pesavento22db5392017-04-14 00:56:43 -0400240 Route route1 = createRoute(1, 20, 10);
241 Route route2 = createRoute(2, 30, 20);
Nick Gordon89c4cca2016-11-02 15:42:32 +0000242
Nick Gordon89c4cca2016-11-02 15:42:32 +0000243 int nAfterInsertEntryInvocations = 0;
244 int nAfterAddRouteInvocations = 0;
245 int nBeforeRemoveRouteInvocations = 0;
246 int nAfterEraseEntryInvocations = 0;
Davide Pesaventoe422f9e2022-06-03 01:30:23 -0400247 rib.afterInsertEntry.connect([&] (const auto&) {
248 BOOST_CHECK_EQUAL(nAfterInsertEntryInvocations, 0);
249 BOOST_CHECK_EQUAL(nAfterAddRouteInvocations, 0);
250 BOOST_CHECK(rib.find(name) != rib.end());
251 nAfterInsertEntryInvocations++;
252 });
Nick Gordon89c4cca2016-11-02 15:42:32 +0000253
Davide Pesaventoe422f9e2022-06-03 01:30:23 -0400254 rib.afterAddRoute.connect([&] (const auto&) {
255 BOOST_CHECK_EQUAL(nAfterInsertEntryInvocations, 1);
256 BOOST_CHECK(rib.find(name) != rib.end());
257 BOOST_CHECK(rib.find(name, route) != nullptr);
258 nAfterAddRouteInvocations++;
259 });
Nick Gordon89c4cca2016-11-02 15:42:32 +0000260
Davide Pesaventoe422f9e2022-06-03 01:30:23 -0400261 rib.beforeRemoveRoute.connect([&] (const auto&) {
262 BOOST_CHECK_EQUAL(nAfterEraseEntryInvocations, 0);
263 BOOST_CHECK(rib.find(name) != rib.end());
264 BOOST_CHECK(rib.find(name, route) != nullptr);
265 nBeforeRemoveRouteInvocations++;
266 });
Nick Gordon89c4cca2016-11-02 15:42:32 +0000267
Davide Pesaventoe422f9e2022-06-03 01:30:23 -0400268 rib.afterEraseEntry.connect([&] (const auto&) {
269 BOOST_CHECK_EQUAL(nBeforeRemoveRouteInvocations, 2);
270 BOOST_CHECK_EQUAL(nAfterEraseEntryInvocations, 0);
271 BOOST_CHECK(rib.find(name) == rib.end());
272 nAfterEraseEntryInvocations++;
273 });
Nick Gordon89c4cca2016-11-02 15:42:32 +0000274
275 route = route1;
276 rib.insert(name, route);
277 BOOST_CHECK_EQUAL(nAfterInsertEntryInvocations, 1);
278 BOOST_CHECK_EQUAL(nAfterAddRouteInvocations, 1);
279
280 route = route2;
281 rib.insert(name, route);
282 BOOST_CHECK_EQUAL(nAfterInsertEntryInvocations, 1);
283 BOOST_CHECK_EQUAL(nAfterAddRouteInvocations, 2);
284
285 route = route1;
286 rib.erase(name, route);
287 BOOST_CHECK_EQUAL(nBeforeRemoveRouteInvocations, 1);
288 BOOST_CHECK_EQUAL(nAfterEraseEntryInvocations, 0);
289
290 route = route2;
291 rib.erase(name, route);
292 BOOST_CHECK_EQUAL(nBeforeRemoveRouteInvocations, 2);
293 BOOST_CHECK_EQUAL(nAfterEraseEntryInvocations, 1);
Nick Gordon89c4cca2016-11-02 15:42:32 +0000294}
295
Davide Pesaventocaa60cc2024-02-18 18:18:37 -0500296BOOST_AUTO_TEST_CASE(Print)
Weiwei Liuaaa58a62016-11-28 23:15:15 -0700297{
298 rib::Rib rib;
299
Davide Pesavento22db5392017-04-14 00:56:43 -0400300 Route root = createRoute(1, 20);
Weiwei Liuaaa58a62016-11-28 23:15:15 -0700301 Name name1("/");
Davide Pesaventob7bfcb92022-05-22 23:55:23 -0400302 root.expires = std::nullopt;
Weiwei Liuaaa58a62016-11-28 23:15:15 -0700303 rib.insert(name1, root);
304
Davide Pesavento22db5392017-04-14 00:56:43 -0400305 Route route1 = createRoute(2, 20);
Weiwei Liuaaa58a62016-11-28 23:15:15 -0700306 Name name2("/hello");
Davide Pesaventob7bfcb92022-05-22 23:55:23 -0400307 route1.expires = std::nullopt;
Weiwei Liuaaa58a62016-11-28 23:15:15 -0700308 rib.insert(name2, route1);
309
Davide Pesavento22db5392017-04-14 00:56:43 -0400310 Route route2 = createRoute(3, 20);
Weiwei Liuaaa58a62016-11-28 23:15:15 -0700311 Name name3("/hello/world");
Davide Pesaventob7bfcb92022-05-22 23:55:23 -0400312 route2.expires = std::nullopt;
Weiwei Liuaaa58a62016-11-28 23:15:15 -0700313 rib.insert(name3, route2);
314
315 const std::string ribStr = std::string(R"TEXT(
316RibEntry {
Junxiao Shi3f21e582017-05-29 15:26:32 +0000317 Name: /
318 Route(faceid: 1, origin: 20, cost: 0, flags: 0x0, never expires)
Weiwei Liuaaa58a62016-11-28 23:15:15 -0700319}
320RibEntry {
Junxiao Shi3f21e582017-05-29 15:26:32 +0000321 Name: /hello
322 Route(faceid: 2, origin: 20, cost: 0, flags: 0x0, never expires)
Weiwei Liuaaa58a62016-11-28 23:15:15 -0700323}
324RibEntry {
Junxiao Shi3f21e582017-05-29 15:26:32 +0000325 Name: /hello/world
326 Route(faceid: 3, origin: 20, cost: 0, flags: 0x0, never expires)
Weiwei Liuaaa58a62016-11-28 23:15:15 -0700327}
328)TEXT").substr(1);
329
330 BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(rib), ribStr);
331}
332
Davide Pesavento97210d52016-10-14 15:45:48 +0200333BOOST_AUTO_TEST_SUITE_END() // TestRib
Davide Pesaventocaa60cc2024-02-18 18:18:37 -0500334BOOST_AUTO_TEST_SUITE_END() // Rib
Alexander Afanasyev3ecec502014-04-16 13:42:44 -0700335
Davide Pesaventoe422f9e2022-06-03 01:30:23 -0400336} // namespace nfd::tests