blob: 0b397cf13a5f93f656154852f280bf03b982139e [file] [log] [blame]
Alexander Afanasyevc169a812014-05-20 20:37:29 -04001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -08002/**
Alexander Afanasyevc169a812014-05-20 20:37:29 -04003 * Copyright (c) 2013-2014 Regents of the University of California.
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -07004 *
5 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -07006 *
Alexander Afanasyevc169a812014-05-20 20:37:29 -04007 * ndn-cxx library is free software: you can redistribute it and/or modify it under the
8 * terms of the GNU Lesser General Public License as published by the Free Software
9 * Foundation, either version 3 of the License, or (at your option) any later version.
10 *
11 * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13 * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
14 *
15 * You should have received copies of the GNU General Public License and GNU Lesser
16 * General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
17 * <http://www.gnu.org/licenses/>.
18 *
19 * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080020 */
21
Alexander Afanasyev09c613f2014-01-29 00:23:58 -080022#include "interest.hpp"
Junxiao Shiaf8eeea2014-03-31 20:10:56 -070023#include "data.hpp"
24#include "security/signature-sha256-with-rsa.hpp"
Yingdi Yubf6a2812014-06-17 15:32:11 -070025#include "security/digest-sha256.hpp"
Alexander Afanasyev258ec2b2014-05-14 16:15:37 -070026#include "encoding/buffer-stream.hpp"
Junxiao Shiaf8eeea2014-03-31 20:10:56 -070027
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070028#include "boost-test.hpp"
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080029
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -080030namespace ndn {
Alexander Afanasyev90164962014-03-06 08:29:59 +000031namespace tests {
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080032
33BOOST_AUTO_TEST_SUITE(TestInterest)
34
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -070035BOOST_CONCEPT_ASSERT((boost::EqualityComparable<Interest>));
36BOOST_CONCEPT_ASSERT((boost::EqualityComparable<Selectors>));
37
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080038const uint8_t Interest1[] = {
Alexander Afanasyeve881e932014-06-08 14:47:03 +030039 0x05, 0x5c, // NDN Interest
Alexander Afanasyev4b456282014-02-13 00:34:34 -080040 0x07, 0x14, // Name
41 0x08, 0x5, // NameComponent
Alexander Afanasyev636e9f12014-01-07 12:01:03 -080042 0x6c, 0x6f, 0x63, 0x61, 0x6c,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080043 0x08, 0x3, // NameComponent
Alexander Afanasyev636e9f12014-01-07 12:01:03 -080044 0x6e, 0x64, 0x6e,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080045 0x08, 0x6, // NameComponent
Alexander Afanasyev636e9f12014-01-07 12:01:03 -080046 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
Junxiao Shib332e782014-03-31 14:23:46 -070047 0x09, 0x37, // Selectors
Alexander Afanasyev4b456282014-02-13 00:34:34 -080048 0x0d, 0x1, 0x1, // MinSuffix
49 0x0e, 0x1, 0x1, // MaxSuffix
Junxiao Shib332e782014-03-31 14:23:46 -070050 0x1c, 0x16, // KeyLocator
51 0x07, 0x14, // Name
52 0x08, 0x04,
53 0x74, 0x65, 0x73, 0x74,
54 0x08, 0x03,
55 0x6b, 0x65, 0x79,
56 0x08, 0x07,
57 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080058 0x10, 0x14, // Exclude
59 0x08, 0x4, // NameComponent
Alexander Afanasyev636e9f12014-01-07 12:01:03 -080060 0x61, 0x6c, 0x65, 0x78,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080061 0x08, 0x4, // NameComponent
Alexander Afanasyev636e9f12014-01-07 12:01:03 -080062 0x78, 0x78, 0x78, 0x78,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080063 0x13, 0x0, // Any
64 0x08, 0x4, // NameComponent
Alexander Afanasyev636e9f12014-01-07 12:01:03 -080065 0x79, 0x79, 0x79, 0x79,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080066 0x11, 0x1, // ChildSelector
Alexander Afanasyev636e9f12014-01-07 12:01:03 -080067 0x1,
Alexander Afanasyeve881e932014-06-08 14:47:03 +030068 0x0a, 0x4, // Nonce
69 0x1, 0x0, 0x0, 0x00,
70 0x0b, 0x1, // Scope
Alexander Afanasyev636e9f12014-01-07 12:01:03 -080071 0x1,
Alexander Afanasyeve881e932014-06-08 14:47:03 +030072 0x0c, // InterestLifetime
73 0x2, 0x3, 0xe8
74};
75
76const uint8_t Interest2[] = {
77 0x05, 0x5c, // NDN Interest
78 0x07, 0x14, // Name
79 0x08, 0x5, // NameComponent
80 0x6c, 0x6f, 0x63, 0x61, 0x6c,
81 0x08, 0x3, // NameComponent
82 0x6e, 0x64, 0x6e,
83 0x08, 0x6, // NameComponent
84 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
85 0x09, 0x37, // Selectors
86 0x0d, 0x1, 0x1, // MinSuffix
87 0x0e, 0x1, 0x1, // MaxSuffix
88 0x1c, 0x16, // KeyLocator
89 0x07, 0x14, // Name
90 0x08, 0x04,
91 0x74, 0x65, 0x73, 0x74,
92 0x08, 0x03,
93 0x6b, 0x65, 0x79,
94 0x08, 0x07,
95 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,
96 0x10, 0x14, // Exclude
97 0x08, 0x4, // NameComponent
98 0x61, 0x6c, 0x65, 0x78,
99 0x08, 0x4, // NameComponent
100 0x78, 0x78, 0x78, 0x78,
101 0x13, 0x0, // Any
102 0x08, 0x4, // NameComponent
103 0x79, 0x79, 0x79, 0x79,
104 0x11, 0x1, // ChildSelector
105 0x1,
106 0x0a, 0x4, // Nonce
107 0x2, 0x0, 0x0, 0x00,
Alexander Afanasyev4b456282014-02-13 00:34:34 -0800108 0x0b, 0x1, // Scope
Alexander Afanasyev636e9f12014-01-07 12:01:03 -0800109 0x1,
Alexander Afanasyev4b456282014-02-13 00:34:34 -0800110 0x0c, // InterestLifetime
Alexander Afanasyev636e9f12014-01-07 12:01:03 -0800111 0x2, 0x3, 0xe8
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800112};
113
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800114const uint8_t InterestWithLocalControlHeader[] = {
Alexander Afanasyeve881e932014-06-08 14:47:03 +0300115 0x50, 0x25, 0x51, 0x01, 0x0a,
116 0x05, 0x20, 0x07, 0x14, 0x08, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x08, 0x03, 0x6e, 0x64,
117 0x6e, 0x08, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x09, 0x02, 0x12, 0x00, 0x0a, 0x04,
118 0x01, 0x00, 0x00, 0x00
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800119};
120
121const uint8_t InterestWithoutLocalControlHeader[] = {
Alexander Afanasyeve881e932014-06-08 14:47:03 +0300122 0x05, 0x20, 0x07, 0x14, 0x08, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x08, 0x03, 0x6e, 0x64,
123 0x6e, 0x08, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x09, 0x02, 0x12, 0x00, 0x0a, 0x04,
124 0x01, 0x00, 0x00, 0x00
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800125};
126
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700127BOOST_AUTO_TEST_CASE(InterestEqualityChecks)
128{
129 // Interest ::= INTEREST-TYPE TLV-LENGTH
130 // Name
131 // Selectors?
132 // Nonce
133 // Scope?
134 // InterestLifetime?
135
136 Interest a;
137 Interest b;
138
139 // if nonce is not set, it will be set to a random value
140 a.setNonce(1);
141 b.setNonce(1);
142
143 BOOST_CHECK_EQUAL(a == b, true);
144 BOOST_CHECK_EQUAL(a != b, false);
145
146 // check comparison on Name
147 a.setName("ndn:/A");
148 BOOST_CHECK_EQUAL(a == b, false);
149 BOOST_CHECK_EQUAL(a != b, true);
150
151 b.setName("ndn:/B");
152 BOOST_CHECK_EQUAL(a == b, false);
153 BOOST_CHECK_EQUAL(a != b, true);
154
155 b.setName("ndn:/A");
156 BOOST_CHECK_EQUAL(a == b, true);
157 BOOST_CHECK_EQUAL(a != b, false);
158
159 // check comparison on Selectors
160 a.setChildSelector(1);
161 BOOST_CHECK_EQUAL(a == b, false);
162 BOOST_CHECK_EQUAL(a != b, true);
163
164 b.setChildSelector(1);
165 BOOST_CHECK_EQUAL(a == b, true);
166 BOOST_CHECK_EQUAL(a != b, false);
167
168 // check comparison on Nonce
169 a.setNonce(100);
170 BOOST_CHECK_EQUAL(a == b, false);
171 BOOST_CHECK_EQUAL(a != b, true);
172
173 b.setNonce(100);
174 BOOST_CHECK_EQUAL(a == b, true);
175 BOOST_CHECK_EQUAL(a != b, false);
176
177 // check comparison on Nonce
178 a.setScope(1);
179 BOOST_CHECK_EQUAL(a == b, false);
180 BOOST_CHECK_EQUAL(a != b, true);
181
182 b.setScope(1);
183 BOOST_CHECK_EQUAL(a == b, true);
184 BOOST_CHECK_EQUAL(a != b, false);
185
186 // check comparison on InterestLifetime
187 a.setInterestLifetime(time::seconds(10));
188 BOOST_CHECK_EQUAL(a == b, false);
189 BOOST_CHECK_EQUAL(a != b, true);
190
191 b.setInterestLifetime(time::seconds(10));
192 BOOST_CHECK_EQUAL(a == b, true);
193 BOOST_CHECK_EQUAL(a != b, false);
194}
195
196BOOST_AUTO_TEST_CASE(SelectorsEqualityChecks)
197{
198 // Selectors ::= SELECTORS-TYPE TLV-LENGTH
199 // MinSuffixComponents?
200 // MaxSuffixComponents?
201 // PublisherPublicKeyLocator?
202 // Exclude?
203 // ChildSelector?
204 // MustBeFresh?
205
206 Selectors a;
207 Selectors b;
208 BOOST_CHECK_EQUAL(a == b, true);
209 BOOST_CHECK_EQUAL(a != b, false);
210
211 // MinSuffixComponents
212 a.setMinSuffixComponents(1);
213 BOOST_CHECK_EQUAL(a == b, false);
214 BOOST_CHECK_EQUAL(a != b, true);
215
216 b.setMinSuffixComponents(2);
217 BOOST_CHECK_EQUAL(a == b, false);
218 BOOST_CHECK_EQUAL(a != b, true);
219
220 b.setMinSuffixComponents(1);
221 BOOST_CHECK_EQUAL(a == b, true);
222 BOOST_CHECK_EQUAL(a != b, false);
223
224 // MaxSuffixComponents
225 a.setMaxSuffixComponents(10);
226 BOOST_CHECK_EQUAL(a == b, false);
227 BOOST_CHECK_EQUAL(a != b, true);
228
229 b.setMaxSuffixComponents(10);
230 BOOST_CHECK_EQUAL(a == b, true);
231 BOOST_CHECK_EQUAL(a != b, false);
232
233 // PublisherPublicKeyLocator
234 a.setPublisherPublicKeyLocator(KeyLocator("/key/Locator/name"));
235 BOOST_CHECK_EQUAL(a == b, false);
236 BOOST_CHECK_EQUAL(a != b, true);
237
238 b.setPublisherPublicKeyLocator(KeyLocator("/key/Locator/name"));
239 BOOST_CHECK_EQUAL(a == b, true);
240 BOOST_CHECK_EQUAL(a != b, false);
241
242 // Exclude
243 a.setExclude(Exclude().excludeOne(name::Component("exclude")));
244 BOOST_CHECK_EQUAL(a == b, false);
245 BOOST_CHECK_EQUAL(a != b, true);
246
247 b.setExclude(Exclude().excludeOne(name::Component("exclude")));
248 BOOST_CHECK_EQUAL(a == b, true);
249 BOOST_CHECK_EQUAL(a != b, false);
250
251 // ChildSelector
252 a.setChildSelector(1);
253 BOOST_CHECK_EQUAL(a == b, false);
254 BOOST_CHECK_EQUAL(a != b, true);
255
256 b.setChildSelector(1);
257 BOOST_CHECK_EQUAL(a == b, true);
258 BOOST_CHECK_EQUAL(a != b, false);
259
260 // MustBeFresh
261 a.setMustBeFresh(true);
262 BOOST_CHECK_EQUAL(a == b, false);
263 BOOST_CHECK_EQUAL(a != b, true);
264
265 b.setMustBeFresh(true);
266 BOOST_CHECK_EQUAL(a == b, true);
267 BOOST_CHECK_EQUAL(a != b, false);
268}
269
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700270BOOST_AUTO_TEST_CASE(Decode)
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800271{
272 Block interestBlock(Interest1, sizeof(Interest1));
Alexander Afanasyev636e9f12014-01-07 12:01:03 -0800273
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800274 ndn::Interest i;
Alexander Afanasyev049f8f72013-12-26 19:07:15 -0800275 BOOST_REQUIRE_NO_THROW(i.wireDecode(interestBlock));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800276
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700277 BOOST_CHECK_EQUAL(i.getName().toUri(), "/local/ndn/prefix");
278 BOOST_CHECK_EQUAL(i.getScope(), 1);
279 BOOST_CHECK_EQUAL(i.getInterestLifetime(), time::milliseconds(1000));
280 BOOST_CHECK_EQUAL(i.getMinSuffixComponents(), 1);
281 BOOST_CHECK_EQUAL(i.getMaxSuffixComponents(), 1);
282 BOOST_CHECK_EQUAL(i.getPublisherPublicKeyLocator().getType(),
283 static_cast<uint32_t>(KeyLocator::KeyLocator_Name));
284 BOOST_CHECK_EQUAL(i.getPublisherPublicKeyLocator().getName(), "ndn:/test/key/locator");
285 BOOST_CHECK_EQUAL(i.getChildSelector(), 1);
286 BOOST_CHECK_EQUAL(i.getMustBeFresh(), false);
287 BOOST_CHECK_EQUAL(i.getExclude().toUri(), "alex,xxxx,*,yyyy");
288 BOOST_CHECK_EQUAL(i.getNonce(), 1U);
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800289}
290
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700291BOOST_AUTO_TEST_CASE(DecodeFromStream)
Alexander Afanasyev6835ad82014-02-12 10:07:20 -0800292{
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -0700293 boost::iostreams::stream<boost::iostreams::array_source> is(
294 reinterpret_cast<const char *>(Interest1), sizeof(Interest1));
Junxiao Shib332e782014-03-31 14:23:46 -0700295
Alexander Afanasyev9c578182014-05-14 17:28:28 -0700296 Block interestBlock = Block::fromStream(is);
Alexander Afanasyev6835ad82014-02-12 10:07:20 -0800297
298 ndn::Interest i;
299 BOOST_REQUIRE_NO_THROW(i.wireDecode(interestBlock));
300
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700301 BOOST_CHECK_EQUAL(i.getName().toUri(), "/local/ndn/prefix");
302 BOOST_CHECK_EQUAL(i.getScope(), 1);
303 BOOST_CHECK_EQUAL(i.getInterestLifetime(), time::milliseconds(1000));
304 BOOST_CHECK_EQUAL(i.getMinSuffixComponents(), 1);
305 BOOST_CHECK_EQUAL(i.getMaxSuffixComponents(), 1);
306 BOOST_CHECK_EQUAL(i.getChildSelector(), 1);
307 BOOST_CHECK_EQUAL(i.getMustBeFresh(), false);
308 BOOST_CHECK_EQUAL(i.getExclude().toUri(), "alex,xxxx,*,yyyy");
309 BOOST_CHECK_EQUAL(i.getNonce(), 1U);
Alexander Afanasyev6835ad82014-02-12 10:07:20 -0800310}
311
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700312BOOST_AUTO_TEST_CASE(Encode)
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800313{
314 ndn::Interest i(ndn::Name("/local/ndn/prefix"));
315 i.setScope(1);
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700316 i.setInterestLifetime(time::milliseconds(1000));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800317 i.setMinSuffixComponents(1);
318 i.setMaxSuffixComponents(1);
Junxiao Shib332e782014-03-31 14:23:46 -0700319 i.setPublisherPublicKeyLocator(KeyLocator("ndn:/test/key/locator"));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800320 i.setChildSelector(1);
321 i.setMustBeFresh(false);
Alexander Afanasyevc348f832014-02-17 16:35:17 -0800322 Exclude exclude;
323 exclude
Alexander Afanasyev52eb20d2014-02-06 18:25:54 -0800324 .excludeOne(name::Component("alex"))
325 .excludeRange(name::Component("xxxx"), name::Component("yyyy"));
Alexander Afanasyevc348f832014-02-17 16:35:17 -0800326 i.setExclude(exclude);
Alexander Afanasyev840139f2013-12-28 15:02:50 -0800327 i.setNonce(1);
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800328
Alexander Afanasyeve881e932014-06-08 14:47:03 +0300329 BOOST_CHECK_EQUAL(i.hasWire(), false);
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800330 const Block &wire = i.wireEncode();
Alexander Afanasyeve881e932014-06-08 14:47:03 +0300331 BOOST_CHECK_EQUAL(i.hasWire(), true);
Alexander Afanasyev809805d2014-02-17 17:20:33 -0800332
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700333 BOOST_CHECK_EQUAL_COLLECTIONS(Interest1, Interest1 + sizeof(Interest1),
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800334 wire.begin(), wire.end());
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800335
Alexander Afanasyeve881e932014-06-08 14:47:03 +0300336 const uint8_t* originalWire = wire.wire();
337 i.setNonce(2);
338 BOOST_CHECK_EQUAL(i.hasWire(), true);
339 BOOST_CHECK_EQUAL(originalWire, i.wireEncode().wire());
340 BOOST_CHECK_EQUAL(i.hasWire(), true);
341
342 BOOST_CHECK_EQUAL_COLLECTIONS(Interest2, Interest2 + sizeof(Interest2),
343 wire.begin(), wire.end());
Alexander Afanasyeva0c5f832014-06-19 13:27:56 -0700344
345 std::ostringstream strStream;
346 BOOST_CHECK_NO_THROW(strStream << i);
347
348 BOOST_CHECK_EQUAL(strStream.str(),
349 "/local/ndn/prefix?"
350 "ndn.MinSuffixComponents=1&ndn.MaxSuffixComponents=1&"
351 "ndn.ChildSelector=1&ndn.Scope=1&"
352 "ndn.InterestLifetime=1000&"
353 "ndn.Nonce=2&ndn.Exclude=alex,xxxx,*,yyyy");
Alexander Afanasyeve881e932014-06-08 14:47:03 +0300354}
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800355
356BOOST_AUTO_TEST_CASE(EncodeWithLocalHeader)
357{
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800358 ndn::Interest interest(ndn::Name("/local/ndn/prefix"));
359 interest.setMustBeFresh(true);
360 interest.setIncomingFaceId(10);
361 interest.setNonce(1);
Junxiao Shib332e782014-03-31 14:23:46 -0700362
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800363 BOOST_CHECK(!interest.hasWire());
Junxiao Shib332e782014-03-31 14:23:46 -0700364
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800365 Block headerBlock = interest.getLocalControlHeader().wireEncode(interest, true, true);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800366
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800367 BOOST_CHECK(interest.hasWire());
368 BOOST_CHECK(headerBlock.hasWire());
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800369
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800370 BOOST_CHECK_NE(headerBlock.wire(), interest.wireEncode().wire());
371 BOOST_CHECK_NE(headerBlock.size(), interest.wireEncode().size());
372 BOOST_CHECK_EQUAL(headerBlock.size(), 5);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800373
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800374 BOOST_CHECK_EQUAL_COLLECTIONS(InterestWithLocalControlHeader,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700375 InterestWithLocalControlHeader + 5,
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800376 headerBlock.begin(), headerBlock.end());
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800377
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800378 interest.setNonce(1000);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800379
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800380 Block updatedHeaderBlock = interest.getLocalControlHeader().wireEncode(interest, true, true);
381 BOOST_CHECK_EQUAL(updatedHeaderBlock.size(), 5);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800382
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800383 // only length should have changed
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700384 BOOST_CHECK_EQUAL_COLLECTIONS(updatedHeaderBlock.begin() + 2, updatedHeaderBlock.end(),
385 headerBlock.begin() + 2, headerBlock.end());
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800386
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800387 // updating IncomingFaceId that keeps the length
388 interest.setIncomingFaceId(100);
389 updatedHeaderBlock = interest.getLocalControlHeader().wireEncode(interest, true, true);
390 BOOST_CHECK_EQUAL(updatedHeaderBlock.size(), 5);
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700391 BOOST_CHECK_NE(*(updatedHeaderBlock.begin() + 4), *(headerBlock.begin() + 4));
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800392
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800393 // updating IncomingFaceId that increases the length by 2
394 interest.setIncomingFaceId(1000);
395 updatedHeaderBlock = interest.getLocalControlHeader().wireEncode(interest, true, true);
396 BOOST_CHECK_EQUAL(updatedHeaderBlock.size(), 6);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800397
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800398 // adding NextHopId
399 interest.setNextHopFaceId(1);
400 updatedHeaderBlock = interest.getLocalControlHeader().wireEncode(interest, true, true);
401 BOOST_CHECK_EQUAL(updatedHeaderBlock.size(), 9);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800402
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800403 // masking IncomingFaceId
404 updatedHeaderBlock = interest.getLocalControlHeader().wireEncode(interest, false, true);
405 BOOST_CHECK_EQUAL(updatedHeaderBlock.size(), 5);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800406
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800407 // masking NextHopId
408 updatedHeaderBlock = interest.getLocalControlHeader().wireEncode(interest, true, false);
409 BOOST_CHECK_EQUAL(updatedHeaderBlock.size(), 6);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800410
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800411 // masking everything
412 BOOST_CHECK_THROW(interest.getLocalControlHeader().wireEncode(interest, false, false),
413 nfd::LocalControlHeader::Error);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800414}
415
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800416
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700417BOOST_AUTO_TEST_CASE(DecodeWithLocalHeader)
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800418{
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800419 Block wireBlock(InterestWithLocalControlHeader, sizeof(InterestWithLocalControlHeader));
420 const Block& payload = nfd::LocalControlHeader::getPayload(wireBlock);
421 BOOST_REQUIRE_NE(&payload, &wireBlock);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800422
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700423 BOOST_CHECK_EQUAL(payload.type(), static_cast<uint32_t>(Tlv::Interest));
424 BOOST_CHECK_EQUAL(wireBlock.type(), static_cast<uint32_t>(tlv::nfd::LocalControlHeader));
Junxiao Shib332e782014-03-31 14:23:46 -0700425
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800426 Interest interest(payload);
427 BOOST_CHECK(!interest.getLocalControlHeader().hasIncomingFaceId());
428 BOOST_CHECK(!interest.getLocalControlHeader().hasNextHopFaceId());
429
430 BOOST_REQUIRE_NO_THROW(interest.getLocalControlHeader().wireDecode(wireBlock));
431
432 BOOST_CHECK_EQUAL(interest.getLocalControlHeader().wireEncode(interest, true, true).size(), 5);
Junxiao Shib332e782014-03-31 14:23:46 -0700433
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800434 BOOST_CHECK_EQUAL(interest.getIncomingFaceId(), 10);
435 BOOST_CHECK(!interest.getLocalControlHeader().hasNextHopFaceId());
436
437 BOOST_CHECK_THROW(interest.getLocalControlHeader().wireEncode(interest, false, false),
438 nfd::LocalControlHeader::Error);
439
440 BOOST_CHECK_THROW(interest.getLocalControlHeader().wireEncode(interest, false, true),
441 nfd::LocalControlHeader::Error);
442
443 BOOST_CHECK_NO_THROW(interest.getLocalControlHeader().wireEncode(interest, true, false));
444 BOOST_CHECK_NO_THROW(interest.getLocalControlHeader().wireEncode(interest, true, true));
Junxiao Shib332e782014-03-31 14:23:46 -0700445
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800446 BOOST_CHECK_NE((void*)interest.getLocalControlHeader().wireEncode(interest, true, true).wire(),
447 (void*)wireBlock.wire());
448
449 BOOST_CHECK_EQUAL(interest.getLocalControlHeader().wireEncode(interest, true, true).size(), 5);
450}
451
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700452BOOST_AUTO_TEST_CASE(DecodeWithoutLocalHeader)
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800453{
454 Block wireBlock(InterestWithoutLocalControlHeader, sizeof(InterestWithoutLocalControlHeader));
455 const Block& payload = nfd::LocalControlHeader::getPayload(wireBlock);
456 BOOST_CHECK_EQUAL(&payload, &wireBlock);
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800457}
458
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700459BOOST_AUTO_TEST_CASE(MatchesData)
460{
461 Interest interest;
462 interest.setName("ndn:/A")
463 .setMinSuffixComponents(2)
464 .setMaxSuffixComponents(2)
465 .setPublisherPublicKeyLocator(KeyLocator("ndn:/B"))
466 .setExclude(Exclude().excludeBefore(name::Component("C")));
467
468 Data data("ndn:/A/D");
469 SignatureSha256WithRsa signature;
470 signature.setKeyLocator(KeyLocator("ndn:/B"));
471 data.setSignature(signature);
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700472 data.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700473 BOOST_CHECK_EQUAL(interest.matchesData(data), true);
474
475 Data data1 = data;
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700476 data1.setName("ndn:/A"); // violates MinSuffixComponents
477 data1.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700478 BOOST_CHECK_EQUAL(interest.matchesData(data1), false);
479
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700480 interest.setMinSuffixComponents(1);
481 BOOST_CHECK_EQUAL(interest.matchesData(data1), true);
482 interest.setMinSuffixComponents(2);
483
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700484 Data data2 = data;
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700485 data2.setName("ndn:/A/E/F"); // violates MaxSuffixComponents
486 data2.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700487 BOOST_CHECK_EQUAL(interest.matchesData(data2), false);
488
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700489 interest.setMaxSuffixComponents(3);
490 BOOST_CHECK_EQUAL(interest.matchesData(data2), true);
491 interest.setMaxSuffixComponents(2);
492
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700493 Data data3 = data;
494 SignatureSha256WithRsa signature3;
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700495 signature3.setKeyLocator(KeyLocator("ndn:/G")); // violates PublisherPublicKeyLocator
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700496 data3.setSignature(signature3);
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700497 data3.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700498 BOOST_CHECK_EQUAL(interest.matchesData(data3), false);
499
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700500 interest.setPublisherPublicKeyLocator(KeyLocator("ndn:/G"));
501 BOOST_CHECK_EQUAL(interest.matchesData(data3), true);
502 interest.setPublisherPublicKeyLocator(KeyLocator("ndn:/B"));
503
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700504 Data data4 = data;
Yingdi Yubf6a2812014-06-17 15:32:11 -0700505 DigestSha256 signature4; // violates PublisherPublicKeyLocator
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700506 data4.setSignature(signature4);
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700507 data4.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700508 BOOST_CHECK_EQUAL(interest.matchesData(data4), false);
509
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700510 interest.setPublisherPublicKeyLocator(KeyLocator());
511 BOOST_CHECK_EQUAL(interest.matchesData(data4), true);
512 interest.setPublisherPublicKeyLocator(KeyLocator("ndn:/B"));
513
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700514 Data data5 = data;
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700515 data5.setName("ndn:/A/C"); // violates Exclude
516 data5.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700517 BOOST_CHECK_EQUAL(interest.matchesData(data5), false);
518
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700519 interest.setExclude(Exclude().excludeBefore(name::Component("A")));
520 BOOST_CHECK_EQUAL(interest.matchesData(data5), true);
521 interest.setExclude(Exclude().excludeBefore(name::Component("C")));
522
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700523 Data data6 = data;
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700524 data6.setName("ndn:/H/I"); // violates Name
525 data6.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700526 BOOST_CHECK_EQUAL(interest.matchesData(data6), false);
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700527
528 Data data7 = data;
529 data7.setName("ndn:/A/B");
530 data7.wireEncode();
531
532 interest = Interest()
533 .setName("/A/B/%D5H%DE%CE%FCK%88%07%20%DC%92W%A8%D8%15%E9%DFDe%E67B%EEU%C2%913%05%5D%AAg%C2");
534 BOOST_CHECK_EQUAL(interest.matchesData(data7), true);
535
536 interest = Interest()
537 .setName("/A/B/%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00"
538 "%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00");
539 BOOST_CHECK_EQUAL(interest.matchesData(data7), false); // violates implicit digest
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700540}
541
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700542
543
Alexander Afanasyev90164962014-03-06 08:29:59 +0000544BOOST_AUTO_TEST_CASE(InterestFilterMatching)
545{
546 BOOST_CHECK_EQUAL(InterestFilter("/a").doesMatch("/a/b"), true);
547 BOOST_CHECK_EQUAL(InterestFilter("/a/b").doesMatch("/a/b"), true);
548 BOOST_CHECK_EQUAL(InterestFilter("/a/b/c").doesMatch("/a/b"), false);
549
550 BOOST_CHECK_EQUAL(InterestFilter("/a", "<b>").doesMatch("/a/b"), true);
551 BOOST_CHECK_EQUAL(InterestFilter("/a/b", "<b>").doesMatch("/a/b"), false);
552
553 BOOST_CHECK_EQUAL(InterestFilter("/a/b", "<b>").doesMatch("/a/b/c/b"), false);
554 BOOST_CHECK_EQUAL(InterestFilter("/a/b", "<>*<b>").doesMatch("/a/b/c/b"), true);
555
556 BOOST_CHECK_EQUAL(InterestFilter("/a", "<b>").doesMatch("/a/b/c/d"), false);
557 BOOST_CHECK_EQUAL(InterestFilter("/a", "<b><>*").doesMatch("/a/b/c/d"), true);
558 BOOST_CHECK_EQUAL(InterestFilter("/a", "<b><>*").doesMatch("/a/b"), true);
559 BOOST_CHECK_EQUAL(InterestFilter("/a", "<b><>+").doesMatch("/a/b"), false);
560 BOOST_CHECK_EQUAL(InterestFilter("/a", "<b><>+").doesMatch("/a/b/c"), true);
561}
562
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800563BOOST_AUTO_TEST_SUITE_END()
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800564
Alexander Afanasyev90164962014-03-06 08:29:59 +0000565} // namespace tests
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800566} // namespace ndn