blob: 25f79faa59099aa3b90f149e47b96bd2a6439e9e [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);
462 BOOST_CHECK_EQUAL(interest.matchesData(data), true);
463
464 Data data1 = data;
465 data1.setName("ndn:/A");// violates MinSuffixComponents
466 BOOST_CHECK_EQUAL(interest.matchesData(data1), false);
467
468 Data data2 = data;
469 data2.setName("ndn:/A/E/F");// violates MaxSuffixComponents
470 BOOST_CHECK_EQUAL(interest.matchesData(data2), false);
471
472 Data data3 = data;
473 SignatureSha256WithRsa signature3;
474 signature3.setKeyLocator(KeyLocator("ndn:/G"));// violates PublisherPublicKeyLocator
475 data3.setSignature(signature3);
476 BOOST_CHECK_EQUAL(interest.matchesData(data3), false);
477
478 Data data4 = data;
479 SignatureSha256 signature4;// violates PublisherPublicKeyLocator
480 data4.setSignature(signature4);
481 BOOST_CHECK_EQUAL(interest.matchesData(data4), false);
482
483 Data data5 = data;
484 data5.setName("ndn:/A/C");// violates Exclude
485 BOOST_CHECK_EQUAL(interest.matchesData(data5), false);
486
487 Data data6 = data;
488 data6.setName("ndn:/H/I");// violates Name
489 BOOST_CHECK_EQUAL(interest.matchesData(data6), false);
490}
491
Alexander Afanasyev90164962014-03-06 08:29:59 +0000492BOOST_AUTO_TEST_CASE(InterestFilterMatching)
493{
494 BOOST_CHECK_EQUAL(InterestFilter("/a").doesMatch("/a/b"), true);
495 BOOST_CHECK_EQUAL(InterestFilter("/a/b").doesMatch("/a/b"), true);
496 BOOST_CHECK_EQUAL(InterestFilter("/a/b/c").doesMatch("/a/b"), false);
497
498 BOOST_CHECK_EQUAL(InterestFilter("/a", "<b>").doesMatch("/a/b"), true);
499 BOOST_CHECK_EQUAL(InterestFilter("/a/b", "<b>").doesMatch("/a/b"), false);
500
501 BOOST_CHECK_EQUAL(InterestFilter("/a/b", "<b>").doesMatch("/a/b/c/b"), false);
502 BOOST_CHECK_EQUAL(InterestFilter("/a/b", "<>*<b>").doesMatch("/a/b/c/b"), true);
503
504 BOOST_CHECK_EQUAL(InterestFilter("/a", "<b>").doesMatch("/a/b/c/d"), false);
505 BOOST_CHECK_EQUAL(InterestFilter("/a", "<b><>*").doesMatch("/a/b/c/d"), true);
506 BOOST_CHECK_EQUAL(InterestFilter("/a", "<b><>*").doesMatch("/a/b"), true);
507 BOOST_CHECK_EQUAL(InterestFilter("/a", "<b><>+").doesMatch("/a/b"), false);
508 BOOST_CHECK_EQUAL(InterestFilter("/a", "<b><>+").doesMatch("/a/b/c"), true);
509}
510
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800511BOOST_AUTO_TEST_SUITE_END()
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800512
Alexander Afanasyev90164962014-03-06 08:29:59 +0000513} // namespace tests
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800514} // namespace ndn