blob: fda45cae16a3e7c2a7da8df32e2911c796c26e29 [file] [log] [blame]
Alexander Afanasyevc169a812014-05-20 20:37:29 -04001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Junxiao Shidb7464d2017-07-13 03:11:17 +00002/*
Davide Pesavento5f6865c2021-04-23 23:24:11 -04003 * Copyright (c) 2013-2021 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
Davide Pesavento7e780642018-11-24 15:51:34 -050022#include "ndn-cxx/encoding/block.hpp"
23#include "ndn-cxx/encoding/block-helpers.hpp"
Alexander Afanasyev233750e2014-02-16 00:50:07 -080024
Davide Pesavento7e780642018-11-24 15:51:34 -050025#include "tests/boost-test.hpp"
26
Junxiao Shi72c0c642018-04-20 15:41:09 +000027#include <boost/lexical_cast.hpp>
Davide Pesavento1a4a7bf2020-12-04 22:30:46 -050028#include <boost/test/data/test_case.hpp>
Davide Pesavento6b330402019-04-24 00:14:01 -040029
Junxiao Shidc4277a2017-07-17 11:34:02 +000030#include <cstring>
31#include <sstream>
Davide Pesaventoeee3e822016-11-26 19:19:34 +010032
Alexander Afanasyev233750e2014-02-16 00:50:07 -080033namespace ndn {
Alexander Afanasyev74633892015-02-08 18:08:46 -080034namespace tests {
Alexander Afanasyev233750e2014-02-16 00:50:07 -080035
Davide Pesaventoeee3e822016-11-26 19:19:34 +010036BOOST_AUTO_TEST_SUITE(Encoding)
37BOOST_AUTO_TEST_SUITE(TestBlock)
Alexander Afanasyev233750e2014-02-16 00:50:07 -080038
Junxiao Shidc4277a2017-07-17 11:34:02 +000039BOOST_AUTO_TEST_SUITE(Construction)
40
41static const uint8_t TEST_BUFFER[] = {
Davide Pesavento6b330402019-04-24 00:14:01 -040042 0x42, 0x01, 0xfa,
43 0x01, 0x01, 0xfb,
44 0xfe, 0xff, 0xff, 0xff, 0xff, 0x00, // bug #4726
Alexander Afanasyev74633892015-02-08 18:08:46 -080045};
Alexander Afanasyev2d0b4572014-02-24 16:02:12 -080046
Davide Pesavento6b330402019-04-24 00:14:01 -040047BOOST_AUTO_TEST_CASE(Default)
Alexander Afanasyev74633892015-02-08 18:08:46 -080048{
Junxiao Shidc4277a2017-07-17 11:34:02 +000049 Block b;
Davide Pesavento6b330402019-04-24 00:14:01 -040050
51 BOOST_CHECK_EQUAL(b.isValid(), false);
Davide Pesavento6b330402019-04-24 00:14:01 -040052 BOOST_CHECK_EQUAL(b.type(), tlv::Invalid);
53 BOOST_CHECK_EQUAL(b.hasValue(), false);
54 BOOST_CHECK_EQUAL(b.value_size(), 0);
55 BOOST_CHECK(b.value() == nullptr);
56
57 BOOST_CHECK_THROW(b.size(), Block::Error);
58 BOOST_CHECK_THROW(b.begin(), Block::Error);
59 BOOST_CHECK_THROW(b.end(), Block::Error);
60 BOOST_CHECK_THROW(b.wire(), Block::Error);
61 BOOST_CHECK_THROW(b.blockFromValue(), Block::Error);
Alexander Afanasyev74633892015-02-08 18:08:46 -080062}
Alexander Afanasyev937aa782014-03-21 13:17:57 -070063
Junxiao Shidc4277a2017-07-17 11:34:02 +000064BOOST_AUTO_TEST_CASE(FromEncodingBuffer)
Alexander Afanasyev74633892015-02-08 18:08:46 -080065{
Junxiao Shidc4277a2017-07-17 11:34:02 +000066 EncodingBuffer encoder;
Davide Pesavento5c803b92019-02-02 19:23:48 -050067 BOOST_CHECK_THROW(Block{encoder}, tlv::Error);
68
69 const uint8_t VALUE[] = {0x11, 0x12, 0x13, 0x14};
Junxiao Shidc4277a2017-07-17 11:34:02 +000070 size_t length = encoder.prependByteArray(VALUE, sizeof(VALUE));
71 encoder.prependVarNumber(length);
72 encoder.prependVarNumber(0xe0);
73
74 Block b = encoder.block();
75 BOOST_CHECK_EQUAL(b.type(), 0xe0);
76 BOOST_CHECK_EQUAL(b.value_size(), sizeof(VALUE));
77 BOOST_CHECK_EQUAL_COLLECTIONS(b.value_begin(), b.value_end(),
78 VALUE, VALUE + sizeof(VALUE));
79
80 b = Block(encoder);
81 BOOST_CHECK_EQUAL(b.type(), 0xe0);
82 BOOST_CHECK_EQUAL(b.value_size(), sizeof(VALUE));
83 BOOST_CHECK_EQUAL_COLLECTIONS(b.value_begin(), b.value_end(),
84 VALUE, VALUE + sizeof(VALUE));
Alexander Afanasyev74633892015-02-08 18:08:46 -080085}
Alexander Afanasyev937aa782014-03-21 13:17:57 -070086
Davide Pesaventoeee3e822016-11-26 19:19:34 +010087BOOST_AUTO_TEST_CASE(FromBlock)
Alexander Afanasyev4448d292015-08-09 20:11:37 -070088{
Davide Pesavento5c803b92019-02-02 19:23:48 -050089 const uint8_t BUFFER[] = {0x80, 0x06, 0x81, 0x01, 0x01, 0x82, 0x01, 0x01};
90 Block block(BUFFER, sizeof(BUFFER));
Alexander Afanasyev4448d292015-08-09 20:11:37 -070091
92 Block derivedBlock(block, block.begin(), block.end());
93 BOOST_CHECK_EQUAL(derivedBlock.wire(), block.wire()); // pointers should match
94 BOOST_CHECK(derivedBlock == block); // blocks should match
95
96 derivedBlock = Block(block, block.begin() + 2, block.begin() + 5);
97 BOOST_CHECK(derivedBlock.begin() == block.begin() + 2);
Davide Pesavento5c803b92019-02-02 19:23:48 -050098 BOOST_CHECK(derivedBlock == Block(BUFFER + 2, 3));
Alexander Afanasyev4448d292015-08-09 20:11:37 -070099
Davide Pesavento5c803b92019-02-02 19:23:48 -0500100 Buffer otherBuffer(BUFFER, sizeof(BUFFER));
Junxiao Shidb7464d2017-07-13 03:11:17 +0000101 BOOST_CHECK_THROW(Block(block, otherBuffer.begin(), block.end()), std::invalid_argument);
102 BOOST_CHECK_THROW(Block(block, block.begin(), otherBuffer.end()), std::invalid_argument);
103 BOOST_CHECK_THROW(Block(block, otherBuffer.begin(), otherBuffer.end()), std::invalid_argument);
Alexander Afanasyev4448d292015-08-09 20:11:37 -0700104}
105
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100106BOOST_AUTO_TEST_CASE(FromBlockCopyOnWriteModifyOriginal)
Eric Newberry6235aac2015-08-13 16:03:47 -0700107{
Junxiao Shidc4277a2017-07-17 11:34:02 +0000108 const uint8_t BUFFER[] = {
Eric Newberry6235aac2015-08-13 16:03:47 -0700109 0x05, 0x0b, 0x07, 0x03, 0x01, 0x02, 0x03, 0x0a, 0x04, 0x04, 0x05, 0x06, 0x07,
110 };
111
Junxiao Shidc4277a2017-07-17 11:34:02 +0000112 Block b1(BUFFER, sizeof(BUFFER));
Eric Newberry6235aac2015-08-13 16:03:47 -0700113
Junxiao Shidc4277a2017-07-17 11:34:02 +0000114 Block b2(b1, b1.begin(), b1.end());
115 auto buf2 = b2.getBuffer();
Eric Newberry6235aac2015-08-13 16:03:47 -0700116
Junxiao Shidc4277a2017-07-17 11:34:02 +0000117 b1.parse();
118 b1.remove(tlv::Name);
119 b1.encode();
Eric Newberry6235aac2015-08-13 16:03:47 -0700120
Junxiao Shidc4277a2017-07-17 11:34:02 +0000121 b2.parse();
Eric Newberry6235aac2015-08-13 16:03:47 -0700122
Junxiao Shidc4277a2017-07-17 11:34:02 +0000123 BOOST_CHECK_EQUAL_COLLECTIONS(b2.begin(), b2.end(), BUFFER, BUFFER + sizeof(BUFFER));
124 BOOST_CHECK_EQUAL(buf2, b2.getBuffer());
Eric Newberry6235aac2015-08-13 16:03:47 -0700125}
126
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100127BOOST_AUTO_TEST_CASE(FromBlockCopyOnWriteModifyCopy)
Eric Newberry6235aac2015-08-13 16:03:47 -0700128{
Junxiao Shidc4277a2017-07-17 11:34:02 +0000129 const uint8_t BUFFER[] = {
Eric Newberry6235aac2015-08-13 16:03:47 -0700130 0x05, 0x0b, 0x07, 0x03, 0x01, 0x02, 0x03, 0x0a, 0x04, 0x04, 0x05, 0x06, 0x07,
131 };
132
Junxiao Shidc4277a2017-07-17 11:34:02 +0000133 Block b1(BUFFER, sizeof(BUFFER));
134 auto buf1 = b1.getBuffer();
Eric Newberry6235aac2015-08-13 16:03:47 -0700135
Junxiao Shidc4277a2017-07-17 11:34:02 +0000136 Block b2(b1, b1.begin(), b1.end());
Eric Newberry6235aac2015-08-13 16:03:47 -0700137
Junxiao Shidc4277a2017-07-17 11:34:02 +0000138 b2.parse();
139 b2.remove(tlv::Name);
140 b2.encode();
Eric Newberry6235aac2015-08-13 16:03:47 -0700141
Junxiao Shidc4277a2017-07-17 11:34:02 +0000142 b1.parse();
143 BOOST_CHECK_EQUAL_COLLECTIONS(b1.begin(), b1.end(), BUFFER, BUFFER + sizeof(BUFFER));
144 BOOST_CHECK_EQUAL(buf1, b1.getBuffer());
Eric Newberry6235aac2015-08-13 16:03:47 -0700145}
146
Junxiao Shidc4277a2017-07-17 11:34:02 +0000147BOOST_AUTO_TEST_CASE(FromType)
Alexander Afanasyev233750e2014-02-16 00:50:07 -0800148{
Junxiao Shidc4277a2017-07-17 11:34:02 +0000149 Block b1(4);
Davide Pesavento6b330402019-04-24 00:14:01 -0400150 BOOST_CHECK_EQUAL(b1.isValid(), true);
Junxiao Shidc4277a2017-07-17 11:34:02 +0000151 BOOST_CHECK_EQUAL(b1.type(), 4);
152 BOOST_CHECK_EQUAL(b1.size(), 2); // 1-octet TLV-TYPE and 1-octet TLV-LENGTH
Davide Pesavento5c803b92019-02-02 19:23:48 -0500153 BOOST_CHECK_EQUAL(b1.hasValue(), false);
Junxiao Shidc4277a2017-07-17 11:34:02 +0000154 BOOST_CHECK_EQUAL(b1.value_size(), 0);
Davide Pesavento5f6865c2021-04-23 23:24:11 -0400155 BOOST_CHECK(b1.value() == nullptr);
Alexander Afanasyev233750e2014-02-16 00:50:07 -0800156
Junxiao Shidc4277a2017-07-17 11:34:02 +0000157 Block b2(258);
Davide Pesavento6b330402019-04-24 00:14:01 -0400158 BOOST_CHECK_EQUAL(b2.isValid(), true);
Junxiao Shidc4277a2017-07-17 11:34:02 +0000159 BOOST_CHECK_EQUAL(b2.type(), 258);
160 BOOST_CHECK_EQUAL(b2.size(), 4); // 3-octet TLV-TYPE and 1-octet TLV-LENGTH
Davide Pesavento5c803b92019-02-02 19:23:48 -0500161 BOOST_CHECK_EQUAL(b2.hasValue(), false);
Junxiao Shidc4277a2017-07-17 11:34:02 +0000162 BOOST_CHECK_EQUAL(b2.value_size(), 0);
Davide Pesavento5f6865c2021-04-23 23:24:11 -0400163 BOOST_CHECK(b2.value() == nullptr);
Davide Pesavento6b330402019-04-24 00:14:01 -0400164
165 Block b3(tlv::Invalid);
166 BOOST_CHECK_EQUAL(b3.isValid(), false);
167 BOOST_CHECK_EQUAL(b3.type(), tlv::Invalid);
Davide Pesavento5f6865c2021-04-23 23:24:11 -0400168 BOOST_CHECK_EXCEPTION(b3.size(), Block::Error, [] (const auto& e) {
169 return e.what() == "Cannot determine size of invalid block"s;
170 });
Davide Pesavento6b330402019-04-24 00:14:01 -0400171 BOOST_CHECK_EQUAL(b3.hasValue(), false);
172 BOOST_CHECK_EQUAL(b3.value_size(), 0);
173 BOOST_CHECK(b3.value() == nullptr);
Alexander Afanasyev937aa782014-03-21 13:17:57 -0700174}
175
Davide Pesavento5c803b92019-02-02 19:23:48 -0500176BOOST_AUTO_TEST_CASE(FromTypeAndBuffer)
177{
178 const uint8_t VALUE[] = {0x11, 0x12, 0x13, 0x14};
179 auto bufferPtr = make_shared<Buffer>(VALUE, sizeof(VALUE));
180
Davide Pesavento5f6865c2021-04-23 23:24:11 -0400181 Block b1(42, std::move(bufferPtr));
182 BOOST_CHECK_EQUAL(b1.isValid(), true);
183 BOOST_CHECK_EQUAL(b1.type(), 42);
184 BOOST_CHECK_EQUAL(b1.size(), 6);
185 BOOST_CHECK_EQUAL(b1.hasValue(), true);
186 BOOST_CHECK_EQUAL(b1.value_size(), sizeof(VALUE));
187 BOOST_CHECK(b1.value() != nullptr);
188
189 // empty buffer as TLV-VALUE
190 Block b2(63, make_shared<Buffer>());
191 BOOST_CHECK_EQUAL(b2.isValid(), true);
192 BOOST_CHECK_EQUAL(b2.type(), 63);
193 BOOST_CHECK_EQUAL(b2.size(), 2);
194 BOOST_CHECK_EQUAL(b2.hasValue(), true);
195 BOOST_CHECK_EQUAL(b2.value_size(), 0);
196 BOOST_CHECK(b2.value() == nullptr);
Davide Pesavento5c803b92019-02-02 19:23:48 -0500197}
198
199BOOST_AUTO_TEST_CASE(FromTypeAndBlock)
200{
201 const uint8_t BUFFER[] = {0x80, 0x06, 0x81, 0x01, 0x01, 0x82, 0x01, 0x01};
202 Block nested(BUFFER, sizeof(BUFFER));
203
204 Block b(84, nested);
Davide Pesavento6b330402019-04-24 00:14:01 -0400205 BOOST_CHECK_EQUAL(b.isValid(), true);
Davide Pesavento5c803b92019-02-02 19:23:48 -0500206 BOOST_CHECK_EQUAL(b.type(), 84);
207 BOOST_CHECK_EQUAL(b.size(), 10);
208 BOOST_CHECK_EQUAL(b.hasValue(), true);
209 BOOST_CHECK_EQUAL(b.value_size(), sizeof(BUFFER));
Davide Pesavento5f6865c2021-04-23 23:24:11 -0400210 BOOST_CHECK(b.value() != nullptr);
Davide Pesavento5c803b92019-02-02 19:23:48 -0500211}
212
Junxiao Shif0da7892015-04-04 22:16:16 -0700213BOOST_AUTO_TEST_CASE(FromStream)
Alexander Afanasyev21ef2392014-03-25 12:40:22 -0700214{
Junxiao Shidc4277a2017-07-17 11:34:02 +0000215 std::stringstream stream;
216 stream.write(reinterpret_cast<const char*>(TEST_BUFFER), sizeof(TEST_BUFFER));
217 stream.seekg(0);
Alexander Afanasyev21ef2392014-03-25 12:40:22 -0700218
Junxiao Shidc4277a2017-07-17 11:34:02 +0000219 Block b = Block::fromStream(stream);
Davide Pesavento6b330402019-04-24 00:14:01 -0400220 BOOST_CHECK_EQUAL(b.type(), 66);
Junxiao Shidc4277a2017-07-17 11:34:02 +0000221 BOOST_CHECK_EQUAL(b.size(), 3);
222 BOOST_CHECK_EQUAL(b.value_size(), 1);
Davide Pesavento5f6865c2021-04-23 23:24:11 -0400223 BOOST_CHECK_EQUAL(*b.wire(), 0x42);
Junxiao Shidc4277a2017-07-17 11:34:02 +0000224 BOOST_CHECK_EQUAL(*b.value(), 0xfa);
Alexander Afanasyev21ef2392014-03-25 12:40:22 -0700225
Junxiao Shidc4277a2017-07-17 11:34:02 +0000226 b = Block::fromStream(stream);
227 BOOST_CHECK_EQUAL(b.type(), 1);
228 BOOST_CHECK_EQUAL(b.size(), 3);
229 BOOST_CHECK_EQUAL(b.value_size(), 1);
Davide Pesavento5f6865c2021-04-23 23:24:11 -0400230 BOOST_CHECK_EQUAL(*b.wire(), 0x01);
Junxiao Shidc4277a2017-07-17 11:34:02 +0000231 BOOST_CHECK_EQUAL(*b.value(), 0xfb);
Alexander Afanasyev21ef2392014-03-25 12:40:22 -0700232
Davide Pesavento6b330402019-04-24 00:14:01 -0400233 b = Block::fromStream(stream);
234 BOOST_CHECK_EQUAL(b.type(), 0xffffffff);
235 BOOST_CHECK_EQUAL(b.size(), 6);
236 BOOST_CHECK_EQUAL(b.value_size(), 0);
Davide Pesavento5f6865c2021-04-23 23:24:11 -0400237 BOOST_CHECK_EQUAL(*b.wire(), 0xfe);
238 BOOST_CHECK(b.value() == nullptr);
Davide Pesavento6b330402019-04-24 00:14:01 -0400239
240 BOOST_CHECK(stream.eof());
Davide Pesavento5f6865c2021-04-23 23:24:11 -0400241 BOOST_CHECK_EXCEPTION(Block::fromStream(stream), tlv::Error, [] (const auto& e) {
242 return e.what() == "Empty buffer during TLV parsing"s;
243 });
Alexander Afanasyev21ef2392014-03-25 12:40:22 -0700244}
245
Junxiao Shif0da7892015-04-04 22:16:16 -0700246BOOST_AUTO_TEST_CASE(FromStreamWhitespace) // Bug 2728
247{
Junxiao Shidc4277a2017-07-17 11:34:02 +0000248 const uint8_t PACKET[] = {
Junxiao Shif0da7892015-04-04 22:16:16 -0700249 0x06, 0x20, // Data
250 0x07, 0x11, // Name
Junxiao Shi4ffbb9d2018-03-31 17:16:35 +0000251 0x08, 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, // GenericNameComponent 'hello'
252 0x08, 0x01, 0x31, // GenericNameComponent '1'
253 0x08, 0x05, 0x77, 0x6f, 0x72, 0x6c, 0x64, // GenericNameComponent 'world'
Junxiao Shif0da7892015-04-04 22:16:16 -0700254 0x14, 0x00, // MetaInfo empty
255 0x15, 0x00, // Content empty
256 0x16, 0x05, // SignatureInfo
Junxiao Shidc4277a2017-07-17 11:34:02 +0000257 0x1b, 0x01, 0x01, // SignatureType RSA
258 0x1c, 0x00, // KeyLocator empty
Junxiao Shif0da7892015-04-04 22:16:16 -0700259 0x17, 0x00 // SignatureValue empty
260 };
261 // TLV-LENGTH of <Data> is 0x20 which happens to be ASCII whitespace
262
263 std::stringstream stream;
264 stream.write(reinterpret_cast<const char*>(PACKET), sizeof(PACKET));
265 stream.seekg(0);
266
Junxiao Shidc4277a2017-07-17 11:34:02 +0000267 Block b = Block::fromStream(stream);
268 BOOST_CHECK_EQUAL(b.type(), 6);
269 BOOST_CHECK_EQUAL(b.value_size(), 32);
270 b.parse();
Davide Pesavento6b330402019-04-24 00:14:01 -0400271 BOOST_CHECK_EQUAL(b.elements_size(), 5);
Junxiao Shif0da7892015-04-04 22:16:16 -0700272}
273
Junxiao Shi760cc7b2017-07-22 19:17:49 +0000274BOOST_AUTO_TEST_CASE(FromStreamZeroLength)
Junxiao Shif0da7892015-04-04 22:16:16 -0700275{
Junxiao Shi760cc7b2017-07-22 19:17:49 +0000276 const uint8_t BUFFER[] = {0x70, 0x00,
277 0x71, 0x03, 0x86, 0x11, 0x24,
278 0x72, 0x00};
Junxiao Shif0da7892015-04-04 22:16:16 -0700279
280 std::stringstream stream;
281 stream.write(reinterpret_cast<const char*>(BUFFER), sizeof(BUFFER));
282 stream.seekg(0);
283
Junxiao Shi760cc7b2017-07-22 19:17:49 +0000284 Block b1 = Block::fromStream(stream);
285 BOOST_CHECK_EQUAL(b1.type(), 0x70);
286 BOOST_CHECK_EQUAL(b1.value_size(), 0);
Davide Pesavento5f6865c2021-04-23 23:24:11 -0400287 BOOST_CHECK(b1.value() == nullptr);
Junxiao Shidc4277a2017-07-17 11:34:02 +0000288
Junxiao Shi760cc7b2017-07-22 19:17:49 +0000289 Block b2 = Block::fromStream(stream);
290 BOOST_CHECK_EQUAL(b2.type(), 0x71);
291 BOOST_CHECK_EQUAL(b2.value_size(), 3);
292 const uint8_t EXPECTED_VALUE2[] = {0x86, 0x11, 0x24};
293 BOOST_CHECK_EQUAL_COLLECTIONS(b2.value_begin(), b2.value_end(),
294 EXPECTED_VALUE2, EXPECTED_VALUE2 + sizeof(EXPECTED_VALUE2));
295
296 Block b3 = Block::fromStream(stream);
297 BOOST_CHECK_EQUAL(b3.type(), 0x72);
298 BOOST_CHECK_EQUAL(b3.value_size(), 0);
Davide Pesavento5f6865c2021-04-23 23:24:11 -0400299 BOOST_CHECK(b3.value() == nullptr);
Junxiao Shi760cc7b2017-07-22 19:17:49 +0000300
Davide Pesavento5f6865c2021-04-23 23:24:11 -0400301 BOOST_CHECK_EXCEPTION(Block::fromStream(stream), tlv::Error, [] (const auto& e) {
302 return e.what() == "Empty buffer during TLV parsing"s;
303 });
Junxiao Shi760cc7b2017-07-22 19:17:49 +0000304}
305
306BOOST_AUTO_TEST_CASE(FromStreamPacketTooLarge)
307{
308 const uint8_t BUFFER[] = {0x07, 0xfe, 0x00, 0x01, 0x00, 0x00};
309
310 std::stringstream stream;
311 stream.write(reinterpret_cast<const char*>(BUFFER), sizeof(BUFFER));
312 for (int i = 0; i < 0x10000; ++i) {
313 stream.put('\0');
314 }
315 stream.seekg(0);
316
Davide Pesavento5f6865c2021-04-23 23:24:11 -0400317 BOOST_CHECK_EXCEPTION(Block::fromStream(stream), tlv::Error, [] (const auto& e) {
318 return e.what() == "TLV-LENGTH from stream exceeds limit"s;
319 });
Junxiao Shidc4277a2017-07-17 11:34:02 +0000320}
321
322BOOST_AUTO_TEST_CASE(FromWireBuffer)
323{
Davide Pesavento6b330402019-04-24 00:14:01 -0400324 auto buffer = make_shared<Buffer>(TEST_BUFFER, sizeof(TEST_BUFFER));
Junxiao Shidc4277a2017-07-17 11:34:02 +0000325
326 size_t offset = 0;
327 bool isOk = false;
328 Block b;
329 std::tie(isOk, b) = Block::fromBuffer(buffer, offset);
330 BOOST_CHECK(isOk);
Davide Pesavento6b330402019-04-24 00:14:01 -0400331 BOOST_CHECK_EQUAL(b.type(), 66);
Junxiao Shidc4277a2017-07-17 11:34:02 +0000332 BOOST_CHECK_EQUAL(b.size(), 3);
333 BOOST_CHECK_EQUAL(b.value_size(), 1);
Davide Pesavento6b330402019-04-24 00:14:01 -0400334 BOOST_CHECK_EQUAL(*b.wire(), 0x42);
Junxiao Shidc4277a2017-07-17 11:34:02 +0000335 BOOST_CHECK_EQUAL(*b.value(), 0xfa);
336 offset += b.size();
337
338 std::tie(isOk, b) = Block::fromBuffer(buffer, offset);
339 BOOST_CHECK(isOk);
340 BOOST_CHECK_EQUAL(b.type(), 1);
341 BOOST_CHECK_EQUAL(b.size(), 3);
342 BOOST_CHECK_EQUAL(b.value_size(), 1);
343 BOOST_CHECK_EQUAL(*b.wire(), 0x01);
344 BOOST_CHECK_EQUAL(*b.value(), 0xfb);
345 offset += b.size();
346
347 std::tie(isOk, b) = Block::fromBuffer(buffer, offset);
Davide Pesavento6b330402019-04-24 00:14:01 -0400348 BOOST_CHECK(isOk);
349 BOOST_CHECK_EQUAL(b.type(), 0xffffffff);
350 BOOST_CHECK_EQUAL(b.size(), 6);
351 BOOST_CHECK_EQUAL(b.value_size(), 0);
352 BOOST_CHECK_EQUAL(*b.wire(), 0xfe);
Davide Pesavento5f6865c2021-04-23 23:24:11 -0400353 BOOST_CHECK(b.value() == nullptr);
Junxiao Shidc4277a2017-07-17 11:34:02 +0000354}
355
356BOOST_AUTO_TEST_CASE(FromRawBuffer)
357{
358 size_t offset = 0;
359 bool isOk = false;
360 Block b;
361 std::tie(isOk, b) = Block::fromBuffer(TEST_BUFFER + offset, sizeof(TEST_BUFFER) - offset);
362 BOOST_CHECK(isOk);
Davide Pesavento6b330402019-04-24 00:14:01 -0400363 BOOST_CHECK_EQUAL(b.type(), 66);
Junxiao Shidc4277a2017-07-17 11:34:02 +0000364 BOOST_CHECK_EQUAL(b.size(), 3);
365 BOOST_CHECK_EQUAL(b.value_size(), 1);
Davide Pesavento6b330402019-04-24 00:14:01 -0400366 BOOST_CHECK_EQUAL(*b.wire(), 0x42);
Junxiao Shidc4277a2017-07-17 11:34:02 +0000367 BOOST_CHECK_EQUAL(*b.value(), 0xfa);
368 offset += b.size();
369
370 std::tie(isOk, b) = Block::fromBuffer(TEST_BUFFER + offset, sizeof(TEST_BUFFER) - offset);
371 BOOST_CHECK(isOk);
372 BOOST_CHECK_EQUAL(b.type(), 1);
373 BOOST_CHECK_EQUAL(b.size(), 3);
374 BOOST_CHECK_EQUAL(b.value_size(), 1);
375 BOOST_CHECK_EQUAL(*b.wire(), 0x01);
376 BOOST_CHECK_EQUAL(*b.value(), 0xfb);
377 offset += b.size();
378
379 std::tie(isOk, b) = Block::fromBuffer(TEST_BUFFER + offset, sizeof(TEST_BUFFER) - offset);
Davide Pesavento6b330402019-04-24 00:14:01 -0400380 BOOST_CHECK(isOk);
381 BOOST_CHECK_EQUAL(b.type(), 0xffffffff);
382 BOOST_CHECK_EQUAL(b.size(), 6);
383 BOOST_CHECK_EQUAL(b.value_size(), 0);
384 BOOST_CHECK_EQUAL(*b.wire(), 0xfe);
Davide Pesavento5f6865c2021-04-23 23:24:11 -0400385 BOOST_CHECK(b.value() == nullptr);
Davide Pesavento6b330402019-04-24 00:14:01 -0400386}
387
Davide Pesavento1a4a7bf2020-12-04 22:30:46 -0500388static const Buffer MalformedInputs[] = {
389 {0x00, 0x00}, // invalid TLV type (zero)
390 {0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00}, // TLV type too large
391 {0x01, 0xff, 0x42, 0x42}, // bad TLV length
392 {0x01, 0x02, 0x03}, // truncated TLV value
Davide Pesavento6b330402019-04-24 00:14:01 -0400393};
394
Davide Pesavento1a4a7bf2020-12-04 22:30:46 -0500395BOOST_DATA_TEST_CASE(Malformed, MalformedInputs)
Davide Pesavento6b330402019-04-24 00:14:01 -0400396{
397 // constructor from raw buffer
Davide Pesavento1a4a7bf2020-12-04 22:30:46 -0500398 BOOST_CHECK_THROW(Block(sample.data(), sample.size()), tlv::Error);
Davide Pesavento6b330402019-04-24 00:14:01 -0400399
400 // fromStream()
401 std::stringstream stream;
Davide Pesavento1a4a7bf2020-12-04 22:30:46 -0500402 stream.write(sample.template get<char>(), sample.size());
Davide Pesavento6b330402019-04-24 00:14:01 -0400403 stream.seekg(0);
404 BOOST_CHECK_THROW(Block::fromStream(stream), tlv::Error);
405
406 // fromBuffer(), ConstBufferPtr overload
Davide Pesavento1a4a7bf2020-12-04 22:30:46 -0500407 auto buf = make_shared<Buffer>(sample.begin(), sample.end());
Davide Pesavento6b330402019-04-24 00:14:01 -0400408 bool isOk;
409 Block b;
410 std::tie(isOk, b) = Block::fromBuffer(buf, 0);
Junxiao Shidc4277a2017-07-17 11:34:02 +0000411 BOOST_CHECK(!isOk);
Davide Pesavento6b330402019-04-24 00:14:01 -0400412 BOOST_CHECK(!b.isValid());
413
414 // fromBuffer(), raw buffer overload
Davide Pesavento1a4a7bf2020-12-04 22:30:46 -0500415 std::tie(isOk, b) = Block::fromBuffer(sample.data(), sample.size());
Davide Pesavento6b330402019-04-24 00:14:01 -0400416 BOOST_CHECK(!isOk);
417 BOOST_CHECK(!b.isValid());
Junxiao Shif0da7892015-04-04 22:16:16 -0700418}
419
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100420BOOST_AUTO_TEST_SUITE_END() // Construction
421
Junxiao Shidc4277a2017-07-17 11:34:02 +0000422BOOST_AUTO_TEST_SUITE(SubElements)
423
424BOOST_AUTO_TEST_CASE(Parse)
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700425{
Junxiao Shidc4277a2017-07-17 11:34:02 +0000426 const uint8_t PACKET[] = {
427 0x06, 0x20, // Data
428 0x07, 0x11, // Name
Junxiao Shi4ffbb9d2018-03-31 17:16:35 +0000429 0x08, 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, // GenericNameComponent 'hello'
430 0x08, 0x01, 0x31, // GenericNameComponent '1'
431 0x08, 0x05, 0x77, 0x6f, 0x72, 0x6c, 0x64, // GenericNameComponent 'world'
Junxiao Shidc4277a2017-07-17 11:34:02 +0000432 0x14, 0x00, // MetaInfo empty
433 0x15, 0x00, // Content empty
434 0x16, 0x05, // SignatureInfo
435 0x1b, 0x01, 0x01, // SignatureType RSA
436 0x1c, 0x00, // KeyLocator empty
437 0x17, 0x00 // SignatureValue empty
438 };
Junxiao Shidc4277a2017-07-17 11:34:02 +0000439 Block data(PACKET, sizeof(PACKET));
440 data.parse();
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700441
Junxiao Shidc4277a2017-07-17 11:34:02 +0000442 BOOST_CHECK_EQUAL(data.elements_size(), 5);
443 BOOST_CHECK_EQUAL(data.elements().at(0).type(), 0x07);
444 BOOST_CHECK_EQUAL(data.elements().at(0).elements().size(), 0); // parse is not recursive
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700445
Junxiao Shidc4277a2017-07-17 11:34:02 +0000446 BOOST_CHECK(data.get(0x15) == data.elements().at(2));
Davide Pesavento5f6865c2021-04-23 23:24:11 -0400447 BOOST_CHECK_EXCEPTION(data.get(0x01), Block::Error, [] (const auto& e) {
448 return e.what() == "No sub-element of type 1 found in block of type 6"s;
449 });
Junxiao Shidc4277a2017-07-17 11:34:02 +0000450
451 BOOST_CHECK(data.find(0x15) == data.elements_begin() + 2);
452 BOOST_CHECK(data.find(0x01) == data.elements_end());
Davide Pesavento6b330402019-04-24 00:14:01 -0400453
454 const uint8_t MALFORMED[] = {
455 // TLV-LENGTH of nested element is greater than TLV-LENGTH of enclosing element
456 0x05, 0x05, 0x07, 0x07, 0x08, 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f
457 };
458 Block bad(MALFORMED, sizeof(MALFORMED));
Davide Pesavento5f6865c2021-04-23 23:24:11 -0400459 BOOST_CHECK_EXCEPTION(bad.parse(), Block::Error, [] (const auto& e) {
460 return e.what() == "TLV-LENGTH of sub-element of type 7 exceeds TLV-VALUE boundary of parent block"s;
461 });
Junxiao Shiaf8eeea2014-03-31 20:10:56 -0700462}
463
Joao Pereira7476ebf2015-07-07 14:54:39 -0400464BOOST_AUTO_TEST_CASE(InsertBeginning)
465{
466 Block masterBlock(tlv::Name);
Junxiao Shi4ffbb9d2018-03-31 17:16:35 +0000467 Block firstBlock = makeStringBlock(tlv::GenericNameComponent, "firstName");
468 Block secondBlock = makeStringBlock(tlv::GenericNameComponent, "secondName");
469 Block thirdBlock = makeStringBlock(tlv::GenericNameComponent, "thirdName");
Joao Pereira7476ebf2015-07-07 14:54:39 -0400470
471 BOOST_CHECK_EQUAL(masterBlock.elements_size(), 0);
472 masterBlock.push_back(secondBlock);
473 masterBlock.push_back(thirdBlock);
474 BOOST_CHECK_EQUAL(masterBlock.elements_size(), 2);
Junxiao Shi4ffbb9d2018-03-31 17:16:35 +0000475 Block::element_const_iterator it = masterBlock.find(tlv::GenericNameComponent);
Joao Pereira7476ebf2015-07-07 14:54:39 -0400476 BOOST_CHECK_EQUAL(*it == secondBlock, true);
477
478 it = masterBlock.insert(it, firstBlock);
479
480 BOOST_CHECK_EQUAL(masterBlock.elements_size(), 3);
481 BOOST_CHECK_EQUAL(*(it + 1) == secondBlock, true);
482 BOOST_CHECK_EQUAL(*(masterBlock.elements_begin()) == firstBlock, true);
483}
484
485BOOST_AUTO_TEST_CASE(InsertEnd)
486{
487 Block masterBlock(tlv::Name);
Junxiao Shi4ffbb9d2018-03-31 17:16:35 +0000488 Block firstBlock = makeStringBlock(tlv::GenericNameComponent, "firstName");
489 Block secondBlock = makeStringBlock(tlv::GenericNameComponent, "secondName");
490 Block thirdBlock = makeStringBlock(tlv::GenericNameComponent, "thirdName");
Joao Pereira7476ebf2015-07-07 14:54:39 -0400491
492 BOOST_CHECK_EQUAL(masterBlock.elements_size(), 0);
493 masterBlock.push_back(firstBlock);
494 masterBlock.push_back(secondBlock);
495 BOOST_CHECK_EQUAL(masterBlock.elements_size(), 2);
496 Block::element_const_iterator it = masterBlock.elements_end();
497 BOOST_CHECK_EQUAL(*(it - 1) == secondBlock, true);
498
499 it = masterBlock.insert(it, thirdBlock);
500
501 BOOST_CHECK_EQUAL(masterBlock.elements_size(), 3);
502 BOOST_CHECK_EQUAL(*(it - 1) == secondBlock, true);
503 BOOST_CHECK_EQUAL(*(masterBlock.elements_end() - 1) == thirdBlock, true);
504}
505
506BOOST_AUTO_TEST_CASE(InsertMiddle)
507{
508 Block masterBlock(tlv::Name);
Junxiao Shi4ffbb9d2018-03-31 17:16:35 +0000509 Block firstBlock = makeStringBlock(tlv::GenericNameComponent, "firstName");
510 Block secondBlock = makeStringBlock(tlv::GenericNameComponent, "secondName");
511 Block thirdBlock = makeStringBlock(tlv::GenericNameComponent, "thirdName");
Joao Pereira7476ebf2015-07-07 14:54:39 -0400512
513 BOOST_CHECK_EQUAL(masterBlock.elements_size(), 0);
514 masterBlock.push_back(firstBlock);
515 masterBlock.push_back(thirdBlock);
516 BOOST_CHECK_EQUAL(masterBlock.elements_size(), 2);
Junxiao Shi4ffbb9d2018-03-31 17:16:35 +0000517 Block::element_const_iterator it = masterBlock.find(tlv::GenericNameComponent);
Joao Pereira7476ebf2015-07-07 14:54:39 -0400518 BOOST_CHECK_EQUAL(*it == firstBlock, true);
519
Junxiao Shidc4277a2017-07-17 11:34:02 +0000520 it = masterBlock.insert(it + 1, secondBlock);
Joao Pereira7476ebf2015-07-07 14:54:39 -0400521
522 BOOST_CHECK_EQUAL(*it == secondBlock, true);
523 BOOST_CHECK_EQUAL(*(it + 1) == thirdBlock, true);
524 BOOST_CHECK_EQUAL(*(it - 1) == firstBlock, true);
525}
526
527BOOST_AUTO_TEST_CASE(EraseSingleElement)
528{
529 Block masterBlock(tlv::Name);
Junxiao Shi4ffbb9d2018-03-31 17:16:35 +0000530 Block firstBlock = makeStringBlock(tlv::GenericNameComponent, "firstName");
531 Block secondBlock = makeStringBlock(tlv::GenericNameComponent, "secondName");
532 Block thirdBlock = makeStringBlock(tlv::GenericNameComponent, "thirdName");
Joao Pereira7476ebf2015-07-07 14:54:39 -0400533
534 BOOST_CHECK_EQUAL(masterBlock.elements_size(), 0);
535 masterBlock.push_back(firstBlock);
536 masterBlock.push_back(secondBlock);
537 masterBlock.push_back(thirdBlock);
538 BOOST_CHECK_EQUAL(masterBlock.elements_size(), 3);
Junxiao Shi4ffbb9d2018-03-31 17:16:35 +0000539 Block::element_const_iterator it = masterBlock.find(tlv::GenericNameComponent);
Joao Pereira7476ebf2015-07-07 14:54:39 -0400540 it++;
541 BOOST_CHECK_EQUAL(*it == secondBlock, true);
542
543 it = masterBlock.erase(it);
544
545 BOOST_CHECK_EQUAL(masterBlock.elements_size(), 2);
546 BOOST_CHECK_EQUAL(*(it) == thirdBlock, true);
547 BOOST_CHECK_EQUAL(*(it - 1) == firstBlock, true);
548}
549
550BOOST_AUTO_TEST_CASE(EraseRange)
551{
552 Block masterBlock(tlv::Name);
Junxiao Shi4ffbb9d2018-03-31 17:16:35 +0000553 Block firstBlock = makeStringBlock(tlv::GenericNameComponent, "firstName");
554 Block secondBlock = makeStringBlock(tlv::GenericNameComponent, "secondName");
555 Block thirdBlock = makeStringBlock(tlv::GenericNameComponent, "thirdName");
556 Block fourthBlock = makeStringBlock(tlv::GenericNameComponent, "fourthName");
557 Block fifthBlock = makeStringBlock(tlv::GenericNameComponent, "fifthName");
558 Block sixthBlock = makeStringBlock(tlv::GenericNameComponent, "sixthName");
Joao Pereira7476ebf2015-07-07 14:54:39 -0400559
560 BOOST_CHECK_EQUAL(masterBlock.elements_size(), 0);
561 masterBlock.push_back(firstBlock);
562 masterBlock.push_back(secondBlock);
563 masterBlock.push_back(thirdBlock);
564 masterBlock.push_back(fourthBlock);
565 masterBlock.push_back(fifthBlock);
566 masterBlock.push_back(sixthBlock);
567 BOOST_CHECK_EQUAL(masterBlock.elements_size(), 6);
Junxiao Shi4ffbb9d2018-03-31 17:16:35 +0000568 Block::element_const_iterator itStart = masterBlock.find(tlv::GenericNameComponent);
Joao Pereira7476ebf2015-07-07 14:54:39 -0400569 itStart++;
570 Block::element_const_iterator itEnd = itStart + 3;
571 BOOST_CHECK_EQUAL(*itStart == secondBlock, true);
572 BOOST_CHECK_EQUAL(*itEnd == fifthBlock, true);
573
574 Block::element_const_iterator newIt = masterBlock.erase(itStart, itEnd);
575
576 BOOST_CHECK_EQUAL(masterBlock.elements_size(), 3);
577 BOOST_CHECK_EQUAL(*(newIt) == fifthBlock, true);
578 BOOST_CHECK_EQUAL(*(newIt - 1) == firstBlock, true);
579}
580
Eric Newberrya3d9fc02015-07-26 10:55:44 -0700581BOOST_AUTO_TEST_CASE(Remove)
582{
583 Block block(tlv::Data);
584 block.push_back(makeNonNegativeIntegerBlock(tlv::ContentType, 0));
585 block.push_back(makeNonNegativeIntegerBlock(tlv::FreshnessPeriod, 123));
Davide Pesavento5f6865c2021-04-23 23:24:11 -0400586 block.push_back(makeStringBlock(tlv::Name, "/test-prefix"));
Eric Newberrya3d9fc02015-07-26 10:55:44 -0700587 block.push_back(makeNonNegativeIntegerBlock(tlv::ContentType, 2));
588 block.push_back(makeNonNegativeIntegerBlock(tlv::ContentType, 1));
589
590 BOOST_CHECK_EQUAL(5, block.elements_size());
Davide Pesavento6b330402019-04-24 00:14:01 -0400591 BOOST_CHECK_NO_THROW(block.remove(tlv::ContentType));
592 BOOST_REQUIRE_EQUAL(2, block.elements_size());
Eric Newberrya3d9fc02015-07-26 10:55:44 -0700593
Davide Pesavento6b330402019-04-24 00:14:01 -0400594 auto elements = block.elements();
Eric Newberrya3d9fc02015-07-26 10:55:44 -0700595 BOOST_CHECK_EQUAL(tlv::FreshnessPeriod, elements[0].type());
596 BOOST_CHECK_EQUAL(123, readNonNegativeInteger(elements[0]));
597 BOOST_CHECK_EQUAL(tlv::Name, elements[1].type());
Davide Pesavento5f6865c2021-04-23 23:24:11 -0400598 BOOST_CHECK_EQUAL(readString(elements[1]).compare("/test-prefix"), 0);
Eric Newberrya3d9fc02015-07-26 10:55:44 -0700599}
600
Junxiao Shidc4277a2017-07-17 11:34:02 +0000601BOOST_AUTO_TEST_SUITE_END() // SubElements
602
603BOOST_AUTO_TEST_CASE(Equality)
604{
Davide Pesaventob10024c2017-09-22 01:36:44 -0400605 const uint8_t one[] = {0x08, 0x00};
606 Block a(one, sizeof(one));
607 Block b(one, sizeof(one));
Junxiao Shidc4277a2017-07-17 11:34:02 +0000608 BOOST_CHECK_EQUAL(a == b, true);
609 BOOST_CHECK_EQUAL(a != b, false);
610
Davide Pesaventob10024c2017-09-22 01:36:44 -0400611 const uint8_t two[] = {0x06, 0x00};
612 Block c(two, sizeof(two));
613 Block d(one, sizeof(one));
Junxiao Shidc4277a2017-07-17 11:34:02 +0000614 BOOST_CHECK_EQUAL(c == d, false);
615 BOOST_CHECK_EQUAL(c != d, true);
616
Davide Pesaventob10024c2017-09-22 01:36:44 -0400617 const uint8_t three[] = {0x06, 0x01, 0xcc};
618 Block e(two, sizeof(two));
619 Block f(three, sizeof(three));
Junxiao Shidc4277a2017-07-17 11:34:02 +0000620 BOOST_CHECK_EQUAL(e == f, false);
621 BOOST_CHECK_EQUAL(e != f, true);
622}
623
Junxiao Shi72c0c642018-04-20 15:41:09 +0000624BOOST_AUTO_TEST_CASE(Print)
625{
626 // default constructed
627 Block b;
628 BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(b), "[invalid]");
629
630 // zero length
631 b = "0700"_block;
632 BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(b), "7[empty]");
633
634 // unparsed
635 b = "0E10FF7E4E6B3B21C902660F16ED589FCCCC"_block;
636 BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(b),
637 "14[16]=FF7E4E6B3B21C902660F16ED589FCCCC");
638 // set and restore format flags
639 {
640 std::ostringstream oss;
641 oss << std::showbase << std::hex << 0xd23c4 << b << 0x4981e;
642 BOOST_CHECK_EQUAL(oss.str(), "0xd23c414[16]=FF7E4E6B3B21C902660F16ED589FCCCC0x4981e");
643 }
644
645 // parsed
646 b = "FD010808 0502CADD 59024E42"_block;
647 b.parse();
648 BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(b),
649 "264[8]={5[2]=CADD,89[2]=4E42}");
650
651 // parsed then modified: print modified sub-elements
652 b = "FD010808 0502CADD 59024E42"_block;
653 b.parse();
654 b.erase(b.elements_begin());
655 b.push_back("10022386"_block);
656 BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(b),
657 "264[8]={89[2]=4E42,16[2]=2386}");
658}
659
Junxiao Shi2b322eb2018-08-24 10:43:27 -0600660BOOST_AUTO_TEST_SUITE(BlockLiteral)
661
662BOOST_AUTO_TEST_CASE(Simple)
663{
Davide Pesavento6b330402019-04-24 00:14:01 -0400664 Block b0 = "4200"_block;
665 BOOST_CHECK_EQUAL(b0.type(), 0x42);
Junxiao Shi2b322eb2018-08-24 10:43:27 -0600666 BOOST_CHECK_EQUAL(b0.value_size(), 0);
667
668 Block b1 = "0101A0"_block;
669 BOOST_CHECK_EQUAL(b1.type(), 0x01);
670 BOOST_REQUIRE_EQUAL(b1.value_size(), 1);
671 BOOST_CHECK_EQUAL(b1.value()[0], 0xA0);
672}
673
674BOOST_AUTO_TEST_CASE(Comment)
675{
676 Block b0 = "a2b0c0d2eBf0G.B 1+"_block;
677 BOOST_CHECK_EQUAL(b0.type(), 0x20);
678 BOOST_REQUIRE_EQUAL(b0.value_size(), 2);
679 BOOST_CHECK_EQUAL(b0.value()[0], 0xB0);
680 BOOST_CHECK_EQUAL(b0.value()[1], 0xB1);
681}
682
683BOOST_AUTO_TEST_CASE(BadInput)
684{
685 BOOST_CHECK_THROW(""_block, std::invalid_argument);
686 BOOST_CHECK_THROW("1"_block, std::invalid_argument);
687 BOOST_CHECK_THROW("333"_block, std::invalid_argument);
Davide Pesavento6b330402019-04-24 00:14:01 -0400688 BOOST_CHECK_THROW("xx yy zz"_block, std::invalid_argument); // only comments
Junxiao Shi2b322eb2018-08-24 10:43:27 -0600689
Davide Pesavento6b330402019-04-24 00:14:01 -0400690 BOOST_CHECK_THROW("0000"_block, tlv::Error); // invalid type
691 BOOST_CHECK_THROW("0202C0"_block, tlv::Error); // truncated value
692 BOOST_CHECK_THROW("0201C0C1"_block, tlv::Error); // trailing garbage
Junxiao Shi2b322eb2018-08-24 10:43:27 -0600693}
694
695BOOST_AUTO_TEST_SUITE_END() // BlockLiteral
696
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100697BOOST_AUTO_TEST_SUITE_END() // TestBlock
698BOOST_AUTO_TEST_SUITE_END() // Encoding
Alexander Afanasyev233750e2014-02-16 00:50:07 -0800699
Alexander Afanasyev74633892015-02-08 18:08:46 -0800700} // namespace tests
Alexander Afanasyev233750e2014-02-16 00:50:07 -0800701} // namespace ndn