blob: b4fe0512280004a44cccc2fe75aaeb8dc03e6ca0 [file] [log] [blame]
Junxiao Shif2bfb442018-01-05 12:34:57 +00001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
Davide Pesavento1d2d3372025-01-14 12:04:12 -05003 * Copyright (c) 2014-2025, Regents of the University of California,
Junxiao Shif2bfb442018-01-05 12:34:57 +00004 * 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.
10 *
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/>.
24 */
25
26#include "mgmt/cs-manager.hpp"
Davide Pesavento28181322018-11-08 16:44:50 -050027
Davide Pesavento78ddcab2019-02-28 22:00:03 -050028#include "manager-common-fixture.hpp"
Davide Pesavento28181322018-11-08 16:44:50 -050029
Junxiao Shif2bfb442018-01-05 12:34:57 +000030#include <ndn-cxx/mgmt/nfd/cs-info.hpp>
31
Davide Pesaventoe422f9e2022-06-03 01:30:23 -040032namespace nfd::tests {
Junxiao Shif2bfb442018-01-05 12:34:57 +000033
Davide Pesavento78ddcab2019-02-28 22:00:03 -050034class CsManagerFixture : public ManagerFixtureWithAuthenticator
Junxiao Shif2bfb442018-01-05 12:34:57 +000035{
36public:
37 CsManagerFixture()
38 : m_cs(m_forwarder.getCs())
39 , m_fwCnt(const_cast<ForwarderCounters&>(m_forwarder.getCounters()))
40 , m_manager(m_cs, m_fwCnt, m_dispatcher, *m_authenticator)
41 {
42 setTopPrefix();
Junxiao Shic9b5e012018-02-07 15:04:18 +000043 setPrivilege("cs");
Junxiao Shif2bfb442018-01-05 12:34:57 +000044 }
45
46protected:
47 Cs& m_cs;
48 ForwarderCounters& m_fwCnt;
49 CsManager m_manager;
50};
51
52BOOST_AUTO_TEST_SUITE(Mgmt)
53BOOST_FIXTURE_TEST_SUITE(TestCsManager, CsManagerFixture)
54
Junxiao Shic9b5e012018-02-07 15:04:18 +000055BOOST_AUTO_TEST_CASE(Config)
56{
57 using ndn::nfd::CsFlagBit;
Davide Pesavento1d2d3372025-01-14 12:04:12 -050058 const Name cmdPrefix = Name("/localhost/nfd").append(ndn::nfd::CsConfigCommand::getName());
Junxiao Shic9b5e012018-02-07 15:04:18 +000059
60 // setup initial CS config
61 m_cs.setLimit(22129);
62 m_cs.enableAdmit(false);
63 m_cs.enableServe(true);
64
65 // send empty cs/config command
Davide Pesavento20cafa82022-07-25 01:15:03 -040066 auto req = makeControlCommandRequest(cmdPrefix);
Junxiao Shic9b5e012018-02-07 15:04:18 +000067 receiveInterest(req);
68
69 // response shall reflect current config
70 ControlParameters body;
71 body.setCapacity(22129);
72 body.setFlagBit(CsFlagBit::BIT_CS_ENABLE_ADMIT, false, false);
73 body.setFlagBit(CsFlagBit::BIT_CS_ENABLE_SERVE, true, false);
Davide Pesavento4296fe32025-01-14 23:00:41 -050074 BOOST_CHECK_EQUAL(checkResponse(0, req.getName(), makeResponse(200, "OK", body)),
Junxiao Shic9b5e012018-02-07 15:04:18 +000075 CheckResponseResult::OK);
76
77 // send filled cs/config command
78 ControlParameters parameters;
79 parameters.setCapacity(18609);
80 parameters.setFlagBit(CsFlagBit::BIT_CS_ENABLE_ADMIT, true);
81 parameters.setFlagBit(CsFlagBit::BIT_CS_ENABLE_SERVE, false);
82 req = makeControlCommandRequest(cmdPrefix, parameters);
83 receiveInterest(req);
84
85 // response shall reflect updated config
86 body.setCapacity(18609);
87 body.setFlagBit(CsFlagBit::BIT_CS_ENABLE_ADMIT, true, false);
88 body.setFlagBit(CsFlagBit::BIT_CS_ENABLE_SERVE, false, false);
Davide Pesavento4296fe32025-01-14 23:00:41 -050089 BOOST_CHECK_EQUAL(checkResponse(1, req.getName(), makeResponse(200, "OK", body)),
Junxiao Shic9b5e012018-02-07 15:04:18 +000090 CheckResponseResult::OK);
91
92 // CS shall have updated config
93 BOOST_CHECK_EQUAL(m_cs.getLimit(), 18609);
94 BOOST_CHECK_EQUAL(m_cs.shouldAdmit(), true);
95 BOOST_CHECK_EQUAL(m_cs.shouldServe(), false);
96}
97
Junxiao Shibd724312018-04-17 02:23:48 +000098BOOST_AUTO_TEST_CASE(Erase)
99{
100 m_cs.setLimit(CsManager::ERASE_LIMIT * 5);
101 m_cs.insert(*makeData("/B/C/1"));
102 m_cs.insert(*makeData("/B/C/2"));
103 m_cs.insert(*makeData("/B/D/3"));
104 m_cs.insert(*makeData("/B/D/4"));
105 for (size_t i = 0; i < CsManager::ERASE_LIMIT - 1; ++i) {
106 m_cs.insert(*makeData(Name("/E").appendSequenceNumber(i)));
107 }
108 for (size_t i = 0; i < CsManager::ERASE_LIMIT; ++i) {
109 m_cs.insert(*makeData(Name("/F").appendSequenceNumber(i)));
110 }
111 for (size_t i = 0; i < CsManager::ERASE_LIMIT + 1; ++i) {
112 m_cs.insert(*makeData(Name("/G").appendSequenceNumber(i)));
113 }
114 for (size_t i = 0; i < CsManager::ERASE_LIMIT + 1; ++i) {
115 m_cs.insert(*makeData(Name("/H").appendSequenceNumber(i)));
116 }
Davide Pesavento1d2d3372025-01-14 12:04:12 -0500117 const Name cmdPrefix = Name("/localhost/nfd").append(ndn::nfd::CsEraseCommand::getName());
Junxiao Shibd724312018-04-17 02:23:48 +0000118
119 // requested Name matches no Data
Davide Pesavento4296fe32025-01-14 23:00:41 -0500120 auto req = makeControlCommandRequest(cmdPrefix, ControlParameters().setName("/A").setCount(1));
Junxiao Shibd724312018-04-17 02:23:48 +0000121 receiveInterest(req);
122
123 // response should include zero as actual Count
124 ControlParameters body;
125 body.setName("/A");
126 body.setCount(0);
Davide Pesavento4296fe32025-01-14 23:00:41 -0500127 BOOST_CHECK_EQUAL(checkResponse(0, req.getName(), makeResponse(200, "OK", body)),
Junxiao Shibd724312018-04-17 02:23:48 +0000128 CheckResponseResult::OK);
129
130 // requested Count is less than erase limit
Davide Pesavento4296fe32025-01-14 23:00:41 -0500131 req = makeControlCommandRequest(cmdPrefix, ControlParameters().setName("/B").setCount(3));
Junxiao Shibd724312018-04-17 02:23:48 +0000132 receiveInterest(req);
133
134 // response should include actual Count and omit Capacity
135 body.setName("/B");
136 body.setCount(3);
Davide Pesavento4296fe32025-01-14 23:00:41 -0500137 BOOST_CHECK_EQUAL(checkResponse(1, req.getName(), makeResponse(200, "OK", body)),
Junxiao Shibd724312018-04-17 02:23:48 +0000138 CheckResponseResult::OK);
139
140 // requested Count equals erase limit
141 req = makeControlCommandRequest(cmdPrefix,
142 ControlParameters().setName("/E").setCount(CsManager::ERASE_LIMIT));
143 receiveInterest(req);
144
145 // response should include actual Count and omit Capacity
146 body.setName("/E");
147 body.setCount(CsManager::ERASE_LIMIT - 1);
Davide Pesavento4296fe32025-01-14 23:00:41 -0500148 BOOST_CHECK_EQUAL(checkResponse(2, req.getName(), makeResponse(200, "OK", body)),
Junxiao Shibd724312018-04-17 02:23:48 +0000149 CheckResponseResult::OK);
150
151 // requested Count exceeds erase limit, but there are no more Data
152 req = makeControlCommandRequest(cmdPrefix,
153 ControlParameters().setName("/F").setCount(CsManager::ERASE_LIMIT + 1));
154 receiveInterest(req);
155
156 // response should include actual Count and omit Capacity
157 body.setName("/F");
158 body.setCount(CsManager::ERASE_LIMIT);
Davide Pesavento4296fe32025-01-14 23:00:41 -0500159 BOOST_CHECK_EQUAL(checkResponse(3, req.getName(), makeResponse(200, "OK", body)),
Junxiao Shibd724312018-04-17 02:23:48 +0000160 CheckResponseResult::OK);
161
162 // requested Count exceeds erase limit, and there are more Data
163 req = makeControlCommandRequest(cmdPrefix,
164 ControlParameters().setName("/G").setCount(CsManager::ERASE_LIMIT + 1));
165 receiveInterest(req);
166
167 // response should include both actual Count and Capacity
168 body.setName("/G");
169 body.setCount(CsManager::ERASE_LIMIT);
170 body.setCapacity(CsManager::ERASE_LIMIT);
Davide Pesavento4296fe32025-01-14 23:00:41 -0500171 BOOST_CHECK_EQUAL(checkResponse(4, req.getName(), makeResponse(200, "OK", body)),
Junxiao Shibd724312018-04-17 02:23:48 +0000172 CheckResponseResult::OK);
173
174 // request omit Count, which implies "no limit" aka exceeds erase limit
Davide Pesavento4296fe32025-01-14 23:00:41 -0500175 req = makeControlCommandRequest(cmdPrefix, ControlParameters().setName("/H"));
Junxiao Shibd724312018-04-17 02:23:48 +0000176 receiveInterest(req);
177
178 // response should include both actual Count and Capacity since there are more Data
179 body.setName("/H");
180 body.setCount(CsManager::ERASE_LIMIT);
181 body.setCapacity(CsManager::ERASE_LIMIT);
Davide Pesavento4296fe32025-01-14 23:00:41 -0500182 BOOST_CHECK_EQUAL(checkResponse(5, req.getName(), makeResponse(200, "OK", body)),
Junxiao Shibd724312018-04-17 02:23:48 +0000183 CheckResponseResult::OK);
184
185 // one Data each under /A, /G, /H remain, all other Data are erased
186 BOOST_CHECK_EQUAL(m_cs.size(), 3);
187}
188
Junxiao Shif2bfb442018-01-05 12:34:57 +0000189BOOST_AUTO_TEST_CASE(Info)
190{
Junxiao Shi26667e12018-02-08 20:01:18 +0000191 m_cs.setLimit(2681);
Davide Pesavento28181322018-11-08 16:44:50 -0500192 for (uint64_t i = 0; i < 310; ++i) {
Junxiao Shi26667e12018-02-08 20:01:18 +0000193 m_cs.insert(*makeData(Name("/Q8H4oi4g").appendSequenceNumber(i)));
194 }
195 m_cs.enableAdmit(false);
196 m_cs.enableServe(true);
Junxiao Shif2bfb442018-01-05 12:34:57 +0000197 m_fwCnt.nCsHits.set(362);
198 m_fwCnt.nCsMisses.set(1493);
199
Junxiao Shi9d727852019-05-14 13:44:22 -0600200 receiveInterest(*makeInterest("/localhost/nfd/cs/info", true));
Junxiao Shif2bfb442018-01-05 12:34:57 +0000201 Block dataset = concatenateResponses();
202 dataset.parse();
203 BOOST_REQUIRE_EQUAL(dataset.elements_size(), 1);
204
205 ndn::nfd::CsInfo info(*dataset.elements_begin());
Junxiao Shi26667e12018-02-08 20:01:18 +0000206 BOOST_CHECK_EQUAL(info.getCapacity(), 2681);
207 BOOST_CHECK_EQUAL(info.getEnableAdmit(), false);
208 BOOST_CHECK_EQUAL(info.getEnableServe(), true);
209 BOOST_CHECK_EQUAL(info.getNEntries(), 310);
Junxiao Shif2bfb442018-01-05 12:34:57 +0000210 BOOST_CHECK_EQUAL(info.getNHits(), 362);
211 BOOST_CHECK_EQUAL(info.getNMisses(), 1493);
212}
213
214BOOST_AUTO_TEST_SUITE_END() // TestCsManager
215BOOST_AUTO_TEST_SUITE_END() // Mgmt
216
Davide Pesaventoe422f9e2022-06-03 01:30:23 -0400217} // namespace nfd::tests