blob: 9951e5c4b472478b7f616afc4800750b0e597fd6 [file] [log] [blame]
Zhuo Lib3558892016-08-12 15:51:12 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Junxiao Shib54aabd2018-04-16 19:36:24 +00002/*
Davide Pesavento66777622020-10-09 18:46:03 -04003 * Copyright (c) 2014-2020, Arizona Board of Regents.
Zhuo Lib3558892016-08-12 15:51:12 -07004 *
5 * This file is part of ndn-tools (Named Data Networking Essential Tools).
6 * See AUTHORS.md for complete list of ndn-tools authors and contributors.
7 *
8 * ndn-tools 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 * ndn-tools 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 * ndn-tools, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20#include "tools/peek/ndnpeek/ndnpeek.hpp"
21
22#include "tests/test-common.hpp"
Davide Pesavento66777622020-10-09 18:46:03 -040023#include "tests/io-fixture.hpp"
Davide Pesaventobf28cd72017-08-13 17:22:47 -040024
Zhuo Lib3558892016-08-12 15:51:12 -070025#include <ndn-cxx/util/dummy-client-face.hpp>
26
27#include <boost/mpl/vector.hpp>
Davide Pesaventoa8600b02019-12-22 18:52:36 -050028#if BOOST_VERSION >= 105900
29#include <boost/test/tools/output_test_stream.hpp>
30#else
31#include <boost/test/output_test_stream.hpp>
32#endif
Zhuo Lib3558892016-08-12 15:51:12 -070033
34namespace ndn {
35namespace peek {
36namespace tests {
37
38using namespace ndn::tests;
39using boost::test_tools::output_test_stream;
40
41class CoutRedirector : noncopyable
42{
43public:
44 explicit
45 CoutRedirector(std::ostream& destination)
46 {
47 m_originalBuf = std::cout.rdbuf(destination.rdbuf());
48 }
49
50 ~CoutRedirector()
51 {
52 std::cout.rdbuf(m_originalBuf);
53 }
54
55private:
56 std::streambuf* m_originalBuf;
57};
58
Davide Pesavento96028232019-08-17 01:26:13 -040059static PeekOptions
60makeDefaultOptions()
61{
62 PeekOptions opt;
63 opt.name = "/peek/test";
64 return opt;
65}
66
Davide Pesavento66777622020-10-09 18:46:03 -040067class NdnPeekFixture : public IoFixture
Zhuo Lib3558892016-08-12 15:51:12 -070068{
69protected:
Zhuo Lib3558892016-08-12 15:51:12 -070070 void
Davide Pesavento96028232019-08-17 01:26:13 -040071 initialize(const PeekOptions& opts = makeDefaultOptions())
Zhuo Lib3558892016-08-12 15:51:12 -070072 {
73 peek = make_unique<NdnPeek>(face, opts);
74 }
75
76protected:
Davide Pesavento66777622020-10-09 18:46:03 -040077 ndn::util::DummyClientFace face{m_io};
Zhuo Lib3558892016-08-12 15:51:12 -070078 output_test_stream output;
79 unique_ptr<NdnPeek> peek;
80};
81
Zhuo Lib3558892016-08-12 15:51:12 -070082class OutputFull
83{
84public:
85 static PeekOptions
86 makeOptions()
87 {
88 return makeDefaultOptions();
89 }
90
91 static void
92 checkOutput(output_test_stream& output, const Data& data)
93 {
94 const Block& block = data.wireEncode();
95 std::string expected(reinterpret_cast<const char*>(block.wire()), block.size());
96 BOOST_CHECK(output.is_equal(expected));
97 }
98
99 static void
100 checkOutput(output_test_stream& output, const lp::Nack& nack)
101 {
102 const Block& block = nack.getHeader().wireEncode();
103 std::string expected(reinterpret_cast<const char*>(block.wire()), block.size());
104 BOOST_CHECK(output.is_equal(expected));
105 }
106};
107
108class OutputPayloadOnly
109{
110public:
111 static PeekOptions
112 makeOptions()
113 {
114 PeekOptions opt = makeDefaultOptions();
115 opt.wantPayloadOnly = true;
116 return opt;
117 }
118
119 static void
120 checkOutput(output_test_stream& output, const Data& data)
121 {
122 const Block& block = data.getContent();
123 std::string expected(reinterpret_cast<const char*>(block.value()), block.value_size());
124 BOOST_CHECK(output.is_equal(expected));
125 }
126
127 static void
128 checkOutput(output_test_stream& output, const lp::Nack& nack)
129 {
130 std::string expected = boost::lexical_cast<std::string>(nack.getReason()) + '\n';
131 BOOST_CHECK(output.is_equal(expected));
132 }
133};
134
135BOOST_AUTO_TEST_SUITE(Peek)
136BOOST_FIXTURE_TEST_SUITE(TestNdnPeek, NdnPeekFixture)
137
138using OutputChecks = boost::mpl::vector<OutputFull, OutputPayloadOnly>;
139
140BOOST_AUTO_TEST_CASE_TEMPLATE(Default, OutputCheck, OutputChecks)
141{
142 auto options = OutputCheck::makeOptions();
143 initialize(options);
144
Junxiao Shib54aabd2018-04-16 19:36:24 +0000145 auto data = makeData(options.name);
Davide Pesavento65d11552019-06-09 19:15:50 -0400146 const std::string payload = "NdnPeekTest";
Zhuo Lib3558892016-08-12 15:51:12 -0700147 data->setContent(reinterpret_cast<const uint8_t*>(payload.data()), payload.size());
148
149 {
150 CoutRedirector redir(output);
151 peek->start();
Davide Pesavento66777622020-10-09 18:46:03 -0400152 this->advanceClocks(25_ms, 4);
Zhuo Lib3558892016-08-12 15:51:12 -0700153 face.receive(*data);
154 }
155
156 OutputCheck::checkOutput(output, *data);
157 BOOST_REQUIRE_EQUAL(face.sentInterests.size(), 1);
Junxiao Shib54aabd2018-04-16 19:36:24 +0000158 BOOST_CHECK_EQUAL(face.sentInterests.back().getCanBePrefix(), false);
Zhuo Lib3558892016-08-12 15:51:12 -0700159 BOOST_CHECK_EQUAL(face.sentInterests.back().getMustBeFresh(), false);
Davide Pesavento65d11552019-06-09 19:15:50 -0400160 BOOST_CHECK_EQUAL(face.sentInterests.back().getForwardingHint().empty(), true);
Junxiao Shib54aabd2018-04-16 19:36:24 +0000161 BOOST_CHECK_EQUAL(face.sentInterests.back().getInterestLifetime(), DEFAULT_INTEREST_LIFETIME);
Davide Pesaventoc214e072019-08-17 01:33:28 -0400162 BOOST_CHECK(face.sentInterests.back().getHopLimit() == nullopt);
163 BOOST_CHECK(!face.sentInterests.back().hasApplicationParameters());
Davide Pesavento87434be2019-07-25 19:04:23 -0400164 BOOST_CHECK(peek->getResult() == NdnPeek::Result::DATA);
Zhuo Lib3558892016-08-12 15:51:12 -0700165}
166
Junxiao Shib54aabd2018-04-16 19:36:24 +0000167BOOST_AUTO_TEST_CASE_TEMPLATE(NonDefault, OutputCheck, OutputChecks)
Zhuo Lib3558892016-08-12 15:51:12 -0700168{
169 auto options = OutputCheck::makeOptions();
Junxiao Shib54aabd2018-04-16 19:36:24 +0000170 options.canBePrefix = true;
Zhuo Lib3558892016-08-12 15:51:12 -0700171 options.mustBeFresh = true;
Junxiao Shib54aabd2018-04-16 19:36:24 +0000172 options.interestLifetime = 200_ms;
Davide Pesaventoc214e072019-08-17 01:33:28 -0400173 options.hopLimit = 64;
Zhuo Lib3558892016-08-12 15:51:12 -0700174 initialize(options);
175
Junxiao Shib54aabd2018-04-16 19:36:24 +0000176 auto data = makeData(Name(options.name).append("suffix"));
Junxiao Shi96192952019-05-22 15:45:12 +0000177 data->setFreshnessPeriod(1_s);
Davide Pesavento65d11552019-06-09 19:15:50 -0400178 const std::string payload = "NdnPeekTest";
Zhuo Lib3558892016-08-12 15:51:12 -0700179 data->setContent(reinterpret_cast<const uint8_t*>(payload.data()), payload.size());
180
181 {
182 CoutRedirector redir(output);
183 peek->start();
Davide Pesavento66777622020-10-09 18:46:03 -0400184 this->advanceClocks(25_ms, 4);
Zhuo Lib3558892016-08-12 15:51:12 -0700185 face.receive(*data);
186 }
187
188 OutputCheck::checkOutput(output, *data);
189 BOOST_REQUIRE_EQUAL(face.sentInterests.size(), 1);
Junxiao Shib54aabd2018-04-16 19:36:24 +0000190 BOOST_CHECK_EQUAL(face.sentInterests.back().getCanBePrefix(), true);
Zhuo Lib3558892016-08-12 15:51:12 -0700191 BOOST_CHECK_EQUAL(face.sentInterests.back().getMustBeFresh(), true);
Davide Pesavento65d11552019-06-09 19:15:50 -0400192 BOOST_CHECK_EQUAL(face.sentInterests.back().getForwardingHint().empty(), true);
Junxiao Shib54aabd2018-04-16 19:36:24 +0000193 BOOST_CHECK_EQUAL(face.sentInterests.back().getInterestLifetime(), 200_ms);
Davide Pesaventoc214e072019-08-17 01:33:28 -0400194 BOOST_CHECK(face.sentInterests.back().getHopLimit() == 64);
195 BOOST_CHECK(!face.sentInterests.back().hasApplicationParameters());
Davide Pesavento87434be2019-07-25 19:04:23 -0400196 BOOST_CHECK(peek->getResult() == NdnPeek::Result::DATA);
Zhuo Lib3558892016-08-12 15:51:12 -0700197}
198
199BOOST_AUTO_TEST_CASE_TEMPLATE(ReceiveNackWithReason, OutputCheck, OutputChecks)
200{
201 auto options = OutputCheck::makeOptions();
202 initialize(options);
203 lp::Nack nack;
204
205 {
206 CoutRedirector redir(output);
207 peek->start();
Davide Pesavento66777622020-10-09 18:46:03 -0400208 this->advanceClocks(25_ms, 4);
Zhuo Lib3558892016-08-12 15:51:12 -0700209 nack = makeNack(face.sentInterests.at(0), lp::NackReason::NO_ROUTE);
210 face.receive(nack);
211 }
212
213 OutputCheck::checkOutput(output, nack);
214 BOOST_CHECK_EQUAL(face.sentInterests.size(), 1);
Davide Pesavento87434be2019-07-25 19:04:23 -0400215 BOOST_CHECK(peek->getResult() == NdnPeek::Result::NACK);
Zhuo Lib3558892016-08-12 15:51:12 -0700216}
217
218BOOST_AUTO_TEST_CASE_TEMPLATE(ReceiveNackWithoutReason, OutputCheck, OutputChecks)
219{
220 auto options = OutputCheck::makeOptions();
221 initialize(options);
222 lp::Nack nack;
223
224 {
225 CoutRedirector redir(output);
226 peek->start();
Davide Pesavento66777622020-10-09 18:46:03 -0400227 this->advanceClocks(25_ms, 4);
Zhuo Lib3558892016-08-12 15:51:12 -0700228 nack = makeNack(face.sentInterests.at(0), lp::NackReason::NONE);
229 face.receive(nack);
230 }
231
232 OutputCheck::checkOutput(output, nack);
233 BOOST_CHECK_EQUAL(face.sentInterests.size(), 1);
Davide Pesavento87434be2019-07-25 19:04:23 -0400234 BOOST_CHECK(peek->getResult() == NdnPeek::Result::NACK);
Zhuo Lib3558892016-08-12 15:51:12 -0700235}
236
Davide Pesavento96028232019-08-17 01:26:13 -0400237BOOST_AUTO_TEST_CASE(ApplicationParameters)
238{
239 auto options = makeDefaultOptions();
240 options.applicationParameters = make_shared<Buffer>("hello", 5);
241 initialize(options);
242
243 peek->start();
Davide Pesavento66777622020-10-09 18:46:03 -0400244 this->advanceClocks(25_ms, 4);
Davide Pesavento96028232019-08-17 01:26:13 -0400245
246 BOOST_REQUIRE_EQUAL(face.sentInterests.size(), 1);
247 BOOST_CHECK_EQUAL(face.sentInterests.back().getCanBePrefix(), false);
248 BOOST_CHECK_EQUAL(face.sentInterests.back().getMustBeFresh(), false);
249 BOOST_CHECK_EQUAL(face.sentInterests.back().getForwardingHint().empty(), true);
250 BOOST_CHECK_EQUAL(face.sentInterests.back().getInterestLifetime(), DEFAULT_INTEREST_LIFETIME);
251 BOOST_CHECK_EQUAL(face.sentInterests.back().hasApplicationParameters(), true);
252 BOOST_CHECK_EQUAL(face.sentInterests.back().getApplicationParameters(), "2405 68656C6C6F"_block);
253}
254
Davide Pesavento65d11552019-06-09 19:15:50 -0400255BOOST_AUTO_TEST_CASE(NoTimeout)
Zhuo Lib3558892016-08-12 15:51:12 -0700256{
257 auto options = makeDefaultOptions();
Davide Pesavento65d11552019-06-09 19:15:50 -0400258 options.interestLifetime = 1_s;
259 options.timeout = nullopt;
Zhuo Lib3558892016-08-12 15:51:12 -0700260 initialize(options);
261
Davide Pesavento65d11552019-06-09 19:15:50 -0400262 BOOST_CHECK_EQUAL(face.sentInterests.size(), 0);
Zhuo Lib3558892016-08-12 15:51:12 -0700263
264 peek->start();
Davide Pesavento66777622020-10-09 18:46:03 -0400265 this->advanceClocks(100_ms, 9);
Zhuo Lib3558892016-08-12 15:51:12 -0700266 BOOST_CHECK_EQUAL(face.sentInterests.size(), 1);
Davide Pesavento65d11552019-06-09 19:15:50 -0400267 BOOST_CHECK_EQUAL(face.getNPendingInterests(), 1);
Davide Pesavento87434be2019-07-25 19:04:23 -0400268 BOOST_CHECK(peek->getResult() == NdnPeek::Result::UNKNOWN);
Davide Pesavento65d11552019-06-09 19:15:50 -0400269
Davide Pesavento66777622020-10-09 18:46:03 -0400270 this->advanceClocks(100_ms, 2);
Davide Pesavento65d11552019-06-09 19:15:50 -0400271 BOOST_CHECK_EQUAL(face.sentInterests.size(), 1);
272 BOOST_CHECK_EQUAL(face.getNPendingInterests(), 0);
Davide Pesavento87434be2019-07-25 19:04:23 -0400273 BOOST_CHECK(peek->getResult() == NdnPeek::Result::TIMEOUT);
Zhuo Lib3558892016-08-12 15:51:12 -0700274}
275
276BOOST_AUTO_TEST_CASE(TimeoutLessThanLifetime)
277{
278 auto options = makeDefaultOptions();
Junxiao Shib54aabd2018-04-16 19:36:24 +0000279 options.interestLifetime = 200_ms;
280 options.timeout = 100_ms;
Zhuo Lib3558892016-08-12 15:51:12 -0700281 initialize(options);
282
Davide Pesavento65d11552019-06-09 19:15:50 -0400283 BOOST_CHECK_EQUAL(face.sentInterests.size(), 0);
Zhuo Lib3558892016-08-12 15:51:12 -0700284
285 peek->start();
Davide Pesavento66777622020-10-09 18:46:03 -0400286 this->advanceClocks(25_ms, 6);
Zhuo Lib3558892016-08-12 15:51:12 -0700287
288 BOOST_CHECK_EQUAL(face.sentInterests.size(), 1);
Davide Pesavento65d11552019-06-09 19:15:50 -0400289 BOOST_CHECK_EQUAL(face.getNPendingInterests(), 0);
Davide Pesavento87434be2019-07-25 19:04:23 -0400290 BOOST_CHECK(peek->getResult() == NdnPeek::Result::TIMEOUT);
Zhuo Lib3558892016-08-12 15:51:12 -0700291}
292
293BOOST_AUTO_TEST_CASE(TimeoutGreaterThanLifetime)
294{
295 auto options = makeDefaultOptions();
Junxiao Shib54aabd2018-04-16 19:36:24 +0000296 options.interestLifetime = 50_ms;
297 options.timeout = 200_ms;
Zhuo Lib3558892016-08-12 15:51:12 -0700298 initialize(options);
299
Davide Pesavento65d11552019-06-09 19:15:50 -0400300 BOOST_CHECK_EQUAL(face.sentInterests.size(), 0);
Zhuo Lib3558892016-08-12 15:51:12 -0700301
302 peek->start();
Davide Pesavento66777622020-10-09 18:46:03 -0400303 this->advanceClocks(25_ms, 4);
Zhuo Lib3558892016-08-12 15:51:12 -0700304
305 BOOST_CHECK_EQUAL(face.sentInterests.size(), 1);
Davide Pesavento65d11552019-06-09 19:15:50 -0400306 BOOST_CHECK_EQUAL(face.getNPendingInterests(), 0);
Davide Pesavento87434be2019-07-25 19:04:23 -0400307 BOOST_CHECK(peek->getResult() == NdnPeek::Result::TIMEOUT);
Zhuo Lib3558892016-08-12 15:51:12 -0700308}
309
Davide Pesavento96028232019-08-17 01:26:13 -0400310BOOST_AUTO_TEST_CASE(OversizedPacket)
311{
312 auto options = makeDefaultOptions();
313 options.applicationParameters = make_shared<Buffer>(MAX_NDN_PACKET_SIZE);
314 initialize(options);
315
316 peek->start();
Davide Pesavento66777622020-10-09 18:46:03 -0400317 BOOST_CHECK_THROW(this->advanceClocks(1_ms, 10), Face::OversizedPacketError);
Davide Pesavento96028232019-08-17 01:26:13 -0400318
319 BOOST_CHECK_EQUAL(face.sentInterests.size(), 0);
320}
321
Zhuo Lib3558892016-08-12 15:51:12 -0700322BOOST_AUTO_TEST_SUITE_END() // TestNdnPeek
323BOOST_AUTO_TEST_SUITE_END() // Peek
324
325} // namespace tests
326} // namespace peek
327} // namespace ndn