blob: 9ba03d8a6b44e6c64b2843bb06427d71bca475c6 [file] [log] [blame]
Junxiao Shi65d00722014-02-17 10:50:20 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Junxiao Shi3f9234b2017-12-07 17:41:50 +00002/*
Davide Pesaventoe422f9e2022-06-03 01:30:23 -04003 * Copyright (c) 2014-2022, Regents of the University of California,
Junxiao Shi767cb332015-01-08 09:35:49 -07004 * Arizona Board of Regents,
5 * Colorado State University,
Junxiao Shi35353962015-01-08 09:13:47 -07006 * University Pierre & Marie Curie, Sorbonne University,
Junxiao Shi767cb332015-01-08 09:35:49 -07007 * Washington University in St. Louis,
8 * Beijing Institute of Technology,
9 * The University of Memphis.
Alexander Afanasyev9bcbc7c2014-04-06 19:37:37 -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/>.
Junxiao Shi19838042014-06-21 00:34:01 -070024 */
Junxiao Shi65d00722014-02-17 10:50:20 -070025
26#include "table/measurements.hpp"
Junxiao Shi8c0500f2015-11-11 08:30:16 -070027#include "table/fib.hpp"
Junxiao Shi767cb332015-01-08 09:35:49 -070028#include "table/pit.hpp"
Junxiao Shi65d00722014-02-17 10:50:20 -070029
Junxiao Shid9ee45c2014-02-27 15:38:11 -070030#include "tests/test-common.hpp"
Davide Pesaventocf7db2f2019-03-24 23:17:28 -040031#include "tests/daemon/global-io-fixture.hpp"
Junxiao Shi65d00722014-02-17 10:50:20 -070032
Davide Pesaventoe422f9e2022-06-03 01:30:23 -040033namespace nfd::tests {
Junxiao Shi65d00722014-02-17 10:50:20 -070034
Davide Pesaventoe422f9e2022-06-03 01:30:23 -040035using namespace nfd::measurements;
Junxiao Shi80f9fcd2016-07-23 02:48:36 +000036
Junxiao Shi8c0500f2015-11-11 08:30:16 -070037BOOST_AUTO_TEST_SUITE(Table)
38
Davide Pesaventocf7db2f2019-03-24 23:17:28 -040039class MeasurementsFixture : public GlobalIoTimeFixture
Junxiao Shi8c0500f2015-11-11 08:30:16 -070040{
41public:
42 MeasurementsFixture()
43 : measurements(nameTree)
44 {
45 }
46
47public:
48 NameTree nameTree;
49 Measurements measurements;
50};
51
52BOOST_FIXTURE_TEST_SUITE(TestMeasurements, MeasurementsFixture)
Junxiao Shi65d00722014-02-17 10:50:20 -070053
54BOOST_AUTO_TEST_CASE(Get_Parent)
55{
Junxiao Shi80f9fcd2016-07-23 02:48:36 +000056 Entry& entryAB = measurements.get("/A/B");
57 BOOST_CHECK_EQUAL(entryAB.getName(), "/A/B");
Junxiao Shi65d00722014-02-17 10:50:20 -070058
Junxiao Shi80f9fcd2016-07-23 02:48:36 +000059 Entry& entry0 = measurements.get("/");
60 BOOST_CHECK_EQUAL(entry0.getName(), "/");
Junxiao Shi65d00722014-02-17 10:50:20 -070061
Junxiao Shi80f9fcd2016-07-23 02:48:36 +000062 Entry* entryA = measurements.getParent(entryAB);
Junxiao Shie368d992014-12-02 23:44:31 -070063 BOOST_REQUIRE(entryA != nullptr);
Junxiao Shi8c0500f2015-11-11 08:30:16 -070064 BOOST_CHECK_EQUAL(entryA->getName(), "/A");
Junxiao Shi65d00722014-02-17 10:50:20 -070065
Junxiao Shi80f9fcd2016-07-23 02:48:36 +000066 Entry* entry0c = measurements.getParent(*entryA);
67 BOOST_REQUIRE(entry0c != nullptr);
68 BOOST_CHECK_EQUAL(&entry0, entry0c);
Junxiao Shi65d00722014-02-17 10:50:20 -070069}
70
Junxiao Shi3f9234b2017-12-07 17:41:50 +000071BOOST_AUTO_TEST_CASE(GetLongName)
72{
73 Name n;
74 while (n.size() < NameTree::getMaxDepth() - 1) {
75 n.append("A");
76 }
77 Entry& entry1 = measurements.get(n);
78 BOOST_CHECK_EQUAL(entry1.getName().size(), NameTree::getMaxDepth() - 1);
79
80 n.append("B");
81 Entry& entry2 = measurements.get(n);
82 BOOST_CHECK_EQUAL(entry2.getName().size(), NameTree::getMaxDepth());
83
84 n.append("C");
85 Entry& entry3 = measurements.get(n);
86 BOOST_CHECK_EQUAL(entry3.getName().size(), NameTree::getMaxDepth());
87}
88
Junxiao Shi8c0500f2015-11-11 08:30:16 -070089BOOST_AUTO_TEST_CASE(GetWithFibEntry)
90{
91 Fib fib(nameTree);
92
Junxiao Shia6de4292016-07-12 02:08:10 +000093 const fib::Entry* fibA = fib.insert("/A").first;
94 const fib::Entry* fibAB = fib.insert("/A/B").first;
Junxiao Shi8c0500f2015-11-11 08:30:16 -070095
Junxiao Shi80f9fcd2016-07-23 02:48:36 +000096 Entry& entryA = measurements.get(*fibA);
97 BOOST_CHECK_EQUAL(entryA.getName(), "/A");
Junxiao Shi8c0500f2015-11-11 08:30:16 -070098
Junxiao Shi80f9fcd2016-07-23 02:48:36 +000099 Entry& entryAB = measurements.get(*fibAB);
100 BOOST_CHECK_EQUAL(entryAB.getName(), "/A/B");
Junxiao Shi8c0500f2015-11-11 08:30:16 -0700101}
102
103BOOST_AUTO_TEST_CASE(GetWithEmptyFibEntry) // Bug 3275
104{
105 Fib fib(nameTree);
106
Junxiao Shia6de4292016-07-12 02:08:10 +0000107 const fib::Entry& fib0 = fib.findLongestPrefixMatch("/");
Junxiao Shi8c0500f2015-11-11 08:30:16 -0700108
Junxiao Shi80f9fcd2016-07-23 02:48:36 +0000109 Entry& entry0 = measurements.get(fib0);
110 BOOST_CHECK_EQUAL(entry0.getName(), "/");
Junxiao Shi8c0500f2015-11-11 08:30:16 -0700111}
112
113BOOST_AUTO_TEST_CASE(GetWithPitEntry)
114{
115 Pit pit(nameTree);
116
117 shared_ptr<Interest> interestA = makeInterest("/A");
118 shared_ptr<pit::Entry> pitA = pit.insert(*interestA).first;
Junxiao Shi4370fde2016-02-24 12:20:46 -0700119 shared_ptr<Data> dataABC = makeData("/A/B/C");
120 Name fullName = dataABC->getFullName();
121 shared_ptr<Interest> interestFull = makeInterest(fullName);
122 shared_ptr<pit::Entry> pitFull = pit.insert(*interestFull).first;
Junxiao Shi8c0500f2015-11-11 08:30:16 -0700123
Junxiao Shi80f9fcd2016-07-23 02:48:36 +0000124 Entry& entryA = measurements.get(*pitA);
125 BOOST_CHECK_EQUAL(entryA.getName(), "/A");
Junxiao Shi4370fde2016-02-24 12:20:46 -0700126
Junxiao Shi80f9fcd2016-07-23 02:48:36 +0000127 Entry& entryFull = measurements.get(*pitFull);
128 BOOST_CHECK_EQUAL(entryFull.getName(), fullName);
Junxiao Shi8c0500f2015-11-11 08:30:16 -0700129}
130
Junxiao Shib30c7b02015-01-07 15:45:54 -0700131class DummyStrategyInfo1 : public fw::StrategyInfo
132{
133public:
134 static constexpr int
135 getTypeId()
136 {
137 return 21;
138 }
139};
140
141class DummyStrategyInfo2 : public fw::StrategyInfo
142{
143public:
144 static constexpr int
145 getTypeId()
146 {
147 return 22;
148 }
149};
150
151BOOST_AUTO_TEST_CASE(FindLongestPrefixMatch)
152{
Junxiao Shib30c7b02015-01-07 15:45:54 -0700153 measurements.get("/A");
Junxiao Shi5b3feb62016-08-19 01:51:41 +0000154 measurements.get("/A/B/C").insertStrategyInfo<DummyStrategyInfo1>();
Junxiao Shib30c7b02015-01-07 15:45:54 -0700155 measurements.get("/A/B/C/D");
156
Junxiao Shi80f9fcd2016-07-23 02:48:36 +0000157 Entry* found1 = measurements.findLongestPrefixMatch("/A/B/C/D/E");
Junxiao Shib30c7b02015-01-07 15:45:54 -0700158 BOOST_REQUIRE(found1 != nullptr);
159 BOOST_CHECK_EQUAL(found1->getName(), "/A/B/C/D");
160
Junxiao Shi80f9fcd2016-07-23 02:48:36 +0000161 Entry* found2 = measurements.findLongestPrefixMatch("/A/B/C/D/E",
162 EntryWithStrategyInfo<DummyStrategyInfo1>());
Junxiao Shib30c7b02015-01-07 15:45:54 -0700163 BOOST_REQUIRE(found2 != nullptr);
164 BOOST_CHECK_EQUAL(found2->getName(), "/A/B/C");
165
Junxiao Shi80f9fcd2016-07-23 02:48:36 +0000166 Entry* found3 = measurements.findLongestPrefixMatch("/A/B/C/D/E",
167 EntryWithStrategyInfo<DummyStrategyInfo2>());
Junxiao Shib30c7b02015-01-07 15:45:54 -0700168 BOOST_CHECK(found3 == nullptr);
169}
170
Junxiao Shi767cb332015-01-08 09:35:49 -0700171BOOST_AUTO_TEST_CASE(FindLongestPrefixMatchWithPitEntry)
172{
Junxiao Shi767cb332015-01-08 09:35:49 -0700173 Pit pit(nameTree);
174
175 measurements.get("/A");
Junxiao Shi5b3feb62016-08-19 01:51:41 +0000176 measurements.get("/A/B/C").insertStrategyInfo<DummyStrategyInfo1>();
Junxiao Shi767cb332015-01-08 09:35:49 -0700177 measurements.get("/A/B/C/D");
178
179 shared_ptr<Interest> interest = makeInterest("/A/B/C/D/E");
180 shared_ptr<pit::Entry> pitEntry = pit.insert(*interest).first;
181
Junxiao Shi80f9fcd2016-07-23 02:48:36 +0000182 Entry* found1 = measurements.findLongestPrefixMatch(*pitEntry);
Junxiao Shi767cb332015-01-08 09:35:49 -0700183 BOOST_REQUIRE(found1 != nullptr);
184 BOOST_CHECK_EQUAL(found1->getName(), "/A/B/C/D");
185
Junxiao Shi80f9fcd2016-07-23 02:48:36 +0000186 Entry* found2 = measurements.findLongestPrefixMatch(*pitEntry,
187 EntryWithStrategyInfo<DummyStrategyInfo1>());
Junxiao Shi767cb332015-01-08 09:35:49 -0700188 BOOST_REQUIRE(found2 != nullptr);
189 BOOST_CHECK_EQUAL(found2->getName(), "/A/B/C");
190
Junxiao Shi80f9fcd2016-07-23 02:48:36 +0000191 Entry* found3 = measurements.findLongestPrefixMatch(*pitEntry,
192 EntryWithStrategyInfo<DummyStrategyInfo2>());
Junxiao Shi767cb332015-01-08 09:35:49 -0700193 BOOST_CHECK(found3 == nullptr);
194}
195
Junxiao Shi8c0500f2015-11-11 08:30:16 -0700196BOOST_AUTO_TEST_CASE(Lifetime)
Junxiao Shi19838042014-06-21 00:34:01 -0700197{
Junxiao Shi19838042014-06-21 00:34:01 -0700198 Name nameA("ndn:/A");
199 Name nameB("ndn:/B");
200 Name nameC("ndn:/C");
201
202 BOOST_CHECK_EQUAL(measurements.size(), 0);
203
Junxiao Shi80f9fcd2016-07-23 02:48:36 +0000204 Entry& entryA = measurements.get(nameA);
205 measurements.get(nameB);
206 Entry& entryC = measurements.get(nameC);
Junxiao Shi19838042014-06-21 00:34:01 -0700207 BOOST_CHECK_EQUAL(measurements.size(), 3);
208
Davide Pesavento14e71f02019-03-28 17:35:25 -0400209 const time::nanoseconds EXTEND_A = 2_s;
210 const time::nanoseconds CHECK1 = 3_s;
211 const time::nanoseconds CHECK2 = 5_s;
212 const time::nanoseconds EXTEND_C = 6_s;
213 const time::nanoseconds CHECK3 = 7_s;
Junxiao Shie368d992014-12-02 23:44:31 -0700214 BOOST_ASSERT(EXTEND_A < CHECK1);
215 BOOST_ASSERT(CHECK1 < Measurements::getInitialLifetime());
216 BOOST_ASSERT(Measurements::getInitialLifetime() < CHECK2);
217 BOOST_ASSERT(CHECK2 < EXTEND_C);
218 BOOST_ASSERT(EXTEND_C < CHECK3);
Junxiao Shi19838042014-06-21 00:34:01 -0700219
Junxiao Shi80f9fcd2016-07-23 02:48:36 +0000220 measurements.extendLifetime(entryA, EXTEND_A);
221 measurements.extendLifetime(entryC, EXTEND_C);
Junxiao Shi19838042014-06-21 00:34:01 -0700222 // remaining lifetime:
223 // A = initial lifetime, because it's extended by less duration
224 // B = initial lifetime
225 // C = EXTEND_C
Junxiao Shi19838042014-06-21 00:34:01 -0700226
Davide Pesavento14e71f02019-03-28 17:35:25 -0400227 this->advanceClocks(100_ms, CHECK1);
Junxiao Shie368d992014-12-02 23:44:31 -0700228 BOOST_CHECK(measurements.findExactMatch(nameA) != nullptr);
229 BOOST_CHECK(measurements.findExactMatch(nameB) != nullptr);
230 BOOST_CHECK(measurements.findExactMatch(nameC) != nullptr);
Junxiao Shi19838042014-06-21 00:34:01 -0700231 BOOST_CHECK_EQUAL(measurements.size(), 3);
232
Davide Pesavento14e71f02019-03-28 17:35:25 -0400233 this->advanceClocks(100_ms, CHECK2 - CHECK1);
Junxiao Shie368d992014-12-02 23:44:31 -0700234 BOOST_CHECK(measurements.findExactMatch(nameA) == nullptr);
235 BOOST_CHECK(measurements.findExactMatch(nameB) == nullptr);
236 BOOST_CHECK(measurements.findExactMatch(nameC) != nullptr);
Junxiao Shi19838042014-06-21 00:34:01 -0700237 BOOST_CHECK_EQUAL(measurements.size(), 1);
238
Davide Pesavento14e71f02019-03-28 17:35:25 -0400239 this->advanceClocks(100_ms, CHECK3 - CHECK2);
Junxiao Shie368d992014-12-02 23:44:31 -0700240 BOOST_CHECK(measurements.findExactMatch(nameA) == nullptr);
241 BOOST_CHECK(measurements.findExactMatch(nameB) == nullptr);
242 BOOST_CHECK(measurements.findExactMatch(nameC) == nullptr);
Junxiao Shi19838042014-06-21 00:34:01 -0700243 BOOST_CHECK_EQUAL(measurements.size(), 0);
244}
245
Junxiao Shi8c0500f2015-11-11 08:30:16 -0700246BOOST_AUTO_TEST_CASE(EraseNameTreeEntry)
Junxiao Shiee5a4442014-07-27 17:13:43 -0700247{
Junxiao Shiee5a4442014-07-27 17:13:43 -0700248 size_t nNameTreeEntriesBefore = nameTree.size();
249
Junxiao Shi80f9fcd2016-07-23 02:48:36 +0000250 measurements.get("/A");
251 BOOST_CHECK_EQUAL(measurements.size(), 1);
252
Davide Pesavento14e71f02019-03-28 17:35:25 -0400253 this->advanceClocks(Measurements::getInitialLifetime() + 10_ms);
Junxiao Shiee5a4442014-07-27 17:13:43 -0700254 BOOST_CHECK_EQUAL(measurements.size(), 0);
255 BOOST_CHECK_EQUAL(nameTree.size(), nNameTreeEntriesBefore);
256}
257
Junxiao Shi8c0500f2015-11-11 08:30:16 -0700258BOOST_AUTO_TEST_SUITE_END() // TestMeasurements
259BOOST_AUTO_TEST_SUITE_END() // Table
Junxiao Shi65d00722014-02-17 10:50:20 -0700260
Davide Pesaventoe422f9e2022-06-03 01:30:23 -0400261} // namespace nfd::tests