blob: 3ae6aa15b2f2d3560c5af8156fb584f988cc2124 [file] [log] [blame]
Alexander Afanasyevc169a812014-05-20 20:37:29 -04001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Alexander Afanasyev233750e2014-02-16 00:50:07 -08002/**
Alexander Afanasyev74633892015-02-08 18:08:46 -08003 * Copyright (c) 2013-2015 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 Afanasyev233750e2014-02-16 00:50:07 -080020 */
21
Alexander Afanasyev233750e2014-02-16 00:50:07 -080022#include "encoding/encoding-buffer.hpp"
Alexander Afanasyev258ec2b2014-05-14 16:15:37 -070023#include "encoding/buffer-stream.hpp"
Joao Pereira7476ebf2015-07-07 14:54:39 -040024#include "encoding/block-helpers.hpp"
Alexander Afanasyev233750e2014-02-16 00:50:07 -080025
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070026#include "boost-test.hpp"
Junxiao Shiaf8eeea2014-03-31 20:10:56 -070027
Alexander Afanasyev233750e2014-02-16 00:50:07 -080028namespace ndn {
Alexander Afanasyev74633892015-02-08 18:08:46 -080029namespace tests {
Alexander Afanasyev233750e2014-02-16 00:50:07 -080030
Spyridon Mastorakis429634f2015-02-19 17:35:33 -080031BOOST_AUTO_TEST_SUITE(EncodingBlock)
Alexander Afanasyev233750e2014-02-16 00:50:07 -080032
Alexander Afanasyev74633892015-02-08 18:08:46 -080033class BasicBlockFixture
Alexander Afanasyev2d0b4572014-02-24 16:02:12 -080034{
Alexander Afanasyev74633892015-02-08 18:08:46 -080035public:
Alexander Afanasyev2d0b4572014-02-24 16:02:12 -080036 EncodingBuffer buffer;
37 EncodingEstimator estimator;
Alexander Afanasyev74633892015-02-08 18:08:46 -080038};
Alexander Afanasyev2d0b4572014-02-24 16:02:12 -080039
Alexander Afanasyev74633892015-02-08 18:08:46 -080040BOOST_FIXTURE_TEST_SUITE(Basic, BasicBlockFixture)
Alexander Afanasyev937aa782014-03-21 13:17:57 -070041
Alexander Afanasyev74633892015-02-08 18:08:46 -080042BOOST_AUTO_TEST_CASE(VarNumberOneByte1)
43{
44 size_t s1 = buffer.prependVarNumber(252);
45 size_t s2 = estimator.prependVarNumber(252);
Alexander Afanasyev2d0b4572014-02-24 16:02:12 -080046 BOOST_CHECK_EQUAL(buffer.size(), 1);
47 BOOST_CHECK_EQUAL(s1, 1);
48 BOOST_CHECK_EQUAL(s2, 1);
Alexander Afanasyev74633892015-02-08 18:08:46 -080049}
Alexander Afanasyev937aa782014-03-21 13:17:57 -070050
Alexander Afanasyev74633892015-02-08 18:08:46 -080051BOOST_AUTO_TEST_CASE(VarNumberOneByte2)
52{
53 size_t s1 = buffer.prependVarNumber(253);
54 size_t s2 = estimator.prependVarNumber(253);
Alexander Afanasyev2d0b4572014-02-24 16:02:12 -080055 BOOST_CHECK_EQUAL(buffer.size(), 3);
56 BOOST_CHECK_EQUAL(s1, 3);
57 BOOST_CHECK_EQUAL(s2, 3);
Alexander Afanasyev74633892015-02-08 18:08:46 -080058}
Alexander Afanasyev937aa782014-03-21 13:17:57 -070059
Alexander Afanasyev74633892015-02-08 18:08:46 -080060BOOST_AUTO_TEST_CASE(VarNumberThreeBytes1)
61{
62 size_t s1 = buffer.prependVarNumber(255);
63 size_t s2 = estimator.prependVarNumber(255);
Alexander Afanasyev2d0b4572014-02-24 16:02:12 -080064 BOOST_CHECK_EQUAL(buffer.size(), 3);
65 BOOST_CHECK_EQUAL(s1, 3);
66 BOOST_CHECK_EQUAL(s2, 3);
Alexander Afanasyev74633892015-02-08 18:08:46 -080067}
Alexander Afanasyev2d0b4572014-02-24 16:02:12 -080068
Alexander Afanasyev74633892015-02-08 18:08:46 -080069BOOST_AUTO_TEST_CASE(VarNumberThreeBytes2)
70{
71 size_t s1 = buffer.prependVarNumber(65535);
72 size_t s2 = estimator.prependVarNumber(65535);
Alexander Afanasyev2d0b4572014-02-24 16:02:12 -080073 BOOST_CHECK_EQUAL(buffer.size(), 3);
74 BOOST_CHECK_EQUAL(s1, 3);
75 BOOST_CHECK_EQUAL(s2, 3);
Alexander Afanasyev74633892015-02-08 18:08:46 -080076}
Alexander Afanasyev2d0b4572014-02-24 16:02:12 -080077
Alexander Afanasyev74633892015-02-08 18:08:46 -080078BOOST_AUTO_TEST_CASE(VarNumberFiveBytes1)
79{
80 size_t s1 = buffer.prependVarNumber(65536);
81 size_t s2 = estimator.prependVarNumber(65536);
Alexander Afanasyev2d0b4572014-02-24 16:02:12 -080082 BOOST_CHECK_EQUAL(buffer.size(), 5);
83 BOOST_CHECK_EQUAL(s1, 5);
84 BOOST_CHECK_EQUAL(s2, 5);
Alexander Afanasyev74633892015-02-08 18:08:46 -080085}
Alexander Afanasyev937aa782014-03-21 13:17:57 -070086
Alexander Afanasyev74633892015-02-08 18:08:46 -080087BOOST_AUTO_TEST_CASE(VarNumberFiveBytes2)
88{
89 size_t s1 = buffer.prependVarNumber(4294967295LL);
90 size_t s2 = estimator.prependVarNumber(4294967295LL);
Alexander Afanasyev2d0b4572014-02-24 16:02:12 -080091 BOOST_CHECK_EQUAL(buffer.size(), 5);
92 BOOST_CHECK_EQUAL(s1, 5);
93 BOOST_CHECK_EQUAL(s2, 5);
Alexander Afanasyev74633892015-02-08 18:08:46 -080094}
Alexander Afanasyev2d0b4572014-02-24 16:02:12 -080095
Alexander Afanasyev74633892015-02-08 18:08:46 -080096BOOST_AUTO_TEST_CASE(VarNumberNineBytes)
97{
98 size_t s1 = buffer.prependVarNumber(4294967296LL);
99 size_t s2 = estimator.prependVarNumber(4294967296LL);
Alexander Afanasyev2d0b4572014-02-24 16:02:12 -0800100 BOOST_CHECK_EQUAL(buffer.size(), 9);
101 BOOST_CHECK_EQUAL(s1, 9);
102 BOOST_CHECK_EQUAL(s2, 9);
Alexander Afanasyev74633892015-02-08 18:08:46 -0800103}
Alexander Afanasyev2d0b4572014-02-24 16:02:12 -0800104
Alexander Afanasyev74633892015-02-08 18:08:46 -0800105BOOST_AUTO_TEST_CASE(NonNegativeNumberOneByte1)
106{
107 size_t s1 = buffer.prependNonNegativeInteger(252);
108 size_t s2 = estimator.prependNonNegativeInteger(252);
Alexander Afanasyev2d0b4572014-02-24 16:02:12 -0800109 BOOST_CHECK_EQUAL(buffer.size(), 1);
110 BOOST_CHECK_EQUAL(s1, 1);
111 BOOST_CHECK_EQUAL(s2, 1);
Alexander Afanasyev74633892015-02-08 18:08:46 -0800112}
Alexander Afanasyev937aa782014-03-21 13:17:57 -0700113
Alexander Afanasyev74633892015-02-08 18:08:46 -0800114BOOST_AUTO_TEST_CASE(NonNegativeNumberOneByte2)
115{
116 size_t s1 = buffer.prependNonNegativeInteger(255);
117 size_t s2 = estimator.prependNonNegativeInteger(255);
Alexander Afanasyev2d0b4572014-02-24 16:02:12 -0800118 BOOST_CHECK_EQUAL(buffer.size(), 1);
119 BOOST_CHECK_EQUAL(s1, 1);
120 BOOST_CHECK_EQUAL(s2, 1);
Alexander Afanasyev74633892015-02-08 18:08:46 -0800121}
Alexander Afanasyev937aa782014-03-21 13:17:57 -0700122
Alexander Afanasyev74633892015-02-08 18:08:46 -0800123BOOST_AUTO_TEST_CASE(NonNegativeNumberTwoBytes1)
124{
125 size_t s1 = buffer.prependNonNegativeInteger(256);
126 size_t s2 = estimator.prependNonNegativeInteger(256);
Alexander Afanasyev2d0b4572014-02-24 16:02:12 -0800127 BOOST_CHECK_EQUAL(buffer.size(), 2);
128 BOOST_CHECK_EQUAL(s1, 2);
129 BOOST_CHECK_EQUAL(s2, 2);
Alexander Afanasyev74633892015-02-08 18:08:46 -0800130}
Alexander Afanasyev2d0b4572014-02-24 16:02:12 -0800131
Alexander Afanasyev74633892015-02-08 18:08:46 -0800132BOOST_AUTO_TEST_CASE(NonNegativeNumberTwoBytes2)
133{
134 size_t s1 = buffer.prependNonNegativeInteger(65535);
135 size_t s2 = estimator.prependNonNegativeInteger(65535);
Alexander Afanasyev2d0b4572014-02-24 16:02:12 -0800136 BOOST_CHECK_EQUAL(buffer.size(), 2);
137 BOOST_CHECK_EQUAL(s1, 2);
138 BOOST_CHECK_EQUAL(s2, 2);
Alexander Afanasyev74633892015-02-08 18:08:46 -0800139}
Alexander Afanasyev2d0b4572014-02-24 16:02:12 -0800140
Alexander Afanasyev74633892015-02-08 18:08:46 -0800141BOOST_AUTO_TEST_CASE(NonNegativeNumberFourBytes1)
142{
143 size_t s1 = buffer.prependNonNegativeInteger(65536);
144 size_t s2 = estimator.prependNonNegativeInteger(65536);
Alexander Afanasyev2d0b4572014-02-24 16:02:12 -0800145 BOOST_CHECK_EQUAL(buffer.size(), 4);
146 BOOST_CHECK_EQUAL(s1, 4);
147 BOOST_CHECK_EQUAL(s2, 4);
Alexander Afanasyev74633892015-02-08 18:08:46 -0800148}
Alexander Afanasyev2d0b4572014-02-24 16:02:12 -0800149
Alexander Afanasyev74633892015-02-08 18:08:46 -0800150BOOST_AUTO_TEST_CASE(NonNegativeNumberFourBytes2)
151{
152 size_t s1 = buffer.prependNonNegativeInteger(4294967295LL);
153 size_t s2 = estimator.prependNonNegativeInteger(4294967295LL);
Alexander Afanasyev2d0b4572014-02-24 16:02:12 -0800154 BOOST_CHECK_EQUAL(buffer.size(), 4);
155 BOOST_CHECK_EQUAL(s1, 4);
156 BOOST_CHECK_EQUAL(s2, 4);
Alexander Afanasyev74633892015-02-08 18:08:46 -0800157}
Alexander Afanasyev2d0b4572014-02-24 16:02:12 -0800158
Alexander Afanasyev74633892015-02-08 18:08:46 -0800159BOOST_AUTO_TEST_CASE(NonNegativeNumberEightBytes)
160{
161 size_t s1 = buffer.prependNonNegativeInteger(4294967296LL);
162 size_t s2 = estimator.prependNonNegativeInteger(4294967296LL);
Alexander Afanasyev2d0b4572014-02-24 16:02:12 -0800163 BOOST_CHECK_EQUAL(buffer.size(), 8);
164 BOOST_CHECK_EQUAL(s1, 8);
165 BOOST_CHECK_EQUAL(s2, 8);
Alexander Afanasyev2d0b4572014-02-24 16:02:12 -0800166}
167
Alexander Afanasyev74633892015-02-08 18:08:46 -0800168BOOST_AUTO_TEST_SUITE_END() // Basic
169
Alexander Afanasyev4448d292015-08-09 20:11:37 -0700170BOOST_AUTO_TEST_CASE(BlockFromBlock)
171{
172 static uint8_t buffer[] = {0x80, 0x06, 0x81, 0x01, 0x01, 0x82, 0x01, 0x01};
173 Block block(buffer, sizeof(buffer));
174
175 Block derivedBlock(block, block.begin(), block.end());
176 BOOST_CHECK_EQUAL(derivedBlock.wire(), block.wire()); // pointers should match
177 BOOST_CHECK(derivedBlock == block); // blocks should match
178
179 derivedBlock = Block(block, block.begin() + 2, block.begin() + 5);
180 BOOST_CHECK(derivedBlock.begin() == block.begin() + 2);
181 BOOST_CHECK(derivedBlock == Block(buffer + 2, 3));
182
183 Buffer otherBuffer(buffer, sizeof(buffer));
184 BOOST_CHECK_THROW(Block(block, otherBuffer.begin(), block.end()), Block::Error);
185 BOOST_CHECK_THROW(Block(block, block.begin(), otherBuffer.end()), Block::Error);
186 BOOST_CHECK_THROW(Block(block, otherBuffer.begin(), otherBuffer.end()), Block::Error);
187}
188
Alexander Afanasyev937aa782014-03-21 13:17:57 -0700189BOOST_AUTO_TEST_CASE(EncodingBufferToBlock)
Alexander Afanasyev233750e2014-02-16 00:50:07 -0800190{
191 uint8_t value[4];
192
Alexander Afanasyev15151312014-02-16 00:53:51 -0800193 EncodingBuffer buffer;
Alexander Afanasyev233750e2014-02-16 00:50:07 -0800194 size_t length = buffer.prependByteArray(value, sizeof(value));
195 buffer.prependVarNumber(length);
196 buffer.prependVarNumber(0xe0);
197
198 Block block;
199 BOOST_REQUIRE_NO_THROW(block = buffer.block());
200 BOOST_CHECK_EQUAL(block.type(), 0xe0);
201 BOOST_CHECK_EQUAL(block.value_size(), sizeof(value));
Alexander Afanasyev15151312014-02-16 00:53:51 -0800202
203 BOOST_REQUIRE_NO_THROW(block = Block(buffer));
204 BOOST_CHECK_EQUAL(block.type(), 0xe0);
205 BOOST_CHECK_EQUAL(block.value_size(), sizeof(value));
206}
207
Alexander Afanasyev937aa782014-03-21 13:17:57 -0700208BOOST_AUTO_TEST_CASE(BlockToBuffer)
Alexander Afanasyev15151312014-02-16 00:53:51 -0800209{
210 shared_ptr<Buffer> buf = make_shared<Buffer>(10);
211 for (int i = 0; i < 10; i++) (*buf)[i] = i;
Alexander Afanasyev937aa782014-03-21 13:17:57 -0700212
Alexander Afanasyev15151312014-02-16 00:53:51 -0800213 Block block(0xab, buf);
214 block.encode();
215
Alexander Afanasyev74633892015-02-08 18:08:46 -0800216 {
217 BOOST_REQUIRE_NO_THROW(EncodingBuffer(block));
218 EncodingBuffer buffer(block);
219 BOOST_CHECK_EQUAL(buffer.size(), 12);
220 BOOST_CHECK_EQUAL(buffer.capacity(), 12);
221 }
Alexander Afanasyev15151312014-02-16 00:53:51 -0800222
223 (*buf)[1] = 0xe0;
224 (*buf)[2] = 2;
225 BOOST_REQUIRE_NO_THROW(block = Block(buf, buf->begin() + 1, buf->begin() + 5));
226 BOOST_CHECK_EQUAL(block.type(), 0xe0);
227
Alexander Afanasyev74633892015-02-08 18:08:46 -0800228 {
229 BOOST_REQUIRE_NO_THROW(EncodingBuffer(block));
230 EncodingBuffer buffer(block);
231 BOOST_CHECK_EQUAL(buffer.size(), 4);
232 BOOST_CHECK_EQUAL(buffer.capacity(), 10);
233 }
Alexander Afanasyev233750e2014-02-16 00:50:07 -0800234}
235
Alexander Afanasyev937aa782014-03-21 13:17:57 -0700236BOOST_AUTO_TEST_CASE(FromBuffer)
237{
238 const uint8_t TEST_BUFFER[] = {0x00, 0x01, 0xfa, // ok
239 0x01, 0x01, 0xfb, // ok
240 0x03, 0x02, 0xff}; // not ok
241 BufferPtr buffer(new Buffer(TEST_BUFFER, sizeof(TEST_BUFFER)));
242
243 // using BufferPtr (avoids memory copy)
244 size_t offset = 0;
Junxiao Shi02a4bf32015-02-21 21:07:46 -0700245 bool isOk = false;
Alexander Afanasyev937aa782014-03-21 13:17:57 -0700246 Block testBlock;
Junxiao Shi02a4bf32015-02-21 21:07:46 -0700247 std::tie(isOk, testBlock) = Block::fromBuffer(buffer, offset);
248 BOOST_CHECK(isOk);
Alexander Afanasyev937aa782014-03-21 13:17:57 -0700249 BOOST_CHECK_EQUAL(testBlock.type(), 0);
250 BOOST_CHECK_EQUAL(testBlock.size(), 3);
251 BOOST_CHECK_EQUAL(testBlock.value_size(), 1);
252 BOOST_CHECK_EQUAL(*testBlock.wire(), 0x00);
253 BOOST_CHECK_EQUAL(*testBlock.value(), 0xfa);
254 offset += testBlock.size();
255
Junxiao Shi02a4bf32015-02-21 21:07:46 -0700256 std::tie(isOk, testBlock) = Block::fromBuffer(buffer, offset);
257 BOOST_CHECK(isOk);
Alexander Afanasyev937aa782014-03-21 13:17:57 -0700258 BOOST_CHECK_EQUAL(testBlock.type(), 1);
259 BOOST_CHECK_EQUAL(testBlock.size(), 3);
260 BOOST_CHECK_EQUAL(testBlock.value_size(), 1);
261 BOOST_CHECK_EQUAL(*testBlock.wire(), 0x01);
262 BOOST_CHECK_EQUAL(*testBlock.value(), 0xfb);
263 offset += testBlock.size();
264
Junxiao Shi02a4bf32015-02-21 21:07:46 -0700265 std::tie(isOk, testBlock) = Block::fromBuffer(buffer, offset);
266 BOOST_CHECK(!isOk);
Alexander Afanasyev937aa782014-03-21 13:17:57 -0700267
268 // just buffer, copies memory
269 offset = 0;
Junxiao Shi02a4bf32015-02-21 21:07:46 -0700270 std::tie(isOk, testBlock) = Block::fromBuffer(TEST_BUFFER + offset,
271 sizeof(TEST_BUFFER) - offset);
272 BOOST_CHECK(isOk);
Alexander Afanasyev937aa782014-03-21 13:17:57 -0700273 BOOST_CHECK_EQUAL(testBlock.type(), 0);
274 BOOST_CHECK_EQUAL(testBlock.size(), 3);
275 BOOST_CHECK_EQUAL(testBlock.value_size(), 1);
276 BOOST_CHECK_EQUAL(*testBlock.wire(), 0x00);
277 BOOST_CHECK_EQUAL(*testBlock.value(), 0xfa);
278 offset += testBlock.size();
279
Junxiao Shi02a4bf32015-02-21 21:07:46 -0700280 std::tie(isOk, testBlock) = Block::fromBuffer(TEST_BUFFER + offset,
281 sizeof(TEST_BUFFER) - offset);
282 BOOST_CHECK(isOk);
Alexander Afanasyev937aa782014-03-21 13:17:57 -0700283 BOOST_CHECK_EQUAL(testBlock.type(), 1);
284 BOOST_CHECK_EQUAL(testBlock.size(), 3);
285 BOOST_CHECK_EQUAL(testBlock.value_size(), 1);
286 BOOST_CHECK_EQUAL(*testBlock.wire(), 0x01);
287 BOOST_CHECK_EQUAL(*testBlock.value(), 0xfb);
288 offset += testBlock.size();
289
Junxiao Shi02a4bf32015-02-21 21:07:46 -0700290 std::tie(isOk, testBlock) = Block::fromBuffer(TEST_BUFFER + offset,
291 sizeof(TEST_BUFFER) - offset);
292 BOOST_CHECK(!isOk);
Alexander Afanasyev937aa782014-03-21 13:17:57 -0700293}
294
Junxiao Shif0da7892015-04-04 22:16:16 -0700295BOOST_AUTO_TEST_CASE(FromStream)
Alexander Afanasyev21ef2392014-03-25 12:40:22 -0700296{
297 const uint8_t TEST_BUFFER[] = {0x00, 0x01, 0xfa, // ok
298 0x01, 0x01, 0xfb, // ok
299 0x03, 0x02, 0xff}; // not ok
300
301 typedef boost::iostreams::stream<boost::iostreams::array_source> ArrayStream;
302 ArrayStream stream(reinterpret_cast<const char*>(TEST_BUFFER), sizeof(TEST_BUFFER));
303
Alexander Afanasyev9c578182014-05-14 17:28:28 -0700304
Alexander Afanasyev21ef2392014-03-25 12:40:22 -0700305 Block testBlock;
Alexander Afanasyev9c578182014-05-14 17:28:28 -0700306 BOOST_REQUIRE_NO_THROW(testBlock = Block::fromStream(stream));
Alexander Afanasyev21ef2392014-03-25 12:40:22 -0700307 BOOST_CHECK_EQUAL(testBlock.type(), 0);
308 BOOST_CHECK_EQUAL(testBlock.size(), 3);
309 BOOST_CHECK_EQUAL(testBlock.value_size(), 1);
310 BOOST_CHECK_EQUAL(*testBlock.wire(), 0x00);
311 BOOST_CHECK_EQUAL(*testBlock.value(), 0xfa);
312
Alexander Afanasyev9c578182014-05-14 17:28:28 -0700313 BOOST_REQUIRE_NO_THROW(testBlock = Block::fromStream(stream));
Alexander Afanasyev21ef2392014-03-25 12:40:22 -0700314 BOOST_CHECK_EQUAL(testBlock.type(), 1);
315 BOOST_CHECK_EQUAL(testBlock.size(), 3);
316 BOOST_CHECK_EQUAL(testBlock.value_size(), 1);
317 BOOST_CHECK_EQUAL(*testBlock.wire(), 0x01);
318 BOOST_CHECK_EQUAL(*testBlock.value(), 0xfb);
319
Steve DiBenedetto54ce6682014-07-22 13:22:57 -0600320 BOOST_CHECK_THROW(Block::fromStream(stream), tlv::Error);
Alexander Afanasyev21ef2392014-03-25 12:40:22 -0700321}
322
Junxiao Shif0da7892015-04-04 22:16:16 -0700323BOOST_AUTO_TEST_CASE(FromStreamWhitespace) // Bug 2728
324{
325 uint8_t PACKET[] = {
326 0x06, 0x20, // Data
327 0x07, 0x11, // Name
328 0x08, 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, // NameComponent 'hello'
329 0x08, 0x01, 0x31, // NameComponent '1'
330 0x08, 0x05, 0x77, 0x6f, 0x72, 0x6c, 0x64, // NameComponent 'world'
331 0x14, 0x00, // MetaInfo empty
332 0x15, 0x00, // Content empty
333 0x16, 0x05, // SignatureInfo
334 0x1b, 0x01, 0x01, // SignatureType RSA
335 0x1c, 0x00, // KeyLocator empty
336 0x17, 0x00 // SignatureValue empty
337 };
338 // TLV-LENGTH of <Data> is 0x20 which happens to be ASCII whitespace
339
340 std::stringstream stream;
341 stream.write(reinterpret_cast<const char*>(PACKET), sizeof(PACKET));
342 stream.seekg(0);
343
344 Block block = Block::fromStream(stream);
345 BOOST_CHECK_NO_THROW(block.parse());
346}
347
348BOOST_AUTO_TEST_CASE(FromStreamZeroLength) // Bug 2729
349{
350 uint8_t BUFFER[] = { 0x07, 0x00 }; // TLV-LENGTH is zero
351
352 std::stringstream stream;
353 stream.write(reinterpret_cast<const char*>(BUFFER), sizeof(BUFFER));
354 stream.seekg(0);
355
356 Block block;
357 BOOST_CHECK_NO_THROW(block = Block::fromStream(stream));
358 BOOST_CHECK_EQUAL(block.type(), 0x07);
359 BOOST_CHECK_EQUAL(block.value_size(), 0);
360}
361
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700362BOOST_AUTO_TEST_CASE(Equality)
363{
364 BOOST_CONCEPT_ASSERT((boost::EqualityComparable<Block>));
365
366 Block a("\x08\x00", 2);
367 Block b("\x08\x00", 2);;
368 BOOST_CHECK_EQUAL(a == b, true);
369 BOOST_CHECK_EQUAL(a != b, false);
370
371 Block c("\x06\x00", 2);
372 Block d("\x08\x00", 2);;
373 BOOST_CHECK_EQUAL(c == d, false);
374 BOOST_CHECK_EQUAL(c != d, true);
375
376 Block e("\x06\x00", 2);
377 Block f("\x06\x01\xcc", 3);;
378 BOOST_CHECK_EQUAL(e == f, false);
379 BOOST_CHECK_EQUAL(e != f, true);
380}
381
Joao Pereira7476ebf2015-07-07 14:54:39 -0400382BOOST_AUTO_TEST_CASE(InsertBeginning)
383{
384 Block masterBlock(tlv::Name);
385 Block firstBlock = makeStringBlock(tlv::NameComponent, "firstName");
386 Block secondBlock = makeStringBlock(tlv::NameComponent, "secondName");
387 Block thirdBlock = makeStringBlock(tlv::NameComponent, "thirdName");
388
389 BOOST_CHECK_EQUAL(masterBlock.elements_size(), 0);
390 masterBlock.push_back(secondBlock);
391 masterBlock.push_back(thirdBlock);
392 BOOST_CHECK_EQUAL(masterBlock.elements_size(), 2);
393 Block::element_const_iterator it = masterBlock.find(tlv::NameComponent);
394 BOOST_CHECK_EQUAL(*it == secondBlock, true);
395
396 it = masterBlock.insert(it, firstBlock);
397
398 BOOST_CHECK_EQUAL(masterBlock.elements_size(), 3);
399 BOOST_CHECK_EQUAL(*(it + 1) == secondBlock, true);
400 BOOST_CHECK_EQUAL(*(masterBlock.elements_begin()) == firstBlock, true);
401}
402
403BOOST_AUTO_TEST_CASE(InsertEnd)
404{
405 Block masterBlock(tlv::Name);
406 Block firstBlock = makeStringBlock(tlv::NameComponent, "firstName");
407 Block secondBlock = makeStringBlock(tlv::NameComponent, "secondName");
408 Block thirdBlock = makeStringBlock(tlv::NameComponent, "thirdName");
409
410 BOOST_CHECK_EQUAL(masterBlock.elements_size(), 0);
411 masterBlock.push_back(firstBlock);
412 masterBlock.push_back(secondBlock);
413 BOOST_CHECK_EQUAL(masterBlock.elements_size(), 2);
414 Block::element_const_iterator it = masterBlock.elements_end();
415 BOOST_CHECK_EQUAL(*(it - 1) == secondBlock, true);
416
417 it = masterBlock.insert(it, thirdBlock);
418
419 BOOST_CHECK_EQUAL(masterBlock.elements_size(), 3);
420 BOOST_CHECK_EQUAL(*(it - 1) == secondBlock, true);
421 BOOST_CHECK_EQUAL(*(masterBlock.elements_end() - 1) == thirdBlock, true);
422}
423
424BOOST_AUTO_TEST_CASE(InsertMiddle)
425{
426 Block masterBlock(tlv::Name);
427 Block firstBlock = makeStringBlock(tlv::NameComponent, "firstName");
428 Block secondBlock = makeStringBlock(tlv::NameComponent, "secondName");
429 Block thirdBlock = makeStringBlock(tlv::NameComponent, "thirdName");
430
431 BOOST_CHECK_EQUAL(masterBlock.elements_size(), 0);
432 masterBlock.push_back(firstBlock);
433 masterBlock.push_back(thirdBlock);
434 BOOST_CHECK_EQUAL(masterBlock.elements_size(), 2);
435 Block::element_const_iterator it = masterBlock.find(tlv::NameComponent);
436 BOOST_CHECK_EQUAL(*it == firstBlock, true);
437
438 it = masterBlock.insert(it+1, secondBlock);
439
440 BOOST_CHECK_EQUAL(*it == secondBlock, true);
441 BOOST_CHECK_EQUAL(*(it + 1) == thirdBlock, true);
442 BOOST_CHECK_EQUAL(*(it - 1) == firstBlock, true);
443}
444
445BOOST_AUTO_TEST_CASE(EraseSingleElement)
446{
447 Block masterBlock(tlv::Name);
448 Block firstBlock = makeStringBlock(tlv::NameComponent, "firstName");
449 Block secondBlock = makeStringBlock(tlv::NameComponent, "secondName");
450 Block thirdBlock = makeStringBlock(tlv::NameComponent, "thirdName");
451
452 BOOST_CHECK_EQUAL(masterBlock.elements_size(), 0);
453 masterBlock.push_back(firstBlock);
454 masterBlock.push_back(secondBlock);
455 masterBlock.push_back(thirdBlock);
456 BOOST_CHECK_EQUAL(masterBlock.elements_size(), 3);
457 Block::element_const_iterator it = masterBlock.find(tlv::NameComponent);
458 it++;
459 BOOST_CHECK_EQUAL(*it == secondBlock, true);
460
461 it = masterBlock.erase(it);
462
463 BOOST_CHECK_EQUAL(masterBlock.elements_size(), 2);
464 BOOST_CHECK_EQUAL(*(it) == thirdBlock, true);
465 BOOST_CHECK_EQUAL(*(it - 1) == firstBlock, true);
466}
467
468BOOST_AUTO_TEST_CASE(EraseRange)
469{
470 Block masterBlock(tlv::Name);
471 Block firstBlock = makeStringBlock(tlv::NameComponent, "firstName");
472 Block secondBlock = makeStringBlock(tlv::NameComponent, "secondName");
473 Block thirdBlock = makeStringBlock(tlv::NameComponent, "thirdName");
474 Block fourthBlock = makeStringBlock(tlv::NameComponent, "fourthName");
475 Block fifthBlock = makeStringBlock(tlv::NameComponent, "fifthName");
476 Block sixthBlock = makeStringBlock(tlv::NameComponent, "sixthName");
477
478 BOOST_CHECK_EQUAL(masterBlock.elements_size(), 0);
479 masterBlock.push_back(firstBlock);
480 masterBlock.push_back(secondBlock);
481 masterBlock.push_back(thirdBlock);
482 masterBlock.push_back(fourthBlock);
483 masterBlock.push_back(fifthBlock);
484 masterBlock.push_back(sixthBlock);
485 BOOST_CHECK_EQUAL(masterBlock.elements_size(), 6);
486 Block::element_const_iterator itStart = masterBlock.find(tlv::NameComponent);
487 itStart++;
488 Block::element_const_iterator itEnd = itStart + 3;
489 BOOST_CHECK_EQUAL(*itStart == secondBlock, true);
490 BOOST_CHECK_EQUAL(*itEnd == fifthBlock, true);
491
492 Block::element_const_iterator newIt = masterBlock.erase(itStart, itEnd);
493
494 BOOST_CHECK_EQUAL(masterBlock.elements_size(), 3);
495 BOOST_CHECK_EQUAL(*(newIt) == fifthBlock, true);
496 BOOST_CHECK_EQUAL(*(newIt - 1) == firstBlock, true);
497}
498
Eric Newberrya3d9fc02015-07-26 10:55:44 -0700499BOOST_AUTO_TEST_CASE(Remove)
500{
501 Block block(tlv::Data);
502 block.push_back(makeNonNegativeIntegerBlock(tlv::ContentType, 0));
503 block.push_back(makeNonNegativeIntegerBlock(tlv::FreshnessPeriod, 123));
504 block.push_back(makeStringBlock(tlv::Name, "ndn:/test-prefix"));
505 block.push_back(makeNonNegativeIntegerBlock(tlv::ContentType, 2));
506 block.push_back(makeNonNegativeIntegerBlock(tlv::ContentType, 1));
507
508 BOOST_CHECK_EQUAL(5, block.elements_size());
509 BOOST_REQUIRE_NO_THROW(block.remove(tlv::ContentType));
510 BOOST_CHECK_EQUAL(2, block.elements_size());
511
512 Block::element_container elements = block.elements();
513
514 BOOST_CHECK_EQUAL(tlv::FreshnessPeriod, elements[0].type());
515 BOOST_CHECK_EQUAL(123, readNonNegativeInteger(elements[0]));
516 BOOST_CHECK_EQUAL(tlv::Name, elements[1].type());
517 BOOST_CHECK(readString(elements[1]).compare("ndn:/test-prefix") == 0);
518}
519
Alexander Afanasyev233750e2014-02-16 00:50:07 -0800520BOOST_AUTO_TEST_SUITE_END()
521
Alexander Afanasyev74633892015-02-08 18:08:46 -0800522} // namespace tests
Alexander Afanasyev233750e2014-02-16 00:50:07 -0800523} // namespace ndn