blob: e0933e453e28135c248b6bf366b4468fa9363b63 [file] [log] [blame]
Yanbiao Li6704a4a2015-08-19 16:30:16 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Junxiao Shi7d30d852017-01-22 03:29:26 +00003 * Copyright (c) 2014-2017, Regents of the University of California,
Yanbiao Li6704a4a2015-08-19 16:30:16 -07004 * 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/strategy-choice-manager.hpp"
Yanbiao Li6704a4a2015-08-19 16:30:16 -070027#include "table/strategy-choice.hpp"
Junxiao Shia49a1ab2016-07-15 18:24:36 +000028
Davide Pesavento97210d52016-10-14 15:45:48 +020029#include "nfd-manager-common-fixture.hpp"
Junxiao Shi0e4a1f12016-12-24 02:39:01 +000030#include "../fw/dummy-strategy.hpp"
Junxiao Shi25c6ce42016-09-09 13:49:59 +000031#include <ndn-cxx/mgmt/nfd/strategy-choice.hpp>
Yanbiao Li6704a4a2015-08-19 16:30:16 -070032
33namespace nfd {
34namespace tests {
35
Yanbiao Lidf846e52016-01-30 21:53:47 -080036class StrategyChoiceManagerFixture : public NfdManagerCommonFixture
Yanbiao Li6704a4a2015-08-19 16:30:16 -070037{
38public:
39 StrategyChoiceManagerFixture()
Junxiao Shi7d30d852017-01-22 03:29:26 +000040 : sc(m_forwarder.getStrategyChoice())
41 , manager(sc, m_dispatcher, *m_authenticator)
42 , strategyNameP("/strategy-choice-manager-P/%FD%02")
Yanbiao Li6704a4a2015-08-19 16:30:16 -070043 {
Junxiao Shi7d30d852017-01-22 03:29:26 +000044 VersionedDummyStrategy<2>::registerAs(strategyNameP);
45
Junxiao Shi9ddf1b52016-08-22 03:58:55 +000046 setTopPrefix();
Yanbiao Lidf846e52016-01-30 21:53:47 -080047 setPrivilege("strategy-choice");
Yanbiao Li6704a4a2015-08-19 16:30:16 -070048 }
49
50public:
Junxiao Shi7d30d852017-01-22 03:29:26 +000051 /** \return whether exact-match StrategyChoice entry exists
52 */
53 bool
54 hasEntry(const Name& name) const
Yanbiao Li6704a4a2015-08-19 16:30:16 -070055 {
Junxiao Shi7d30d852017-01-22 03:29:26 +000056 return sc.get(name).first;
Yanbiao Li6704a4a2015-08-19 16:30:16 -070057 }
58
Junxiao Shi7d30d852017-01-22 03:29:26 +000059 /** \return strategy instance name from an exact-match StrategyChoice entry
60 */
61 Name
62 getInstanceName(const Name& name) const
Yanbiao Li6704a4a2015-08-19 16:30:16 -070063 {
Junxiao Shi7d30d852017-01-22 03:29:26 +000064 bool hasEntry = false;
65 Name instanceName;
66 std::tie(hasEntry, instanceName) = sc.get(name);
67 return hasEntry ?
68 instanceName :
69 Name("/no-StrategyChoice-entry-at").append(name);
Yanbiao Li6704a4a2015-08-19 16:30:16 -070070 }
71
72protected:
Junxiao Shi7d30d852017-01-22 03:29:26 +000073 StrategyChoice& sc;
74 StrategyChoiceManager manager;
75
76 const Name strategyNameP;
Yanbiao Li6704a4a2015-08-19 16:30:16 -070077};
78
Davide Pesavento97210d52016-10-14 15:45:48 +020079BOOST_AUTO_TEST_SUITE(Mgmt)
80BOOST_FIXTURE_TEST_SUITE(TestStrategyChoiceManager, StrategyChoiceManagerFixture)
Yanbiao Li6704a4a2015-08-19 16:30:16 -070081
Junxiao Shi7d30d852017-01-22 03:29:26 +000082BOOST_AUTO_TEST_CASE(SetSuccess)
Yanbiao Li6704a4a2015-08-19 16:30:16 -070083{
Junxiao Shi7d30d852017-01-22 03:29:26 +000084 ControlParameters reqParams;
85 reqParams.setName("/A")
86 .setStrategy(strategyNameP.getPrefix(-1)); // use unversioned strategy name in request
87 auto req = makeControlCommandRequest("/localhost/nfd/strategy-choice/set", reqParams);
88 receiveInterest(req);
Yanbiao Li6704a4a2015-08-19 16:30:16 -070089
Junxiao Shi7d30d852017-01-22 03:29:26 +000090 ControlParameters expectedParams;
91 expectedParams.setName("/A")
92 .setStrategy(strategyNameP); // response should have versioned strategy name
93 ControlResponse expectedResp;
94 expectedResp.setCode(200)
95 .setText("OK")
96 .setBody(expectedParams.wireEncode());
Junxiao Shi8a1f1702017-07-03 00:05:08 +000097 BOOST_CHECK_EQUAL(checkResponse(0, req.getName(), expectedResp),
Yanbiao Li6704a4a2015-08-19 16:30:16 -070098 CheckResponseResult::OK);
99
Junxiao Shi7d30d852017-01-22 03:29:26 +0000100 BOOST_CHECK_EQUAL(getInstanceName("/A"), strategyNameP);
Yanbiao Li6704a4a2015-08-19 16:30:16 -0700101
Junxiao Shi7d30d852017-01-22 03:29:26 +0000102 // Strategy versioning and parameters are not tested here because they are covered by
103 // Table/TestStrategyChoice test suite.
Yanbiao Li6704a4a2015-08-19 16:30:16 -0700104}
105
Junxiao Shi7d30d852017-01-22 03:29:26 +0000106BOOST_AUTO_TEST_CASE(SetUnknownStrategy)
Yanbiao Li6704a4a2015-08-19 16:30:16 -0700107{
Junxiao Shi7d30d852017-01-22 03:29:26 +0000108 ControlParameters reqParams;
109 reqParams.setName("/A")
110 .setStrategy("/strategy-choice-manager-unknown");
111 auto req = makeControlCommandRequest("/localhost/nfd/strategy-choice/set", reqParams);
112 receiveInterest(req);
Yanbiao Li6704a4a2015-08-19 16:30:16 -0700113
Junxiao Shi7d30d852017-01-22 03:29:26 +0000114 ControlResponse expectedResp;
115 expectedResp.setCode(404)
116 .setText("Strategy not registered");
Junxiao Shi8a1f1702017-07-03 00:05:08 +0000117 BOOST_CHECK_EQUAL(checkResponse(0, req.getName(), expectedResp),
Yanbiao Li6704a4a2015-08-19 16:30:16 -0700118 CheckResponseResult::OK);
Yanbiao Li6704a4a2015-08-19 16:30:16 -0700119
Junxiao Shi7d30d852017-01-22 03:29:26 +0000120 BOOST_CHECK_EQUAL(hasEntry("/A"), false);
121}
122
123BOOST_AUTO_TEST_CASE(UnsetSuccess)
124{
125 auto insertRes = sc.insert("/A", strategyNameP);
126 BOOST_REQUIRE(insertRes);
127
128 ControlParameters reqParams;
129 reqParams.setName("/A");
130 auto req = makeControlCommandRequest("/localhost/nfd/strategy-choice/unset", reqParams);
131 receiveInterest(req);
132
133 ControlParameters expectedParams(reqParams);
134 ControlResponse expectedResp;
135 expectedResp.setCode(200)
136 .setText("OK")
137 .setBody(expectedParams.wireEncode());
Junxiao Shi8a1f1702017-07-03 00:05:08 +0000138 BOOST_CHECK_EQUAL(checkResponse(0, req.getName(), expectedResp),
Yanbiao Li6704a4a2015-08-19 16:30:16 -0700139 CheckResponseResult::OK);
Junxiao Shi7d30d852017-01-22 03:29:26 +0000140
141 BOOST_CHECK_EQUAL(hasEntry("/A"), false);
Yanbiao Li6704a4a2015-08-19 16:30:16 -0700142}
143
Junxiao Shi7d30d852017-01-22 03:29:26 +0000144BOOST_AUTO_TEST_CASE(UnsetNoop)
Yanbiao Li6704a4a2015-08-19 16:30:16 -0700145{
Junxiao Shi7d30d852017-01-22 03:29:26 +0000146 ControlParameters reqParams;
147 reqParams.setName("/A");
148 auto req = makeControlCommandRequest("/localhost/nfd/strategy-choice/unset", reqParams);
149 receiveInterest(req);
Yanbiao Li6704a4a2015-08-19 16:30:16 -0700150
Junxiao Shi7d30d852017-01-22 03:29:26 +0000151 ControlParameters expectedParams(reqParams);
152 ControlResponse expectedResp;
153 expectedResp.setCode(200)
154 .setText("OK")
155 .setBody(expectedParams.wireEncode());
Junxiao Shi8a1f1702017-07-03 00:05:08 +0000156 BOOST_CHECK_EQUAL(checkResponse(0, req.getName(), expectedResp),
Junxiao Shi7d30d852017-01-22 03:29:26 +0000157 CheckResponseResult::OK);
Yanbiao Li6704a4a2015-08-19 16:30:16 -0700158
Junxiao Shi7d30d852017-01-22 03:29:26 +0000159 BOOST_CHECK_EQUAL(hasEntry("/A"), false);
Yanbiao Li6704a4a2015-08-19 16:30:16 -0700160}
161
Junxiao Shi7d30d852017-01-22 03:29:26 +0000162BOOST_AUTO_TEST_CASE(UnsetRootForbidden)
Yanbiao Li6704a4a2015-08-19 16:30:16 -0700163{
Junxiao Shi7d30d852017-01-22 03:29:26 +0000164 ControlParameters reqParams;
165 reqParams.setName("/");
166 auto req = makeControlCommandRequest("/localhost/nfd/strategy-choice/unset", reqParams);
167 receiveInterest(req);
168
169 ControlResponse expectedResp;
170 expectedResp.setCode(400)
171 .setText("failed in validating parameters");
Junxiao Shi8a1f1702017-07-03 00:05:08 +0000172 BOOST_CHECK_EQUAL(checkResponse(0, req.getName(), expectedResp),
Junxiao Shi7d30d852017-01-22 03:29:26 +0000173 CheckResponseResult::OK);
174
175 BOOST_CHECK_EQUAL(hasEntry("/"), true);
Yanbiao Li6704a4a2015-08-19 16:30:16 -0700176}
177
Davide Pesavento97210d52016-10-14 15:45:48 +0200178BOOST_AUTO_TEST_CASE(StrategyChoiceDataset)
Yanbiao Li6704a4a2015-08-19 16:30:16 -0700179{
Junxiao Shi7d30d852017-01-22 03:29:26 +0000180 std::map<Name, Name> expected; // namespace => strategy instance name
181 for (const strategy_choice::Entry& entry : sc) {
182 expected[entry.getPrefix()] = entry.getStrategyInstanceName();
Yanbiao Li6704a4a2015-08-19 16:30:16 -0700183 }
184
Junxiao Shi7d30d852017-01-22 03:29:26 +0000185 for (int i = expected.size(); i < 1024; ++i) {
186 Name name("/SC");
187 name.appendNumber(i);
188 Name strategy = DummyStrategy::getStrategyName(i);
189
190 auto insertRes = sc.insert(name, strategy);
191 BOOST_CHECK(insertRes);
192 expected[name] = strategy;
Yanbiao Li6704a4a2015-08-19 16:30:16 -0700193 }
Yanbiao Li6704a4a2015-08-19 16:30:16 -0700194
Junxiao Shi8a1f1702017-07-03 00:05:08 +0000195 receiveInterest(Interest("/localhost/nfd/strategy-choice/list"));
Junxiao Shi7d30d852017-01-22 03:29:26 +0000196 Block dataset = concatenateResponses();
197 dataset.parse();
198 BOOST_CHECK_EQUAL(dataset.elements_size(), expected.size());
Yanbiao Li6704a4a2015-08-19 16:30:16 -0700199
Junxiao Shi7d30d852017-01-22 03:29:26 +0000200 for (auto i = dataset.elements_begin(); i != dataset.elements_end(); ++i) {
201 ndn::nfd::StrategyChoice record(*i);
202 auto found = expected.find(record.getName());
203 if (found == expected.end()) {
204 BOOST_ERROR("record has unexpected namespace " << record.getName());
205 }
206 else {
207 BOOST_CHECK_MESSAGE(record.getStrategy() == found->second,
208 "record for " << record.getName() << " has wrong strategy " << record.getStrategy() <<
209 ", should be " << found->second);
210 expected.erase(found);
211 }
Yanbiao Li6704a4a2015-08-19 16:30:16 -0700212 }
213
Junxiao Shi7d30d852017-01-22 03:29:26 +0000214 for (const auto& pair : expected) {
215 BOOST_ERROR("record for " << pair.first << " is missing");
216 }
Yanbiao Li6704a4a2015-08-19 16:30:16 -0700217}
218
219BOOST_AUTO_TEST_SUITE_END() // TestStrategyChoiceManager
220BOOST_AUTO_TEST_SUITE_END() // Mgmt
221
222} // namespace tests
223} // namespace nfd