blob: 82bf8bd1621a229507f394c08aaea17000ac7c12 [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 Afanasyevc3932172014-07-10 18:53:56 -0700354
355 i.refreshNonce();
356 BOOST_CHECK_EQUAL(i.hasWire(), true);
357 BOOST_CHECK_EQUAL(originalWire, i.wireEncode().wire());
358 BOOST_CHECK_NE(i.getNonce(), 2);
Alexander Afanasyeve881e932014-06-08 14:47:03 +0300359}
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800360
361BOOST_AUTO_TEST_CASE(EncodeWithLocalHeader)
362{
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800363 ndn::Interest interest(ndn::Name("/local/ndn/prefix"));
364 interest.setMustBeFresh(true);
365 interest.setIncomingFaceId(10);
366 interest.setNonce(1);
Junxiao Shib332e782014-03-31 14:23:46 -0700367
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800368 BOOST_CHECK(!interest.hasWire());
Junxiao Shib332e782014-03-31 14:23:46 -0700369
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800370 Block headerBlock = interest.getLocalControlHeader().wireEncode(interest, true, true);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800371
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800372 BOOST_CHECK(interest.hasWire());
373 BOOST_CHECK(headerBlock.hasWire());
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800374
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800375 BOOST_CHECK_NE(headerBlock.wire(), interest.wireEncode().wire());
376 BOOST_CHECK_NE(headerBlock.size(), interest.wireEncode().size());
377 BOOST_CHECK_EQUAL(headerBlock.size(), 5);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800378
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800379 BOOST_CHECK_EQUAL_COLLECTIONS(InterestWithLocalControlHeader,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700380 InterestWithLocalControlHeader + 5,
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800381 headerBlock.begin(), headerBlock.end());
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800382
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800383 interest.setNonce(1000);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800384
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800385 Block updatedHeaderBlock = interest.getLocalControlHeader().wireEncode(interest, true, true);
386 BOOST_CHECK_EQUAL(updatedHeaderBlock.size(), 5);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800387
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800388 // only length should have changed
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700389 BOOST_CHECK_EQUAL_COLLECTIONS(updatedHeaderBlock.begin() + 2, updatedHeaderBlock.end(),
390 headerBlock.begin() + 2, headerBlock.end());
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800391
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800392 // updating IncomingFaceId that keeps the length
393 interest.setIncomingFaceId(100);
394 updatedHeaderBlock = interest.getLocalControlHeader().wireEncode(interest, true, true);
395 BOOST_CHECK_EQUAL(updatedHeaderBlock.size(), 5);
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700396 BOOST_CHECK_NE(*(updatedHeaderBlock.begin() + 4), *(headerBlock.begin() + 4));
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800397
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800398 // updating IncomingFaceId that increases the length by 2
399 interest.setIncomingFaceId(1000);
400 updatedHeaderBlock = interest.getLocalControlHeader().wireEncode(interest, true, true);
401 BOOST_CHECK_EQUAL(updatedHeaderBlock.size(), 6);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800402
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800403 // adding NextHopId
404 interest.setNextHopFaceId(1);
405 updatedHeaderBlock = interest.getLocalControlHeader().wireEncode(interest, true, true);
406 BOOST_CHECK_EQUAL(updatedHeaderBlock.size(), 9);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800407
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800408 // masking IncomingFaceId
409 updatedHeaderBlock = interest.getLocalControlHeader().wireEncode(interest, false, true);
410 BOOST_CHECK_EQUAL(updatedHeaderBlock.size(), 5);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800411
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800412 // masking NextHopId
413 updatedHeaderBlock = interest.getLocalControlHeader().wireEncode(interest, true, false);
414 BOOST_CHECK_EQUAL(updatedHeaderBlock.size(), 6);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800415
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800416 // masking everything
417 BOOST_CHECK_THROW(interest.getLocalControlHeader().wireEncode(interest, false, false),
418 nfd::LocalControlHeader::Error);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800419}
420
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800421
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700422BOOST_AUTO_TEST_CASE(DecodeWithLocalHeader)
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800423{
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800424 Block wireBlock(InterestWithLocalControlHeader, sizeof(InterestWithLocalControlHeader));
425 const Block& payload = nfd::LocalControlHeader::getPayload(wireBlock);
426 BOOST_REQUIRE_NE(&payload, &wireBlock);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800427
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700428 BOOST_CHECK_EQUAL(payload.type(), static_cast<uint32_t>(Tlv::Interest));
429 BOOST_CHECK_EQUAL(wireBlock.type(), static_cast<uint32_t>(tlv::nfd::LocalControlHeader));
Junxiao Shib332e782014-03-31 14:23:46 -0700430
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800431 Interest interest(payload);
432 BOOST_CHECK(!interest.getLocalControlHeader().hasIncomingFaceId());
433 BOOST_CHECK(!interest.getLocalControlHeader().hasNextHopFaceId());
434
435 BOOST_REQUIRE_NO_THROW(interest.getLocalControlHeader().wireDecode(wireBlock));
436
437 BOOST_CHECK_EQUAL(interest.getLocalControlHeader().wireEncode(interest, true, true).size(), 5);
Junxiao Shib332e782014-03-31 14:23:46 -0700438
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800439 BOOST_CHECK_EQUAL(interest.getIncomingFaceId(), 10);
440 BOOST_CHECK(!interest.getLocalControlHeader().hasNextHopFaceId());
441
442 BOOST_CHECK_THROW(interest.getLocalControlHeader().wireEncode(interest, false, false),
443 nfd::LocalControlHeader::Error);
444
445 BOOST_CHECK_THROW(interest.getLocalControlHeader().wireEncode(interest, false, true),
446 nfd::LocalControlHeader::Error);
447
448 BOOST_CHECK_NO_THROW(interest.getLocalControlHeader().wireEncode(interest, true, false));
449 BOOST_CHECK_NO_THROW(interest.getLocalControlHeader().wireEncode(interest, true, true));
Junxiao Shib332e782014-03-31 14:23:46 -0700450
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800451 BOOST_CHECK_NE((void*)interest.getLocalControlHeader().wireEncode(interest, true, true).wire(),
452 (void*)wireBlock.wire());
453
454 BOOST_CHECK_EQUAL(interest.getLocalControlHeader().wireEncode(interest, true, true).size(), 5);
455}
456
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700457BOOST_AUTO_TEST_CASE(DecodeWithoutLocalHeader)
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800458{
459 Block wireBlock(InterestWithoutLocalControlHeader, sizeof(InterestWithoutLocalControlHeader));
460 const Block& payload = nfd::LocalControlHeader::getPayload(wireBlock);
461 BOOST_CHECK_EQUAL(&payload, &wireBlock);
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800462}
463
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700464BOOST_AUTO_TEST_CASE(MatchesData)
465{
466 Interest interest;
467 interest.setName("ndn:/A")
468 .setMinSuffixComponents(2)
469 .setMaxSuffixComponents(2)
470 .setPublisherPublicKeyLocator(KeyLocator("ndn:/B"))
471 .setExclude(Exclude().excludeBefore(name::Component("C")));
472
473 Data data("ndn:/A/D");
Yingdi Yu4a557052014-07-09 16:40:37 -0700474 SignatureSha256WithRsa signature(KeyLocator("ndn:/B"));
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700475 data.setSignature(signature);
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700476 data.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700477 BOOST_CHECK_EQUAL(interest.matchesData(data), true);
478
479 Data data1 = data;
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700480 data1.setName("ndn:/A"); // violates MinSuffixComponents
481 data1.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700482 BOOST_CHECK_EQUAL(interest.matchesData(data1), false);
483
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700484 interest.setMinSuffixComponents(1);
485 BOOST_CHECK_EQUAL(interest.matchesData(data1), true);
486 interest.setMinSuffixComponents(2);
487
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700488 Data data2 = data;
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700489 data2.setName("ndn:/A/E/F"); // violates MaxSuffixComponents
490 data2.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700491 BOOST_CHECK_EQUAL(interest.matchesData(data2), false);
492
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700493 interest.setMaxSuffixComponents(3);
494 BOOST_CHECK_EQUAL(interest.matchesData(data2), true);
495 interest.setMaxSuffixComponents(2);
496
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700497 Data data3 = data;
Yingdi Yu4a557052014-07-09 16:40:37 -0700498 SignatureSha256WithRsa signature3(KeyLocator("ndn:/G")); // violates PublisherPublicKeyLocator
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700499 data3.setSignature(signature3);
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700500 data3.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700501 BOOST_CHECK_EQUAL(interest.matchesData(data3), false);
502
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700503 interest.setPublisherPublicKeyLocator(KeyLocator("ndn:/G"));
504 BOOST_CHECK_EQUAL(interest.matchesData(data3), true);
505 interest.setPublisherPublicKeyLocator(KeyLocator("ndn:/B"));
506
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700507 Data data4 = data;
Yingdi Yubf6a2812014-06-17 15:32:11 -0700508 DigestSha256 signature4; // violates PublisherPublicKeyLocator
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700509 data4.setSignature(signature4);
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700510 data4.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700511 BOOST_CHECK_EQUAL(interest.matchesData(data4), false);
512
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700513 interest.setPublisherPublicKeyLocator(KeyLocator());
514 BOOST_CHECK_EQUAL(interest.matchesData(data4), true);
515 interest.setPublisherPublicKeyLocator(KeyLocator("ndn:/B"));
516
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700517 Data data5 = data;
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700518 data5.setName("ndn:/A/C"); // violates Exclude
519 data5.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700520 BOOST_CHECK_EQUAL(interest.matchesData(data5), false);
521
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700522 interest.setExclude(Exclude().excludeBefore(name::Component("A")));
523 BOOST_CHECK_EQUAL(interest.matchesData(data5), true);
524 interest.setExclude(Exclude().excludeBefore(name::Component("C")));
525
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700526 Data data6 = data;
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700527 data6.setName("ndn:/H/I"); // violates Name
528 data6.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700529 BOOST_CHECK_EQUAL(interest.matchesData(data6), false);
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700530
531 Data data7 = data;
532 data7.setName("ndn:/A/B");
533 data7.wireEncode();
534
535 interest = Interest()
536 .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");
537 BOOST_CHECK_EQUAL(interest.matchesData(data7), true);
538
539 interest = Interest()
540 .setName("/A/B/%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00"
541 "%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00");
542 BOOST_CHECK_EQUAL(interest.matchesData(data7), false); // violates implicit digest
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700543}
544
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700545
546
Alexander Afanasyev90164962014-03-06 08:29:59 +0000547BOOST_AUTO_TEST_CASE(InterestFilterMatching)
548{
549 BOOST_CHECK_EQUAL(InterestFilter("/a").doesMatch("/a/b"), true);
550 BOOST_CHECK_EQUAL(InterestFilter("/a/b").doesMatch("/a/b"), true);
551 BOOST_CHECK_EQUAL(InterestFilter("/a/b/c").doesMatch("/a/b"), false);
552
553 BOOST_CHECK_EQUAL(InterestFilter("/a", "<b>").doesMatch("/a/b"), true);
554 BOOST_CHECK_EQUAL(InterestFilter("/a/b", "<b>").doesMatch("/a/b"), false);
555
556 BOOST_CHECK_EQUAL(InterestFilter("/a/b", "<b>").doesMatch("/a/b/c/b"), false);
557 BOOST_CHECK_EQUAL(InterestFilter("/a/b", "<>*<b>").doesMatch("/a/b/c/b"), true);
558
559 BOOST_CHECK_EQUAL(InterestFilter("/a", "<b>").doesMatch("/a/b/c/d"), false);
560 BOOST_CHECK_EQUAL(InterestFilter("/a", "<b><>*").doesMatch("/a/b/c/d"), true);
561 BOOST_CHECK_EQUAL(InterestFilter("/a", "<b><>*").doesMatch("/a/b"), true);
562 BOOST_CHECK_EQUAL(InterestFilter("/a", "<b><>+").doesMatch("/a/b"), false);
563 BOOST_CHECK_EQUAL(InterestFilter("/a", "<b><>+").doesMatch("/a/b/c"), true);
564}
565
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800566BOOST_AUTO_TEST_SUITE_END()
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800567
Alexander Afanasyev90164962014-03-06 08:29:59 +0000568} // namespace tests
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800569} // namespace ndn