blob: bd6e30271f4adf8656da4d210f2ca5dd28cccd6b [file] [log] [blame]
Alexander Afanasyevc169a812014-05-20 20:37:29 -04001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Junxiao Shi899277a2017-07-07 22:12:12 +00002/*
Davide Pesaventof6b45892023-03-13 15:00:51 -04003 * Copyright (c) 2013-2023 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
Davide Pesavento7e780642018-11-24 15:51:34 -050022#include "ndn-cxx/interest.hpp"
23#include "ndn-cxx/data.hpp"
Junxiao Shiaf8eeea2014-03-31 20:10:56 -070024
Davide Pesavento4c1ad4c2020-11-16 21:12:02 -050025#include "tests/test-common.hpp"
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080026
Davide Pesavento47ce2ee2023-05-09 01:33:33 -040027namespace ndn::tests {
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080028
Davide Pesavento152ef442023-04-22 02:02:29 -040029BOOST_CONCEPT_ASSERT((WireEncodable<Interest>));
30BOOST_CONCEPT_ASSERT((WireEncodableWithEncodingBuffer<Interest>));
31BOOST_CONCEPT_ASSERT((WireDecodable<Interest>));
32static_assert(std::is_convertible_v<Interest::Error*, tlv::Error*>,
33 "Interest::Error must inherit from tlv::Error");
34
Junxiao Shi899277a2017-07-07 22:12:12 +000035BOOST_AUTO_TEST_SUITE(TestInterest)
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080036
Davide Pesaventoadc9aa22019-06-30 19:00:20 -040037class DisableAutoCheckParametersDigest
38{
39public:
40 DisableAutoCheckParametersDigest()
41 : m_saved(Interest::getAutoCheckParametersDigest())
42 {
43 Interest::setAutoCheckParametersDigest(false);
44 }
45
46 ~DisableAutoCheckParametersDigest()
47 {
48 Interest::setAutoCheckParametersDigest(m_saved);
49 }
50
51private:
52 bool m_saved;
53};
Junxiao Shi899277a2017-07-07 22:12:12 +000054
55BOOST_AUTO_TEST_CASE(DefaultConstructor)
56{
57 Interest i;
Davide Pesaventoadc9aa22019-06-30 19:00:20 -040058 BOOST_CHECK_EQUAL(i.hasWire(), false);
Junxiao Shi899277a2017-07-07 22:12:12 +000059 BOOST_CHECK_EQUAL(i.getName(), "/");
Davide Pesavento478d3382021-03-17 12:46:08 -040060 BOOST_CHECK_EQUAL(i.getCanBePrefix(), false);
Junxiao Shi6efa3b72018-04-14 15:54:08 +000061 BOOST_CHECK_EQUAL(i.getMustBeFresh(), false);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -040062 BOOST_CHECK_EQUAL(i.getForwardingHint().empty(), true);
63 BOOST_CHECK_EQUAL(i.hasNonce(), false);
Junxiao Shi899277a2017-07-07 22:12:12 +000064 BOOST_CHECK_EQUAL(i.getInterestLifetime(), DEFAULT_INTEREST_LIFETIME);
Davide Pesaventof6b45892023-03-13 15:00:51 -040065 BOOST_CHECK(i.getHopLimit() == std::nullopt);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -040066 BOOST_CHECK_EQUAL(i.hasApplicationParameters(), false);
67 BOOST_CHECK_EQUAL(i.getApplicationParameters().isValid(), false);
68 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
Davide Pesaventof6b45892023-03-13 15:00:51 -040069 BOOST_CHECK(i.getSignatureInfo() == std::nullopt);
Eric Newberry6e262f02020-05-29 23:11:25 -070070 BOOST_CHECK_EQUAL(i.getSignatureValue().isValid(), false);
71 BOOST_CHECK_EQUAL(i.isSigned(), false);
Davide Pesaventofccb2dc2019-02-09 01:02:35 -050072}
73
Davide Pesavento0e0b3892019-07-30 21:05:05 -040074BOOST_AUTO_TEST_SUITE(Encode)
Davide Pesaventoadc9aa22019-06-30 19:00:20 -040075
76BOOST_AUTO_TEST_CASE(Basic)
Junxiao Shi899277a2017-07-07 22:12:12 +000077{
78 const uint8_t WIRE[] = {
79 0x05, 0x1c, // Interest
80 0x07, 0x14, // Name
Junxiao Shi4ffbb9d2018-03-31 17:16:35 +000081 0x08, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, // GenericNameComponent
82 0x08, 0x03, 0x6e, 0x64, 0x6e, // GenericNameComponent
83 0x08, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, // GenericNameComponent
Junxiao Shi899277a2017-07-07 22:12:12 +000084 0x0a, 0x04, // Nonce
Davide Pesavento53533942020-03-04 23:10:06 -050085 0x01, 0x02, 0x03, 0x04,
Junxiao Shi899277a2017-07-07 22:12:12 +000086 };
87
Davide Pesavento0e0b3892019-07-30 21:05:05 -040088 Interest i1;
89 i1.setName("/local/ndn/prefix");
Davide Pesavento53533942020-03-04 23:10:06 -050090 i1.setNonce(0x01020304);
Davide Pesavento0e0b3892019-07-30 21:05:05 -040091 BOOST_CHECK_EQUAL(i1.isParametersDigestValid(), true);
92
Junxiao Shi899277a2017-07-07 22:12:12 +000093 Block wire1 = i1.wireEncode();
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -050094 BOOST_TEST(wire1 == WIRE, boost::test_tools::per_element());
Junxiao Shi899277a2017-07-07 22:12:12 +000095
96 Interest i2(wire1);
97 BOOST_CHECK_EQUAL(i2.getName(), "/local/ndn/prefix");
Davide Pesavento0e0b3892019-07-30 21:05:05 -040098 BOOST_CHECK_EQUAL(i2.getCanBePrefix(), false);
99 BOOST_CHECK_EQUAL(i2.getMustBeFresh(), false);
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400100 BOOST_CHECK_EQUAL(i2.getForwardingHint().empty(), true);
Davide Pesavento835f0272019-09-21 13:18:24 -0400101 BOOST_CHECK_EQUAL(i2.hasNonce(), true);
Davide Pesavento53533942020-03-04 23:10:06 -0500102 BOOST_CHECK_EQUAL(i2.getNonce(), 0x01020304);
Junxiao Shi899277a2017-07-07 22:12:12 +0000103 BOOST_CHECK_EQUAL(i2.getInterestLifetime(), DEFAULT_INTEREST_LIFETIME);
Davide Pesaventof6b45892023-03-13 15:00:51 -0400104 BOOST_CHECK(i2.getHopLimit() == std::nullopt);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400105 BOOST_CHECK_EQUAL(i2.hasApplicationParameters(), false);
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400106 BOOST_CHECK_EQUAL(i2.getApplicationParameters().isValid(), false);
Davide Pesaventof6b45892023-03-13 15:00:51 -0400107 BOOST_CHECK(i2.getSignatureInfo() == std::nullopt);
Eric Newberry6e262f02020-05-29 23:11:25 -0700108 BOOST_CHECK_EQUAL(i2.getSignatureValue().isValid(), false);
109 BOOST_CHECK_EQUAL(i2.isSigned(), false);
Junxiao Shi899277a2017-07-07 22:12:12 +0000110}
111
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400112BOOST_AUTO_TEST_CASE(WithParameters)
113{
114 const uint8_t WIRE[] = {
115 0x05, 0x44, // Interest
116 0x07, 0x36, // Name
117 0x08, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, // GenericNameComponent
118 0x08, 0x03, 0x6e, 0x64, 0x6e, // GenericNameComponent
119 0x08, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, // GenericNameComponent
120 0x02, 0x20, // ParametersSha256DigestComponent
121 0xff, 0x91, 0x00, 0xe0, 0x4e, 0xaa, 0xdc, 0xf3, 0x06, 0x74, 0xd9, 0x80,
122 0x26, 0xa0, 0x51, 0xba, 0x25, 0xf5, 0x6b, 0x69, 0xbf, 0xa0, 0x26, 0xdc,
123 0xcc, 0xd7, 0x2c, 0x6e, 0xa0, 0xf7, 0x31, 0x5a,
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700124 0x0a, 0x04, // Nonce
Davide Pesavento53533942020-03-04 23:10:06 -0500125 0x00, 0x00, 0x00, 0x01,
Davide Pesavento9c19a392019-04-06 15:07:54 -0400126 0x24, 0x04, // ApplicationParameters
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400127 0xc0, 0xc1, 0xc2, 0xc3
128 };
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700129
130 Interest i1;
131 i1.setName("/local/ndn/prefix");
Davide Pesavento53533942020-03-04 23:10:06 -0500132 i1.setNonce(0x1);
Davide Pesavento9c19a392019-04-06 15:07:54 -0400133 i1.setApplicationParameters("2404C0C1C2C3"_block);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400134 BOOST_CHECK_EQUAL(i1.isParametersDigestValid(), true);
135
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700136 Block wire1 = i1.wireEncode();
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500137 BOOST_TEST(wire1 == WIRE, boost::test_tools::per_element());
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700138
139 Interest i2(wire1);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400140 BOOST_CHECK_EQUAL(i2.getName(),
141 "/local/ndn/prefix/params-sha256=ff9100e04eaadcf30674d98026a051ba25f56b69bfa026dcccd72c6ea0f7315a");
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700142 BOOST_CHECK_EQUAL(i2.getCanBePrefix(), false);
143 BOOST_CHECK_EQUAL(i2.getMustBeFresh(), false);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400144 BOOST_CHECK_EQUAL(i2.getForwardingHint().empty(), true);
Davide Pesavento835f0272019-09-21 13:18:24 -0400145 BOOST_CHECK_EQUAL(i2.hasNonce(), true);
Davide Pesavento53533942020-03-04 23:10:06 -0500146 BOOST_CHECK_EQUAL(i2.getNonce(), 0x1);
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700147 BOOST_CHECK_EQUAL(i2.getInterestLifetime(), DEFAULT_INTEREST_LIFETIME);
Davide Pesaventof6b45892023-03-13 15:00:51 -0400148 BOOST_CHECK(i2.getHopLimit() == std::nullopt);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400149 BOOST_CHECK_EQUAL(i2.hasApplicationParameters(), true);
Davide Pesavento9c19a392019-04-06 15:07:54 -0400150 BOOST_CHECK_EQUAL(i2.getApplicationParameters(), "2404C0C1C2C3"_block);
Davide Pesaventof6b45892023-03-13 15:00:51 -0400151 BOOST_CHECK(i2.getSignatureInfo() == std::nullopt);
Eric Newberry6e262f02020-05-29 23:11:25 -0700152 BOOST_CHECK_EQUAL(i2.getSignatureValue().isValid(), false);
153 BOOST_CHECK_EQUAL(i2.isSigned(), false);
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700154}
155
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400156BOOST_AUTO_TEST_CASE(Full)
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700157{
158 const uint8_t WIRE[] = {
Junxiao Shie4603e12022-01-05 19:12:25 +0000159 0x05, 0x56, // Interest
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400160 0x07, 0x36, // Name
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700161 0x08, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, // GenericNameComponent
162 0x08, 0x03, 0x6e, 0x64, 0x6e, // GenericNameComponent
163 0x08, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, // GenericNameComponent
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400164 0x02, 0x20, // ParametersSha256DigestComponent
165 0xff, 0x91, 0x00, 0xe0, 0x4e, 0xaa, 0xdc, 0xf3, 0x06, 0x74, 0xd9, 0x80,
166 0x26, 0xa0, 0x51, 0xba, 0x25, 0xf5, 0x6b, 0x69, 0xbf, 0xa0, 0x26, 0xdc,
167 0xcc, 0xd7, 0x2c, 0x6e, 0xa0, 0xf7, 0x31, 0x5a,
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700168 0x21, 0x00, // CanBePrefix
169 0x12, 0x00, // MustBeFresh
Junxiao Shie4603e12022-01-05 19:12:25 +0000170 0x1e, 0x05, // ForwardingHint
171 0x07, 0x03, 0x08, 0x01, 0x48,
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700172 0x0a, 0x04, // Nonce
Davide Pesavento53533942020-03-04 23:10:06 -0500173 0x4c, 0x1e, 0xcb, 0x4a,
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400174 0x0c, 0x02, // InterestLifetime
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700175 0x76, 0xa1,
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400176 0x22, 0x01, // HopLimit
177 0xdc,
Davide Pesavento9c19a392019-04-06 15:07:54 -0400178 0x24, 0x04, // ApplicationParameters
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400179 0xc0, 0xc1, 0xc2, 0xc3
180 };
181
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700182 Interest i1;
183 i1.setName("/local/ndn/prefix");
184 i1.setMustBeFresh(true);
185 i1.setCanBePrefix(true);
Junxiao Shie4603e12022-01-05 19:12:25 +0000186 i1.setForwardingHint({"/H"});
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700187 i1.setNonce(0x4c1ecb4a);
188 i1.setInterestLifetime(30369_ms);
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400189 i1.setHopLimit(220);
Davide Pesavento9c19a392019-04-06 15:07:54 -0400190 i1.setApplicationParameters("2404C0C1C2C3"_block);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400191 BOOST_CHECK_EQUAL(i1.isParametersDigestValid(), true);
192
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700193 Block wire1 = i1.wireEncode();
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500194 BOOST_TEST(wire1 == WIRE, boost::test_tools::per_element());
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700195
196 Interest i2(wire1);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400197 BOOST_CHECK_EQUAL(i2.getName(),
198 "/local/ndn/prefix/params-sha256=ff9100e04eaadcf30674d98026a051ba25f56b69bfa026dcccd72c6ea0f7315a");
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700199 BOOST_CHECK_EQUAL(i2.getCanBePrefix(), true);
200 BOOST_CHECK_EQUAL(i2.getMustBeFresh(), true);
Junxiao Shie4603e12022-01-05 19:12:25 +0000201 BOOST_TEST(i2.getForwardingHint() == std::vector<Name>({"/H"}), boost::test_tools::per_element());
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400202 BOOST_CHECK_EQUAL(i2.hasNonce(), true);
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700203 BOOST_CHECK_EQUAL(i2.getNonce(), 0x4c1ecb4a);
204 BOOST_CHECK_EQUAL(i2.getInterestLifetime(), 30369_ms);
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400205 BOOST_CHECK_EQUAL(*i2.getHopLimit(), 220);
Davide Pesavento9c19a392019-04-06 15:07:54 -0400206 BOOST_CHECK_EQUAL(i2.getApplicationParameters(), "2404C0C1C2C3"_block);
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700207}
208
Eric Newberry6e262f02020-05-29 23:11:25 -0700209BOOST_AUTO_TEST_CASE(Signed)
210{
211 const uint8_t WIRE[] = {
212 0x05, 0x77, // Interest
213 0x07, 0x36, // Name
214 0x08, 0x05, // GenericNameComponent
215 0x6c, 0x6f, 0x63, 0x61, 0x6c,
216 0x08, 0x03, // GenericNameComponent
217 0x6e, 0x64, 0x6e,
218 0x08, 0x06, // GenericNameComponent
219 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
220 0x02, 0x20, // ParametersSha256DigestComponent
221 0x6f, 0x29, 0x58, 0x60, 0x53, 0xee, 0x9f, 0xcc,
222 0xd8, 0xa4, 0x22, 0x12, 0x29, 0x25, 0x28, 0x7c,
223 0x0a, 0x18, 0x43, 0x5f, 0x40, 0x74, 0xc4, 0x0a,
224 0xbb, 0x0d, 0x5b, 0x30, 0xe4, 0xaa, 0x62, 0x20,
225 0x12, 0x00, // MustBeFresh
226 0x0a, 0x04, // Nonce
227 0x4c, 0x1e, 0xcb, 0x4a,
228 0x24, 0x04, // ApplicationParameters
229 0xc0, 0xc1, 0xc2, 0xc3,
230 0x2c, 0x0d, // InterestSignatureInfo
231 0x1b, 0x01, // SignatureType
232 0x00,
233 0x26, 0x08, // SignatureNonce
234 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
235 0x2e, 0x20, // InterestSignatureValue
236 0x12, 0x47, 0x1a, 0xe0, 0xf8, 0x72, 0x3a, 0xc1,
237 0x15, 0x6c, 0x37, 0x0a, 0x38, 0x71, 0x1e, 0xbe,
238 0xbf, 0x28, 0x17, 0xde, 0x9b, 0x2d, 0xd9, 0x4e,
239 0x9b, 0x7e, 0x62, 0xf1, 0x17, 0xb8, 0x76, 0xc1,
240 };
241
242 SignatureInfo si(tlv::DigestSha256);
243 std::vector<uint8_t> nonce{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
244 si.setNonce(nonce);
245 Block sv("2E20 12471AE0F8723AC1156C370A38711EBEBF2817DE9B2DD94E9B7E62F117B876C1"_block);
246
Davide Pesaventofbea4fc2022-02-08 07:26:04 -0500247 Interest i1(Block{WIRE});
Eric Newberry6e262f02020-05-29 23:11:25 -0700248 BOOST_CHECK_EQUAL(i1.getName(),
249 "/local/ndn/prefix/params-sha256=6f29586053ee9fccd8a422122925287c0a18435f4074c40abb0d5b30e4aa6220");
250 BOOST_CHECK_EQUAL(i1.getCanBePrefix(), false);
251 BOOST_CHECK_EQUAL(i1.getMustBeFresh(), true);
252 BOOST_CHECK_EQUAL(i1.hasNonce(), true);
253 BOOST_CHECK_EQUAL(i1.getNonce(), 0x4c1ecb4a);
254 BOOST_CHECK_EQUAL(i1.getSignatureInfo()->getSignatureType(), tlv::DigestSha256);
255 BOOST_CHECK(i1.getSignatureInfo()->getNonce() == nonce);
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500256 BOOST_TEST(i1.getSignatureValue() == sv, boost::test_tools::per_element());
Eric Newberry6e262f02020-05-29 23:11:25 -0700257 BOOST_CHECK_EQUAL(i1.getApplicationParameters(), "2404C0C1C2C3"_block);
258 BOOST_CHECK_EQUAL(i1.isParametersDigestValid(), true);
259
260 // Reset wire
261 BOOST_CHECK_EQUAL(i1.hasWire(), true);
262 i1.setCanBePrefix(true);
263 i1.setCanBePrefix(false);
264 BOOST_CHECK_EQUAL(i1.hasWire(), false);
265
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500266 BOOST_TEST(i1.wireEncode() == WIRE, boost::test_tools::per_element());
Eric Newberry6e262f02020-05-29 23:11:25 -0700267
268 Interest i2("/local/ndn/prefix");
Eric Newberry6e262f02020-05-29 23:11:25 -0700269 i2.setMustBeFresh(true);
270 i2.setNonce(0x4c1ecb4a);
271 i2.setApplicationParameters("2404C0C1C2C3"_block);
272 i2.setSignatureInfo(si);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400273 i2.setSignatureValue(sv.value_bytes());
Eric Newberry6e262f02020-05-29 23:11:25 -0700274 BOOST_CHECK_EQUAL(i2.isParametersDigestValid(), true);
275
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500276 BOOST_TEST(i2.wireEncode() == WIRE, boost::test_tools::per_element());
Eric Newberry6e262f02020-05-29 23:11:25 -0700277}
278
279BOOST_AUTO_TEST_CASE(SignedApplicationElements)
280{
281 const uint8_t WIRE[] = {
282 0x05, 0x8f, // Interest
283 0x07, 0x36, // Name
284 0x08, 0x05, // GenericNameComponent
285 0x6c, 0x6f, 0x63, 0x61, 0x6c,
286 0x08, 0x03, // GenericNameComponent
287 0x6e, 0x64, 0x6e,
288 0x08, 0x06, // GenericNameComponent
289 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
290 0x02, 0x20, // ParametersSha256DigestComponent
291 0xbc, 0x36, 0x30, 0xa4, 0xd6, 0x5e, 0x0d, 0xb5,
292 0x48, 0x3d, 0xfa, 0x0d, 0x28, 0xb3, 0x31, 0x2f,
293 0xca, 0xc1, 0xd4, 0x41, 0xec, 0x89, 0x61, 0xd4,
294 0x17, 0x5e, 0x61, 0x75, 0x17, 0x78, 0x10, 0x8e,
295 0x12, 0x00, // MustBeFresh
296 0x0a, 0x04, // Nonce
297 0x4c, 0x1e, 0xcb, 0x4a,
298 0x24, 0x04, // ApplicationParameters
299 0xc0, 0xc1, 0xc2, 0xc3,
300 0xfd, 0x01, 0xfe, 0x08, // Application-specific element (Type 510)
301 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80,
302 0x2c, 0x0d, // InterestSignatureInfo
303 0x1b, 0x01, // SignatureType
304 0x00,
305 0x26, 0x08, // SignatureNonce
306 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
307 0x2e, 0x20, // InterestSignatureValue
308 0x12, 0x47, 0x1a, 0xe0, 0xf8, 0x72, 0x3a, 0xc1,
309 0x15, 0x6c, 0x37, 0x0a, 0x38, 0x71, 0x1e, 0xbe,
310 0xbf, 0x28, 0x17, 0xde, 0x9b, 0x2d, 0xd9, 0x4e,
311 0x9b, 0x7e, 0x62, 0xf1, 0x17, 0xb8, 0x76, 0xc1,
312 0xfd, 0x02, 0x00, 0x08, // Application-specific element (Type 512)
313 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88
314 };
315
316 SignatureInfo si(tlv::DigestSha256);
317 std::vector<uint8_t> nonce{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
318 si.setNonce(nonce);
319 Block sv("2E20 12471AE0F8723AC1156C370A38711EBEBF2817DE9B2DD94E9B7E62F117B876C1"_block);
320
Davide Pesaventofbea4fc2022-02-08 07:26:04 -0500321 Interest i1(Block{WIRE});
Eric Newberry6e262f02020-05-29 23:11:25 -0700322 BOOST_CHECK_EQUAL(i1.getName(),
323 "/local/ndn/prefix/params-sha256=bc3630a4d65e0db5483dfa0d28b3312fcac1d441ec8961d4175e61751778108e");
324 BOOST_CHECK_EQUAL(i1.getCanBePrefix(), false);
325 BOOST_CHECK_EQUAL(i1.getMustBeFresh(), true);
326 BOOST_CHECK_EQUAL(i1.hasNonce(), true);
327 BOOST_CHECK_EQUAL(i1.getNonce(), 0x4c1ecb4a);
328 BOOST_CHECK_EQUAL(i1.getSignatureInfo()->getSignatureType(), tlv::DigestSha256);
329 BOOST_CHECK(i1.getSignatureInfo()->getNonce() == nonce);
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500330 BOOST_TEST(i1.getSignatureValue() == sv, boost::test_tools::per_element());
Eric Newberry6e262f02020-05-29 23:11:25 -0700331 BOOST_CHECK_EQUAL(i1.getApplicationParameters(), "2404C0C1C2C3"_block);
332 BOOST_CHECK_EQUAL(i1.isParametersDigestValid(), true);
333
334 // Reset wire
335 BOOST_CHECK_EQUAL(i1.hasWire(), true);
336 i1.setCanBePrefix(true);
337 i1.setCanBePrefix(false);
338 BOOST_CHECK_EQUAL(i1.hasWire(), false);
339
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500340 BOOST_TEST(i1.wireEncode() == WIRE, boost::test_tools::per_element());
Eric Newberry6e262f02020-05-29 23:11:25 -0700341}
342
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400343BOOST_AUTO_TEST_CASE(MissingApplicationParameters)
344{
345 Interest i;
346 i.setName(Name("/A").appendParametersSha256DigestPlaceholder());
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400347 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), false);
Davide Pesavento905d40f2020-06-09 21:33:25 -0400348 BOOST_CHECK_EXCEPTION(i.wireEncode(), tlv::Error, [] (const auto& e) {
Davide Pesavento296c3a12023-05-04 21:40:40 -0400349 return e.what() == "Interest without parameters must not have a ParametersSha256DigestComponent"sv;
Davide Pesavento905d40f2020-06-09 21:33:25 -0400350 });
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400351}
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400352
353BOOST_AUTO_TEST_CASE(MissingParametersSha256DigestComponent)
354{
355 // there's no way to create an Interest that fails this check via programmatic construction,
356 // so we have to decode an invalid Interest and force reencoding
357
358 DisableAutoCheckParametersDigest disabler;
359 Interest i("050F 0703(080149) 0A04F000F000 2402CAFE"_block);
360 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), false);
361 BOOST_CHECK_NO_THROW(i.wireEncode()); // this succeeds because it uses the cached wire encoding
362
Davide Pesavento905d40f2020-06-09 21:33:25 -0400363 // trigger reencoding
364 i.setNonce(42);
365 // now the check fails while attempting to reencode
366 BOOST_CHECK_EXCEPTION(i.wireEncode(), tlv::Error, [] (const auto& e) {
Davide Pesavento296c3a12023-05-04 21:40:40 -0400367 return e.what() == "Interest with parameters must have a ParametersSha256DigestComponent"sv;
Davide Pesavento905d40f2020-06-09 21:33:25 -0400368 });
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400369}
370
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400371BOOST_AUTO_TEST_SUITE_END() // Encode
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400372
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400373class DecodeFixture
Junxiao Shi899277a2017-07-07 22:12:12 +0000374{
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000375protected:
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400376 DecodeFixture()
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000377 {
378 // initialize all elements to non-empty, to verify wireDecode clears them
379 i.setName("/A");
Junxiao Shie4603e12022-01-05 19:12:25 +0000380 i.setForwardingHint({"/F"});
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000381 i.setNonce(0x03d645a8);
382 i.setInterestLifetime(18554_ms);
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400383 i.setHopLimit(64);
Davide Pesavento9c19a392019-04-06 15:07:54 -0400384 i.setApplicationParameters("2404A0A1A2A3"_block);
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000385 }
Junxiao Shi899277a2017-07-07 22:12:12 +0000386
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000387protected:
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000388 Interest i;
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000389};
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000390
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400391BOOST_FIXTURE_TEST_SUITE(Decode, DecodeFixture)
392
393BOOST_AUTO_TEST_CASE(NotAnInterest)
394{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400395 BOOST_CHECK_EXCEPTION(i.wireDecode("4202CAFE"_block), tlv::Error, [] (const auto& e) {
Davide Pesavento296c3a12023-05-04 21:40:40 -0400396 return e.what() == "Expecting Interest element, but TLV has type 66"sv;
Davide Pesavento905d40f2020-06-09 21:33:25 -0400397 });
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400398}
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000399
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400400BOOST_AUTO_TEST_CASE(NameOnly)
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000401{
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400402 i.wireDecode("0505 0703(080149)"_block);
Davide Pesavento835f0272019-09-21 13:18:24 -0400403 BOOST_CHECK_EQUAL(i.hasWire(), true);
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000404 BOOST_CHECK_EQUAL(i.getName(), "/I");
405 BOOST_CHECK_EQUAL(i.getCanBePrefix(), false);
406 BOOST_CHECK_EQUAL(i.getMustBeFresh(), false);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400407 BOOST_CHECK_EQUAL(i.getForwardingHint().empty(), true);
Davide Pesavento835f0272019-09-21 13:18:24 -0400408 BOOST_CHECK_EQUAL(i.hasNonce(), false);
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000409 BOOST_CHECK_EQUAL(i.getInterestLifetime(), DEFAULT_INTEREST_LIFETIME);
Davide Pesaventof6b45892023-03-13 15:00:51 -0400410 BOOST_CHECK(i.getHopLimit() == std::nullopt);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400411 BOOST_CHECK_EQUAL(i.hasApplicationParameters(), false);
412 BOOST_CHECK_EQUAL(i.getApplicationParameters().isValid(), false);
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000413
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400414 // modify then re-encode
Davide Pesavento53533942020-03-04 23:10:06 -0500415 i.setNonce(0x957c6554);
Davide Pesavento835f0272019-09-21 13:18:24 -0400416 BOOST_CHECK_EQUAL(i.hasWire(), false);
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400417 BOOST_CHECK_EQUAL(i.wireEncode(), "050B 0703(080149) 0A04957C6554"_block);
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000418}
419
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400420BOOST_AUTO_TEST_CASE(NameCanBePrefix)
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000421{
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400422 i.wireDecode("0507 0703(080149) 2100"_block);
Davide Pesavento835f0272019-09-21 13:18:24 -0400423 BOOST_CHECK_EQUAL(i.hasWire(), true);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400424 BOOST_CHECK_EQUAL(i.getName(), "/I");
425 BOOST_CHECK_EQUAL(i.getCanBePrefix(), true);
426 BOOST_CHECK_EQUAL(i.getMustBeFresh(), false);
427 BOOST_CHECK_EQUAL(i.getForwardingHint().empty(), true);
Davide Pesavento835f0272019-09-21 13:18:24 -0400428 BOOST_CHECK_EQUAL(i.hasNonce(), false);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400429 BOOST_CHECK_EQUAL(i.getInterestLifetime(), DEFAULT_INTEREST_LIFETIME);
Davide Pesaventof6b45892023-03-13 15:00:51 -0400430 BOOST_CHECK(i.getHopLimit() == std::nullopt);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400431 BOOST_CHECK_EQUAL(i.hasApplicationParameters(), false);
432 BOOST_CHECK_EQUAL(i.getApplicationParameters().isValid(), false);
433}
434
435BOOST_AUTO_TEST_CASE(FullWithoutParameters)
436{
437 i.wireDecode("0531 0703(080149) "
438 "FC00 2100 FC00 1200 FC00 1E0B(1F09 1E023E15 0703080148) "
439 "FC00 0A044ACB1E4C FC00 0C0276A1 FC00 2201D6 FC00"_block);
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000440 BOOST_CHECK_EQUAL(i.getName(), "/I");
441 BOOST_CHECK_EQUAL(i.getCanBePrefix(), true);
442 BOOST_CHECK_EQUAL(i.getMustBeFresh(), true);
Junxiao Shie4603e12022-01-05 19:12:25 +0000443 BOOST_TEST(i.getForwardingHint() == std::vector<Name>({"/H"}), boost::test_tools::per_element());
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400444 BOOST_CHECK_EQUAL(i.hasNonce(), true);
Davide Pesavento53533942020-03-04 23:10:06 -0500445 BOOST_CHECK_EQUAL(i.getNonce(), 0x4acb1e4c);
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000446 BOOST_CHECK_EQUAL(i.getInterestLifetime(), 30369_ms);
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400447 BOOST_CHECK_EQUAL(*i.getHopLimit(), 214);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400448 BOOST_CHECK_EQUAL(i.hasApplicationParameters(), false);
449 BOOST_CHECK_EQUAL(i.getApplicationParameters().isValid(), false);
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000450
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000451 // encode without modification: retain original wire encoding
Junxiao Shi8b753a22018-10-24 01:51:40 +0000452 BOOST_CHECK_EQUAL(i.wireEncode().value_size(), 49);
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000453
Junxiao Shie4603e12022-01-05 19:12:25 +0000454 // modify then re-encode:
455 // * unrecognized elements are discarded;
456 // * ForwardingHint is re-encoded as a sequence of Names
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000457 i.setName("/J");
Junxiao Shi72c0c642018-04-20 15:41:09 +0000458 BOOST_CHECK_EQUAL(i.wireEncode(),
Junxiao Shie4603e12022-01-05 19:12:25 +0000459 "051D 0703(08014A) "
460 "2100 1200 1E05(0703080148) "
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400461 "0A044ACB1E4C 0C0276A1 2201D6"_block);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400462}
463
464BOOST_AUTO_TEST_CASE(FullWithParameters)
465{
466 i.wireDecode("055B 0725(080149 0220F16DB273F40436A852063F864D5072B01EAD53151F5A688EA1560492BEBEDD05) "
467 "FC00 2100 FC00 1200 FC00 1E0B(1F09 1E023E15 0703080148) "
468 "FC00 0A044ACB1E4C FC00 0C0276A1 FC00 2201D6 FC00 2404C0C1C2C3 FC00"_block);
469 BOOST_CHECK_EQUAL(i.getName(),
470 "/I/params-sha256=f16db273f40436a852063f864d5072b01ead53151f5a688ea1560492bebedd05");
471 BOOST_CHECK_EQUAL(i.getCanBePrefix(), true);
472 BOOST_CHECK_EQUAL(i.getMustBeFresh(), true);
Junxiao Shie4603e12022-01-05 19:12:25 +0000473 BOOST_TEST(i.getForwardingHint() == std::vector<Name>({"/H"}), boost::test_tools::per_element());
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400474 BOOST_CHECK_EQUAL(i.hasNonce(), true);
Davide Pesavento53533942020-03-04 23:10:06 -0500475 BOOST_CHECK_EQUAL(i.getNonce(), 0x4acb1e4c);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400476 BOOST_CHECK_EQUAL(i.getInterestLifetime(), 30369_ms);
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400477 BOOST_CHECK_EQUAL(*i.getHopLimit(), 214);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400478 BOOST_CHECK_EQUAL(i.hasApplicationParameters(), true);
479 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2404C0C1C2C3"_block);
480
481 // encode without modification: retain original wire encoding
482 BOOST_CHECK_EQUAL(i.wireEncode().value_size(), 91);
483
Junxiao Shie4603e12022-01-05 19:12:25 +0000484 // modify then re-encode:
485 // * unrecognized elements after ApplicationParameters are preserved, the rest are discarded;
486 // * ForwardingHint is re-encoded as a sequence of Names
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400487 i.setName("/J");
488 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
489 BOOST_CHECK_EQUAL(i.wireEncode(),
Junxiao Shie4603e12022-01-05 19:12:25 +0000490 "0547 0725(08014A 0220F16DB273F40436A852063F864D5072B01EAD53151F5A688EA1560492BEBEDD05) "
491 "2100 1200 1E05(0703080148) "
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400492 "0A044ACB1E4C 0C0276A1 2201D6 2404C0C1C2C3 FC00"_block);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400493
494 // modify ApplicationParameters: unrecognized elements are preserved
495 i.setApplicationParameters("2402CAFE"_block);
496 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
497 BOOST_CHECK_EQUAL(i.wireEncode(),
Junxiao Shie4603e12022-01-05 19:12:25 +0000498 "0545 0725(08014A 02205FDA67967EE302FC457E41B7D3D51BA6A9379574D193FD88F64954BF16C2927A) "
499 "2100 1200 1E05(0703080148) "
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400500 "0A044ACB1E4C 0C0276A1 2201D6 2402CAFE FC00"_block);
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000501}
502
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000503BOOST_AUTO_TEST_CASE(CriticalElementOutOfOrder)
504{
Davide Pesavento94048922023-08-11 22:00:01 -0400505 BOOST_CHECK_EXCEPTION(i.wireDecode("0507 FC00 0703080149"_block),
506 tlv::Error,
507 [] (const auto& e) { return e.what() == "Name element is missing or out of order"sv; });
Davide Pesavento905d40f2020-06-09 21:33:25 -0400508 BOOST_CHECK_EXCEPTION(i.wireDecode(
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000509 "0529 2100 0703080149 1200 1E0B(1F09 1E023E15 0703080148) "
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500510 "0A044ACB1E4C 0C0276A1 2201D6 2404C0C1C2C3"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400511 tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400512 [] (const auto& e) { return e.what() == "Name element is missing or out of order"sv; });
Davide Pesavento905d40f2020-06-09 21:33:25 -0400513 BOOST_CHECK_EXCEPTION(i.wireDecode(
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000514 "0529 0703080149 1200 2100 1E0B(1F09 1E023E15 0703080148) "
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500515 "0A044ACB1E4C 0C0276A1 2201D6 2404C0C1C2C3"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400516 tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400517 [] (const auto& e) { return e.what() == "CanBePrefix element is out of order"sv; });
Davide Pesavento905d40f2020-06-09 21:33:25 -0400518 BOOST_CHECK_EXCEPTION(i.wireDecode(
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000519 "0529 0703080149 2100 1E0B(1F09 1E023E15 0703080148) 1200 "
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500520 "0A044ACB1E4C 0C0276A1 2201D6 2404C0C1C2C3"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400521 tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400522 [] (const auto& e) { return e.what() == "MustBeFresh element is out of order"sv; });
Davide Pesavento905d40f2020-06-09 21:33:25 -0400523 BOOST_CHECK_EXCEPTION(i.wireDecode(
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000524 "0529 0703080149 2100 1200 0A044ACB1E4C "
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500525 "1E0B(1F09 1E023E15 0703080148) 0C0276A1 2201D6 2404C0C1C2C3"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400526 tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400527 [] (const auto& e) { return e.what() == "ForwardingHint element is out of order"sv; });
Davide Pesavento905d40f2020-06-09 21:33:25 -0400528 BOOST_CHECK_EXCEPTION(i.wireDecode(
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000529 "0529 0703080149 2100 1200 1E0B(1F09 1E023E15 0703080148) "
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500530 "0C0276A1 0A044ACB1E4C 2201D6 2404C0C1C2C3"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400531 tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400532 [] (const auto& e) { return e.what() == "Nonce element is out of order"sv; });
Davide Pesavento905d40f2020-06-09 21:33:25 -0400533 BOOST_CHECK_EXCEPTION(i.wireDecode(
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000534 "0529 0703080149 2100 1200 1E0B(1F09 1E023E15 0703080148) "
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500535 "0A044ACB1E4C 2201D6 0C0276A1 2404C0C1C2C3"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400536 tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400537 [] (const auto& e) { return e.what() == "InterestLifetime element is out of order"sv; });
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000538}
539
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500540BOOST_AUTO_TEST_CASE(NonCriticalElementOutOfOrder)
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000541{
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400542 // duplicate HopLimit
543 i.wireDecode("0536 0725(080149 0220FF9100E04EAADCF30674D98026A051BA25F56B69BFA026DCCCD72C6EA0F7315A)"
544 "2201D6 2200 2404C0C1C2C3 22020101"_block);
545 BOOST_CHECK_EQUAL(i.getName(),
546 "/I/params-sha256=ff9100e04eaadcf30674d98026a051ba25f56b69bfa026dcccd72c6ea0f7315a");
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400547 BOOST_CHECK_EQUAL(*i.getHopLimit(), 214);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400548 BOOST_CHECK_EQUAL(i.hasApplicationParameters(), true);
Davide Pesavento9c19a392019-04-06 15:07:54 -0400549 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2404C0C1C2C3"_block);
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500550
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400551 // duplicate ApplicationParameters
552 i.wireDecode("0541 0725(080149 0220FF9100E04EAADCF30674D98026A051BA25F56B69BFA026DCCCD72C6EA0F7315A)"
553 "2100 1200 0A044ACB1E4C 0C0276A1 2201D6 2404C0C1C2C3 2401EE"_block);
554 BOOST_CHECK_EQUAL(i.getName(),
555 "/I/params-sha256=ff9100e04eaadcf30674d98026a051ba25f56b69bfa026dcccd72c6ea0f7315a");
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400556 BOOST_CHECK_EQUAL(*i.getHopLimit(), 214);
Davide Pesavento9c19a392019-04-06 15:07:54 -0400557 BOOST_CHECK_EQUAL(i.hasApplicationParameters(), true);
558 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2404C0C1C2C3"_block);
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000559}
560
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400561BOOST_AUTO_TEST_CASE(MissingName)
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000562{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400563 BOOST_CHECK_EXCEPTION(i.wireDecode("0500"_block), tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400564 [] (const auto& e) { return e.what() == "Name element is missing or out of order"sv; });
Davide Pesavento905d40f2020-06-09 21:33:25 -0400565 BOOST_CHECK_EXCEPTION(i.wireDecode("0502 1200"_block), tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400566 [] (const auto& e) { return e.what() == "Name element is missing or out of order"sv; });
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000567}
568
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400569BOOST_AUTO_TEST_CASE(BadName)
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000570{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400571 BOOST_CHECK_EXCEPTION(i.wireDecode("0502 0700"_block), tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400572 [] (const auto& e) { return e.what() == "Name has zero name components"sv; });
Davide Pesavento905d40f2020-06-09 21:33:25 -0400573 BOOST_CHECK_EXCEPTION(i.wireDecode("054C 074A(080149"
574 "02200000000000000000000000000000000000000000000000000000000000000000"
575 "080132"
576 "02200000000000000000000000000000000000000000000000000000000000000000)"_block),
577 tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400578 [] (const auto& e) { return e.what() == "Name has more than one ParametersSha256DigestComponent"sv; });
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000579}
580
581BOOST_AUTO_TEST_CASE(BadCanBePrefix)
582{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400583 BOOST_CHECK_EXCEPTION(i.wireDecode("0508 0703080149 210102"_block), tlv::Error,
Davide Pesavento94048922023-08-11 22:00:01 -0400584 [] (const auto& e) { return e.what() == "CanBePrefix element has non-zero TLV-LENGTH"sv; });
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000585}
586
587BOOST_AUTO_TEST_CASE(BadMustBeFresh)
588{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400589 BOOST_CHECK_EXCEPTION(i.wireDecode("0508 0703080149 120102"_block), tlv::Error,
Davide Pesavento94048922023-08-11 22:00:01 -0400590 [] (const auto& e) { return e.what() == "MustBeFresh element has non-zero TLV-LENGTH"sv; });
591}
592
593BOOST_AUTO_TEST_CASE(BadForwardingHint)
594{
595 BOOST_CHECK_EXCEPTION(i.wireDecode("050C 0703080149 1E05(0703080248)"_block), tlv::Error,
596 [] (const auto& e) { return e.what() == "Invalid Name in ForwardingHint"sv; });
597 BOOST_CHECK_EXCEPTION(i.wireDecode("050E 0703080149 1E07(1F05(0703080248))"_block), tlv::Error,
598 [] (const auto& e) { return e.what() == "Invalid Name in ForwardingHint.Delegation"sv; });
599 BOOST_CHECK_EXCEPTION(i.wireDecode("0509 0703080149 1E02(2100)"_block), tlv::Error,
600 [] (const auto& e) { return e.what() == "Unexpected TLV-TYPE 33 while decoding ForwardingHint"sv; });
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000601}
602
603BOOST_AUTO_TEST_CASE(BadNonce)
604{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400605 BOOST_CHECK_EXCEPTION(i.wireDecode("0507 0703080149 0A00"_block), tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400606 [] (const auto& e) { return e.what() == "Nonce element is malformed"sv; });
Davide Pesavento905d40f2020-06-09 21:33:25 -0400607 BOOST_CHECK_EXCEPTION(i.wireDecode("050A 0703080149 0A0304C263"_block), tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400608 [] (const auto& e) { return e.what() == "Nonce element is malformed"sv; });
Davide Pesavento905d40f2020-06-09 21:33:25 -0400609 BOOST_CHECK_EXCEPTION(i.wireDecode("050C 0703080149 0A05EFA420B262"_block), tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400610 [] (const auto& e) { return e.what() == "Nonce element is malformed"sv; });
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000611}
612
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500613BOOST_AUTO_TEST_CASE(BadHopLimit)
614{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400615 BOOST_CHECK_EXCEPTION(i.wireDecode("0507 0703080149 2200"_block), tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400616 [] (const auto& e) { return e.what() == "HopLimit element is malformed"sv; });
Davide Pesavento905d40f2020-06-09 21:33:25 -0400617 BOOST_CHECK_EXCEPTION(i.wireDecode("0509 0703080149 22021356"_block), tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400618 [] (const auto& e) { return e.what() == "HopLimit element is malformed"sv; });
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500619}
620
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400621BOOST_AUTO_TEST_CASE(BadParametersDigest)
622{
623 // ApplicationParameters without ParametersSha256DigestComponent
624 Block b1("0509 0703(080149) 2402CAFE"_block);
625 // ParametersSha256DigestComponent without ApplicationParameters
626 Block b2("0527 0725(080149 0220E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855)"_block);
627 // digest mismatch
628 Block b3("052B 0725(080149 02200000000000000000000000000000000000000000000000000000000000000000) "
629 "2402CAFE"_block);
630
631 BOOST_CHECK_THROW(i.wireDecode(b1), tlv::Error);
632 BOOST_CHECK_THROW(i.wireDecode(b2), tlv::Error);
633 BOOST_CHECK_THROW(i.wireDecode(b3), tlv::Error);
634
635 DisableAutoCheckParametersDigest disabler;
636 BOOST_CHECK_NO_THROW(i.wireDecode(b1));
637 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), false);
638 BOOST_CHECK_NO_THROW(i.wireDecode(b2));
639 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), false);
640 BOOST_CHECK_NO_THROW(i.wireDecode(b3));
641 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), false);
642}
643
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000644BOOST_AUTO_TEST_CASE(UnrecognizedCriticalElement)
645{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400646 BOOST_CHECK_EXCEPTION(i.wireDecode("0507 0703080149 FB00"_block), tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400647 [] (const auto& e) { return e.what() == "Unrecognized element of critical type 251"sv; });
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400648 // v0.2 packet with Selectors
Davide Pesavento905d40f2020-06-09 21:33:25 -0400649 BOOST_CHECK_EXCEPTION(i.wireDecode("0510 0703080149 09030D0101 0A0401000000"_block), tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400650 [] (const auto& e) { return e.what() == "Unrecognized element of critical type 9"sv; });
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000651}
652
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400653BOOST_AUTO_TEST_SUITE_END() // Decode
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000654
Junxiao Shi899277a2017-07-07 22:12:12 +0000655BOOST_AUTO_TEST_CASE(MatchesData)
656{
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000657 auto interest = makeInterest("/A");
Junxiao Shi899277a2017-07-07 22:12:12 +0000658
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000659 auto data = makeData("/A");
660 BOOST_CHECK_EQUAL(interest->matchesData(*data), true);
Junxiao Shi899277a2017-07-07 22:12:12 +0000661
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000662 data->setName("/A/D");
663 BOOST_CHECK_EQUAL(interest->matchesData(*data), false); // violates CanBePrefix
Junxiao Shi899277a2017-07-07 22:12:12 +0000664
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000665 interest->setCanBePrefix(true);
666 BOOST_CHECK_EQUAL(interest->matchesData(*data), true);
Junxiao Shi899277a2017-07-07 22:12:12 +0000667
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000668 interest->setMustBeFresh(true);
Alexander Afanasyev0af48fb2023-05-19 12:20:15 -0400669 BOOST_CHECK_EQUAL(interest->matchesData(*data), true);
Junxiao Shi899277a2017-07-07 22:12:12 +0000670
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000671 data->setFreshnessPeriod(1_s);
672 BOOST_CHECK_EQUAL(interest->matchesData(*data), true);
Junxiao Shi899277a2017-07-07 22:12:12 +0000673
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000674 data->setName("/H/I");
675 BOOST_CHECK_EQUAL(interest->matchesData(*data), false); // Name does not match
Junxiao Shi899277a2017-07-07 22:12:12 +0000676
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000677 data->wireEncode();
678 interest = makeInterest(data->getFullName());
679 BOOST_CHECK_EQUAL(interest->matchesData(*data), true);
Junxiao Shi899277a2017-07-07 22:12:12 +0000680
Davide Pesavento53533942020-03-04 23:10:06 -0500681 setNameComponent(*interest, -1,
682 name::Component::fromEscapedString("sha256digest=00000000000000000000000000"
683 "00000000000000000000000000000000000000"));
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000684 BOOST_CHECK_EQUAL(interest->matchesData(*data), false); // violates implicit digest
Junxiao Shi899277a2017-07-07 22:12:12 +0000685}
686
Davide Pesavento94048922023-08-11 22:00:01 -0400687BOOST_AUTO_TEST_CASE(MatchesInterest,
688 * boost::unit_test::expected_failures(1))
Junxiao Shi899277a2017-07-07 22:12:12 +0000689{
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400690 Interest interest;
691 interest.setName("/A")
692 .setCanBePrefix(true)
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000693 .setMustBeFresh(true)
Junxiao Shie4603e12022-01-05 19:12:25 +0000694 .setForwardingHint({"/H"})
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000695 .setNonce(2228)
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400696 .setInterestLifetime(5_s)
697 .setHopLimit(90);
Junxiao Shi899277a2017-07-07 22:12:12 +0000698
699 Interest other;
700 BOOST_CHECK_EQUAL(interest.matchesInterest(other), false);
701
702 other.setName(interest.getName());
703 BOOST_CHECK_EQUAL(interest.matchesInterest(other), false);
704
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000705 other.setCanBePrefix(interest.getCanBePrefix());
706 BOOST_CHECK_EQUAL(interest.matchesInterest(other), false);
707
708 other.setMustBeFresh(interest.getMustBeFresh());
Junxiao Shi899277a2017-07-07 22:12:12 +0000709 BOOST_CHECK_EQUAL(interest.matchesInterest(other), false); // will match until #3162 implemented
710
Junxiao Shie4603e12022-01-05 19:12:25 +0000711 auto fh = interest.getForwardingHint();
712 other.setForwardingHint(std::vector<Name>(fh.begin(), fh.end()));
Junxiao Shi899277a2017-07-07 22:12:12 +0000713 BOOST_CHECK_EQUAL(interest.matchesInterest(other), true);
714
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000715 other.setNonce(9336);
Junxiao Shi899277a2017-07-07 22:12:12 +0000716 BOOST_CHECK_EQUAL(interest.matchesInterest(other), true);
717
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000718 other.setInterestLifetime(3_s);
Junxiao Shi899277a2017-07-07 22:12:12 +0000719 BOOST_CHECK_EQUAL(interest.matchesInterest(other), true);
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400720
721 other.setHopLimit(31);
722 BOOST_CHECK_EQUAL(interest.matchesInterest(other), true);
Junxiao Shi899277a2017-07-07 22:12:12 +0000723}
724
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400725BOOST_AUTO_TEST_CASE(SetName)
726{
727 Interest i;
728 BOOST_CHECK_EQUAL(i.getName(), "/");
729 i.setName("/A/B");
730 BOOST_CHECK_EQUAL(i.getName(), "/A/B");
731 i.setName("/I/params-sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
732 BOOST_CHECK_EQUAL(i.getName(),
733 "/I/params-sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
734 BOOST_CHECK_THROW(i.setName("/I"
735 "/params-sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
736 "/params-sha256=0000000000000000000000000000000000000000000000000000000000000000"),
737 std::invalid_argument);
738}
Junxiao Shi899277a2017-07-07 22:12:12 +0000739
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400740BOOST_AUTO_TEST_CASE(SetCanBePrefix)
Junxiao Shi8d3f8342018-04-04 12:46:37 +0000741{
742 Interest i;
Junxiao Shi8d3f8342018-04-04 12:46:37 +0000743 BOOST_CHECK_EQUAL(i.getCanBePrefix(), false);
Junxiao Shi8d3f8342018-04-04 12:46:37 +0000744 i.setCanBePrefix(true);
745 BOOST_CHECK_EQUAL(i.getCanBePrefix(), true);
Davide Pesavento478d3382021-03-17 12:46:08 -0400746 i.setCanBePrefix(false);
747 BOOST_CHECK_EQUAL(i.getCanBePrefix(), false);
Junxiao Shi8d3f8342018-04-04 12:46:37 +0000748}
749
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400750BOOST_AUTO_TEST_CASE(SetMustBeFresh)
Junxiao Shi8d3f8342018-04-04 12:46:37 +0000751{
752 Interest i;
753 BOOST_CHECK_EQUAL(i.getMustBeFresh(), false);
754 i.setMustBeFresh(true);
755 BOOST_CHECK_EQUAL(i.getMustBeFresh(), true);
Junxiao Shi8d3f8342018-04-04 12:46:37 +0000756 i.setMustBeFresh(false);
757 BOOST_CHECK_EQUAL(i.getMustBeFresh(), false);
Junxiao Shi8d3f8342018-04-04 12:46:37 +0000758}
759
Junxiao Shi899277a2017-07-07 22:12:12 +0000760BOOST_AUTO_TEST_CASE(GetNonce)
761{
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000762 unique_ptr<Interest> i1, i2;
Davide Pesavento53533942020-03-04 23:10:06 -0500763 Interest::Nonce nonce1(0), nonce2(0);
Junxiao Shi899277a2017-07-07 22:12:12 +0000764
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000765 // getNonce automatically assigns a random Nonce.
766 // It's possible to assign the same Nonce to two Interest, but it's unlikely to get 100 pairs of
Davide Pesavento53533942020-03-04 23:10:06 -0500767 // identical Nonces in a row.
Junxiao Shi899277a2017-07-07 22:12:12 +0000768 int nIterations = 0;
769 do {
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000770 i1 = make_unique<Interest>();
771 nonce1 = i1->getNonce();
772 i2 = make_unique<Interest>();
773 nonce2 = i2->getNonce();
Junxiao Shi899277a2017-07-07 22:12:12 +0000774 }
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000775 while (nonce1 == nonce2 && ++nIterations < 100);
Davide Pesavento53533942020-03-04 23:10:06 -0500776
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000777 BOOST_CHECK_NE(nonce1, nonce2);
778 BOOST_CHECK(i1->hasNonce());
779 BOOST_CHECK(i2->hasNonce());
Junxiao Shi899277a2017-07-07 22:12:12 +0000780
781 // Once a Nonce is assigned, it should not change.
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000782 BOOST_CHECK_EQUAL(i1->getNonce(), nonce1);
Davide Pesavento53533942020-03-04 23:10:06 -0500783 BOOST_CHECK_EQUAL(i2->getNonce(), nonce2);
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000784}
785
786BOOST_AUTO_TEST_CASE(SetNonce)
787{
788 Interest i1("/A");
Davide Pesavento53533942020-03-04 23:10:06 -0500789 BOOST_CHECK(!i1.hasNonce());
790
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000791 i1.setNonce(1);
792 i1.wireEncode();
Davide Pesavento53533942020-03-04 23:10:06 -0500793 BOOST_CHECK(i1.hasNonce());
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000794 BOOST_CHECK_EQUAL(i1.getNonce(), 1);
795
796 Interest i2(i1);
Davide Pesavento53533942020-03-04 23:10:06 -0500797 BOOST_CHECK(i2.hasNonce());
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000798 BOOST_CHECK_EQUAL(i2.getNonce(), 1);
799
800 i2.setNonce(2);
801 BOOST_CHECK_EQUAL(i2.getNonce(), 2);
Davide Pesavento53533942020-03-04 23:10:06 -0500802 BOOST_CHECK_EQUAL(i1.getNonce(), 1); // should not affect i1's Nonce (Bug #4168)
803
Davide Pesaventof6b45892023-03-13 15:00:51 -0400804 i2.setNonce(std::nullopt);
Davide Pesavento53533942020-03-04 23:10:06 -0500805 BOOST_CHECK(!i2.hasNonce());
Junxiao Shi899277a2017-07-07 22:12:12 +0000806}
807
808BOOST_AUTO_TEST_CASE(RefreshNonce)
809{
810 Interest i;
811 BOOST_CHECK(!i.hasNonce());
812 i.refreshNonce();
813 BOOST_CHECK(!i.hasNonce());
814
815 i.setNonce(1);
816 BOOST_CHECK(i.hasNonce());
817 i.refreshNonce();
818 BOOST_CHECK(i.hasNonce());
819 BOOST_CHECK_NE(i.getNonce(), 1);
820}
821
Davide Pesavento53533942020-03-04 23:10:06 -0500822BOOST_AUTO_TEST_CASE(NonceConversions)
823{
824 Interest i;
Davide Pesavento53533942020-03-04 23:10:06 -0500825
826 // 4-arg constructor
827 Interest::Nonce n1(1, 2, 3, 4);
828 i.setNonce(n1);
829 BOOST_CHECK_EQUAL(i.getNonce(), 0x01020304);
830
831 // 4-arg constructor + assignment
832 n1 = {0xf, 0xe, 0xd, 0xc};
833 i.setNonce(n1);
834 BOOST_CHECK_EQUAL(i.getNonce(), 0x0f0e0d0c);
835
836 // 1-arg constructor + assignment (implicit conversion)
837 Interest::Nonce n2;
838 n2 = 42;
839 BOOST_CHECK_NE(n1, n2);
840 i.setNonce(n2);
841 n2 = 21; // should not affect i's Nonce
842 BOOST_CHECK_EQUAL(i.getNonce(), 42);
843 BOOST_CHECK_EQUAL(i.toUri(), "/?Nonce=0000002a"); // stored in big-endian
844}
845
Junxiao Shi899277a2017-07-07 22:12:12 +0000846BOOST_AUTO_TEST_CASE(SetInterestLifetime)
847{
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500848 BOOST_CHECK_THROW(Interest("/A", -1_ms), std::invalid_argument);
Davide Pesavento0f830802018-01-16 23:58:58 -0500849 BOOST_CHECK_NO_THROW(Interest("/A", 0_ms));
Junxiao Shi899277a2017-07-07 22:12:12 +0000850
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400851 Interest i;
Junxiao Shi899277a2017-07-07 22:12:12 +0000852 BOOST_CHECK_EQUAL(i.getInterestLifetime(), DEFAULT_INTEREST_LIFETIME);
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500853 BOOST_CHECK_THROW(i.setInterestLifetime(-1_ms), std::invalid_argument);
Junxiao Shi899277a2017-07-07 22:12:12 +0000854 BOOST_CHECK_EQUAL(i.getInterestLifetime(), DEFAULT_INTEREST_LIFETIME);
Davide Pesavento0f830802018-01-16 23:58:58 -0500855 i.setInterestLifetime(0_ms);
856 BOOST_CHECK_EQUAL(i.getInterestLifetime(), 0_ms);
857 i.setInterestLifetime(1_ms);
858 BOOST_CHECK_EQUAL(i.getInterestLifetime(), 1_ms);
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400859
860 i = Interest("/B", 15_s);
861 BOOST_CHECK_EQUAL(i.getInterestLifetime(), 15_s);
862}
863
864BOOST_AUTO_TEST_CASE(SetHopLimit)
865{
866 Interest i;
Davide Pesaventof6b45892023-03-13 15:00:51 -0400867 BOOST_CHECK(i.getHopLimit() == std::nullopt);
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400868 i.setHopLimit(42);
869 BOOST_CHECK(i.getHopLimit() == 42);
Davide Pesaventof6b45892023-03-13 15:00:51 -0400870 i.setHopLimit(std::nullopt);
871 BOOST_CHECK(i.getHopLimit() == std::nullopt);
Junxiao Shi899277a2017-07-07 22:12:12 +0000872}
873
Davide Pesavento9c19a392019-04-06 15:07:54 -0400874BOOST_AUTO_TEST_CASE(SetApplicationParameters)
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700875{
876 const uint8_t PARAMETERS1[] = {0xc1};
877 const uint8_t PARAMETERS2[] = {0xc2};
878
879 Interest i;
Davide Pesavento9c19a392019-04-06 15:07:54 -0400880 BOOST_CHECK(!i.hasApplicationParameters());
881 i.setApplicationParameters("2400"_block);
882 BOOST_CHECK(i.hasApplicationParameters());
883 i.unsetApplicationParameters();
884 BOOST_CHECK(!i.hasApplicationParameters());
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700885
Davide Pesavento38912442019-04-06 22:03:39 -0400886 // Block overload
Davide Pesavento38912442019-04-06 22:03:39 -0400887 i.setApplicationParameters("2401C0"_block);
Davide Pesavento9c19a392019-04-06 15:07:54 -0400888 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2401C0"_block);
Davide Pesavento38912442019-04-06 22:03:39 -0400889 i.setApplicationParameters("8001C1"_block);
Davide Pesavento9c19a392019-04-06 15:07:54 -0400890 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "24038001C1"_block);
Davide Pesavento296c3a12023-05-04 21:40:40 -0400891
892 // Block overload, default constructed (invalid)
893 BOOST_CHECK_EXCEPTION(i.setApplicationParameters(Block{}), std::invalid_argument, [] (const auto& e) {
894 return e.what() == "ApplicationParameters block must be valid"sv;
895 });
Davide Pesavento38912442019-04-06 22:03:39 -0400896
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500897 // span overload
898 i.setApplicationParameters(PARAMETERS1);
Davide Pesavento38912442019-04-06 22:03:39 -0400899 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2401C1"_block);
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500900 i.setApplicationParameters(span<uint8_t>{});
Davide Pesavento38912442019-04-06 22:03:39 -0400901 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2400"_block);
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500902
Davide Pesavento296c3a12023-05-04 21:40:40 -0400903 // string_view overload
904 i.setApplicationParameters("hi"sv);
905 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "24026869"_block);
906 i.setApplicationParameters("");
907 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2400"_block);
908
Davide Pesavento38912442019-04-06 22:03:39 -0400909 // ConstBufferPtr overload
910 i.setApplicationParameters(make_shared<Buffer>(PARAMETERS2, sizeof(PARAMETERS2)));
911 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2401C2"_block);
912 i.setApplicationParameters(make_shared<Buffer>());
913 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2400"_block);
Davide Pesavento296c3a12023-05-04 21:40:40 -0400914
915 // ConstBufferPtr overload, null/empty pointer (invalid)
916 BOOST_CHECK_EXCEPTION(i.setApplicationParameters(ConstBufferPtr{}), std::invalid_argument, [] (const auto& e) {
917 return e.what() == "ApplicationParameters buffer cannot be null"sv;
918 });
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700919}
920
Eric Newberry6e262f02020-05-29 23:11:25 -0700921BOOST_AUTO_TEST_CASE(SetSignature)
922{
923 Interest i;
Eric Newberry6e262f02020-05-29 23:11:25 -0700924
Eric Newberry6e262f02020-05-29 23:11:25 -0700925 Block sv1("2E04 01020304"_block);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400926 BOOST_CHECK_EXCEPTION(i.setSignatureValue(sv1.value_bytes()), tlv::Error, [] (const auto& e) {
Davide Pesavento296c3a12023-05-04 21:40:40 -0400927 return e.what() == "InterestSignatureInfo must be present to set InterestSignatureValue"sv;
Davide Pesavento487e3d32022-05-05 18:06:23 -0400928 });
929
Davide Pesaventof6b45892023-03-13 15:00:51 -0400930 BOOST_CHECK(i.getSignatureInfo() == std::nullopt);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400931 BOOST_CHECK_EQUAL(i.getSignatureValue().isValid(), false);
932 BOOST_CHECK_EQUAL(i.isSigned(), false);
Eric Newberry6e262f02020-05-29 23:11:25 -0700933
934 // Simple set/get case for InterestSignatureInfo (no prior set)
935 SignatureInfo si1(tlv::SignatureSha256WithEcdsa);
936 i.setSignatureInfo(si1);
937 BOOST_CHECK(i.getSignatureInfo() == si1);
938 BOOST_CHECK_EQUAL(i.isSigned(), false);
939
940 // Simple set/get case for InterestSignatureValue (no prior set)
Davide Pesavento487e3d32022-05-05 18:06:23 -0400941 auto svBuffer1 = make_shared<Buffer>(sv1.value_begin(), sv1.value_end());
Eric Newberry6e262f02020-05-29 23:11:25 -0700942 i.setSignatureValue(svBuffer1);
943 BOOST_CHECK_EQUAL(i.getSignatureValue(), sv1);
944 BOOST_CHECK_EQUAL(i.isSigned(), true);
945
Davide Pesavento296c3a12023-05-04 21:40:40 -0400946 // Throws because attempting to set InterestSignatureValue to a null pointer
947 BOOST_CHECK_EXCEPTION(i.setSignatureValue(ConstBufferPtr{}), std::invalid_argument, [] (const auto& e) {
948 return e.what() == "InterestSignatureValue buffer cannot be null"sv;
949 });
Eric Newberry6e262f02020-05-29 23:11:25 -0700950 BOOST_CHECK_EQUAL(i.getSignatureValue(), sv1);
951 BOOST_CHECK_EQUAL(i.isSigned(), true);
952
953 // Ensure that wire is not reset if specified InterestSignatureInfo is same
954 i.wireEncode();
955 BOOST_CHECK_EQUAL(i.hasWire(), true);
956 i.setSignatureInfo(si1);
957 BOOST_CHECK_EQUAL(i.hasWire(), true);
958 BOOST_CHECK(i.getSignatureInfo() == si1);
959 BOOST_CHECK_EQUAL(i.getSignatureValue(), sv1);
960 BOOST_CHECK_EQUAL(i.isSigned(), true);
961
962 // Ensure that wire is reset if specified InterestSignatureInfo is different
963 i.wireEncode();
964 BOOST_CHECK_EQUAL(i.hasWire(), true);
965 SignatureInfo si2(tlv::SignatureSha256WithRsa);
966 i.setSignatureInfo(si2);
967 BOOST_CHECK_EQUAL(i.hasWire(), false);
968 BOOST_CHECK(i.getSignatureInfo() == si2);
969 BOOST_CHECK_EQUAL(i.getSignatureValue(), sv1);
970 BOOST_CHECK_EQUAL(i.isSigned(), true);
971
972 // Ensure that wire is not reset if specified InterestSignatureValue is same
973 i.wireEncode();
974 BOOST_CHECK_EQUAL(i.hasWire(), true);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400975 i.setSignatureValue(sv1.value_bytes());
Eric Newberry6e262f02020-05-29 23:11:25 -0700976 BOOST_CHECK_EQUAL(i.hasWire(), true);
977 BOOST_CHECK(i.getSignatureInfo() == si2);
978 BOOST_CHECK_EQUAL(i.getSignatureValue(), sv1);
979 BOOST_CHECK_EQUAL(i.isSigned(), true);
980
981 // Ensure that wire is reset if specified InterestSignatureValue is different
982 i.wireEncode();
983 BOOST_CHECK_EQUAL(i.hasWire(), true);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400984 const uint8_t sv2[] = {0x99, 0x88, 0x77, 0x66};
985 i.setSignatureValue(sv2);
Eric Newberry6e262f02020-05-29 23:11:25 -0700986 BOOST_CHECK_EQUAL(i.hasWire(), false);
987 BOOST_CHECK(i.getSignatureInfo() == si2);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400988 BOOST_TEST(i.getSignatureValue().value_bytes() == sv2, boost::test_tools::per_element());
Eric Newberry6e262f02020-05-29 23:11:25 -0700989 BOOST_CHECK_EQUAL(i.isSigned(), true);
990}
991
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400992BOOST_AUTO_TEST_CASE(ParametersSha256DigestComponent)
993{
994 Interest i("/I");
995 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
996
997 i.setApplicationParameters("2404C0C1C2C3"_block); // auto-appends ParametersSha256DigestComponent
998 BOOST_CHECK_EQUAL(i.getName(),
999 "/I/params-sha256=ff9100e04eaadcf30674d98026a051ba25f56b69bfa026dcccd72c6ea0f7315a");
1000 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
1001
Davide Pesaventoa3d809e2022-02-06 11:55:02 -05001002 i.setApplicationParameters(span<uint8_t>{}); // updates ParametersSha256DigestComponent
Davide Pesaventoadc9aa22019-06-30 19:00:20 -04001003 BOOST_CHECK_EQUAL(i.getName(),
1004 "/I/params-sha256=33b67cb5385ceddad93d0ee960679041613bed34b8b4a5e6362fe7539ba2d3ce");
1005 BOOST_CHECK_EQUAL(i.hasApplicationParameters(), true);
1006 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
1007
1008 i.unsetApplicationParameters(); // removes ParametersSha256DigestComponent
1009 BOOST_CHECK_EQUAL(i.getName(), "/I");
1010 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
1011
1012 i.setName(Name("/P").appendParametersSha256DigestPlaceholder().append("Q"));
1013 BOOST_CHECK_EQUAL(i.hasApplicationParameters(), false);
1014 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), false);
1015
1016 i.unsetApplicationParameters(); // removes ParametersSha256DigestComponent
1017 BOOST_CHECK_EQUAL(i.getName(), "/P/Q");
1018 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
1019
1020 i.setName(Name("/P").appendParametersSha256DigestPlaceholder().append("Q"));
1021 i.setApplicationParameters("2404C0C1C2C3"_block); // updates ParametersSha256DigestComponent
1022 BOOST_CHECK_EQUAL(i.getName(),
1023 "/P/params-sha256=ff9100e04eaadcf30674d98026a051ba25f56b69bfa026dcccd72c6ea0f7315a/Q");
1024 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
1025
1026 i.setName("/A/B/C"); // auto-appends ParametersSha256DigestComponent
1027 BOOST_CHECK_EQUAL(i.getName(),
1028 "/A/B/C/params-sha256=ff9100e04eaadcf30674d98026a051ba25f56b69bfa026dcccd72c6ea0f7315a");
1029 BOOST_CHECK_EQUAL(i.hasApplicationParameters(), true);
1030 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
Eric Newberry6e262f02020-05-29 23:11:25 -07001031
1032 SignatureInfo si(tlv::SignatureSha256WithEcdsa);
1033 i.setSignatureInfo(si); // updates ParametersSha256DigestComponent
1034 BOOST_CHECK_EQUAL(i.getName(),
1035 "/A/B/C/params-sha256=6400cae1730c15fd7854b26be05794d53685423c94bc61e59c49bd640d646ae8");
1036 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
1037 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2404 C0C1C2C3"_block);
1038 BOOST_CHECK(i.getSignatureInfo() == si);
1039
1040 i.unsetApplicationParameters(); // removes ParametersSha256DigestComponent and InterestSignatureInfo
Davide Pesaventof6b45892023-03-13 15:00:51 -04001041 BOOST_CHECK(i.getSignatureInfo() == std::nullopt);
Eric Newberry6e262f02020-05-29 23:11:25 -07001042 BOOST_CHECK_EQUAL(i.getSignatureValue().isValid(), false);
1043 BOOST_CHECK_EQUAL(i.getName(), "/A/B/C");
1044
1045 i.setSignatureInfo(si); // auto-adds an empty ApplicationParameters element
1046 BOOST_CHECK_EQUAL(i.getName(),
1047 "/A/B/C/params-sha256=d2ac0eb1f60f60ab206fb80bf1d0f73cfef353bbec43ba6ea626117f671ca3bb");
1048 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
1049 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2400"_block);
1050 BOOST_CHECK(i.getSignatureInfo() == si);
1051
1052 Block sv("2E04 01020304"_block);
Davide Pesavento487e3d32022-05-05 18:06:23 -04001053 i.setSignatureValue(sv.value_bytes()); // updates ParametersDigestSha256Component
Eric Newberry6e262f02020-05-29 23:11:25 -07001054 BOOST_CHECK_EQUAL(i.getName(),
1055 "/A/B/C/params-sha256=f649845ef944638390d1c689e2f0618ea02e471eff236110cbeb822d5932d342");
1056 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
1057 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2400"_block);
1058 BOOST_CHECK(i.getSignatureInfo() == si);
1059 BOOST_CHECK_EQUAL(i.getSignatureValue(), sv);
1060
1061 i.setApplicationParameters("2404C0C1C2C3"_block); // updates ParametersSha256DigestComponent
1062 BOOST_CHECK_EQUAL(i.getName(),
1063 "/A/B/C/params-sha256=c5d7e567e6b251ddf36f7a6dbed95235b2d4a0b36215bb0f3cc403ac64ad0284");
1064 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
1065 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2404 C0C1C2C3"_block);
1066 BOOST_CHECK(i.getSignatureInfo() == si);
1067 BOOST_CHECK_EQUAL(i.getSignatureValue(), sv);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -04001068}
Junxiao Shi899277a2017-07-07 22:12:12 +00001069
Eric Newberryb74bbda2020-06-18 19:33:58 -07001070BOOST_AUTO_TEST_CASE(ExtractSignedRanges)
1071{
Davide Pesavento296c3a12023-05-04 21:40:40 -04001072 InputBuffers bufs;
1073
Eric Newberryb74bbda2020-06-18 19:33:58 -07001074 Interest i1;
Davide Pesavento296c3a12023-05-04 21:40:40 -04001075 BOOST_CHECK_EXCEPTION(bufs = i1.extractSignedRanges(), tlv::Error, [] (const auto& e) {
1076 return e.what() == "Name has zero name components"sv;
Eric Newberryb74bbda2020-06-18 19:33:58 -07001077 });
1078 i1.setName("/test/prefix");
1079 i1.setNonce(0x01020304);
1080 SignatureInfo sigInfo(tlv::DigestSha256);
1081 i1.setSignatureInfo(sigInfo);
1082
1083 // Test with previously unsigned Interest (no InterestSignatureValue)
1084 auto ranges1 = i1.extractSignedRanges();
1085 BOOST_REQUIRE_EQUAL(ranges1.size(), 2);
1086 const Block& wire1 = i1.wireEncode();
1087 // Ensure Name range captured properly
1088 Block nameWithoutDigest1 = i1.getName().getPrefix(-1).wireEncode();
Davide Pesavento765abc92021-12-27 00:44:04 -05001089 BOOST_CHECK_EQUAL_COLLECTIONS(ranges1.front().begin(), ranges1.front().end(),
Eric Newberryb74bbda2020-06-18 19:33:58 -07001090 nameWithoutDigest1.value_begin(), nameWithoutDigest1.value_end());
1091 // Ensure parameters range captured properly
1092 const auto& appParamsWire1 = wire1.find(tlv::ApplicationParameters);
1093 BOOST_REQUIRE(appParamsWire1 != wire1.elements_end());
Davide Pesavento765abc92021-12-27 00:44:04 -05001094 BOOST_CHECK_EQUAL_COLLECTIONS(ranges1.back().begin(), ranges1.back().end(),
Eric Newberryb74bbda2020-06-18 19:33:58 -07001095 appParamsWire1->begin(), wire1.end());
1096
1097 // Test with Interest with existing InterestSignatureValue
Davide Pesavento487e3d32022-05-05 18:06:23 -04001098 i1.setSignatureValue(std::make_shared<Buffer>());
Eric Newberryb74bbda2020-06-18 19:33:58 -07001099 auto ranges2 = i1.extractSignedRanges();
1100 BOOST_REQUIRE_EQUAL(ranges2.size(), 2);
1101 const auto& wire2 = i1.wireEncode();
1102 // Ensure Name range captured properly
1103 Block nameWithoutDigest2 = i1.getName().getPrefix(-1).wireEncode();
Davide Pesavento765abc92021-12-27 00:44:04 -05001104 BOOST_CHECK_EQUAL_COLLECTIONS(ranges2.front().begin(), ranges2.front().end(),
Eric Newberryb74bbda2020-06-18 19:33:58 -07001105 nameWithoutDigest2.value_begin(), nameWithoutDigest2.value_end());
1106 // Ensure parameters range captured properly
1107 const auto& appParamsWire2 = wire2.find(tlv::ApplicationParameters);
1108 BOOST_REQUIRE(appParamsWire2 != wire2.elements_end());
1109 const auto& sigValueWire2 = wire2.find(tlv::InterestSignatureValue);
1110 BOOST_REQUIRE(sigValueWire2 != wire2.elements_end());
Davide Pesavento765abc92021-12-27 00:44:04 -05001111 BOOST_CHECK_EQUAL_COLLECTIONS(ranges2.back().begin(), ranges2.back().end(),
Eric Newberryb74bbda2020-06-18 19:33:58 -07001112 appParamsWire2->begin(), sigValueWire2->begin());
1113
1114 // Test with decoded Interest
1115 const uint8_t WIRE[] = {
1116 0x05, 0x6f, // Interest
1117 0x07, 0x2e, // Name
1118 0x08, 0x04, // GenericNameComponent
1119 0x61, 0x62, 0x63, 0x64,
1120 0x08, 0x04, // GenericNameComponent
1121 0x65, 0x66, 0x67, 0x68,
1122 0x02, 0x20, // ParametersSha256DigestComponent
1123 0x6f, 0x29, 0x58, 0x60, 0x53, 0xee, 0x9f, 0xcc,
1124 0xd8, 0xa4, 0x22, 0x12, 0x29, 0x25, 0x28, 0x7c,
1125 0x0a, 0x18, 0x43, 0x5f, 0x40, 0x74, 0xc4, 0x0a,
1126 0xbb, 0x0d, 0x5b, 0x30, 0xe4, 0xaa, 0x62, 0x20,
1127 0x12, 0x00, // MustBeFresh
1128 0x0a, 0x04, // Nonce
1129 0x4c, 0x1e, 0xcb, 0x4a,
1130 0x24, 0x04, // ApplicationParameters
1131 0xc0, 0xc1, 0xc2, 0xc3,
1132 0x2c, 0x0d, // InterestSignatureInfo
1133 0x1b, 0x01, // SignatureType
1134 0x00,
1135 0x26, 0x08, // SignatureNonce
1136 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
1137 0x2e, 0x20, // InterestSignatureValue
1138 0x12, 0x47, 0x1a, 0xe0, 0xf8, 0x72, 0x3a, 0xc1,
1139 0x15, 0x6c, 0x37, 0x0a, 0x38, 0x71, 0x1e, 0xbe,
1140 0xbf, 0x28, 0x17, 0xde, 0x9b, 0x2d, 0xd9, 0x4e,
1141 0x9b, 0x7e, 0x62, 0xf1, 0x17, 0xb8, 0x76, 0xc1,
1142 };
Davide Pesaventofbea4fc2022-02-08 07:26:04 -05001143 Block wire3(WIRE);
Eric Newberryb74bbda2020-06-18 19:33:58 -07001144 Interest i2(wire3);
1145 auto ranges3 = i2.extractSignedRanges();
1146 BOOST_REQUIRE_EQUAL(ranges3.size(), 2);
1147 // Ensure Name range captured properly
Davide Pesavento765abc92021-12-27 00:44:04 -05001148 BOOST_CHECK_EQUAL_COLLECTIONS(ranges3.front().begin(), ranges3.front().end(), &WIRE[4], &WIRE[16]);
Eric Newberryb74bbda2020-06-18 19:33:58 -07001149 // Ensure parameters range captured properly
Davide Pesavento765abc92021-12-27 00:44:04 -05001150 BOOST_CHECK_EQUAL_COLLECTIONS(ranges3.back().begin(), ranges3.back().end(), &WIRE[58], &WIRE[79]);
Eric Newberryb74bbda2020-06-18 19:33:58 -07001151
Eric Newberryb74bbda2020-06-18 19:33:58 -07001152 Interest i3("/a");
Davide Pesavento296c3a12023-05-04 21:40:40 -04001153 // Failure due to missing ParametersSha256DigestComponent
1154 BOOST_CHECK_EXCEPTION(bufs = i3.extractSignedRanges(), tlv::Error, [] (const auto& e) {
1155 return e.what() == "Interest Name must end with a ParametersSha256DigestComponent"sv;
Eric Newberryb74bbda2020-06-18 19:33:58 -07001156 });
1157
Davide Pesavento296c3a12023-05-04 21:40:40 -04001158 i3.setApplicationParameters("");
1159 // Failure due to missing InterestSignatureInfo
1160 BOOST_CHECK_EXCEPTION(bufs = i3.extractSignedRanges(), tlv::Error, [] (const auto& e) {
1161 return e.what() == "Interest missing InterestSignatureInfo"sv;
Eric Newberryb74bbda2020-06-18 19:33:58 -07001162 });
1163}
1164
Davide Pesavento2fdb2742019-07-31 23:03:35 -04001165BOOST_AUTO_TEST_CASE(ToUri)
1166{
1167 Interest i;
Davide Pesavento2fdb2742019-07-31 23:03:35 -04001168 BOOST_CHECK_EQUAL(i.toUri(), "/");
1169
1170 i.setName("/foo");
1171 BOOST_CHECK_EQUAL(i.toUri(), "/foo");
1172
1173 i.setCanBePrefix(true);
1174 BOOST_CHECK_EQUAL(i.toUri(), "/foo?CanBePrefix");
1175
1176 i.setMustBeFresh(true);
1177 BOOST_CHECK_EQUAL(i.toUri(), "/foo?CanBePrefix&MustBeFresh");
1178
Davide Pesavento53533942020-03-04 23:10:06 -05001179 i.setNonce(0xa1b2c3);
1180 BOOST_CHECK_EQUAL(i.toUri(), "/foo?CanBePrefix&MustBeFresh&Nonce=00a1b2c3");
Davide Pesavento2fdb2742019-07-31 23:03:35 -04001181
1182 i.setInterestLifetime(2_s);
Davide Pesavento53533942020-03-04 23:10:06 -05001183 BOOST_CHECK_EQUAL(i.toUri(), "/foo?CanBePrefix&MustBeFresh&Nonce=00a1b2c3&Lifetime=2000");
Davide Pesavento2fdb2742019-07-31 23:03:35 -04001184
1185 i.setHopLimit(18);
Davide Pesavento53533942020-03-04 23:10:06 -05001186 BOOST_CHECK_EQUAL(i.toUri(), "/foo?CanBePrefix&MustBeFresh&Nonce=00a1b2c3&Lifetime=2000&HopLimit=18");
Davide Pesavento2fdb2742019-07-31 23:03:35 -04001187
1188 i.setCanBePrefix(false);
1189 i.setMustBeFresh(false);
Davide Pesaventof6b45892023-03-13 15:00:51 -04001190 i.setHopLimit(std::nullopt);
Davide Pesavento2fdb2742019-07-31 23:03:35 -04001191 i.setApplicationParameters("2402CAFE"_block);
1192 BOOST_CHECK_EQUAL(i.toUri(),
1193 "/foo/params-sha256=8621f5e8321f04104640c8d02877d7c5142cad6e203c5effda1783b1a0e476d6"
Davide Pesavento53533942020-03-04 23:10:06 -05001194 "?Nonce=00a1b2c3&Lifetime=2000");
Davide Pesavento2fdb2742019-07-31 23:03:35 -04001195}
1196
Davide Pesaventoeee3e822016-11-26 19:19:34 +01001197BOOST_AUTO_TEST_SUITE_END() // TestInterest
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -08001198
Davide Pesavento47ce2ee2023-05-09 01:33:33 -04001199} // namespace ndn::tests