blob: 04fc0beb5914d3090d2ab1cfb612e69c2e5fff9a [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
35const uint8_t Interest1[] = {
Alexander Afanasyeve881e932014-06-08 14:47:03 +030036 0x05, 0x5c, // NDN Interest
Alexander Afanasyev4b456282014-02-13 00:34:34 -080037 0x07, 0x14, // Name
38 0x08, 0x5, // NameComponent
Alexander Afanasyev636e9f12014-01-07 12:01:03 -080039 0x6c, 0x6f, 0x63, 0x61, 0x6c,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080040 0x08, 0x3, // NameComponent
Alexander Afanasyev636e9f12014-01-07 12:01:03 -080041 0x6e, 0x64, 0x6e,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080042 0x08, 0x6, // NameComponent
Alexander Afanasyev636e9f12014-01-07 12:01:03 -080043 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
Junxiao Shib332e782014-03-31 14:23:46 -070044 0x09, 0x37, // Selectors
Alexander Afanasyev4b456282014-02-13 00:34:34 -080045 0x0d, 0x1, 0x1, // MinSuffix
46 0x0e, 0x1, 0x1, // MaxSuffix
Junxiao Shib332e782014-03-31 14:23:46 -070047 0x1c, 0x16, // KeyLocator
48 0x07, 0x14, // Name
49 0x08, 0x04,
50 0x74, 0x65, 0x73, 0x74,
51 0x08, 0x03,
52 0x6b, 0x65, 0x79,
53 0x08, 0x07,
54 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080055 0x10, 0x14, // Exclude
56 0x08, 0x4, // NameComponent
Alexander Afanasyev636e9f12014-01-07 12:01:03 -080057 0x61, 0x6c, 0x65, 0x78,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080058 0x08, 0x4, // NameComponent
Alexander Afanasyev636e9f12014-01-07 12:01:03 -080059 0x78, 0x78, 0x78, 0x78,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080060 0x13, 0x0, // Any
61 0x08, 0x4, // NameComponent
Alexander Afanasyev636e9f12014-01-07 12:01:03 -080062 0x79, 0x79, 0x79, 0x79,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080063 0x11, 0x1, // ChildSelector
Alexander Afanasyev636e9f12014-01-07 12:01:03 -080064 0x1,
Alexander Afanasyeve881e932014-06-08 14:47:03 +030065 0x0a, 0x4, // Nonce
66 0x1, 0x0, 0x0, 0x00,
67 0x0b, 0x1, // Scope
Alexander Afanasyev636e9f12014-01-07 12:01:03 -080068 0x1,
Alexander Afanasyeve881e932014-06-08 14:47:03 +030069 0x0c, // InterestLifetime
70 0x2, 0x3, 0xe8
71};
72
73const uint8_t Interest2[] = {
74 0x05, 0x5c, // NDN Interest
75 0x07, 0x14, // Name
76 0x08, 0x5, // NameComponent
77 0x6c, 0x6f, 0x63, 0x61, 0x6c,
78 0x08, 0x3, // NameComponent
79 0x6e, 0x64, 0x6e,
80 0x08, 0x6, // NameComponent
81 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
82 0x09, 0x37, // Selectors
83 0x0d, 0x1, 0x1, // MinSuffix
84 0x0e, 0x1, 0x1, // MaxSuffix
85 0x1c, 0x16, // KeyLocator
86 0x07, 0x14, // Name
87 0x08, 0x04,
88 0x74, 0x65, 0x73, 0x74,
89 0x08, 0x03,
90 0x6b, 0x65, 0x79,
91 0x08, 0x07,
92 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,
93 0x10, 0x14, // Exclude
94 0x08, 0x4, // NameComponent
95 0x61, 0x6c, 0x65, 0x78,
96 0x08, 0x4, // NameComponent
97 0x78, 0x78, 0x78, 0x78,
98 0x13, 0x0, // Any
99 0x08, 0x4, // NameComponent
100 0x79, 0x79, 0x79, 0x79,
101 0x11, 0x1, // ChildSelector
102 0x1,
103 0x0a, 0x4, // Nonce
104 0x2, 0x0, 0x0, 0x00,
Alexander Afanasyev4b456282014-02-13 00:34:34 -0800105 0x0b, 0x1, // Scope
Alexander Afanasyev636e9f12014-01-07 12:01:03 -0800106 0x1,
Alexander Afanasyev4b456282014-02-13 00:34:34 -0800107 0x0c, // InterestLifetime
Alexander Afanasyev636e9f12014-01-07 12:01:03 -0800108 0x2, 0x3, 0xe8
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800109};
110
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800111const uint8_t InterestWithLocalControlHeader[] = {
Alexander Afanasyeve881e932014-06-08 14:47:03 +0300112 0x50, 0x25, 0x51, 0x01, 0x0a,
113 0x05, 0x20, 0x07, 0x14, 0x08, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x08, 0x03, 0x6e, 0x64,
114 0x6e, 0x08, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x09, 0x02, 0x12, 0x00, 0x0a, 0x04,
115 0x01, 0x00, 0x00, 0x00
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800116};
117
118const uint8_t InterestWithoutLocalControlHeader[] = {
Alexander Afanasyeve881e932014-06-08 14:47:03 +0300119 0x05, 0x20, 0x07, 0x14, 0x08, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x08, 0x03, 0x6e, 0x64,
120 0x6e, 0x08, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x09, 0x02, 0x12, 0x00, 0x0a, 0x04,
121 0x01, 0x00, 0x00, 0x00
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800122};
123
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700124BOOST_AUTO_TEST_CASE(InterestEqualityChecks)
125{
126 // Interest ::= INTEREST-TYPE TLV-LENGTH
127 // Name
128 // Selectors?
129 // Nonce
130 // Scope?
131 // InterestLifetime?
132
133 Interest a;
134 Interest b;
135
136 // if nonce is not set, it will be set to a random value
137 a.setNonce(1);
138 b.setNonce(1);
139
140 BOOST_CHECK_EQUAL(a == b, true);
141 BOOST_CHECK_EQUAL(a != b, false);
142
143 // check comparison on Name
144 a.setName("ndn:/A");
145 BOOST_CHECK_EQUAL(a == b, false);
146 BOOST_CHECK_EQUAL(a != b, true);
147
148 b.setName("ndn:/B");
149 BOOST_CHECK_EQUAL(a == b, false);
150 BOOST_CHECK_EQUAL(a != b, true);
151
152 b.setName("ndn:/A");
153 BOOST_CHECK_EQUAL(a == b, true);
154 BOOST_CHECK_EQUAL(a != b, false);
155
156 // check comparison on Selectors
157 a.setChildSelector(1);
158 BOOST_CHECK_EQUAL(a == b, false);
159 BOOST_CHECK_EQUAL(a != b, true);
160
161 b.setChildSelector(1);
162 BOOST_CHECK_EQUAL(a == b, true);
163 BOOST_CHECK_EQUAL(a != b, false);
164
165 // check comparison on Nonce
166 a.setNonce(100);
167 BOOST_CHECK_EQUAL(a == b, false);
168 BOOST_CHECK_EQUAL(a != b, true);
169
170 b.setNonce(100);
171 BOOST_CHECK_EQUAL(a == b, true);
172 BOOST_CHECK_EQUAL(a != b, false);
173
174 // check comparison on Nonce
175 a.setScope(1);
176 BOOST_CHECK_EQUAL(a == b, false);
177 BOOST_CHECK_EQUAL(a != b, true);
178
179 b.setScope(1);
180 BOOST_CHECK_EQUAL(a == b, true);
181 BOOST_CHECK_EQUAL(a != b, false);
182
183 // check comparison on InterestLifetime
184 a.setInterestLifetime(time::seconds(10));
185 BOOST_CHECK_EQUAL(a == b, false);
186 BOOST_CHECK_EQUAL(a != b, true);
187
188 b.setInterestLifetime(time::seconds(10));
189 BOOST_CHECK_EQUAL(a == b, true);
190 BOOST_CHECK_EQUAL(a != b, false);
191}
192
193BOOST_AUTO_TEST_CASE(SelectorsEqualityChecks)
194{
195 // Selectors ::= SELECTORS-TYPE TLV-LENGTH
196 // MinSuffixComponents?
197 // MaxSuffixComponents?
198 // PublisherPublicKeyLocator?
199 // Exclude?
200 // ChildSelector?
201 // MustBeFresh?
202
203 Selectors a;
204 Selectors b;
205 BOOST_CHECK_EQUAL(a == b, true);
206 BOOST_CHECK_EQUAL(a != b, false);
207
208 // MinSuffixComponents
209 a.setMinSuffixComponents(1);
210 BOOST_CHECK_EQUAL(a == b, false);
211 BOOST_CHECK_EQUAL(a != b, true);
212
213 b.setMinSuffixComponents(2);
214 BOOST_CHECK_EQUAL(a == b, false);
215 BOOST_CHECK_EQUAL(a != b, true);
216
217 b.setMinSuffixComponents(1);
218 BOOST_CHECK_EQUAL(a == b, true);
219 BOOST_CHECK_EQUAL(a != b, false);
220
221 // MaxSuffixComponents
222 a.setMaxSuffixComponents(10);
223 BOOST_CHECK_EQUAL(a == b, false);
224 BOOST_CHECK_EQUAL(a != b, true);
225
226 b.setMaxSuffixComponents(10);
227 BOOST_CHECK_EQUAL(a == b, true);
228 BOOST_CHECK_EQUAL(a != b, false);
229
230 // PublisherPublicKeyLocator
231 a.setPublisherPublicKeyLocator(KeyLocator("/key/Locator/name"));
232 BOOST_CHECK_EQUAL(a == b, false);
233 BOOST_CHECK_EQUAL(a != b, true);
234
235 b.setPublisherPublicKeyLocator(KeyLocator("/key/Locator/name"));
236 BOOST_CHECK_EQUAL(a == b, true);
237 BOOST_CHECK_EQUAL(a != b, false);
238
239 // Exclude
240 a.setExclude(Exclude().excludeOne(name::Component("exclude")));
241 BOOST_CHECK_EQUAL(a == b, false);
242 BOOST_CHECK_EQUAL(a != b, true);
243
244 b.setExclude(Exclude().excludeOne(name::Component("exclude")));
245 BOOST_CHECK_EQUAL(a == b, true);
246 BOOST_CHECK_EQUAL(a != b, false);
247
248 // ChildSelector
249 a.setChildSelector(1);
250 BOOST_CHECK_EQUAL(a == b, false);
251 BOOST_CHECK_EQUAL(a != b, true);
252
253 b.setChildSelector(1);
254 BOOST_CHECK_EQUAL(a == b, true);
255 BOOST_CHECK_EQUAL(a != b, false);
256
257 // MustBeFresh
258 a.setMustBeFresh(true);
259 BOOST_CHECK_EQUAL(a == b, false);
260 BOOST_CHECK_EQUAL(a != b, true);
261
262 b.setMustBeFresh(true);
263 BOOST_CHECK_EQUAL(a == b, true);
264 BOOST_CHECK_EQUAL(a != b, false);
265}
266
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700267BOOST_AUTO_TEST_CASE(Decode)
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800268{
269 Block interestBlock(Interest1, sizeof(Interest1));
Alexander Afanasyev636e9f12014-01-07 12:01:03 -0800270
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800271 ndn::Interest i;
Alexander Afanasyev049f8f72013-12-26 19:07:15 -0800272 BOOST_REQUIRE_NO_THROW(i.wireDecode(interestBlock));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800273
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700274 BOOST_CHECK_EQUAL(i.getName().toUri(), "/local/ndn/prefix");
275 BOOST_CHECK_EQUAL(i.getScope(), 1);
276 BOOST_CHECK_EQUAL(i.getInterestLifetime(), time::milliseconds(1000));
277 BOOST_CHECK_EQUAL(i.getMinSuffixComponents(), 1);
278 BOOST_CHECK_EQUAL(i.getMaxSuffixComponents(), 1);
279 BOOST_CHECK_EQUAL(i.getPublisherPublicKeyLocator().getType(),
280 static_cast<uint32_t>(KeyLocator::KeyLocator_Name));
281 BOOST_CHECK_EQUAL(i.getPublisherPublicKeyLocator().getName(), "ndn:/test/key/locator");
282 BOOST_CHECK_EQUAL(i.getChildSelector(), 1);
283 BOOST_CHECK_EQUAL(i.getMustBeFresh(), false);
284 BOOST_CHECK_EQUAL(i.getExclude().toUri(), "alex,xxxx,*,yyyy");
285 BOOST_CHECK_EQUAL(i.getNonce(), 1U);
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800286}
287
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700288BOOST_AUTO_TEST_CASE(DecodeFromStream)
Alexander Afanasyev6835ad82014-02-12 10:07:20 -0800289{
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -0700290 boost::iostreams::stream<boost::iostreams::array_source> is(
291 reinterpret_cast<const char *>(Interest1), sizeof(Interest1));
Junxiao Shib332e782014-03-31 14:23:46 -0700292
Alexander Afanasyev9c578182014-05-14 17:28:28 -0700293 Block interestBlock = Block::fromStream(is);
Alexander Afanasyev6835ad82014-02-12 10:07:20 -0800294
295 ndn::Interest i;
296 BOOST_REQUIRE_NO_THROW(i.wireDecode(interestBlock));
297
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700298 BOOST_CHECK_EQUAL(i.getName().toUri(), "/local/ndn/prefix");
299 BOOST_CHECK_EQUAL(i.getScope(), 1);
300 BOOST_CHECK_EQUAL(i.getInterestLifetime(), time::milliseconds(1000));
301 BOOST_CHECK_EQUAL(i.getMinSuffixComponents(), 1);
302 BOOST_CHECK_EQUAL(i.getMaxSuffixComponents(), 1);
303 BOOST_CHECK_EQUAL(i.getChildSelector(), 1);
304 BOOST_CHECK_EQUAL(i.getMustBeFresh(), false);
305 BOOST_CHECK_EQUAL(i.getExclude().toUri(), "alex,xxxx,*,yyyy");
306 BOOST_CHECK_EQUAL(i.getNonce(), 1U);
Alexander Afanasyev6835ad82014-02-12 10:07:20 -0800307}
308
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700309BOOST_AUTO_TEST_CASE(Encode)
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800310{
311 ndn::Interest i(ndn::Name("/local/ndn/prefix"));
312 i.setScope(1);
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700313 i.setInterestLifetime(time::milliseconds(1000));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800314 i.setMinSuffixComponents(1);
315 i.setMaxSuffixComponents(1);
Junxiao Shib332e782014-03-31 14:23:46 -0700316 i.setPublisherPublicKeyLocator(KeyLocator("ndn:/test/key/locator"));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800317 i.setChildSelector(1);
318 i.setMustBeFresh(false);
Alexander Afanasyevc348f832014-02-17 16:35:17 -0800319 Exclude exclude;
320 exclude
Alexander Afanasyev52eb20d2014-02-06 18:25:54 -0800321 .excludeOne(name::Component("alex"))
322 .excludeRange(name::Component("xxxx"), name::Component("yyyy"));
Alexander Afanasyevc348f832014-02-17 16:35:17 -0800323 i.setExclude(exclude);
Alexander Afanasyev840139f2013-12-28 15:02:50 -0800324 i.setNonce(1);
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800325
Alexander Afanasyeve881e932014-06-08 14:47:03 +0300326 BOOST_CHECK_EQUAL(i.hasWire(), false);
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800327 const Block &wire = i.wireEncode();
Alexander Afanasyeve881e932014-06-08 14:47:03 +0300328 BOOST_CHECK_EQUAL(i.hasWire(), true);
Alexander Afanasyev809805d2014-02-17 17:20:33 -0800329
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700330 BOOST_CHECK_EQUAL_COLLECTIONS(Interest1, Interest1 + sizeof(Interest1),
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800331 wire.begin(), wire.end());
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800332
Alexander Afanasyeve881e932014-06-08 14:47:03 +0300333 const uint8_t* originalWire = wire.wire();
334 i.setNonce(2);
335 BOOST_CHECK_EQUAL(i.hasWire(), true);
336 BOOST_CHECK_EQUAL(originalWire, i.wireEncode().wire());
337 BOOST_CHECK_EQUAL(i.hasWire(), true);
338
339 BOOST_CHECK_EQUAL_COLLECTIONS(Interest2, Interest2 + sizeof(Interest2),
340 wire.begin(), wire.end());
Alexander Afanasyeva0c5f832014-06-19 13:27:56 -0700341
342 std::ostringstream strStream;
343 BOOST_CHECK_NO_THROW(strStream << i);
344
345 BOOST_CHECK_EQUAL(strStream.str(),
346 "/local/ndn/prefix?"
347 "ndn.MinSuffixComponents=1&ndn.MaxSuffixComponents=1&"
348 "ndn.ChildSelector=1&ndn.Scope=1&"
349 "ndn.InterestLifetime=1000&"
350 "ndn.Nonce=2&ndn.Exclude=alex,xxxx,*,yyyy");
Alexander Afanasyevc3932172014-07-10 18:53:56 -0700351
352 i.refreshNonce();
353 BOOST_CHECK_EQUAL(i.hasWire(), true);
354 BOOST_CHECK_EQUAL(originalWire, i.wireEncode().wire());
355 BOOST_CHECK_NE(i.getNonce(), 2);
Alexander Afanasyeve881e932014-06-08 14:47:03 +0300356}
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800357
358BOOST_AUTO_TEST_CASE(EncodeWithLocalHeader)
359{
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800360 ndn::Interest interest(ndn::Name("/local/ndn/prefix"));
361 interest.setMustBeFresh(true);
362 interest.setIncomingFaceId(10);
363 interest.setNonce(1);
Junxiao Shib332e782014-03-31 14:23:46 -0700364
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800365 BOOST_CHECK(!interest.hasWire());
Junxiao Shib332e782014-03-31 14:23:46 -0700366
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800367 Block headerBlock = interest.getLocalControlHeader().wireEncode(interest, true, true);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800368
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800369 BOOST_CHECK(interest.hasWire());
370 BOOST_CHECK(headerBlock.hasWire());
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800371
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800372 BOOST_CHECK_NE(headerBlock.wire(), interest.wireEncode().wire());
373 BOOST_CHECK_NE(headerBlock.size(), interest.wireEncode().size());
374 BOOST_CHECK_EQUAL(headerBlock.size(), 5);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800375
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800376 BOOST_CHECK_EQUAL_COLLECTIONS(InterestWithLocalControlHeader,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700377 InterestWithLocalControlHeader + 5,
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800378 headerBlock.begin(), headerBlock.end());
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800379
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800380 interest.setNonce(1000);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800381
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800382 Block updatedHeaderBlock = interest.getLocalControlHeader().wireEncode(interest, true, true);
383 BOOST_CHECK_EQUAL(updatedHeaderBlock.size(), 5);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800384
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800385 // only length should have changed
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700386 BOOST_CHECK_EQUAL_COLLECTIONS(updatedHeaderBlock.begin() + 2, updatedHeaderBlock.end(),
387 headerBlock.begin() + 2, headerBlock.end());
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800388
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800389 // updating IncomingFaceId that keeps the length
390 interest.setIncomingFaceId(100);
391 updatedHeaderBlock = interest.getLocalControlHeader().wireEncode(interest, true, true);
392 BOOST_CHECK_EQUAL(updatedHeaderBlock.size(), 5);
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700393 BOOST_CHECK_NE(*(updatedHeaderBlock.begin() + 4), *(headerBlock.begin() + 4));
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800394
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800395 // updating IncomingFaceId that increases the length by 2
396 interest.setIncomingFaceId(1000);
397 updatedHeaderBlock = interest.getLocalControlHeader().wireEncode(interest, true, true);
398 BOOST_CHECK_EQUAL(updatedHeaderBlock.size(), 6);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800399
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800400 // adding NextHopId
401 interest.setNextHopFaceId(1);
402 updatedHeaderBlock = interest.getLocalControlHeader().wireEncode(interest, true, true);
403 BOOST_CHECK_EQUAL(updatedHeaderBlock.size(), 9);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800404
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800405 // masking IncomingFaceId
406 updatedHeaderBlock = interest.getLocalControlHeader().wireEncode(interest, false, true);
407 BOOST_CHECK_EQUAL(updatedHeaderBlock.size(), 5);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800408
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800409 // masking NextHopId
410 updatedHeaderBlock = interest.getLocalControlHeader().wireEncode(interest, true, false);
411 BOOST_CHECK_EQUAL(updatedHeaderBlock.size(), 6);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800412
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800413 // masking everything
414 BOOST_CHECK_THROW(interest.getLocalControlHeader().wireEncode(interest, false, false),
415 nfd::LocalControlHeader::Error);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800416}
417
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800418
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700419BOOST_AUTO_TEST_CASE(DecodeWithLocalHeader)
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800420{
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800421 Block wireBlock(InterestWithLocalControlHeader, sizeof(InterestWithLocalControlHeader));
422 const Block& payload = nfd::LocalControlHeader::getPayload(wireBlock);
423 BOOST_REQUIRE_NE(&payload, &wireBlock);
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800424
Steve DiBenedetto54ce6682014-07-22 13:22:57 -0600425 BOOST_CHECK_EQUAL(payload.type(), static_cast<uint32_t>(tlv::Interest));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700426 BOOST_CHECK_EQUAL(wireBlock.type(), static_cast<uint32_t>(tlv::nfd::LocalControlHeader));
Junxiao Shib332e782014-03-31 14:23:46 -0700427
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800428 Interest interest(payload);
429 BOOST_CHECK(!interest.getLocalControlHeader().hasIncomingFaceId());
430 BOOST_CHECK(!interest.getLocalControlHeader().hasNextHopFaceId());
431
432 BOOST_REQUIRE_NO_THROW(interest.getLocalControlHeader().wireDecode(wireBlock));
433
434 BOOST_CHECK_EQUAL(interest.getLocalControlHeader().wireEncode(interest, true, true).size(), 5);
Junxiao Shib332e782014-03-31 14:23:46 -0700435
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800436 BOOST_CHECK_EQUAL(interest.getIncomingFaceId(), 10);
437 BOOST_CHECK(!interest.getLocalControlHeader().hasNextHopFaceId());
438
439 BOOST_CHECK_THROW(interest.getLocalControlHeader().wireEncode(interest, false, false),
440 nfd::LocalControlHeader::Error);
441
442 BOOST_CHECK_THROW(interest.getLocalControlHeader().wireEncode(interest, false, true),
443 nfd::LocalControlHeader::Error);
444
445 BOOST_CHECK_NO_THROW(interest.getLocalControlHeader().wireEncode(interest, true, false));
446 BOOST_CHECK_NO_THROW(interest.getLocalControlHeader().wireEncode(interest, true, true));
Junxiao Shib332e782014-03-31 14:23:46 -0700447
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800448 BOOST_CHECK_NE((void*)interest.getLocalControlHeader().wireEncode(interest, true, true).wire(),
449 (void*)wireBlock.wire());
450
451 BOOST_CHECK_EQUAL(interest.getLocalControlHeader().wireEncode(interest, true, true).size(), 5);
452}
453
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700454BOOST_AUTO_TEST_CASE(DecodeWithoutLocalHeader)
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800455{
456 Block wireBlock(InterestWithoutLocalControlHeader, sizeof(InterestWithoutLocalControlHeader));
457 const Block& payload = nfd::LocalControlHeader::getPayload(wireBlock);
458 BOOST_CHECK_EQUAL(&payload, &wireBlock);
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800459}
460
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700461BOOST_AUTO_TEST_CASE(MatchesData)
462{
463 Interest interest;
464 interest.setName("ndn:/A")
465 .setMinSuffixComponents(2)
466 .setMaxSuffixComponents(2)
467 .setPublisherPublicKeyLocator(KeyLocator("ndn:/B"))
468 .setExclude(Exclude().excludeBefore(name::Component("C")));
469
470 Data data("ndn:/A/D");
Yingdi Yu4a557052014-07-09 16:40:37 -0700471 SignatureSha256WithRsa signature(KeyLocator("ndn:/B"));
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700472 data.setSignature(signature);
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700473 data.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700474 BOOST_CHECK_EQUAL(interest.matchesData(data), true);
475
476 Data data1 = data;
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700477 data1.setName("ndn:/A"); // violates MinSuffixComponents
478 data1.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700479 BOOST_CHECK_EQUAL(interest.matchesData(data1), false);
480
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700481 interest.setMinSuffixComponents(1);
482 BOOST_CHECK_EQUAL(interest.matchesData(data1), true);
483 interest.setMinSuffixComponents(2);
484
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700485 Data data2 = data;
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700486 data2.setName("ndn:/A/E/F"); // violates MaxSuffixComponents
487 data2.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700488 BOOST_CHECK_EQUAL(interest.matchesData(data2), false);
489
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700490 interest.setMaxSuffixComponents(3);
491 BOOST_CHECK_EQUAL(interest.matchesData(data2), true);
492 interest.setMaxSuffixComponents(2);
493
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700494 Data data3 = data;
Yingdi Yu4a557052014-07-09 16:40:37 -0700495 SignatureSha256WithRsa signature3(KeyLocator("ndn:/G")); // violates PublisherPublicKeyLocator
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700496 data3.setSignature(signature3);
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700497 data3.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700498 BOOST_CHECK_EQUAL(interest.matchesData(data3), false);
499
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700500 interest.setPublisherPublicKeyLocator(KeyLocator("ndn:/G"));
501 BOOST_CHECK_EQUAL(interest.matchesData(data3), true);
502 interest.setPublisherPublicKeyLocator(KeyLocator("ndn:/B"));
503
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700504 Data data4 = data;
Yingdi Yubf6a2812014-06-17 15:32:11 -0700505 DigestSha256 signature4; // violates PublisherPublicKeyLocator
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700506 data4.setSignature(signature4);
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700507 data4.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700508 BOOST_CHECK_EQUAL(interest.matchesData(data4), false);
509
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700510 interest.setPublisherPublicKeyLocator(KeyLocator());
511 BOOST_CHECK_EQUAL(interest.matchesData(data4), true);
512 interest.setPublisherPublicKeyLocator(KeyLocator("ndn:/B"));
513
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700514 Data data5 = data;
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700515 data5.setName("ndn:/A/C"); // violates Exclude
516 data5.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700517 BOOST_CHECK_EQUAL(interest.matchesData(data5), false);
518
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700519 interest.setExclude(Exclude().excludeBefore(name::Component("A")));
520 BOOST_CHECK_EQUAL(interest.matchesData(data5), true);
521 interest.setExclude(Exclude().excludeBefore(name::Component("C")));
522
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700523 Data data6 = data;
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700524 data6.setName("ndn:/H/I"); // violates Name
525 data6.wireEncode();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700526 BOOST_CHECK_EQUAL(interest.matchesData(data6), false);
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700527
528 Data data7 = data;
529 data7.setName("ndn:/A/B");
530 data7.wireEncode();
531
532 interest = Interest()
Alexander Afanasyev56860f52014-11-07 11:51:17 -0800533 .setName("/A/B/sha256digest=D548DECEFC4B880720DC9257A8D815E9DF4465E63742EE55C29133055DAA67C2");
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700534 BOOST_CHECK_EQUAL(interest.matchesData(data7), true);
535
536 interest = Interest()
537 .setName("/A/B/%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00"
538 "%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00");
539 BOOST_CHECK_EQUAL(interest.matchesData(data7), false); // violates implicit digest
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700540}
541
Alexander 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