blob: 3e8ef3b584416050de5eebc8fb9357c7c60a58ae [file] [log] [blame]
Saurab Dulal7526cee2018-01-31 18:14:10 +00001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Ashlesh Gawande5d93aa52020-06-13 18:57:45 -07002/*
Junxiao Shi43f37a02023-08-09 00:09:00 +00003 * Copyright (c) 2014-2023, The University of Memphis,
Saurab Dulal7526cee2018-01-31 18:14:10 +00004 * Regents of the University of California,
5 * Arizona Board of Regents.
6 *
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/>.
Ashlesh Gawande5d93aa52020-06-13 18:57:45 -070020 */
Saurab Dulal7526cee2018-01-31 18:14:10 +000021
22#include "update/prefix-update-processor.hpp"
Davide Pesavento8de8a8b2022-05-12 01:26:43 -040023#include "conf-parameter.hpp"
Saurab Dulal7526cee2018-01-31 18:14:10 +000024#include "nlsr.hpp"
25
Davide Pesavento8de8a8b2022-05-12 01:26:43 -040026#include "tests/io-key-chain-fixture.hpp"
Saurab Dulal427e0122019-11-28 11:58:02 -060027#include "tests/test-common.hpp"
Junxiao Shi008c9b12019-01-13 23:15:56 +000028
Saurab Dulal7526cee2018-01-31 18:14:10 +000029#include <ndn-cxx/mgmt/nfd/control-response.hpp>
Davide Pesavento6184c202021-05-17 02:28:03 -040030#include <ndn-cxx/security/interest-signer.hpp>
Saurab Dulal7526cee2018-01-31 18:14:10 +000031#include <ndn-cxx/security/signing-helpers.hpp>
Junxiao Shi008c9b12019-01-13 23:15:56 +000032
Davide Pesavento8de8a8b2022-05-12 01:26:43 -040033#include <boost/filesystem/operations.hpp>
34#include <boost/filesystem/path.hpp>
Davide Pesavento7bc3d432021-10-25 21:08:04 -040035#include <boost/property_tree/info_parser.hpp>
Saurab Dulal7526cee2018-01-31 18:14:10 +000036
37namespace nlsr {
Saurab Dulal7526cee2018-01-31 18:14:10 +000038namespace test {
39
Davide Pesavento7bc3d432021-10-25 21:08:04 -040040namespace bpt = boost::property_tree;
Saurab Dulal7526cee2018-01-31 18:14:10 +000041
Davide Pesavento8de8a8b2022-05-12 01:26:43 -040042class PrefixSaveDeleteFixture : public IoKeyChainFixture
Saurab Dulal7526cee2018-01-31 18:14:10 +000043{
44public:
45 PrefixSaveDeleteFixture()
Davide Pesavento8de8a8b2022-05-12 01:26:43 -040046 : face(m_io, m_keyChain, {true, true})
Saurab Dulal7526cee2018-01-31 18:14:10 +000047 , siteIdentityName(ndn::Name("/edu/test-site"))
48 , opIdentityName(ndn::Name("/edu/test-site").append(ndn::Name("%C1.Operator")))
Saurab Dulal7526cee2018-01-31 18:14:10 +000049 , testConfFile("/tmp/nlsr.conf.test")
Saurab Dulal427e0122019-11-28 11:58:02 -060050 , conf(face, m_keyChain, testConfFile)
Ashlesh Gawande85998a12017-12-07 22:22:13 -060051 , confProcessor(conf)
52 , nlsr(face, m_keyChain, conf)
53 , SITE_CERT_PATH(boost::filesystem::current_path() / std::string("site.cert"))
Saurab Dulal7526cee2018-01-31 18:14:10 +000054 , counter(0)
55 {
Ashlesh Gawande30d96e42021-03-21 19:15:33 -070056 std::ifstream source("nlsr.conf", std::ios::binary);
Ashlesh Gawande85998a12017-12-07 22:22:13 -060057 std::ofstream destination(testConfFile, std::ios::binary);
Saurab Dulal7526cee2018-01-31 18:14:10 +000058 destination << source.rdbuf();
59 source.close();
60 destination.close();
61
dulalsaurab82a34c22019-02-04 17:31:21 +000062 conf.setConfFileNameDynamic(testConfFile);
Davide Pesavento8de8a8b2022-05-12 01:26:43 -040063 siteIdentity = m_keyChain.createIdentity(siteIdentityName);
64 saveIdentityCert(siteIdentity, SITE_CERT_PATH.string());
Saurab Dulal7526cee2018-01-31 18:14:10 +000065
66 // Operator cert
67 opIdentity = addSubCertificate(opIdentityName, siteIdentity);
68 // Loading the security section's validator part into the validator
69 // See conf file processor for more details
70 std::ifstream inputFile;
71 inputFile.open(testConfFile);
72 BOOST_REQUIRE(inputFile.is_open());
Davide Pesavento7bc3d432021-10-25 21:08:04 -040073 bpt::ptree pt;
74 bpt::read_info(inputFile, pt);
Saurab Dulal7526cee2018-01-31 18:14:10 +000075 // Loads section and file name
76 for (const auto& section : pt) {
77 if (section.first == "security") {
Ashlesh Gawande85998a12017-12-07 22:22:13 -060078 for (const auto& it : section.second) {
79 if (it.first == "prefix-update-validator") {
80 conf.getPrefixUpdateValidator().load(it.second, std::string("nlsr.conf"));
81 }
Saurab Dulal7526cee2018-01-31 18:14:10 +000082 }
Saurab Dulal7526cee2018-01-31 18:14:10 +000083 }
84 }
dulalsaurab82a34c22019-02-04 17:31:21 +000085
Saurab Dulal7526cee2018-01-31 18:14:10 +000086 inputFile.close();
Ashlesh Gawande85998a12017-12-07 22:22:13 -060087
Saurab Dulal7526cee2018-01-31 18:14:10 +000088 // Site cert
Davide Pesavento8de8a8b2022-05-12 01:26:43 -040089 siteIdentity = m_keyChain.createIdentity(siteIdentityName);
90 saveIdentityCert(siteIdentity, SITE_CERT_PATH.string());
Saurab Dulal7526cee2018-01-31 18:14:10 +000091
92 // Operator cert
93 opIdentity = addSubCertificate(opIdentityName, siteIdentity);
Saurab Dulal427e0122019-11-28 11:58:02 -060094
95 // Create certificate and load it to the validator
96 conf.initializeKey();
97 conf.loadCertToValidator(siteIdentity.getDefaultKey().getDefaultCertificate());
98 conf.loadCertToValidator(opIdentity.getDefaultKey().getDefaultCertificate());
Saurab Dulal7526cee2018-01-31 18:14:10 +000099
100 // Set the network so the LSA prefix is constructed
Davide Pesavento8de8a8b2022-05-12 01:26:43 -0400101 m_keyChain.createIdentity(conf.getRouterPrefix());
Saurab Dulal7526cee2018-01-31 18:14:10 +0000102
Saurab Dulal7526cee2018-01-31 18:14:10 +0000103 this->advanceClocks(ndn::time::milliseconds(10));
104 face.sentInterests.clear();
105 }
106
107 uint32_t
108 getResponseCode()
109 {
110 ndn::nfd::ControlResponse response;
111 for (const auto& data : face.sentData) {
112 response.wireDecode(data.getContent().blockFromValue());
113 }
114 return response.getCode();
115 }
116
117 bool
118 checkPrefix(const std::string prefixName)
119 {
Davide Pesavento7bc3d432021-10-25 21:08:04 -0400120 bpt::ptree m_savePrefix;
121 bpt::read_info(testConfFile, m_savePrefix);
122
Saurab Dulal7526cee2018-01-31 18:14:10 +0000123 // counter helps to check if multiple prefix of same name exists on conf file
Davide Pesavento7bc3d432021-10-25 21:08:04 -0400124 counter = 0;
Saurab Dulal7526cee2018-01-31 18:14:10 +0000125 for (const auto& section : m_savePrefix.get_child("advertising")) {
Davide Pesavento7bc3d432021-10-25 21:08:04 -0400126 auto b = section.second.get_value<std::string>();
Saurab Dulal7526cee2018-01-31 18:14:10 +0000127 if (b == prefixName) {
128 counter++;
129 }
130 }
Davide Pesavento7bc3d432021-10-25 21:08:04 -0400131 return counter > 0;
Saurab Dulal7526cee2018-01-31 18:14:10 +0000132 }
133
134 ndn::Interest
135 advertiseWithdraw(std::string prefixName, std::string type, bool P_FLAG)
136 {
137 ndn::nfd::ControlParameters parameters;
138 parameters.setName(prefixName);
Davide Pesavento6184c202021-05-17 02:28:03 -0400139 if (P_FLAG) {
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600140 parameters.setFlags(update::PREFIX_FLAG);
Saurab Dulal7526cee2018-01-31 18:14:10 +0000141 }
142 ndn::Name advertiseCommand("/localhost/nlsr/prefix-update/advertise");
143 ndn::Name withdrawCommand("/localhost/nlsr/prefix-update/withdraw");
Davide Pesavento6184c202021-05-17 02:28:03 -0400144 ndn::security::InterestSigner signer(m_keyChain);
Saurab Dulal7526cee2018-01-31 18:14:10 +0000145 // type true for advertise, else withdraw
146 if (type == "advertise") {
Davide Pesaventoe28d8752022-03-19 03:55:25 -0400147 advertiseCommand.append(ndn::tlv::GenericNameComponent, parameters.wireEncode());
Davide Pesavento6184c202021-05-17 02:28:03 -0400148 return signer.makeCommandInterest(advertiseCommand, ndn::security::signingByIdentity(opIdentity));
Saurab Dulal7526cee2018-01-31 18:14:10 +0000149 }
150 else {
Davide Pesaventoe28d8752022-03-19 03:55:25 -0400151 withdrawCommand.append(ndn::tlv::GenericNameComponent, parameters.wireEncode());
Davide Pesavento6184c202021-05-17 02:28:03 -0400152 return signer.makeCommandInterest(withdrawCommand, ndn::security::signingByIdentity(opIdentity));
Saurab Dulal7526cee2018-01-31 18:14:10 +0000153 }
Saurab Dulal7526cee2018-01-31 18:14:10 +0000154 }
155
156public:
Junxiao Shi43f37a02023-08-09 00:09:00 +0000157 ndn::DummyClientFace face;
Saurab Dulal427e0122019-11-28 11:58:02 -0600158 ndn::Name siteIdentityName, routerIdName;
159 ndn::security::pib::Identity siteIdentity, routerId;
Saurab Dulal7526cee2018-01-31 18:14:10 +0000160
161 ndn::Name opIdentityName;
162 ndn::security::pib::Identity opIdentity;
163
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600164 std::string testConfFile;
165 ConfParameter conf;
166 DummyConfFileProcessor confProcessor;
Saurab Dulal7526cee2018-01-31 18:14:10 +0000167 Nlsr nlsr;
168 const boost::filesystem::path SITE_CERT_PATH;
169 ndn::Name sessionTime;
Saurab Dulal7526cee2018-01-31 18:14:10 +0000170 int counter;
171};
172
173BOOST_FIXTURE_TEST_SUITE(TestAdvertiseWithdrawPrefix, PrefixSaveDeleteFixture)
174
175BOOST_AUTO_TEST_CASE(Basic)
176{
Saurab Dulal7526cee2018-01-31 18:14:10 +0000177 face.receive(advertiseWithdraw("/prefix/to/save", "advertise", false));
178 this->advanceClocks(ndn::time::milliseconds(10));
179 BOOST_CHECK_EQUAL(checkPrefix("/prefix/to/save"), false);
180 BOOST_CHECK_EQUAL(getResponseCode(), 200);
181 face.sentData.clear();
182
183 // trying to re-advertise
184 face.receive(advertiseWithdraw("/prefix/to/save", "advertise", false));
185 this->advanceClocks(ndn::time::milliseconds(10));
186 BOOST_CHECK_EQUAL(getResponseCode(), 204);
187 face.sentData.clear();
188
189 // only withdraw
190 face.receive(advertiseWithdraw("/prefix/to/save", "withdraw", false));
191 this->advanceClocks(ndn::time::milliseconds(10));
192 BOOST_CHECK_EQUAL(checkPrefix("/prefix/to/save"), false);
193 BOOST_CHECK_EQUAL(getResponseCode(), 200);
194 face.sentData.clear();
195
196 // trying to re-advertise
197 face.receive(advertiseWithdraw("/prefix/to/save", "withdraw", false));
198 this->advanceClocks(ndn::time::milliseconds(10));
199 BOOST_CHECK_EQUAL(getResponseCode(), 204);
200 face.sentData.clear();
201}
202
203BOOST_AUTO_TEST_CASE(PrefixStillSavedAfterJustWithdrawn)
204{
205 // advertise and save
206 face.receive(advertiseWithdraw("/prefix/to/save", "advertise", true));
207 this->advanceClocks(ndn::time::milliseconds(10));
208 face.sentData.clear();
209 BOOST_CHECK_EQUAL(checkPrefix("/prefix/to/save"), true);
210
211 // trying to advertise same name prefix
dulalsaurab82a34c22019-02-04 17:31:21 +0000212 face.receive(advertiseWithdraw("/prefix/to/save", "advertise", true));
Saurab Dulal7526cee2018-01-31 18:14:10 +0000213 this->advanceClocks(ndn::time::milliseconds(10));
214 BOOST_REQUIRE(counter == 1);
215 BOOST_CHECK_EQUAL(getResponseCode(), 406);
216 face.sentData.clear();
217
218 // only withdraw
219 face.receive(advertiseWithdraw("/prefix/to/save", "withdraw", false));
220 this->advanceClocks(ndn::time::milliseconds(10));
221 // after withdrawing only prefix should still be there
222 BOOST_CHECK_EQUAL(checkPrefix("/prefix/to/save"), true);
223 BOOST_CHECK_EQUAL(getResponseCode(), 200);
224
225 // delete
226 face.receive(advertiseWithdraw("/prefix/to/save", "withdraw", true));
227 this->advanceClocks(ndn::time::milliseconds(10));
228 // after withdrawn delete prefix should be deleted from the file
229 BOOST_CHECK_EQUAL(getResponseCode(), 205);
dulalsaurab82a34c22019-02-04 17:31:21 +0000230 BOOST_CHECK_EQUAL(checkPrefix("/prefix/to/save"), false);
Saurab Dulal7526cee2018-01-31 18:14:10 +0000231}
232
233BOOST_AUTO_TEST_SUITE_END()
234
235} // namespace test
Saurab Dulal7526cee2018-01-31 18:14:10 +0000236} // namespace nlsr