blob: 2f465aef9b5ce1211749c29d3de2e1794e34d6ce [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");
Yingdi Yu4a557052014-07-09 16:40:37 -0700469 SignatureSha256WithRsa signature(KeyLocator("ndn:/B"));
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700470 data.setSignature(signature);
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700471 data.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700472 BOOST_CHECK_EQUAL(interest.matchesData(data), true);
473
474 Data data1 = data;
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700475 data1.setName("ndn:/A"); // violates MinSuffixComponents
476 data1.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700477 BOOST_CHECK_EQUAL(interest.matchesData(data1), false);
478
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700479 interest.setMinSuffixComponents(1);
480 BOOST_CHECK_EQUAL(interest.matchesData(data1), true);
481 interest.setMinSuffixComponents(2);
482
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700483 Data data2 = data;
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700484 data2.setName("ndn:/A/E/F"); // violates MaxSuffixComponents
485 data2.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700486 BOOST_CHECK_EQUAL(interest.matchesData(data2), false);
487
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700488 interest.setMaxSuffixComponents(3);
489 BOOST_CHECK_EQUAL(interest.matchesData(data2), true);
490 interest.setMaxSuffixComponents(2);
491
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700492 Data data3 = data;
Yingdi Yu4a557052014-07-09 16:40:37 -0700493 SignatureSha256WithRsa signature3(KeyLocator("ndn:/G")); // violates PublisherPublicKeyLocator
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700494 data3.setSignature(signature3);
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700495 data3.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700496 BOOST_CHECK_EQUAL(interest.matchesData(data3), false);
497
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700498 interest.setPublisherPublicKeyLocator(KeyLocator("ndn:/G"));
499 BOOST_CHECK_EQUAL(interest.matchesData(data3), true);
500 interest.setPublisherPublicKeyLocator(KeyLocator("ndn:/B"));
501
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700502 Data data4 = data;
Yingdi Yubf6a2812014-06-17 15:32:11 -0700503 DigestSha256 signature4; // violates PublisherPublicKeyLocator
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700504 data4.setSignature(signature4);
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700505 data4.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700506 BOOST_CHECK_EQUAL(interest.matchesData(data4), false);
507
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700508 interest.setPublisherPublicKeyLocator(KeyLocator());
509 BOOST_CHECK_EQUAL(interest.matchesData(data4), true);
510 interest.setPublisherPublicKeyLocator(KeyLocator("ndn:/B"));
511
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700512 Data data5 = data;
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700513 data5.setName("ndn:/A/C"); // violates Exclude
514 data5.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700515 BOOST_CHECK_EQUAL(interest.matchesData(data5), false);
516
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700517 interest.setExclude(Exclude().excludeBefore(name::Component("A")));
518 BOOST_CHECK_EQUAL(interest.matchesData(data5), true);
519 interest.setExclude(Exclude().excludeBefore(name::Component("C")));
520
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700521 Data data6 = data;
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700522 data6.setName("ndn:/H/I"); // violates Name
523 data6.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700524 BOOST_CHECK_EQUAL(interest.matchesData(data6), false);
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700525
526 Data data7 = data;
527 data7.setName("ndn:/A/B");
528 data7.wireEncode();
529
530 interest = Interest()
531 .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");
532 BOOST_CHECK_EQUAL(interest.matchesData(data7), true);
533
534 interest = Interest()
535 .setName("/A/B/%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00"
536 "%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00");
537 BOOST_CHECK_EQUAL(interest.matchesData(data7), false); // violates implicit digest
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700538}
539
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700540
541
Alexander Afanasyev90164962014-03-06 08:29:59 +0000542BOOST_AUTO_TEST_CASE(InterestFilterMatching)
543{
544 BOOST_CHECK_EQUAL(InterestFilter("/a").doesMatch("/a/b"), true);
545 BOOST_CHECK_EQUAL(InterestFilter("/a/b").doesMatch("/a/b"), true);
546 BOOST_CHECK_EQUAL(InterestFilter("/a/b/c").doesMatch("/a/b"), false);
547
548 BOOST_CHECK_EQUAL(InterestFilter("/a", "<b>").doesMatch("/a/b"), true);
549 BOOST_CHECK_EQUAL(InterestFilter("/a/b", "<b>").doesMatch("/a/b"), false);
550
551 BOOST_CHECK_EQUAL(InterestFilter("/a/b", "<b>").doesMatch("/a/b/c/b"), false);
552 BOOST_CHECK_EQUAL(InterestFilter("/a/b", "<>*<b>").doesMatch("/a/b/c/b"), true);
553
554 BOOST_CHECK_EQUAL(InterestFilter("/a", "<b>").doesMatch("/a/b/c/d"), false);
555 BOOST_CHECK_EQUAL(InterestFilter("/a", "<b><>*").doesMatch("/a/b/c/d"), true);
556 BOOST_CHECK_EQUAL(InterestFilter("/a", "<b><>*").doesMatch("/a/b"), true);
557 BOOST_CHECK_EQUAL(InterestFilter("/a", "<b><>+").doesMatch("/a/b"), false);
558 BOOST_CHECK_EQUAL(InterestFilter("/a", "<b><>+").doesMatch("/a/b/c"), true);
559}
560
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800561BOOST_AUTO_TEST_SUITE_END()
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800562
Alexander Afanasyev90164962014-03-06 08:29:59 +0000563} // namespace tests
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800564} // namespace ndn