blob: 707ff954587a7d8aea040d403953a8777659f242 [file] [log] [blame]
Shock Jiangcde28712014-10-19 21:17:20 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Yumin Xia2c509c22017-02-09 14:37:36 -08002/*
3 * Copyright (c) 2014-2017, Regents of the University of California.
Shock Jiangcde28712014-10-19 21:17:20 -07004 *
5 * This file is part of NDNS (Named Data Networking Domain Name Service).
6 * See AUTHORS.md for complete list of NDNS authors and contributors.
7 *
8 * NDNS is free software: you can redistribute it and/or modify it under the terms
9 * of the GNU General Public License as published by the Free Software Foundation,
10 * either version 3 of the License, or (at your option) any later version.
11 *
12 * NDNS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
13 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 * PURPOSE. See the GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * NDNS, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
18 */
19
Shock Jiangcde28712014-10-19 21:17:20 -070020#include "daemon/name-server.hpp"
Alexander Afanasyevfde570c2016-12-19 16:02:55 -080021#include "daemon/db-mgr.hpp"
Shock Jiangcde28712014-10-19 21:17:20 -070022#include "clients/response.hpp"
23#include "clients/query.hpp"
Shock Jiangcde28712014-10-19 21:17:20 -070024
Alexander Afanasyevfde570c2016-12-19 16:02:55 -080025#include "test-common.hpp"
26#include "unit/database-test-data.hpp"
Shock Jiangcde28712014-10-19 21:17:20 -070027
Yumin Xia2c509c22017-02-09 14:37:36 -080028#include <ndn-cxx/util/regex.hpp>
29
Shock Jiangcde28712014-10-19 21:17:20 -070030namespace ndn {
31namespace ndns {
32namespace tests {
33
Alexander Afanasyevc7c99002015-10-09 17:27:30 -070034NDNS_LOG_INIT("NameServerTest")
Shock Jiangcde28712014-10-19 21:17:20 -070035
36class NameServerFixture : public DbTestData
37{
38public:
39 NameServerFixture()
Junxiao Shibbf7ac82016-07-14 14:45:15 +000040 : face({false, true})
Yumin Xia2c509c22017-02-09 14:37:36 -080041 , zone(m_test.getName())
42 , validator(NdnsValidatorBuilder::create(face))
43 , server(zone, m_certName, face, m_session, m_keyChain, *validator)
Shock Jiangcde28712014-10-19 21:17:20 -070044 {
45 // ensure prefix is registered
46 run();
47 }
48
49 void
50 run()
51 {
Junxiao Shibbf7ac82016-07-14 14:45:15 +000052 face.getIoService().poll();
53 face.getIoService().reset();
Shock Jiangcde28712014-10-19 21:17:20 -070054 }
55
56public:
Junxiao Shibbf7ac82016-07-14 14:45:15 +000057 ndn::util::DummyClientFace face;
Shock Jiangcde28712014-10-19 21:17:20 -070058 const Name& zone;
Yumin Xia2c509c22017-02-09 14:37:36 -080059 unique_ptr<security::v2::Validator> validator;
Shock Jiangcde28712014-10-19 21:17:20 -070060 ndns::NameServer server;
61};
62
63BOOST_FIXTURE_TEST_SUITE(NameServer, NameServerFixture)
64
65BOOST_AUTO_TEST_CASE(NdnsQuery)
66{
Yumin Xia6343c5b2016-10-20 15:45:50 -070067 Query q(zone, ndns::label::NDNS_ITERATIVE_QUERY);
Shock Jiange1a81fd2014-11-20 20:25:49 -080068 q.setRrLabel(Name("net"));
Shock Jiangcde28712014-10-19 21:17:20 -070069 q.setRrType(ndns::label::NS_RR_TYPE);
70
71 bool hasDataBack = false;
72
Junxiao Shibbf7ac82016-07-14 14:45:15 +000073 face.onSendData.connectSingleShot([&] (const Data& data) {
Shock Jiangcde28712014-10-19 21:17:20 -070074 hasDataBack = true;
75 NDNS_LOG_TRACE("get Data back");
76 BOOST_CHECK_EQUAL(data.getName().getPrefix(-1), q.toInterest().getName());
77
78 Response resp;
Yumin Xia6343c5b2016-10-20 15:45:50 -070079 BOOST_CHECK_NO_THROW(resp.fromData(zone, data));
Yumin Xiaa484ba72016-11-10 20:40:12 -080080 BOOST_CHECK_EQUAL(resp.getContentType(), NDNS_LINK);
Junxiao Shi8f5be2a2015-01-06 10:06:43 -070081 });
Shock Jiangcde28712014-10-19 21:17:20 -070082
Junxiao Shibbf7ac82016-07-14 14:45:15 +000083 face.receive(q.toInterest());
Shock Jiangcde28712014-10-19 21:17:20 -070084
85 run();
86
87 BOOST_CHECK_EQUAL(hasDataBack, true);
88}
89
90BOOST_AUTO_TEST_CASE(KeyQuery)
91{
Yumin Xia6343c5b2016-10-20 15:45:50 -070092 Query q(zone, ndns::label::NDNS_ITERATIVE_QUERY);
Shock Jiangcde28712014-10-19 21:17:20 -070093 q.setRrType(ndns::label::CERT_RR_TYPE);
94
95 size_t nDataBack = 0;
96
97 // will ask for non-existing record
Junxiao Shibbf7ac82016-07-14 14:45:15 +000098 face.onSendData.connectSingleShot([&] (const Data& data) {
Shock Jiangcde28712014-10-19 21:17:20 -070099 ++nDataBack;
100 NDNS_LOG_TRACE("get Data back");
101 BOOST_CHECK_EQUAL(data.getName().getPrefix(-1), q.toInterest().getName());
102
103 Response resp;
Yumin Xia6343c5b2016-10-20 15:45:50 -0700104 BOOST_CHECK_NO_THROW(resp.fromData(zone, data));
Yumin Xiaa484ba72016-11-10 20:40:12 -0800105 BOOST_CHECK_EQUAL(resp.getContentType(), NDNS_NACK);
Junxiao Shi8f5be2a2015-01-06 10:06:43 -0700106 });
Shock Jiangcde28712014-10-19 21:17:20 -0700107
Junxiao Shibbf7ac82016-07-14 14:45:15 +0000108 face.receive(q.toInterest());
Shock Jiangcde28712014-10-19 21:17:20 -0700109 run();
110
Yumin Xia3c6b1fd2016-12-11 19:08:47 -0800111 // will ask for the existing record (will have type NDNS_KEY, as it is certificate)
Junxiao Shibbf7ac82016-07-14 14:45:15 +0000112 face.onSendData.connectSingleShot([&] (const Data& data) {
Shock Jiangcde28712014-10-19 21:17:20 -0700113 ++nDataBack;
114 NDNS_LOG_TRACE("get Data back");
115 BOOST_CHECK_EQUAL(data.getName().getPrefix(-1), q.toInterest().getName());
116
117 Response resp;
Yumin Xia6343c5b2016-10-20 15:45:50 -0700118 BOOST_CHECK_NO_THROW(resp.fromData(zone, data));
Yumin Xia3c6b1fd2016-12-11 19:08:47 -0800119 BOOST_CHECK_EQUAL(resp.getContentType(), NDNS_KEY);
Junxiao Shi8f5be2a2015-01-06 10:06:43 -0700120 });
Shock Jiangcde28712014-10-19 21:17:20 -0700121
Yumin Xia2c509c22017-02-09 14:37:36 -0800122 Response certResp;
123 certResp.fromData(zone, m_cert);
124 q.setRrLabel(certResp.getRrLabel());
Shock Jiangcde28712014-10-19 21:17:20 -0700125
Junxiao Shibbf7ac82016-07-14 14:45:15 +0000126 face.receive(q.toInterest());
Shock Jiangcde28712014-10-19 21:17:20 -0700127 run();
128
129 BOOST_CHECK_EQUAL(nDataBack, 2);
Alexander Afanasyevaa46c272016-03-09 12:54:12 -0800130
131 // explicit interest with correct version
Yumin Xia2c509c22017-02-09 14:37:36 -0800132 face.receive(Interest(m_cert.getName()));
Alexander Afanasyevaa46c272016-03-09 12:54:12 -0800133
Junxiao Shibbf7ac82016-07-14 14:45:15 +0000134 face.onSendData.connectSingleShot([&] (const Data& data) {
Alexander Afanasyevaa46c272016-03-09 12:54:12 -0800135 ++nDataBack;
136
137 Response resp;
Yumin Xia6343c5b2016-10-20 15:45:50 -0700138 BOOST_CHECK_NO_THROW(resp.fromData(zone, data));
Yumin Xia3c6b1fd2016-12-11 19:08:47 -0800139 BOOST_CHECK_EQUAL(resp.getContentType(), NDNS_KEY);
Alexander Afanasyevaa46c272016-03-09 12:54:12 -0800140 });
141
142 run();
143 BOOST_CHECK_EQUAL(nDataBack, 3);
144
145 // explicit interest with wrong version
Yumin Xia2c509c22017-02-09 14:37:36 -0800146 Name wrongName = m_cert.getName().getPrefix(-1);
147 wrongName.appendVersion();
148 face.receive(Interest(wrongName));
Alexander Afanasyevaa46c272016-03-09 12:54:12 -0800149
Junxiao Shibbf7ac82016-07-14 14:45:15 +0000150 face.onSendData.connectSingleShot([&] (const Data& data) {
Alexander Afanasyevaa46c272016-03-09 12:54:12 -0800151 ++nDataBack;
152
153 Response resp;
Yumin Xia6343c5b2016-10-20 15:45:50 -0700154 BOOST_CHECK_NO_THROW(resp.fromData(zone, data));
Yumin Xiaa484ba72016-11-10 20:40:12 -0800155 BOOST_CHECK_EQUAL(resp.getContentType(), NDNS_NACK);
Alexander Afanasyevaa46c272016-03-09 12:54:12 -0800156 });
157
158 run();
159 BOOST_CHECK_EQUAL(nDataBack, 4);
Shock Jiangcde28712014-10-19 21:17:20 -0700160}
161
162BOOST_AUTO_TEST_CASE(UpdateReplaceRr)
163{
164 Response re;
165 re.setZone(zone);
166 re.setQueryType(label::NDNS_ITERATIVE_QUERY);
Shock Jiange1a81fd2014-11-20 20:25:49 -0800167 re.setRrLabel(Name("net"));
Shock Jiangcde28712014-10-19 21:17:20 -0700168 re.setRrType(label::NS_RR_TYPE);
Yumin Xiaa484ba72016-11-10 20:40:12 -0800169 re.setContentType(NDNS_RESP);
Shock Jiangcde28712014-10-19 21:17:20 -0700170
171 std::string str = "ns1.ndnsim.net";
Junxiao Shi767f35c2016-07-23 01:54:42 +0000172 re.addRr(makeBinaryBlock(ndns::tlv::RrData, str.c_str(), str.size()));
Shock Jiangcde28712014-10-19 21:17:20 -0700173 str = "ns2.ndnsim.net";
Junxiao Shi767f35c2016-07-23 01:54:42 +0000174 re.addRr(makeBinaryBlock(ndns::tlv::RrData, str.c_str(), str.size()));
Shock Jiangcde28712014-10-19 21:17:20 -0700175
176 shared_ptr<Data> data = re.toData();
Yumin Xia2c509c22017-02-09 14:37:36 -0800177 m_keyChain.sign(*data, security::signingByCertificate(m_cert));
Shock Jiangcde28712014-10-19 21:17:20 -0700178
Yumin Xia6343c5b2016-10-20 15:45:50 -0700179 Query q(Name(zone), ndns::label::NDNS_ITERATIVE_QUERY);
Shock Jiangcde28712014-10-19 21:17:20 -0700180 const Block& block = data->wireEncode();
181 Name name;
182 name.append(block);
183
184 q.setRrLabel(name);
185 q.setRrType(label::NDNS_UPDATE_LABEL);
186
187 bool hasDataBack = false;
188
Junxiao Shibbf7ac82016-07-14 14:45:15 +0000189 face.onSendData.connectSingleShot([&] (const Data& data) {
Shock Jiangcde28712014-10-19 21:17:20 -0700190 hasDataBack = true;
191 NDNS_LOG_TRACE("get Data back");
192 BOOST_CHECK_EQUAL(data.getName().getPrefix(-1), q.toInterest().getName());
193 Response resp;
194
Yumin Xia6343c5b2016-10-20 15:45:50 -0700195 BOOST_CHECK_NO_THROW(resp.fromData(zone, data));
Yumin Xiaa484ba72016-11-10 20:40:12 -0800196 BOOST_CHECK_EQUAL(resp.getContentType(), NDNS_RESP); // by default NDNS_BLOB is enough
Shock Jiangcde28712014-10-19 21:17:20 -0700197 BOOST_CHECK_GT(resp.getRrs().size(), 0);
198 Block block = resp.getRrs()[0];
199 block.parse();
200 int ret = -1;
201 BOOST_CHECK_EQUAL(block.type(), ndns::tlv::RrData);
202 Block::element_const_iterator val = block.elements_begin();
203 BOOST_CHECK_EQUAL(val->type(), ndns::tlv::UpdateReturnCode); // the first must be return code
204 ret = readNonNegativeInteger(*val);
205 BOOST_CHECK_EQUAL(ret, 0);
Junxiao Shi8f5be2a2015-01-06 10:06:43 -0700206 });
Junxiao Shibbf7ac82016-07-14 14:45:15 +0000207 face.receive(q.toInterest());
Shock Jiangcde28712014-10-19 21:17:20 -0700208 run();
209
210 BOOST_CHECK_EQUAL(hasDataBack, true);
211}
212
213BOOST_AUTO_TEST_CASE(UpdateInsertNewRr)
214{
215 Response re;
216 re.setZone(zone);
217 re.setQueryType(label::NDNS_ITERATIVE_QUERY);
Shock Jiange1a81fd2014-11-20 20:25:49 -0800218 re.setRrLabel(Name("net-XYZ")); // insert new records
Shock Jiangcde28712014-10-19 21:17:20 -0700219 re.setRrType(label::NS_RR_TYPE);
Yumin Xiaa484ba72016-11-10 20:40:12 -0800220 re.setContentType(NDNS_RESP);
Shock Jiangcde28712014-10-19 21:17:20 -0700221
222 std::string str = "ns1.ndnsim.net";
Junxiao Shi767f35c2016-07-23 01:54:42 +0000223 re.addRr(makeBinaryBlock(ndns::tlv::RrData, str.c_str(), str.size()));
Shock Jiangcde28712014-10-19 21:17:20 -0700224 str = "ns2.ndnsim.net";
Junxiao Shi767f35c2016-07-23 01:54:42 +0000225 re.addRr(makeBinaryBlock(ndns::tlv::RrData, str.c_str(), str.size()));
Shock Jiangcde28712014-10-19 21:17:20 -0700226
227 shared_ptr<Data> data = re.toData();
Yumin Xia2c509c22017-02-09 14:37:36 -0800228 m_keyChain.sign(*data, security::signingByCertificate(m_cert));
Shock Jiangcde28712014-10-19 21:17:20 -0700229
Yumin Xia6343c5b2016-10-20 15:45:50 -0700230 Query q(Name(zone), ndns::label::NDNS_ITERATIVE_QUERY);
Shock Jiangcde28712014-10-19 21:17:20 -0700231 const Block& block = data->wireEncode();
232 Name name;
233 name.append(block);
234
235 q.setRrLabel(name);
236 q.setRrType(label::NDNS_UPDATE_LABEL);
237
238 bool hasDataBack = false;
239
Junxiao Shibbf7ac82016-07-14 14:45:15 +0000240 face.onSendData.connectSingleShot([&] (const Data& data) {
Shock Jiangcde28712014-10-19 21:17:20 -0700241 hasDataBack = true;
242 NDNS_LOG_TRACE("get Data back");
243 BOOST_CHECK_EQUAL(data.getName().getPrefix(-1), q.toInterest().getName());
244 Response resp;
245
Yumin Xia6343c5b2016-10-20 15:45:50 -0700246 BOOST_CHECK_NO_THROW(resp.fromData(zone, data));
Yumin Xiaa484ba72016-11-10 20:40:12 -0800247 BOOST_CHECK_EQUAL(resp.getContentType(), NDNS_RESP); // by default NDNS_BLOB is enough
Shock Jiangcde28712014-10-19 21:17:20 -0700248 BOOST_CHECK_GT(resp.getRrs().size(), 0);
249 Block block = resp.getRrs()[0];
250 block.parse();
251 int ret = -1;
252 BOOST_CHECK_EQUAL(block.type(), ndns::tlv::RrData);
253 Block::element_const_iterator val = block.elements_begin();
254 BOOST_CHECK_EQUAL(val->type(), ndns::tlv::UpdateReturnCode); // the first must be return code
255 ret = readNonNegativeInteger(*val);
256 BOOST_CHECK_EQUAL(ret, 0);
Junxiao Shi8f5be2a2015-01-06 10:06:43 -0700257 });
Shock Jiangcde28712014-10-19 21:17:20 -0700258
Junxiao Shibbf7ac82016-07-14 14:45:15 +0000259 face.receive(q.toInterest());
Shock Jiangcde28712014-10-19 21:17:20 -0700260 run();
261
262 BOOST_CHECK_EQUAL(hasDataBack, true);
263}
264
Shock Jiange1a81fd2014-11-20 20:25:49 -0800265BOOST_AUTO_TEST_CASE(UpdateValidatorCannotFetchCert)
266{
Yumin Xia2c509c22017-02-09 14:37:36 -0800267 Identity zoneIdentity = m_keyChain.createIdentity(TEST_IDENTITY_NAME);
268 Key dsk = m_keyChain.createKey(zoneIdentity);
Shock Jiange1a81fd2014-11-20 20:25:49 -0800269
Yumin Xia2c509c22017-02-09 14:37:36 -0800270 Name dskCertName = dsk.getName();
271 dskCertName
272 .append("CERT")
273 .appendVersion();
274 Certificate dskCert;
275 dskCert.setName(dskCertName);
276 dskCert.setContentType(ndn::tlv::ContentType_Key);
277 dskCert.setFreshnessPeriod(time::hours(1));
278 dskCert.setContent(dsk.getPublicKey().data(), dsk.getPublicKey().size());
279 SignatureInfo info;
280 info.setValidityPeriod(security::ValidityPeriod(time::system_clock::now(),
281 time::system_clock::now() + time::days(365)));
Shock Jiange1a81fd2014-11-20 20:25:49 -0800282
Yumin Xia2c509c22017-02-09 14:37:36 -0800283 m_keyChain.sign(dskCert, security::signingByCertificate(m_cert));
284 m_keyChain.setDefaultCertificate(dsk, dskCert);
285
286 NDNS_LOG_TRACE("KeyChain: add cert: " << dskCert.getName() << ". KeyLocator: "
287 << dskCert.getSignature().getKeyLocator().getName());
288
289 Rrset rrset(&m_test);
290 Name label = dskCert.getName().getPrefix(-2).getSubName(m_test.getName().size() + 1);
Shock Jiange1a81fd2014-11-20 20:25:49 -0800291 rrset.setLabel(label);
292 rrset.setType(label::CERT_RR_TYPE);
Yumin Xia2c509c22017-02-09 14:37:36 -0800293 rrset.setVersion(dskCert.getName().get(-1));
294 rrset.setTtl(m_test.getTtl());
295 rrset.setData(dskCert.wireEncode());
Shock Jiange1a81fd2014-11-20 20:25:49 -0800296 m_session.insert(rrset);
Yumin Xia2c509c22017-02-09 14:37:36 -0800297 NDNS_LOG_TRACE("DB: zone " << m_test << " add a CERT RR with name="
298 << dskCert.getName() << " rrLabel=" << label);
Shock Jiange1a81fd2014-11-20 20:25:49 -0800299
300 Response re;
301 re.setZone(zone);
302 re.setQueryType(label::NDNS_ITERATIVE_QUERY);
303 re.setRrLabel(Name("ndnsim-XYZ")); // insert new records
304 re.setRrType(label::NS_RR_TYPE);
Yumin Xiaa484ba72016-11-10 20:40:12 -0800305 re.setContentType(NDNS_RESP);
Shock Jiange1a81fd2014-11-20 20:25:49 -0800306
307 std::string str = "ns1.ndnsim.net";
Junxiao Shi767f35c2016-07-23 01:54:42 +0000308 re.addRr(makeBinaryBlock(ndns::tlv::RrData, str.c_str(), str.size()));
Shock Jiange1a81fd2014-11-20 20:25:49 -0800309 str = "ns2.ndnsim.net";
Junxiao Shi767f35c2016-07-23 01:54:42 +0000310 re.addRr(makeBinaryBlock(ndns::tlv::RrData, str.c_str(), str.size()));
Shock Jiange1a81fd2014-11-20 20:25:49 -0800311
312 shared_ptr<Data> data = re.toData();
Yumin Xia2c509c22017-02-09 14:37:36 -0800313 m_keyChain.sign(*data, security::signingByCertificate(dskCert));
Shock Jiange1a81fd2014-11-20 20:25:49 -0800314
Yumin Xia6343c5b2016-10-20 15:45:50 -0700315 Query q(Name(zone), ndns::label::NDNS_ITERATIVE_QUERY);
Shock Jiange1a81fd2014-11-20 20:25:49 -0800316 const Block& block = data->wireEncode();
317 Name name;
318 name.append(block);
319
320 q.setRrLabel(name);
321 q.setRrType(label::NDNS_UPDATE_LABEL);
322
323 bool hasDataBack = false;
324
325 // no data back, since the Update cannot pass verification
Junxiao Shibbf7ac82016-07-14 14:45:15 +0000326 face.onSendData.connectSingleShot([&] (const Data& data) {
Shock Jiange1a81fd2014-11-20 20:25:49 -0800327 hasDataBack = true;
328 BOOST_FAIL("UNEXPECTED");
Junxiao Shi8f5be2a2015-01-06 10:06:43 -0700329 });
Shock Jiange1a81fd2014-11-20 20:25:49 -0800330
Junxiao Shibbf7ac82016-07-14 14:45:15 +0000331 face.receive(q.toInterest());
Shock Jiange1a81fd2014-11-20 20:25:49 -0800332 run();
333
334 BOOST_CHECK_EQUAL(hasDataBack, false);
335}
336
337class NameServerFixture2 : public DbTestData
338{
339public:
340 NameServerFixture2()
Junxiao Shibbf7ac82016-07-14 14:45:15 +0000341 : face(io, m_keyChain, {false, true})
342 , validatorFace(io, m_keyChain, {false, true})
Yumin Xia2c509c22017-02-09 14:37:36 -0800343 , zone(m_test.getName())
344 , validator(NdnsValidatorBuilder::create(validatorFace)) // different face for validator
345 , server(zone, m_certName, face, m_session, m_keyChain, *validator)
Shock Jiange1a81fd2014-11-20 20:25:49 -0800346 {
347 // ensure prefix is registered
348 run();
Alexander Afanasyeva81266c2015-05-10 20:18:57 -0700349
Junxiao Shibbf7ac82016-07-14 14:45:15 +0000350 validatorFace.onSendInterest.connect([this] (const Interest& interest) {
Shock Jiange1a81fd2014-11-20 20:25:49 -0800351 NDNS_LOG_TRACE("validatorFace get Interest: " << interest.getName());
Alexander Afanasyeva81266c2015-05-10 20:18:57 -0700352
353 shared_ptr<const Interest> i = interest.shared_from_this();
354 io.post([i, this] {
Junxiao Shibbf7ac82016-07-14 14:45:15 +0000355 face.receive(*i);
Alexander Afanasyeva81266c2015-05-10 20:18:57 -0700356 });
Junxiao Shi8f5be2a2015-01-06 10:06:43 -0700357 });
Shock Jiange1a81fd2014-11-20 20:25:49 -0800358 }
359
360 void
361 run()
362 {
363 io.poll();
364 io.reset();
365 }
366
367public:
368 boost::asio::io_service io;
Junxiao Shibbf7ac82016-07-14 14:45:15 +0000369 ndn::util::DummyClientFace face;
370 ndn::util::DummyClientFace validatorFace;
Shock Jiange1a81fd2014-11-20 20:25:49 -0800371 const Name& zone;
Yumin Xia2c509c22017-02-09 14:37:36 -0800372 unique_ptr<security::v2::Validator> validator;
Shock Jiange1a81fd2014-11-20 20:25:49 -0800373 ndns::NameServer server;
374};
375
376BOOST_FIXTURE_TEST_CASE(UpdateValidatorFetchCert, NameServerFixture2)
377{
Shock Jiange1a81fd2014-11-20 20:25:49 -0800378 Response re;
379 re.setZone(zone);
380 re.setQueryType(label::NDNS_ITERATIVE_QUERY);
381 re.setRrLabel(Name("ndnsim-XYZ")); // insert new records
382 re.setRrType(label::NS_RR_TYPE);
Yumin Xiaa484ba72016-11-10 20:40:12 -0800383 re.setContentType(NDNS_RESP);
Shock Jiange1a81fd2014-11-20 20:25:49 -0800384
385 std::string str = "ns1.ndnsim.net";
Junxiao Shi767f35c2016-07-23 01:54:42 +0000386 re.addRr(makeBinaryBlock(ndns::tlv::RrData, str.c_str(), str.size()));
Shock Jiange1a81fd2014-11-20 20:25:49 -0800387 str = "ns2.ndnsim.net";
Junxiao Shi767f35c2016-07-23 01:54:42 +0000388 re.addRr(makeBinaryBlock(ndns::tlv::RrData, str.c_str(), str.size()));
Shock Jiange1a81fd2014-11-20 20:25:49 -0800389
390 shared_ptr<Data> data = re.toData();
Yumin Xia2c509c22017-02-09 14:37:36 -0800391 m_keyChain.sign(*data, security::signingByCertificate(m_cert));
Shock Jiange1a81fd2014-11-20 20:25:49 -0800392
Yumin Xia6343c5b2016-10-20 15:45:50 -0700393 Query q(Name(zone), ndns::label::NDNS_ITERATIVE_QUERY);
Shock Jiange1a81fd2014-11-20 20:25:49 -0800394 const Block& block = data->wireEncode();
395 Name name;
396 name.append(block);
397
398 q.setRrLabel(name);
399 q.setRrType(label::NDNS_UPDATE_LABEL);
400
401 bool hasDataBack = false;
402
Yumin Xia2c509c22017-02-09 14:37:36 -0800403 shared_ptr<Regex> regex = make_shared<Regex>("(<>*)<NDNS><KEY>(<>+)<CERT><>");
Junxiao Shibbf7ac82016-07-14 14:45:15 +0000404 face.onSendData.connect([&] (const Data& data) {
Shock Jiange1a81fd2014-11-20 20:25:49 -0800405 if (regex->match(data.getName())) {
Alexander Afanasyeva81266c2015-05-10 20:18:57 -0700406 shared_ptr<const Data> d = data.shared_from_this();
407 io.post([d, this] {
Junxiao Shibbf7ac82016-07-14 14:45:15 +0000408 validatorFace.receive(*d); // It's data requested by validator
Alexander Afanasyeva81266c2015-05-10 20:18:57 -0700409 });
Shock Jiange1a81fd2014-11-20 20:25:49 -0800410 }
411 else {
412 // cert is requested by validator
413 hasDataBack = true;
414 NDNS_LOG_TRACE("get Data back");
415 BOOST_CHECK_EQUAL(data.getName().getPrefix(-1), q.toInterest().getName());
416 Response resp;
417
Yumin Xia6343c5b2016-10-20 15:45:50 -0700418 BOOST_CHECK_NO_THROW(resp.fromData(zone, data));
Yumin Xiaa484ba72016-11-10 20:40:12 -0800419 BOOST_CHECK_EQUAL(resp.getContentType(), NDNS_RESP); // by default NDNS_BLOB is enough
Shock Jiange1a81fd2014-11-20 20:25:49 -0800420 BOOST_CHECK_GT(resp.getRrs().size(), 0);
421 Block block = resp.getRrs()[0];
422 block.parse();
423 int ret = -1;
424 BOOST_CHECK_EQUAL(block.type(), ndns::tlv::RrData);
425 Block::element_const_iterator val = block.elements_begin();
426 BOOST_CHECK_EQUAL(val->type(), ndns::tlv::UpdateReturnCode); // the first must be return code
427 ret = readNonNegativeInteger(*val);
428 BOOST_CHECK_EQUAL(ret, 0);
429 }
Junxiao Shi8f5be2a2015-01-06 10:06:43 -0700430 });
Shock Jiange1a81fd2014-11-20 20:25:49 -0800431
Junxiao Shibbf7ac82016-07-14 14:45:15 +0000432 face.receive(q.toInterest());
Shock Jiange1a81fd2014-11-20 20:25:49 -0800433 run();
434
435 BOOST_CHECK_EQUAL(hasDataBack, true);
436}
437
Shock Jiangcde28712014-10-19 21:17:20 -0700438BOOST_AUTO_TEST_SUITE_END()
439
440} // namespace tests
441} // namespace ndns
442} // namespace ndn