blob: 5bb0a8557eafe39c7f286e6d65154fd0e532972c [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"
25#include "security/signature-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());
344}
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800345
346BOOST_AUTO_TEST_CASE(EncodeWithLocalHeader)
347{
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800348 ndn::Interest interest(ndn::Name("/local/ndn/prefix"));
349 interest.setMustBeFresh(true);
350 interest.setIncomingFaceId(10);
351 interest.setNonce(1);
Junxiao Shib332e782014-03-31 14:23:46 -0700352
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800353 BOOST_CHECK(!interest.hasWire());
Junxiao Shib332e782014-03-31 14:23:46 -0700354
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800355 Block headerBlock = interest.getLocalControlHeader().wireEncode(interest, true, true);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800356
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800357 BOOST_CHECK(interest.hasWire());
358 BOOST_CHECK(headerBlock.hasWire());
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800359
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800360 BOOST_CHECK_NE(headerBlock.wire(), interest.wireEncode().wire());
361 BOOST_CHECK_NE(headerBlock.size(), interest.wireEncode().size());
362 BOOST_CHECK_EQUAL(headerBlock.size(), 5);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800363
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800364 BOOST_CHECK_EQUAL_COLLECTIONS(InterestWithLocalControlHeader,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700365 InterestWithLocalControlHeader + 5,
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800366 headerBlock.begin(), headerBlock.end());
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800367
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800368 interest.setNonce(1000);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800369
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800370 Block updatedHeaderBlock = interest.getLocalControlHeader().wireEncode(interest, true, true);
371 BOOST_CHECK_EQUAL(updatedHeaderBlock.size(), 5);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800372
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800373 // only length should have changed
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700374 BOOST_CHECK_EQUAL_COLLECTIONS(updatedHeaderBlock.begin() + 2, updatedHeaderBlock.end(),
375 headerBlock.begin() + 2, headerBlock.end());
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800376
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800377 // updating IncomingFaceId that keeps the length
378 interest.setIncomingFaceId(100);
379 updatedHeaderBlock = interest.getLocalControlHeader().wireEncode(interest, true, true);
380 BOOST_CHECK_EQUAL(updatedHeaderBlock.size(), 5);
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700381 BOOST_CHECK_NE(*(updatedHeaderBlock.begin() + 4), *(headerBlock.begin() + 4));
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800382
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800383 // updating IncomingFaceId that increases the length by 2
384 interest.setIncomingFaceId(1000);
385 updatedHeaderBlock = interest.getLocalControlHeader().wireEncode(interest, true, true);
386 BOOST_CHECK_EQUAL(updatedHeaderBlock.size(), 6);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800387
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800388 // adding NextHopId
389 interest.setNextHopFaceId(1);
390 updatedHeaderBlock = interest.getLocalControlHeader().wireEncode(interest, true, true);
391 BOOST_CHECK_EQUAL(updatedHeaderBlock.size(), 9);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800392
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800393 // masking IncomingFaceId
394 updatedHeaderBlock = interest.getLocalControlHeader().wireEncode(interest, false, true);
395 BOOST_CHECK_EQUAL(updatedHeaderBlock.size(), 5);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800396
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800397 // masking NextHopId
398 updatedHeaderBlock = interest.getLocalControlHeader().wireEncode(interest, true, false);
399 BOOST_CHECK_EQUAL(updatedHeaderBlock.size(), 6);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800400
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800401 // masking everything
402 BOOST_CHECK_THROW(interest.getLocalControlHeader().wireEncode(interest, false, false),
403 nfd::LocalControlHeader::Error);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800404}
405
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800406
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700407BOOST_AUTO_TEST_CASE(DecodeWithLocalHeader)
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800408{
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800409 Block wireBlock(InterestWithLocalControlHeader, sizeof(InterestWithLocalControlHeader));
410 const Block& payload = nfd::LocalControlHeader::getPayload(wireBlock);
411 BOOST_REQUIRE_NE(&payload, &wireBlock);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800412
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700413 BOOST_CHECK_EQUAL(payload.type(), static_cast<uint32_t>(Tlv::Interest));
414 BOOST_CHECK_EQUAL(wireBlock.type(), static_cast<uint32_t>(tlv::nfd::LocalControlHeader));
Junxiao Shib332e782014-03-31 14:23:46 -0700415
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800416 Interest interest(payload);
417 BOOST_CHECK(!interest.getLocalControlHeader().hasIncomingFaceId());
418 BOOST_CHECK(!interest.getLocalControlHeader().hasNextHopFaceId());
419
420 BOOST_REQUIRE_NO_THROW(interest.getLocalControlHeader().wireDecode(wireBlock));
421
422 BOOST_CHECK_EQUAL(interest.getLocalControlHeader().wireEncode(interest, true, true).size(), 5);
Junxiao Shib332e782014-03-31 14:23:46 -0700423
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800424 BOOST_CHECK_EQUAL(interest.getIncomingFaceId(), 10);
425 BOOST_CHECK(!interest.getLocalControlHeader().hasNextHopFaceId());
426
427 BOOST_CHECK_THROW(interest.getLocalControlHeader().wireEncode(interest, false, false),
428 nfd::LocalControlHeader::Error);
429
430 BOOST_CHECK_THROW(interest.getLocalControlHeader().wireEncode(interest, false, true),
431 nfd::LocalControlHeader::Error);
432
433 BOOST_CHECK_NO_THROW(interest.getLocalControlHeader().wireEncode(interest, true, false));
434 BOOST_CHECK_NO_THROW(interest.getLocalControlHeader().wireEncode(interest, true, true));
Junxiao Shib332e782014-03-31 14:23:46 -0700435
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800436 BOOST_CHECK_NE((void*)interest.getLocalControlHeader().wireEncode(interest, true, true).wire(),
437 (void*)wireBlock.wire());
438
439 BOOST_CHECK_EQUAL(interest.getLocalControlHeader().wireEncode(interest, true, true).size(), 5);
440}
441
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700442BOOST_AUTO_TEST_CASE(DecodeWithoutLocalHeader)
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800443{
444 Block wireBlock(InterestWithoutLocalControlHeader, sizeof(InterestWithoutLocalControlHeader));
445 const Block& payload = nfd::LocalControlHeader::getPayload(wireBlock);
446 BOOST_CHECK_EQUAL(&payload, &wireBlock);
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800447}
448
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700449BOOST_AUTO_TEST_CASE(MatchesData)
450{
451 Interest interest;
452 interest.setName("ndn:/A")
453 .setMinSuffixComponents(2)
454 .setMaxSuffixComponents(2)
455 .setPublisherPublicKeyLocator(KeyLocator("ndn:/B"))
456 .setExclude(Exclude().excludeBefore(name::Component("C")));
457
458 Data data("ndn:/A/D");
459 SignatureSha256WithRsa signature;
460 signature.setKeyLocator(KeyLocator("ndn:/B"));
461 data.setSignature(signature);
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700462 data.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700463 BOOST_CHECK_EQUAL(interest.matchesData(data), true);
464
465 Data data1 = data;
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700466 data1.setName("ndn:/A"); // violates MinSuffixComponents
467 data1.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700468 BOOST_CHECK_EQUAL(interest.matchesData(data1), false);
469
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700470 interest.setMinSuffixComponents(1);
471 BOOST_CHECK_EQUAL(interest.matchesData(data1), true);
472 interest.setMinSuffixComponents(2);
473
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700474 Data data2 = data;
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700475 data2.setName("ndn:/A/E/F"); // violates MaxSuffixComponents
476 data2.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700477 BOOST_CHECK_EQUAL(interest.matchesData(data2), false);
478
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700479 interest.setMaxSuffixComponents(3);
480 BOOST_CHECK_EQUAL(interest.matchesData(data2), true);
481 interest.setMaxSuffixComponents(2);
482
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700483 Data data3 = data;
484 SignatureSha256WithRsa signature3;
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700485 signature3.setKeyLocator(KeyLocator("ndn:/G")); // violates PublisherPublicKeyLocator
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700486 data3.setSignature(signature3);
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700487 data3.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700488 BOOST_CHECK_EQUAL(interest.matchesData(data3), false);
489
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700490 interest.setPublisherPublicKeyLocator(KeyLocator("ndn:/G"));
491 BOOST_CHECK_EQUAL(interest.matchesData(data3), true);
492 interest.setPublisherPublicKeyLocator(KeyLocator("ndn:/B"));
493
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700494 Data data4 = data;
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700495 SignatureSha256 signature4; // violates PublisherPublicKeyLocator
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700496 data4.setSignature(signature4);
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700497 data4.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700498 BOOST_CHECK_EQUAL(interest.matchesData(data4), false);
499
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700500 interest.setPublisherPublicKeyLocator(KeyLocator());
501 BOOST_CHECK_EQUAL(interest.matchesData(data4), true);
502 interest.setPublisherPublicKeyLocator(KeyLocator("ndn:/B"));
503
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700504 Data data5 = data;
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700505 data5.setName("ndn:/A/C"); // violates Exclude
506 data5.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700507 BOOST_CHECK_EQUAL(interest.matchesData(data5), false);
508
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700509 interest.setExclude(Exclude().excludeBefore(name::Component("A")));
510 BOOST_CHECK_EQUAL(interest.matchesData(data5), true);
511 interest.setExclude(Exclude().excludeBefore(name::Component("C")));
512
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700513 Data data6 = data;
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700514 data6.setName("ndn:/H/I"); // violates Name
515 data6.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700516 BOOST_CHECK_EQUAL(interest.matchesData(data6), false);
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700517
518 Data data7 = data;
519 data7.setName("ndn:/A/B");
520 data7.wireEncode();
521
522 interest = Interest()
523 .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");
524 BOOST_CHECK_EQUAL(interest.matchesData(data7), true);
525
526 interest = Interest()
527 .setName("/A/B/%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00"
528 "%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00");
529 BOOST_CHECK_EQUAL(interest.matchesData(data7), false); // violates implicit digest
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700530}
531
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700532
533
Alexander Afanasyev90164962014-03-06 08:29:59 +0000534BOOST_AUTO_TEST_CASE(InterestFilterMatching)
535{
536 BOOST_CHECK_EQUAL(InterestFilter("/a").doesMatch("/a/b"), true);
537 BOOST_CHECK_EQUAL(InterestFilter("/a/b").doesMatch("/a/b"), true);
538 BOOST_CHECK_EQUAL(InterestFilter("/a/b/c").doesMatch("/a/b"), false);
539
540 BOOST_CHECK_EQUAL(InterestFilter("/a", "<b>").doesMatch("/a/b"), true);
541 BOOST_CHECK_EQUAL(InterestFilter("/a/b", "<b>").doesMatch("/a/b"), false);
542
543 BOOST_CHECK_EQUAL(InterestFilter("/a/b", "<b>").doesMatch("/a/b/c/b"), false);
544 BOOST_CHECK_EQUAL(InterestFilter("/a/b", "<>*<b>").doesMatch("/a/b/c/b"), true);
545
546 BOOST_CHECK_EQUAL(InterestFilter("/a", "<b>").doesMatch("/a/b/c/d"), false);
547 BOOST_CHECK_EQUAL(InterestFilter("/a", "<b><>*").doesMatch("/a/b/c/d"), true);
548 BOOST_CHECK_EQUAL(InterestFilter("/a", "<b><>*").doesMatch("/a/b"), true);
549 BOOST_CHECK_EQUAL(InterestFilter("/a", "<b><>+").doesMatch("/a/b"), false);
550 BOOST_CHECK_EQUAL(InterestFilter("/a", "<b><>+").doesMatch("/a/b/c"), true);
551}
552
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800553BOOST_AUTO_TEST_SUITE_END()
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800554
Alexander Afanasyev90164962014-03-06 08:29:59 +0000555} // namespace tests
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800556} // namespace ndn