blob: 5e64fb1dad158d3f33d7578b3f0e7eeda2e0dd7e [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 Pesavento0c526032024-01-31 21:14:01 -05003 * Copyright (c) 2013-2024 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");
Davide Pesaventofffdd622023-08-28 22:50:43 -040034BOOST_CONCEPT_ASSERT((boost::EqualityComparable<Interest::Nonce>));
Davide Pesavento152ef442023-04-22 02:02:29 -040035
Junxiao Shi899277a2017-07-07 22:12:12 +000036BOOST_AUTO_TEST_SUITE(TestInterest)
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080037
Davide Pesaventoadc9aa22019-06-30 19:00:20 -040038class DisableAutoCheckParametersDigest
39{
40public:
41 DisableAutoCheckParametersDigest()
42 : m_saved(Interest::getAutoCheckParametersDigest())
43 {
44 Interest::setAutoCheckParametersDigest(false);
45 }
46
47 ~DisableAutoCheckParametersDigest()
48 {
49 Interest::setAutoCheckParametersDigest(m_saved);
50 }
51
52private:
53 bool m_saved;
54};
Junxiao Shi899277a2017-07-07 22:12:12 +000055
56BOOST_AUTO_TEST_CASE(DefaultConstructor)
57{
58 Interest i;
Davide Pesaventoadc9aa22019-06-30 19:00:20 -040059 BOOST_CHECK_EQUAL(i.hasWire(), false);
Junxiao Shi899277a2017-07-07 22:12:12 +000060 BOOST_CHECK_EQUAL(i.getName(), "/");
Davide Pesavento478d3382021-03-17 12:46:08 -040061 BOOST_CHECK_EQUAL(i.getCanBePrefix(), false);
Junxiao Shi6efa3b72018-04-14 15:54:08 +000062 BOOST_CHECK_EQUAL(i.getMustBeFresh(), false);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -040063 BOOST_CHECK_EQUAL(i.getForwardingHint().empty(), true);
64 BOOST_CHECK_EQUAL(i.hasNonce(), false);
Junxiao Shi899277a2017-07-07 22:12:12 +000065 BOOST_CHECK_EQUAL(i.getInterestLifetime(), DEFAULT_INTEREST_LIFETIME);
Davide Pesaventof6b45892023-03-13 15:00:51 -040066 BOOST_CHECK(i.getHopLimit() == std::nullopt);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -040067 BOOST_CHECK_EQUAL(i.hasApplicationParameters(), false);
68 BOOST_CHECK_EQUAL(i.getApplicationParameters().isValid(), false);
69 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
Davide Pesaventof6b45892023-03-13 15:00:51 -040070 BOOST_CHECK(i.getSignatureInfo() == std::nullopt);
Eric Newberry6e262f02020-05-29 23:11:25 -070071 BOOST_CHECK_EQUAL(i.getSignatureValue().isValid(), false);
72 BOOST_CHECK_EQUAL(i.isSigned(), false);
Davide Pesaventofccb2dc2019-02-09 01:02:35 -050073}
74
Davide Pesavento0e0b3892019-07-30 21:05:05 -040075BOOST_AUTO_TEST_SUITE(Encode)
Davide Pesaventoadc9aa22019-06-30 19:00:20 -040076
77BOOST_AUTO_TEST_CASE(Basic)
Junxiao Shi899277a2017-07-07 22:12:12 +000078{
79 const uint8_t WIRE[] = {
80 0x05, 0x1c, // Interest
81 0x07, 0x14, // Name
Junxiao Shi4ffbb9d2018-03-31 17:16:35 +000082 0x08, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, // GenericNameComponent
83 0x08, 0x03, 0x6e, 0x64, 0x6e, // GenericNameComponent
84 0x08, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, // GenericNameComponent
Junxiao Shi899277a2017-07-07 22:12:12 +000085 0x0a, 0x04, // Nonce
Davide Pesavento53533942020-03-04 23:10:06 -050086 0x01, 0x02, 0x03, 0x04,
Junxiao Shi899277a2017-07-07 22:12:12 +000087 };
88
Davide Pesavento0e0b3892019-07-30 21:05:05 -040089 Interest i1;
90 i1.setName("/local/ndn/prefix");
Davide Pesavento53533942020-03-04 23:10:06 -050091 i1.setNonce(0x01020304);
Davide Pesavento0e0b3892019-07-30 21:05:05 -040092 BOOST_CHECK_EQUAL(i1.isParametersDigestValid(), true);
93
Junxiao Shi899277a2017-07-07 22:12:12 +000094 Block wire1 = i1.wireEncode();
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -050095 BOOST_TEST(wire1 == WIRE, boost::test_tools::per_element());
Junxiao Shi899277a2017-07-07 22:12:12 +000096
97 Interest i2(wire1);
98 BOOST_CHECK_EQUAL(i2.getName(), "/local/ndn/prefix");
Davide Pesavento0e0b3892019-07-30 21:05:05 -040099 BOOST_CHECK_EQUAL(i2.getCanBePrefix(), false);
100 BOOST_CHECK_EQUAL(i2.getMustBeFresh(), false);
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400101 BOOST_CHECK_EQUAL(i2.getForwardingHint().empty(), true);
Davide Pesavento835f0272019-09-21 13:18:24 -0400102 BOOST_CHECK_EQUAL(i2.hasNonce(), true);
Davide Pesavento53533942020-03-04 23:10:06 -0500103 BOOST_CHECK_EQUAL(i2.getNonce(), 0x01020304);
Junxiao Shi899277a2017-07-07 22:12:12 +0000104 BOOST_CHECK_EQUAL(i2.getInterestLifetime(), DEFAULT_INTEREST_LIFETIME);
Davide Pesaventof6b45892023-03-13 15:00:51 -0400105 BOOST_CHECK(i2.getHopLimit() == std::nullopt);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400106 BOOST_CHECK_EQUAL(i2.hasApplicationParameters(), false);
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400107 BOOST_CHECK_EQUAL(i2.getApplicationParameters().isValid(), false);
Davide Pesaventof6b45892023-03-13 15:00:51 -0400108 BOOST_CHECK(i2.getSignatureInfo() == std::nullopt);
Eric Newberry6e262f02020-05-29 23:11:25 -0700109 BOOST_CHECK_EQUAL(i2.getSignatureValue().isValid(), false);
110 BOOST_CHECK_EQUAL(i2.isSigned(), false);
Junxiao Shi899277a2017-07-07 22:12:12 +0000111}
112
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400113BOOST_AUTO_TEST_CASE(WithParameters)
114{
115 const uint8_t WIRE[] = {
116 0x05, 0x44, // Interest
117 0x07, 0x36, // Name
118 0x08, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, // GenericNameComponent
119 0x08, 0x03, 0x6e, 0x64, 0x6e, // GenericNameComponent
120 0x08, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, // GenericNameComponent
121 0x02, 0x20, // ParametersSha256DigestComponent
122 0xff, 0x91, 0x00, 0xe0, 0x4e, 0xaa, 0xdc, 0xf3, 0x06, 0x74, 0xd9, 0x80,
123 0x26, 0xa0, 0x51, 0xba, 0x25, 0xf5, 0x6b, 0x69, 0xbf, 0xa0, 0x26, 0xdc,
124 0xcc, 0xd7, 0x2c, 0x6e, 0xa0, 0xf7, 0x31, 0x5a,
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700125 0x0a, 0x04, // Nonce
Davide Pesavento53533942020-03-04 23:10:06 -0500126 0x00, 0x00, 0x00, 0x01,
Davide Pesavento9c19a392019-04-06 15:07:54 -0400127 0x24, 0x04, // ApplicationParameters
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400128 0xc0, 0xc1, 0xc2, 0xc3
129 };
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700130
131 Interest i1;
132 i1.setName("/local/ndn/prefix");
Davide Pesavento53533942020-03-04 23:10:06 -0500133 i1.setNonce(0x1);
Davide Pesavento9c19a392019-04-06 15:07:54 -0400134 i1.setApplicationParameters("2404C0C1C2C3"_block);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400135 BOOST_CHECK_EQUAL(i1.isParametersDigestValid(), true);
136
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700137 Block wire1 = i1.wireEncode();
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500138 BOOST_TEST(wire1 == WIRE, boost::test_tools::per_element());
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700139
140 Interest i2(wire1);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400141 BOOST_CHECK_EQUAL(i2.getName(),
142 "/local/ndn/prefix/params-sha256=ff9100e04eaadcf30674d98026a051ba25f56b69bfa026dcccd72c6ea0f7315a");
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700143 BOOST_CHECK_EQUAL(i2.getCanBePrefix(), false);
144 BOOST_CHECK_EQUAL(i2.getMustBeFresh(), false);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400145 BOOST_CHECK_EQUAL(i2.getForwardingHint().empty(), true);
Davide Pesavento835f0272019-09-21 13:18:24 -0400146 BOOST_CHECK_EQUAL(i2.hasNonce(), true);
Davide Pesavento53533942020-03-04 23:10:06 -0500147 BOOST_CHECK_EQUAL(i2.getNonce(), 0x1);
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700148 BOOST_CHECK_EQUAL(i2.getInterestLifetime(), DEFAULT_INTEREST_LIFETIME);
Davide Pesaventof6b45892023-03-13 15:00:51 -0400149 BOOST_CHECK(i2.getHopLimit() == std::nullopt);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400150 BOOST_CHECK_EQUAL(i2.hasApplicationParameters(), true);
Davide Pesavento9c19a392019-04-06 15:07:54 -0400151 BOOST_CHECK_EQUAL(i2.getApplicationParameters(), "2404C0C1C2C3"_block);
Davide Pesaventof6b45892023-03-13 15:00:51 -0400152 BOOST_CHECK(i2.getSignatureInfo() == std::nullopt);
Eric Newberry6e262f02020-05-29 23:11:25 -0700153 BOOST_CHECK_EQUAL(i2.getSignatureValue().isValid(), false);
154 BOOST_CHECK_EQUAL(i2.isSigned(), false);
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700155}
156
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400157BOOST_AUTO_TEST_CASE(Full)
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700158{
159 const uint8_t WIRE[] = {
Junxiao Shie4603e12022-01-05 19:12:25 +0000160 0x05, 0x56, // Interest
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400161 0x07, 0x36, // Name
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700162 0x08, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, // GenericNameComponent
163 0x08, 0x03, 0x6e, 0x64, 0x6e, // GenericNameComponent
164 0x08, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, // GenericNameComponent
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400165 0x02, 0x20, // ParametersSha256DigestComponent
166 0xff, 0x91, 0x00, 0xe0, 0x4e, 0xaa, 0xdc, 0xf3, 0x06, 0x74, 0xd9, 0x80,
167 0x26, 0xa0, 0x51, 0xba, 0x25, 0xf5, 0x6b, 0x69, 0xbf, 0xa0, 0x26, 0xdc,
168 0xcc, 0xd7, 0x2c, 0x6e, 0xa0, 0xf7, 0x31, 0x5a,
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700169 0x21, 0x00, // CanBePrefix
170 0x12, 0x00, // MustBeFresh
Junxiao Shie4603e12022-01-05 19:12:25 +0000171 0x1e, 0x05, // ForwardingHint
172 0x07, 0x03, 0x08, 0x01, 0x48,
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700173 0x0a, 0x04, // Nonce
Davide Pesavento53533942020-03-04 23:10:06 -0500174 0x4c, 0x1e, 0xcb, 0x4a,
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400175 0x0c, 0x02, // InterestLifetime
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700176 0x76, 0xa1,
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400177 0x22, 0x01, // HopLimit
178 0xdc,
Davide Pesavento9c19a392019-04-06 15:07:54 -0400179 0x24, 0x04, // ApplicationParameters
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400180 0xc0, 0xc1, 0xc2, 0xc3
181 };
182
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700183 Interest i1;
184 i1.setName("/local/ndn/prefix");
185 i1.setMustBeFresh(true);
186 i1.setCanBePrefix(true);
Junxiao Shie4603e12022-01-05 19:12:25 +0000187 i1.setForwardingHint({"/H"});
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700188 i1.setNonce(0x4c1ecb4a);
189 i1.setInterestLifetime(30369_ms);
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400190 i1.setHopLimit(220);
Davide Pesavento9c19a392019-04-06 15:07:54 -0400191 i1.setApplicationParameters("2404C0C1C2C3"_block);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400192 BOOST_CHECK_EQUAL(i1.isParametersDigestValid(), true);
193
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700194 Block wire1 = i1.wireEncode();
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500195 BOOST_TEST(wire1 == WIRE, boost::test_tools::per_element());
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700196
197 Interest i2(wire1);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400198 BOOST_CHECK_EQUAL(i2.getName(),
199 "/local/ndn/prefix/params-sha256=ff9100e04eaadcf30674d98026a051ba25f56b69bfa026dcccd72c6ea0f7315a");
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700200 BOOST_CHECK_EQUAL(i2.getCanBePrefix(), true);
201 BOOST_CHECK_EQUAL(i2.getMustBeFresh(), true);
Junxiao Shie4603e12022-01-05 19:12:25 +0000202 BOOST_TEST(i2.getForwardingHint() == std::vector<Name>({"/H"}), boost::test_tools::per_element());
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400203 BOOST_CHECK_EQUAL(i2.hasNonce(), true);
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700204 BOOST_CHECK_EQUAL(i2.getNonce(), 0x4c1ecb4a);
205 BOOST_CHECK_EQUAL(i2.getInterestLifetime(), 30369_ms);
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400206 BOOST_CHECK_EQUAL(*i2.getHopLimit(), 220);
Davide Pesavento9c19a392019-04-06 15:07:54 -0400207 BOOST_CHECK_EQUAL(i2.getApplicationParameters(), "2404C0C1C2C3"_block);
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700208}
209
Eric Newberry6e262f02020-05-29 23:11:25 -0700210BOOST_AUTO_TEST_CASE(Signed)
211{
212 const uint8_t WIRE[] = {
213 0x05, 0x77, // Interest
214 0x07, 0x36, // Name
215 0x08, 0x05, // GenericNameComponent
216 0x6c, 0x6f, 0x63, 0x61, 0x6c,
217 0x08, 0x03, // GenericNameComponent
218 0x6e, 0x64, 0x6e,
219 0x08, 0x06, // GenericNameComponent
220 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
221 0x02, 0x20, // ParametersSha256DigestComponent
222 0x6f, 0x29, 0x58, 0x60, 0x53, 0xee, 0x9f, 0xcc,
223 0xd8, 0xa4, 0x22, 0x12, 0x29, 0x25, 0x28, 0x7c,
224 0x0a, 0x18, 0x43, 0x5f, 0x40, 0x74, 0xc4, 0x0a,
225 0xbb, 0x0d, 0x5b, 0x30, 0xe4, 0xaa, 0x62, 0x20,
226 0x12, 0x00, // MustBeFresh
227 0x0a, 0x04, // Nonce
228 0x4c, 0x1e, 0xcb, 0x4a,
229 0x24, 0x04, // ApplicationParameters
230 0xc0, 0xc1, 0xc2, 0xc3,
231 0x2c, 0x0d, // InterestSignatureInfo
232 0x1b, 0x01, // SignatureType
233 0x00,
234 0x26, 0x08, // SignatureNonce
235 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
236 0x2e, 0x20, // InterestSignatureValue
237 0x12, 0x47, 0x1a, 0xe0, 0xf8, 0x72, 0x3a, 0xc1,
238 0x15, 0x6c, 0x37, 0x0a, 0x38, 0x71, 0x1e, 0xbe,
239 0xbf, 0x28, 0x17, 0xde, 0x9b, 0x2d, 0xd9, 0x4e,
240 0x9b, 0x7e, 0x62, 0xf1, 0x17, 0xb8, 0x76, 0xc1,
241 };
242
243 SignatureInfo si(tlv::DigestSha256);
244 std::vector<uint8_t> nonce{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
245 si.setNonce(nonce);
246 Block sv("2E20 12471AE0F8723AC1156C370A38711EBEBF2817DE9B2DD94E9B7E62F117B876C1"_block);
247
Davide Pesaventofbea4fc2022-02-08 07:26:04 -0500248 Interest i1(Block{WIRE});
Eric Newberry6e262f02020-05-29 23:11:25 -0700249 BOOST_CHECK_EQUAL(i1.getName(),
250 "/local/ndn/prefix/params-sha256=6f29586053ee9fccd8a422122925287c0a18435f4074c40abb0d5b30e4aa6220");
251 BOOST_CHECK_EQUAL(i1.getCanBePrefix(), false);
252 BOOST_CHECK_EQUAL(i1.getMustBeFresh(), true);
253 BOOST_CHECK_EQUAL(i1.hasNonce(), true);
254 BOOST_CHECK_EQUAL(i1.getNonce(), 0x4c1ecb4a);
255 BOOST_CHECK_EQUAL(i1.getSignatureInfo()->getSignatureType(), tlv::DigestSha256);
256 BOOST_CHECK(i1.getSignatureInfo()->getNonce() == nonce);
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500257 BOOST_TEST(i1.getSignatureValue() == sv, boost::test_tools::per_element());
Eric Newberry6e262f02020-05-29 23:11:25 -0700258 BOOST_CHECK_EQUAL(i1.getApplicationParameters(), "2404C0C1C2C3"_block);
259 BOOST_CHECK_EQUAL(i1.isParametersDigestValid(), true);
260
261 // Reset wire
262 BOOST_CHECK_EQUAL(i1.hasWire(), true);
263 i1.setCanBePrefix(true);
264 i1.setCanBePrefix(false);
265 BOOST_CHECK_EQUAL(i1.hasWire(), false);
266
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500267 BOOST_TEST(i1.wireEncode() == WIRE, boost::test_tools::per_element());
Eric Newberry6e262f02020-05-29 23:11:25 -0700268
269 Interest i2("/local/ndn/prefix");
Eric Newberry6e262f02020-05-29 23:11:25 -0700270 i2.setMustBeFresh(true);
271 i2.setNonce(0x4c1ecb4a);
272 i2.setApplicationParameters("2404C0C1C2C3"_block);
273 i2.setSignatureInfo(si);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400274 i2.setSignatureValue(sv.value_bytes());
Eric Newberry6e262f02020-05-29 23:11:25 -0700275 BOOST_CHECK_EQUAL(i2.isParametersDigestValid(), true);
276
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500277 BOOST_TEST(i2.wireEncode() == WIRE, boost::test_tools::per_element());
Eric Newberry6e262f02020-05-29 23:11:25 -0700278}
279
280BOOST_AUTO_TEST_CASE(SignedApplicationElements)
281{
282 const uint8_t WIRE[] = {
283 0x05, 0x8f, // Interest
284 0x07, 0x36, // Name
285 0x08, 0x05, // GenericNameComponent
286 0x6c, 0x6f, 0x63, 0x61, 0x6c,
287 0x08, 0x03, // GenericNameComponent
288 0x6e, 0x64, 0x6e,
289 0x08, 0x06, // GenericNameComponent
290 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
291 0x02, 0x20, // ParametersSha256DigestComponent
292 0xbc, 0x36, 0x30, 0xa4, 0xd6, 0x5e, 0x0d, 0xb5,
293 0x48, 0x3d, 0xfa, 0x0d, 0x28, 0xb3, 0x31, 0x2f,
294 0xca, 0xc1, 0xd4, 0x41, 0xec, 0x89, 0x61, 0xd4,
295 0x17, 0x5e, 0x61, 0x75, 0x17, 0x78, 0x10, 0x8e,
296 0x12, 0x00, // MustBeFresh
297 0x0a, 0x04, // Nonce
298 0x4c, 0x1e, 0xcb, 0x4a,
299 0x24, 0x04, // ApplicationParameters
300 0xc0, 0xc1, 0xc2, 0xc3,
301 0xfd, 0x01, 0xfe, 0x08, // Application-specific element (Type 510)
302 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80,
303 0x2c, 0x0d, // InterestSignatureInfo
304 0x1b, 0x01, // SignatureType
305 0x00,
306 0x26, 0x08, // SignatureNonce
307 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
308 0x2e, 0x20, // InterestSignatureValue
309 0x12, 0x47, 0x1a, 0xe0, 0xf8, 0x72, 0x3a, 0xc1,
310 0x15, 0x6c, 0x37, 0x0a, 0x38, 0x71, 0x1e, 0xbe,
311 0xbf, 0x28, 0x17, 0xde, 0x9b, 0x2d, 0xd9, 0x4e,
312 0x9b, 0x7e, 0x62, 0xf1, 0x17, 0xb8, 0x76, 0xc1,
313 0xfd, 0x02, 0x00, 0x08, // Application-specific element (Type 512)
314 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88
315 };
316
317 SignatureInfo si(tlv::DigestSha256);
318 std::vector<uint8_t> nonce{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
319 si.setNonce(nonce);
320 Block sv("2E20 12471AE0F8723AC1156C370A38711EBEBF2817DE9B2DD94E9B7E62F117B876C1"_block);
321
Davide Pesaventofbea4fc2022-02-08 07:26:04 -0500322 Interest i1(Block{WIRE});
Eric Newberry6e262f02020-05-29 23:11:25 -0700323 BOOST_CHECK_EQUAL(i1.getName(),
324 "/local/ndn/prefix/params-sha256=bc3630a4d65e0db5483dfa0d28b3312fcac1d441ec8961d4175e61751778108e");
325 BOOST_CHECK_EQUAL(i1.getCanBePrefix(), false);
326 BOOST_CHECK_EQUAL(i1.getMustBeFresh(), true);
327 BOOST_CHECK_EQUAL(i1.hasNonce(), true);
328 BOOST_CHECK_EQUAL(i1.getNonce(), 0x4c1ecb4a);
329 BOOST_CHECK_EQUAL(i1.getSignatureInfo()->getSignatureType(), tlv::DigestSha256);
330 BOOST_CHECK(i1.getSignatureInfo()->getNonce() == nonce);
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500331 BOOST_TEST(i1.getSignatureValue() == sv, boost::test_tools::per_element());
Eric Newberry6e262f02020-05-29 23:11:25 -0700332 BOOST_CHECK_EQUAL(i1.getApplicationParameters(), "2404C0C1C2C3"_block);
333 BOOST_CHECK_EQUAL(i1.isParametersDigestValid(), true);
334
335 // Reset wire
336 BOOST_CHECK_EQUAL(i1.hasWire(), true);
337 i1.setCanBePrefix(true);
338 i1.setCanBePrefix(false);
339 BOOST_CHECK_EQUAL(i1.hasWire(), false);
340
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500341 BOOST_TEST(i1.wireEncode() == WIRE, boost::test_tools::per_element());
Eric Newberry6e262f02020-05-29 23:11:25 -0700342}
343
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400344BOOST_AUTO_TEST_CASE(MissingApplicationParameters)
345{
346 Interest i;
347 i.setName(Name("/A").appendParametersSha256DigestPlaceholder());
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400348 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), false);
Davide Pesavento905d40f2020-06-09 21:33:25 -0400349 BOOST_CHECK_EXCEPTION(i.wireEncode(), tlv::Error, [] (const auto& e) {
Davide Pesavento296c3a12023-05-04 21:40:40 -0400350 return e.what() == "Interest without parameters must not have a ParametersSha256DigestComponent"sv;
Davide Pesavento905d40f2020-06-09 21:33:25 -0400351 });
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400352}
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400353
354BOOST_AUTO_TEST_CASE(MissingParametersSha256DigestComponent)
355{
356 // there's no way to create an Interest that fails this check via programmatic construction,
357 // so we have to decode an invalid Interest and force reencoding
358
359 DisableAutoCheckParametersDigest disabler;
360 Interest i("050F 0703(080149) 0A04F000F000 2402CAFE"_block);
361 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), false);
362 BOOST_CHECK_NO_THROW(i.wireEncode()); // this succeeds because it uses the cached wire encoding
363
Davide Pesavento905d40f2020-06-09 21:33:25 -0400364 // trigger reencoding
365 i.setNonce(42);
366 // now the check fails while attempting to reencode
367 BOOST_CHECK_EXCEPTION(i.wireEncode(), tlv::Error, [] (const auto& e) {
Davide Pesavento296c3a12023-05-04 21:40:40 -0400368 return e.what() == "Interest with parameters must have a ParametersSha256DigestComponent"sv;
Davide Pesavento905d40f2020-06-09 21:33:25 -0400369 });
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400370}
371
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400372BOOST_AUTO_TEST_SUITE_END() // Encode
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400373
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400374class DecodeFixture
Junxiao Shi899277a2017-07-07 22:12:12 +0000375{
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000376protected:
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400377 DecodeFixture()
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000378 {
379 // initialize all elements to non-empty, to verify wireDecode clears them
380 i.setName("/A");
Junxiao Shie4603e12022-01-05 19:12:25 +0000381 i.setForwardingHint({"/F"});
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000382 i.setNonce(0x03d645a8);
383 i.setInterestLifetime(18554_ms);
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400384 i.setHopLimit(64);
Davide Pesavento9c19a392019-04-06 15:07:54 -0400385 i.setApplicationParameters("2404A0A1A2A3"_block);
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000386 }
Junxiao Shi899277a2017-07-07 22:12:12 +0000387
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000388protected:
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000389 Interest i;
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000390};
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000391
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400392BOOST_FIXTURE_TEST_SUITE(Decode, DecodeFixture)
393
394BOOST_AUTO_TEST_CASE(NotAnInterest)
395{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400396 BOOST_CHECK_EXCEPTION(i.wireDecode("4202CAFE"_block), tlv::Error, [] (const auto& e) {
Davide Pesavento296c3a12023-05-04 21:40:40 -0400397 return e.what() == "Expecting Interest element, but TLV has type 66"sv;
Davide Pesavento905d40f2020-06-09 21:33:25 -0400398 });
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400399}
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000400
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400401BOOST_AUTO_TEST_CASE(NameOnly)
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000402{
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400403 i.wireDecode("0505 0703(080149)"_block);
Davide Pesavento835f0272019-09-21 13:18:24 -0400404 BOOST_CHECK_EQUAL(i.hasWire(), true);
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000405 BOOST_CHECK_EQUAL(i.getName(), "/I");
406 BOOST_CHECK_EQUAL(i.getCanBePrefix(), false);
407 BOOST_CHECK_EQUAL(i.getMustBeFresh(), false);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400408 BOOST_CHECK_EQUAL(i.getForwardingHint().empty(), true);
Davide Pesavento835f0272019-09-21 13:18:24 -0400409 BOOST_CHECK_EQUAL(i.hasNonce(), false);
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000410 BOOST_CHECK_EQUAL(i.getInterestLifetime(), DEFAULT_INTEREST_LIFETIME);
Davide Pesaventof6b45892023-03-13 15:00:51 -0400411 BOOST_CHECK(i.getHopLimit() == std::nullopt);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400412 BOOST_CHECK_EQUAL(i.hasApplicationParameters(), false);
413 BOOST_CHECK_EQUAL(i.getApplicationParameters().isValid(), false);
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000414
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400415 // modify then re-encode
Davide Pesavento53533942020-03-04 23:10:06 -0500416 i.setNonce(0x957c6554);
Davide Pesavento835f0272019-09-21 13:18:24 -0400417 BOOST_CHECK_EQUAL(i.hasWire(), false);
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400418 BOOST_CHECK_EQUAL(i.wireEncode(), "050B 0703(080149) 0A04957C6554"_block);
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000419}
420
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400421BOOST_AUTO_TEST_CASE(NameCanBePrefix)
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000422{
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400423 i.wireDecode("0507 0703(080149) 2100"_block);
Davide Pesavento835f0272019-09-21 13:18:24 -0400424 BOOST_CHECK_EQUAL(i.hasWire(), true);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400425 BOOST_CHECK_EQUAL(i.getName(), "/I");
426 BOOST_CHECK_EQUAL(i.getCanBePrefix(), true);
427 BOOST_CHECK_EQUAL(i.getMustBeFresh(), false);
428 BOOST_CHECK_EQUAL(i.getForwardingHint().empty(), true);
Davide Pesavento835f0272019-09-21 13:18:24 -0400429 BOOST_CHECK_EQUAL(i.hasNonce(), false);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400430 BOOST_CHECK_EQUAL(i.getInterestLifetime(), DEFAULT_INTEREST_LIFETIME);
Davide Pesaventof6b45892023-03-13 15:00:51 -0400431 BOOST_CHECK(i.getHopLimit() == std::nullopt);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400432 BOOST_CHECK_EQUAL(i.hasApplicationParameters(), false);
433 BOOST_CHECK_EQUAL(i.getApplicationParameters().isValid(), false);
434}
435
436BOOST_AUTO_TEST_CASE(FullWithoutParameters)
437{
438 i.wireDecode("0531 0703(080149) "
439 "FC00 2100 FC00 1200 FC00 1E0B(1F09 1E023E15 0703080148) "
440 "FC00 0A044ACB1E4C FC00 0C0276A1 FC00 2201D6 FC00"_block);
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000441 BOOST_CHECK_EQUAL(i.getName(), "/I");
442 BOOST_CHECK_EQUAL(i.getCanBePrefix(), true);
443 BOOST_CHECK_EQUAL(i.getMustBeFresh(), true);
Junxiao Shie4603e12022-01-05 19:12:25 +0000444 BOOST_TEST(i.getForwardingHint() == std::vector<Name>({"/H"}), boost::test_tools::per_element());
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400445 BOOST_CHECK_EQUAL(i.hasNonce(), true);
Davide Pesavento53533942020-03-04 23:10:06 -0500446 BOOST_CHECK_EQUAL(i.getNonce(), 0x4acb1e4c);
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000447 BOOST_CHECK_EQUAL(i.getInterestLifetime(), 30369_ms);
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400448 BOOST_CHECK_EQUAL(*i.getHopLimit(), 214);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400449 BOOST_CHECK_EQUAL(i.hasApplicationParameters(), false);
450 BOOST_CHECK_EQUAL(i.getApplicationParameters().isValid(), false);
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000451
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000452 // encode without modification: retain original wire encoding
Junxiao Shi8b753a22018-10-24 01:51:40 +0000453 BOOST_CHECK_EQUAL(i.wireEncode().value_size(), 49);
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000454
Junxiao Shie4603e12022-01-05 19:12:25 +0000455 // modify then re-encode:
456 // * unrecognized elements are discarded;
457 // * ForwardingHint is re-encoded as a sequence of Names
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000458 i.setName("/J");
Junxiao Shi72c0c642018-04-20 15:41:09 +0000459 BOOST_CHECK_EQUAL(i.wireEncode(),
Junxiao Shie4603e12022-01-05 19:12:25 +0000460 "051D 0703(08014A) "
461 "2100 1200 1E05(0703080148) "
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400462 "0A044ACB1E4C 0C0276A1 2201D6"_block);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400463}
464
465BOOST_AUTO_TEST_CASE(FullWithParameters)
466{
467 i.wireDecode("055B 0725(080149 0220F16DB273F40436A852063F864D5072B01EAD53151F5A688EA1560492BEBEDD05) "
468 "FC00 2100 FC00 1200 FC00 1E0B(1F09 1E023E15 0703080148) "
469 "FC00 0A044ACB1E4C FC00 0C0276A1 FC00 2201D6 FC00 2404C0C1C2C3 FC00"_block);
470 BOOST_CHECK_EQUAL(i.getName(),
471 "/I/params-sha256=f16db273f40436a852063f864d5072b01ead53151f5a688ea1560492bebedd05");
472 BOOST_CHECK_EQUAL(i.getCanBePrefix(), true);
473 BOOST_CHECK_EQUAL(i.getMustBeFresh(), true);
Junxiao Shie4603e12022-01-05 19:12:25 +0000474 BOOST_TEST(i.getForwardingHint() == std::vector<Name>({"/H"}), boost::test_tools::per_element());
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400475 BOOST_CHECK_EQUAL(i.hasNonce(), true);
Davide Pesavento53533942020-03-04 23:10:06 -0500476 BOOST_CHECK_EQUAL(i.getNonce(), 0x4acb1e4c);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400477 BOOST_CHECK_EQUAL(i.getInterestLifetime(), 30369_ms);
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400478 BOOST_CHECK_EQUAL(*i.getHopLimit(), 214);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400479 BOOST_CHECK_EQUAL(i.hasApplicationParameters(), true);
480 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2404C0C1C2C3"_block);
481
482 // encode without modification: retain original wire encoding
483 BOOST_CHECK_EQUAL(i.wireEncode().value_size(), 91);
484
Junxiao Shie4603e12022-01-05 19:12:25 +0000485 // modify then re-encode:
486 // * unrecognized elements after ApplicationParameters are preserved, the rest are discarded;
487 // * ForwardingHint is re-encoded as a sequence of Names
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400488 i.setName("/J");
489 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
490 BOOST_CHECK_EQUAL(i.wireEncode(),
Junxiao Shie4603e12022-01-05 19:12:25 +0000491 "0547 0725(08014A 0220F16DB273F40436A852063F864D5072B01EAD53151F5A688EA1560492BEBEDD05) "
492 "2100 1200 1E05(0703080148) "
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400493 "0A044ACB1E4C 0C0276A1 2201D6 2404C0C1C2C3 FC00"_block);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400494
495 // modify ApplicationParameters: unrecognized elements are preserved
496 i.setApplicationParameters("2402CAFE"_block);
497 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
498 BOOST_CHECK_EQUAL(i.wireEncode(),
Junxiao Shie4603e12022-01-05 19:12:25 +0000499 "0545 0725(08014A 02205FDA67967EE302FC457E41B7D3D51BA6A9379574D193FD88F64954BF16C2927A) "
500 "2100 1200 1E05(0703080148) "
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400501 "0A044ACB1E4C 0C0276A1 2201D6 2402CAFE FC00"_block);
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000502}
503
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000504BOOST_AUTO_TEST_CASE(CriticalElementOutOfOrder)
505{
Davide Pesavento94048922023-08-11 22:00:01 -0400506 BOOST_CHECK_EXCEPTION(i.wireDecode("0507 FC00 0703080149"_block),
507 tlv::Error,
508 [] (const auto& e) { return e.what() == "Name element is missing or out of order"sv; });
Davide Pesavento905d40f2020-06-09 21:33:25 -0400509 BOOST_CHECK_EXCEPTION(i.wireDecode(
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000510 "0529 2100 0703080149 1200 1E0B(1F09 1E023E15 0703080148) "
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500511 "0A044ACB1E4C 0C0276A1 2201D6 2404C0C1C2C3"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400512 tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400513 [] (const auto& e) { return e.what() == "Name element is missing or out of order"sv; });
Davide Pesavento905d40f2020-06-09 21:33:25 -0400514 BOOST_CHECK_EXCEPTION(i.wireDecode(
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000515 "0529 0703080149 1200 2100 1E0B(1F09 1E023E15 0703080148) "
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500516 "0A044ACB1E4C 0C0276A1 2201D6 2404C0C1C2C3"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400517 tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400518 [] (const auto& e) { return e.what() == "CanBePrefix element is out of order"sv; });
Davide Pesavento905d40f2020-06-09 21:33:25 -0400519 BOOST_CHECK_EXCEPTION(i.wireDecode(
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000520 "0529 0703080149 2100 1E0B(1F09 1E023E15 0703080148) 1200 "
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500521 "0A044ACB1E4C 0C0276A1 2201D6 2404C0C1C2C3"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400522 tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400523 [] (const auto& e) { return e.what() == "MustBeFresh element is out of order"sv; });
Davide Pesavento905d40f2020-06-09 21:33:25 -0400524 BOOST_CHECK_EXCEPTION(i.wireDecode(
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000525 "0529 0703080149 2100 1200 0A044ACB1E4C "
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500526 "1E0B(1F09 1E023E15 0703080148) 0C0276A1 2201D6 2404C0C1C2C3"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400527 tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400528 [] (const auto& e) { return e.what() == "ForwardingHint element is out of order"sv; });
Davide Pesavento905d40f2020-06-09 21:33:25 -0400529 BOOST_CHECK_EXCEPTION(i.wireDecode(
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000530 "0529 0703080149 2100 1200 1E0B(1F09 1E023E15 0703080148) "
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500531 "0C0276A1 0A044ACB1E4C 2201D6 2404C0C1C2C3"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400532 tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400533 [] (const auto& e) { return e.what() == "Nonce element is out of order"sv; });
Davide Pesavento905d40f2020-06-09 21:33:25 -0400534 BOOST_CHECK_EXCEPTION(i.wireDecode(
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000535 "0529 0703080149 2100 1200 1E0B(1F09 1E023E15 0703080148) "
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500536 "0A044ACB1E4C 2201D6 0C0276A1 2404C0C1C2C3"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400537 tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400538 [] (const auto& e) { return e.what() == "InterestLifetime element is out of order"sv; });
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000539}
540
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500541BOOST_AUTO_TEST_CASE(NonCriticalElementOutOfOrder)
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000542{
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400543 // duplicate HopLimit
544 i.wireDecode("0536 0725(080149 0220FF9100E04EAADCF30674D98026A051BA25F56B69BFA026DCCCD72C6EA0F7315A)"
545 "2201D6 2200 2404C0C1C2C3 22020101"_block);
546 BOOST_CHECK_EQUAL(i.getName(),
547 "/I/params-sha256=ff9100e04eaadcf30674d98026a051ba25f56b69bfa026dcccd72c6ea0f7315a");
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400548 BOOST_CHECK_EQUAL(*i.getHopLimit(), 214);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400549 BOOST_CHECK_EQUAL(i.hasApplicationParameters(), true);
Davide Pesavento9c19a392019-04-06 15:07:54 -0400550 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2404C0C1C2C3"_block);
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500551
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400552 // duplicate ApplicationParameters
553 i.wireDecode("0541 0725(080149 0220FF9100E04EAADCF30674D98026A051BA25F56B69BFA026DCCCD72C6EA0F7315A)"
554 "2100 1200 0A044ACB1E4C 0C0276A1 2201D6 2404C0C1C2C3 2401EE"_block);
555 BOOST_CHECK_EQUAL(i.getName(),
556 "/I/params-sha256=ff9100e04eaadcf30674d98026a051ba25f56b69bfa026dcccd72c6ea0f7315a");
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400557 BOOST_CHECK_EQUAL(*i.getHopLimit(), 214);
Davide Pesavento9c19a392019-04-06 15:07:54 -0400558 BOOST_CHECK_EQUAL(i.hasApplicationParameters(), true);
559 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2404C0C1C2C3"_block);
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000560}
561
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400562BOOST_AUTO_TEST_CASE(MissingName)
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000563{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400564 BOOST_CHECK_EXCEPTION(i.wireDecode("0500"_block), tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400565 [] (const auto& e) { return e.what() == "Name element is missing or out of order"sv; });
Davide Pesavento905d40f2020-06-09 21:33:25 -0400566 BOOST_CHECK_EXCEPTION(i.wireDecode("0502 1200"_block), tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400567 [] (const auto& e) { return e.what() == "Name element is missing or out of order"sv; });
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000568}
569
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400570BOOST_AUTO_TEST_CASE(BadName)
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000571{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400572 BOOST_CHECK_EXCEPTION(i.wireDecode("0502 0700"_block), tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400573 [] (const auto& e) { return e.what() == "Name has zero name components"sv; });
Davide Pesavento905d40f2020-06-09 21:33:25 -0400574 BOOST_CHECK_EXCEPTION(i.wireDecode("054C 074A(080149"
575 "02200000000000000000000000000000000000000000000000000000000000000000"
576 "080132"
577 "02200000000000000000000000000000000000000000000000000000000000000000)"_block),
578 tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400579 [] (const auto& e) { return e.what() == "Name has more than one ParametersSha256DigestComponent"sv; });
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000580}
581
582BOOST_AUTO_TEST_CASE(BadCanBePrefix)
583{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400584 BOOST_CHECK_EXCEPTION(i.wireDecode("0508 0703080149 210102"_block), tlv::Error,
Davide Pesavento94048922023-08-11 22:00:01 -0400585 [] (const auto& e) { return e.what() == "CanBePrefix element has non-zero TLV-LENGTH"sv; });
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000586}
587
588BOOST_AUTO_TEST_CASE(BadMustBeFresh)
589{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400590 BOOST_CHECK_EXCEPTION(i.wireDecode("0508 0703080149 120102"_block), tlv::Error,
Davide Pesavento94048922023-08-11 22:00:01 -0400591 [] (const auto& e) { return e.what() == "MustBeFresh element has non-zero TLV-LENGTH"sv; });
592}
593
594BOOST_AUTO_TEST_CASE(BadForwardingHint)
595{
596 BOOST_CHECK_EXCEPTION(i.wireDecode("050C 0703080149 1E05(0703080248)"_block), tlv::Error,
597 [] (const auto& e) { return e.what() == "Invalid Name in ForwardingHint"sv; });
598 BOOST_CHECK_EXCEPTION(i.wireDecode("050E 0703080149 1E07(1F05(0703080248))"_block), tlv::Error,
599 [] (const auto& e) { return e.what() == "Invalid Name in ForwardingHint.Delegation"sv; });
600 BOOST_CHECK_EXCEPTION(i.wireDecode("0509 0703080149 1E02(2100)"_block), tlv::Error,
601 [] (const auto& e) { return e.what() == "Unexpected TLV-TYPE 33 while decoding ForwardingHint"sv; });
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000602}
603
604BOOST_AUTO_TEST_CASE(BadNonce)
605{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400606 BOOST_CHECK_EXCEPTION(i.wireDecode("0507 0703080149 0A00"_block), tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400607 [] (const auto& e) { return e.what() == "Nonce element is malformed"sv; });
Davide Pesavento905d40f2020-06-09 21:33:25 -0400608 BOOST_CHECK_EXCEPTION(i.wireDecode("050A 0703080149 0A0304C263"_block), tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400609 [] (const auto& e) { return e.what() == "Nonce element is malformed"sv; });
Davide Pesavento905d40f2020-06-09 21:33:25 -0400610 BOOST_CHECK_EXCEPTION(i.wireDecode("050C 0703080149 0A05EFA420B262"_block), tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400611 [] (const auto& e) { return e.what() == "Nonce element is malformed"sv; });
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000612}
613
Davide Pesavento7b540d22024-02-12 23:02:42 -0500614BOOST_AUTO_TEST_CASE(LargeLifetime,
615 * ut::description("test for bug #4997"))
616{
617 i.wireDecode("050F 0703(080149) 0C087FFFFFFFFFFFFFFF"_block);
618 BOOST_CHECK_EQUAL(i.getInterestLifetime(), 0x7FFFFFFFFFFFFFFF_ms);
619
620 i.wireDecode("050F 0703(080149) 0C088000000000000000"_block);
621 BOOST_CHECK_EQUAL(i.getInterestLifetime(), time::milliseconds::max());
622
623 i.wireDecode("050F 0703(080149) 0C08FFFFFFFFFFFFFFFF"_block);
624 BOOST_CHECK_EQUAL(i.getInterestLifetime(), time::milliseconds::max());
625
626 // force re-encoding
627 i.setNonce(0x957c6554);
628 BOOST_CHECK_EQUAL(i.wireEncode(), "0515 0703(080149) 0A04957C6554 0C08FFFFFFFFFFFFFFFF"_block);
629}
630
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500631BOOST_AUTO_TEST_CASE(BadHopLimit)
632{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400633 BOOST_CHECK_EXCEPTION(i.wireDecode("0507 0703080149 2200"_block), tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400634 [] (const auto& e) { return e.what() == "HopLimit element is malformed"sv; });
Davide Pesavento905d40f2020-06-09 21:33:25 -0400635 BOOST_CHECK_EXCEPTION(i.wireDecode("0509 0703080149 22021356"_block), tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400636 [] (const auto& e) { return e.what() == "HopLimit element is malformed"sv; });
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500637}
638
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400639BOOST_AUTO_TEST_CASE(BadParametersDigest)
640{
641 // ApplicationParameters without ParametersSha256DigestComponent
642 Block b1("0509 0703(080149) 2402CAFE"_block);
643 // ParametersSha256DigestComponent without ApplicationParameters
644 Block b2("0527 0725(080149 0220E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855)"_block);
645 // digest mismatch
646 Block b3("052B 0725(080149 02200000000000000000000000000000000000000000000000000000000000000000) "
647 "2402CAFE"_block);
648
649 BOOST_CHECK_THROW(i.wireDecode(b1), tlv::Error);
650 BOOST_CHECK_THROW(i.wireDecode(b2), tlv::Error);
651 BOOST_CHECK_THROW(i.wireDecode(b3), tlv::Error);
652
653 DisableAutoCheckParametersDigest disabler;
654 BOOST_CHECK_NO_THROW(i.wireDecode(b1));
655 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), false);
656 BOOST_CHECK_NO_THROW(i.wireDecode(b2));
657 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), false);
658 BOOST_CHECK_NO_THROW(i.wireDecode(b3));
659 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), false);
660}
661
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000662BOOST_AUTO_TEST_CASE(UnrecognizedCriticalElement)
663{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400664 BOOST_CHECK_EXCEPTION(i.wireDecode("0507 0703080149 FB00"_block), tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400665 [] (const auto& e) { return e.what() == "Unrecognized element of critical type 251"sv; });
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400666 // v0.2 packet with Selectors
Davide Pesavento905d40f2020-06-09 21:33:25 -0400667 BOOST_CHECK_EXCEPTION(i.wireDecode("0510 0703080149 09030D0101 0A0401000000"_block), tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400668 [] (const auto& e) { return e.what() == "Unrecognized element of critical type 9"sv; });
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000669}
670
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400671BOOST_AUTO_TEST_SUITE_END() // Decode
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000672
Junxiao Shi899277a2017-07-07 22:12:12 +0000673BOOST_AUTO_TEST_CASE(MatchesData)
674{
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000675 auto interest = makeInterest("/A");
Junxiao Shi899277a2017-07-07 22:12:12 +0000676
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000677 auto data = makeData("/A");
678 BOOST_CHECK_EQUAL(interest->matchesData(*data), true);
Junxiao Shi899277a2017-07-07 22:12:12 +0000679
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000680 data->setName("/A/D");
681 BOOST_CHECK_EQUAL(interest->matchesData(*data), false); // violates CanBePrefix
Junxiao Shi899277a2017-07-07 22:12:12 +0000682
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000683 interest->setCanBePrefix(true);
684 BOOST_CHECK_EQUAL(interest->matchesData(*data), true);
Junxiao Shi899277a2017-07-07 22:12:12 +0000685
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000686 interest->setMustBeFresh(true);
Alexander Afanasyev0af48fb2023-05-19 12:20:15 -0400687 BOOST_CHECK_EQUAL(interest->matchesData(*data), true);
Junxiao Shi899277a2017-07-07 22:12:12 +0000688
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000689 data->setFreshnessPeriod(1_s);
690 BOOST_CHECK_EQUAL(interest->matchesData(*data), true);
Junxiao Shi899277a2017-07-07 22:12:12 +0000691
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000692 data->setName("/H/I");
693 BOOST_CHECK_EQUAL(interest->matchesData(*data), false); // Name does not match
Junxiao Shi899277a2017-07-07 22:12:12 +0000694
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000695 data->wireEncode();
696 interest = makeInterest(data->getFullName());
697 BOOST_CHECK_EQUAL(interest->matchesData(*data), true);
Junxiao Shi899277a2017-07-07 22:12:12 +0000698
Davide Pesavento8e047e12024-02-12 16:50:23 -0500699 setNameComponent(*interest, -1, name::Component::fromUri("sha256digest=00000000000000000000000000"
700 "00000000000000000000000000000000000000"));
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000701 BOOST_CHECK_EQUAL(interest->matchesData(*data), false); // violates implicit digest
Junxiao Shi899277a2017-07-07 22:12:12 +0000702}
703
Davide Pesavento94048922023-08-11 22:00:01 -0400704BOOST_AUTO_TEST_CASE(MatchesInterest,
Davide Pesavento0c526032024-01-31 21:14:01 -0500705 * ut::expected_failures(1))
Junxiao Shi899277a2017-07-07 22:12:12 +0000706{
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400707 Interest interest;
708 interest.setName("/A")
709 .setCanBePrefix(true)
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000710 .setMustBeFresh(true)
Junxiao Shie4603e12022-01-05 19:12:25 +0000711 .setForwardingHint({"/H"})
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000712 .setNonce(2228)
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400713 .setInterestLifetime(5_s)
714 .setHopLimit(90);
Junxiao Shi899277a2017-07-07 22:12:12 +0000715
716 Interest other;
717 BOOST_CHECK_EQUAL(interest.matchesInterest(other), false);
718
719 other.setName(interest.getName());
720 BOOST_CHECK_EQUAL(interest.matchesInterest(other), false);
721
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000722 other.setCanBePrefix(interest.getCanBePrefix());
723 BOOST_CHECK_EQUAL(interest.matchesInterest(other), false);
724
725 other.setMustBeFresh(interest.getMustBeFresh());
Junxiao Shi899277a2017-07-07 22:12:12 +0000726 BOOST_CHECK_EQUAL(interest.matchesInterest(other), false); // will match until #3162 implemented
727
Junxiao Shie4603e12022-01-05 19:12:25 +0000728 auto fh = interest.getForwardingHint();
729 other.setForwardingHint(std::vector<Name>(fh.begin(), fh.end()));
Junxiao Shi899277a2017-07-07 22:12:12 +0000730 BOOST_CHECK_EQUAL(interest.matchesInterest(other), true);
731
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000732 other.setNonce(9336);
Junxiao Shi899277a2017-07-07 22:12:12 +0000733 BOOST_CHECK_EQUAL(interest.matchesInterest(other), true);
734
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000735 other.setInterestLifetime(3_s);
Junxiao Shi899277a2017-07-07 22:12:12 +0000736 BOOST_CHECK_EQUAL(interest.matchesInterest(other), true);
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400737
738 other.setHopLimit(31);
739 BOOST_CHECK_EQUAL(interest.matchesInterest(other), true);
Junxiao Shi899277a2017-07-07 22:12:12 +0000740}
741
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400742BOOST_AUTO_TEST_CASE(SetName)
743{
744 Interest i;
745 BOOST_CHECK_EQUAL(i.getName(), "/");
746 i.setName("/A/B");
747 BOOST_CHECK_EQUAL(i.getName(), "/A/B");
748 i.setName("/I/params-sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
749 BOOST_CHECK_EQUAL(i.getName(),
750 "/I/params-sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
751 BOOST_CHECK_THROW(i.setName("/I"
752 "/params-sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
753 "/params-sha256=0000000000000000000000000000000000000000000000000000000000000000"),
754 std::invalid_argument);
755}
Junxiao Shi899277a2017-07-07 22:12:12 +0000756
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400757BOOST_AUTO_TEST_CASE(SetCanBePrefix)
Junxiao Shi8d3f8342018-04-04 12:46:37 +0000758{
759 Interest i;
Junxiao Shi8d3f8342018-04-04 12:46:37 +0000760 BOOST_CHECK_EQUAL(i.getCanBePrefix(), false);
Junxiao Shi8d3f8342018-04-04 12:46:37 +0000761 i.setCanBePrefix(true);
762 BOOST_CHECK_EQUAL(i.getCanBePrefix(), true);
Davide Pesavento478d3382021-03-17 12:46:08 -0400763 i.setCanBePrefix(false);
764 BOOST_CHECK_EQUAL(i.getCanBePrefix(), false);
Junxiao Shi8d3f8342018-04-04 12:46:37 +0000765}
766
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400767BOOST_AUTO_TEST_CASE(SetMustBeFresh)
Junxiao Shi8d3f8342018-04-04 12:46:37 +0000768{
769 Interest i;
770 BOOST_CHECK_EQUAL(i.getMustBeFresh(), false);
771 i.setMustBeFresh(true);
772 BOOST_CHECK_EQUAL(i.getMustBeFresh(), true);
Junxiao Shi8d3f8342018-04-04 12:46:37 +0000773 i.setMustBeFresh(false);
774 BOOST_CHECK_EQUAL(i.getMustBeFresh(), false);
Junxiao Shi8d3f8342018-04-04 12:46:37 +0000775}
776
Junxiao Shi899277a2017-07-07 22:12:12 +0000777BOOST_AUTO_TEST_CASE(GetNonce)
778{
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000779 unique_ptr<Interest> i1, i2;
Davide Pesavento53533942020-03-04 23:10:06 -0500780 Interest::Nonce nonce1(0), nonce2(0);
Junxiao Shi899277a2017-07-07 22:12:12 +0000781
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000782 // getNonce automatically assigns a random Nonce.
783 // 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 -0500784 // identical Nonces in a row.
Junxiao Shi899277a2017-07-07 22:12:12 +0000785 int nIterations = 0;
786 do {
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000787 i1 = make_unique<Interest>();
788 nonce1 = i1->getNonce();
789 i2 = make_unique<Interest>();
790 nonce2 = i2->getNonce();
Junxiao Shi899277a2017-07-07 22:12:12 +0000791 }
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000792 while (nonce1 == nonce2 && ++nIterations < 100);
Davide Pesavento53533942020-03-04 23:10:06 -0500793
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000794 BOOST_CHECK_NE(nonce1, nonce2);
795 BOOST_CHECK(i1->hasNonce());
796 BOOST_CHECK(i2->hasNonce());
Junxiao Shi899277a2017-07-07 22:12:12 +0000797
798 // Once a Nonce is assigned, it should not change.
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000799 BOOST_CHECK_EQUAL(i1->getNonce(), nonce1);
Davide Pesavento53533942020-03-04 23:10:06 -0500800 BOOST_CHECK_EQUAL(i2->getNonce(), nonce2);
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000801}
802
803BOOST_AUTO_TEST_CASE(SetNonce)
804{
805 Interest i1("/A");
Davide Pesavento53533942020-03-04 23:10:06 -0500806 BOOST_CHECK(!i1.hasNonce());
807
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000808 i1.setNonce(1);
809 i1.wireEncode();
Davide Pesavento53533942020-03-04 23:10:06 -0500810 BOOST_CHECK(i1.hasNonce());
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000811 BOOST_CHECK_EQUAL(i1.getNonce(), 1);
812
813 Interest i2(i1);
Davide Pesavento53533942020-03-04 23:10:06 -0500814 BOOST_CHECK(i2.hasNonce());
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000815 BOOST_CHECK_EQUAL(i2.getNonce(), 1);
816
817 i2.setNonce(2);
818 BOOST_CHECK_EQUAL(i2.getNonce(), 2);
Davide Pesavento53533942020-03-04 23:10:06 -0500819 BOOST_CHECK_EQUAL(i1.getNonce(), 1); // should not affect i1's Nonce (Bug #4168)
820
Davide Pesaventof6b45892023-03-13 15:00:51 -0400821 i2.setNonce(std::nullopt);
Davide Pesavento53533942020-03-04 23:10:06 -0500822 BOOST_CHECK(!i2.hasNonce());
Junxiao Shi899277a2017-07-07 22:12:12 +0000823}
824
825BOOST_AUTO_TEST_CASE(RefreshNonce)
826{
827 Interest i;
828 BOOST_CHECK(!i.hasNonce());
829 i.refreshNonce();
830 BOOST_CHECK(!i.hasNonce());
831
832 i.setNonce(1);
833 BOOST_CHECK(i.hasNonce());
834 i.refreshNonce();
835 BOOST_CHECK(i.hasNonce());
836 BOOST_CHECK_NE(i.getNonce(), 1);
837}
838
Davide Pesavento53533942020-03-04 23:10:06 -0500839BOOST_AUTO_TEST_CASE(NonceConversions)
840{
841 Interest i;
Davide Pesavento53533942020-03-04 23:10:06 -0500842
843 // 4-arg constructor
844 Interest::Nonce n1(1, 2, 3, 4);
845 i.setNonce(n1);
846 BOOST_CHECK_EQUAL(i.getNonce(), 0x01020304);
847
848 // 4-arg constructor + assignment
849 n1 = {0xf, 0xe, 0xd, 0xc};
850 i.setNonce(n1);
851 BOOST_CHECK_EQUAL(i.getNonce(), 0x0f0e0d0c);
852
853 // 1-arg constructor + assignment (implicit conversion)
854 Interest::Nonce n2;
855 n2 = 42;
856 BOOST_CHECK_NE(n1, n2);
857 i.setNonce(n2);
858 n2 = 21; // should not affect i's Nonce
859 BOOST_CHECK_EQUAL(i.getNonce(), 42);
860 BOOST_CHECK_EQUAL(i.toUri(), "/?Nonce=0000002a"); // stored in big-endian
861}
862
Junxiao Shi899277a2017-07-07 22:12:12 +0000863BOOST_AUTO_TEST_CASE(SetInterestLifetime)
864{
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500865 BOOST_CHECK_THROW(Interest("/A", -1_ms), std::invalid_argument);
Davide Pesavento0f830802018-01-16 23:58:58 -0500866 BOOST_CHECK_NO_THROW(Interest("/A", 0_ms));
Junxiao Shi899277a2017-07-07 22:12:12 +0000867
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400868 Interest i;
Junxiao Shi899277a2017-07-07 22:12:12 +0000869 BOOST_CHECK_EQUAL(i.getInterestLifetime(), DEFAULT_INTEREST_LIFETIME);
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500870 BOOST_CHECK_THROW(i.setInterestLifetime(-1_ms), std::invalid_argument);
Junxiao Shi899277a2017-07-07 22:12:12 +0000871 BOOST_CHECK_EQUAL(i.getInterestLifetime(), DEFAULT_INTEREST_LIFETIME);
Davide Pesavento0f830802018-01-16 23:58:58 -0500872 i.setInterestLifetime(0_ms);
873 BOOST_CHECK_EQUAL(i.getInterestLifetime(), 0_ms);
874 i.setInterestLifetime(1_ms);
875 BOOST_CHECK_EQUAL(i.getInterestLifetime(), 1_ms);
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400876
877 i = Interest("/B", 15_s);
878 BOOST_CHECK_EQUAL(i.getInterestLifetime(), 15_s);
879}
880
881BOOST_AUTO_TEST_CASE(SetHopLimit)
882{
883 Interest i;
Davide Pesaventof6b45892023-03-13 15:00:51 -0400884 BOOST_CHECK(i.getHopLimit() == std::nullopt);
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400885 i.setHopLimit(42);
886 BOOST_CHECK(i.getHopLimit() == 42);
Davide Pesaventof6b45892023-03-13 15:00:51 -0400887 i.setHopLimit(std::nullopt);
888 BOOST_CHECK(i.getHopLimit() == std::nullopt);
Junxiao Shi899277a2017-07-07 22:12:12 +0000889}
890
Davide Pesavento9c19a392019-04-06 15:07:54 -0400891BOOST_AUTO_TEST_CASE(SetApplicationParameters)
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700892{
893 const uint8_t PARAMETERS1[] = {0xc1};
894 const uint8_t PARAMETERS2[] = {0xc2};
895
896 Interest i;
Davide Pesavento9c19a392019-04-06 15:07:54 -0400897 BOOST_CHECK(!i.hasApplicationParameters());
898 i.setApplicationParameters("2400"_block);
899 BOOST_CHECK(i.hasApplicationParameters());
900 i.unsetApplicationParameters();
901 BOOST_CHECK(!i.hasApplicationParameters());
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700902
Davide Pesavento38912442019-04-06 22:03:39 -0400903 // Block overload
Davide Pesavento38912442019-04-06 22:03:39 -0400904 i.setApplicationParameters("2401C0"_block);
Davide Pesavento9c19a392019-04-06 15:07:54 -0400905 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2401C0"_block);
Davide Pesavento38912442019-04-06 22:03:39 -0400906 i.setApplicationParameters("8001C1"_block);
Davide Pesavento9c19a392019-04-06 15:07:54 -0400907 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "24038001C1"_block);
Davide Pesavento296c3a12023-05-04 21:40:40 -0400908
909 // Block overload, default constructed (invalid)
910 BOOST_CHECK_EXCEPTION(i.setApplicationParameters(Block{}), std::invalid_argument, [] (const auto& e) {
911 return e.what() == "ApplicationParameters block must be valid"sv;
912 });
Davide Pesavento38912442019-04-06 22:03:39 -0400913
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500914 // span overload
915 i.setApplicationParameters(PARAMETERS1);
Davide Pesavento38912442019-04-06 22:03:39 -0400916 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2401C1"_block);
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500917 i.setApplicationParameters(span<uint8_t>{});
Davide Pesavento38912442019-04-06 22:03:39 -0400918 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2400"_block);
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500919
Davide Pesavento296c3a12023-05-04 21:40:40 -0400920 // string_view overload
921 i.setApplicationParameters("hi"sv);
922 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "24026869"_block);
923 i.setApplicationParameters("");
924 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2400"_block);
925
Davide Pesavento38912442019-04-06 22:03:39 -0400926 // ConstBufferPtr overload
927 i.setApplicationParameters(make_shared<Buffer>(PARAMETERS2, sizeof(PARAMETERS2)));
928 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2401C2"_block);
929 i.setApplicationParameters(make_shared<Buffer>());
930 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2400"_block);
Davide Pesavento296c3a12023-05-04 21:40:40 -0400931
932 // ConstBufferPtr overload, null/empty pointer (invalid)
933 BOOST_CHECK_EXCEPTION(i.setApplicationParameters(ConstBufferPtr{}), std::invalid_argument, [] (const auto& e) {
934 return e.what() == "ApplicationParameters buffer cannot be null"sv;
935 });
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700936}
937
Eric Newberry6e262f02020-05-29 23:11:25 -0700938BOOST_AUTO_TEST_CASE(SetSignature)
939{
940 Interest i;
Eric Newberry6e262f02020-05-29 23:11:25 -0700941
Eric Newberry6e262f02020-05-29 23:11:25 -0700942 Block sv1("2E04 01020304"_block);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400943 BOOST_CHECK_EXCEPTION(i.setSignatureValue(sv1.value_bytes()), tlv::Error, [] (const auto& e) {
Davide Pesavento296c3a12023-05-04 21:40:40 -0400944 return e.what() == "InterestSignatureInfo must be present to set InterestSignatureValue"sv;
Davide Pesavento487e3d32022-05-05 18:06:23 -0400945 });
946
Davide Pesaventof6b45892023-03-13 15:00:51 -0400947 BOOST_CHECK(i.getSignatureInfo() == std::nullopt);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400948 BOOST_CHECK_EQUAL(i.getSignatureValue().isValid(), false);
949 BOOST_CHECK_EQUAL(i.isSigned(), false);
Eric Newberry6e262f02020-05-29 23:11:25 -0700950
951 // Simple set/get case for InterestSignatureInfo (no prior set)
952 SignatureInfo si1(tlv::SignatureSha256WithEcdsa);
953 i.setSignatureInfo(si1);
954 BOOST_CHECK(i.getSignatureInfo() == si1);
955 BOOST_CHECK_EQUAL(i.isSigned(), false);
956
957 // Simple set/get case for InterestSignatureValue (no prior set)
Davide Pesavento487e3d32022-05-05 18:06:23 -0400958 auto svBuffer1 = make_shared<Buffer>(sv1.value_begin(), sv1.value_end());
Eric Newberry6e262f02020-05-29 23:11:25 -0700959 i.setSignatureValue(svBuffer1);
960 BOOST_CHECK_EQUAL(i.getSignatureValue(), sv1);
961 BOOST_CHECK_EQUAL(i.isSigned(), true);
962
Davide Pesavento296c3a12023-05-04 21:40:40 -0400963 // Throws because attempting to set InterestSignatureValue to a null pointer
964 BOOST_CHECK_EXCEPTION(i.setSignatureValue(ConstBufferPtr{}), std::invalid_argument, [] (const auto& e) {
965 return e.what() == "InterestSignatureValue buffer cannot be null"sv;
966 });
Eric Newberry6e262f02020-05-29 23:11:25 -0700967 BOOST_CHECK_EQUAL(i.getSignatureValue(), sv1);
968 BOOST_CHECK_EQUAL(i.isSigned(), true);
969
970 // Ensure that wire is not reset if specified InterestSignatureInfo is same
971 i.wireEncode();
972 BOOST_CHECK_EQUAL(i.hasWire(), true);
973 i.setSignatureInfo(si1);
974 BOOST_CHECK_EQUAL(i.hasWire(), true);
975 BOOST_CHECK(i.getSignatureInfo() == si1);
976 BOOST_CHECK_EQUAL(i.getSignatureValue(), sv1);
977 BOOST_CHECK_EQUAL(i.isSigned(), true);
978
979 // Ensure that wire is reset if specified InterestSignatureInfo is different
980 i.wireEncode();
981 BOOST_CHECK_EQUAL(i.hasWire(), true);
982 SignatureInfo si2(tlv::SignatureSha256WithRsa);
983 i.setSignatureInfo(si2);
984 BOOST_CHECK_EQUAL(i.hasWire(), false);
985 BOOST_CHECK(i.getSignatureInfo() == si2);
986 BOOST_CHECK_EQUAL(i.getSignatureValue(), sv1);
987 BOOST_CHECK_EQUAL(i.isSigned(), true);
988
989 // Ensure that wire is not reset if specified InterestSignatureValue is same
990 i.wireEncode();
991 BOOST_CHECK_EQUAL(i.hasWire(), true);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400992 i.setSignatureValue(sv1.value_bytes());
Eric Newberry6e262f02020-05-29 23:11:25 -0700993 BOOST_CHECK_EQUAL(i.hasWire(), true);
994 BOOST_CHECK(i.getSignatureInfo() == si2);
995 BOOST_CHECK_EQUAL(i.getSignatureValue(), sv1);
996 BOOST_CHECK_EQUAL(i.isSigned(), true);
997
998 // Ensure that wire is reset if specified InterestSignatureValue is different
999 i.wireEncode();
1000 BOOST_CHECK_EQUAL(i.hasWire(), true);
Davide Pesavento487e3d32022-05-05 18:06:23 -04001001 const uint8_t sv2[] = {0x99, 0x88, 0x77, 0x66};
1002 i.setSignatureValue(sv2);
Eric Newberry6e262f02020-05-29 23:11:25 -07001003 BOOST_CHECK_EQUAL(i.hasWire(), false);
1004 BOOST_CHECK(i.getSignatureInfo() == si2);
Davide Pesavento487e3d32022-05-05 18:06:23 -04001005 BOOST_TEST(i.getSignatureValue().value_bytes() == sv2, boost::test_tools::per_element());
Eric Newberry6e262f02020-05-29 23:11:25 -07001006 BOOST_CHECK_EQUAL(i.isSigned(), true);
1007}
1008
Davide Pesaventoadc9aa22019-06-30 19:00:20 -04001009BOOST_AUTO_TEST_CASE(ParametersSha256DigestComponent)
1010{
1011 Interest i("/I");
1012 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
1013
1014 i.setApplicationParameters("2404C0C1C2C3"_block); // auto-appends ParametersSha256DigestComponent
1015 BOOST_CHECK_EQUAL(i.getName(),
1016 "/I/params-sha256=ff9100e04eaadcf30674d98026a051ba25f56b69bfa026dcccd72c6ea0f7315a");
1017 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
1018
Davide Pesaventoa3d809e2022-02-06 11:55:02 -05001019 i.setApplicationParameters(span<uint8_t>{}); // updates ParametersSha256DigestComponent
Davide Pesaventoadc9aa22019-06-30 19:00:20 -04001020 BOOST_CHECK_EQUAL(i.getName(),
1021 "/I/params-sha256=33b67cb5385ceddad93d0ee960679041613bed34b8b4a5e6362fe7539ba2d3ce");
1022 BOOST_CHECK_EQUAL(i.hasApplicationParameters(), true);
1023 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
1024
1025 i.unsetApplicationParameters(); // removes ParametersSha256DigestComponent
1026 BOOST_CHECK_EQUAL(i.getName(), "/I");
1027 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
1028
1029 i.setName(Name("/P").appendParametersSha256DigestPlaceholder().append("Q"));
1030 BOOST_CHECK_EQUAL(i.hasApplicationParameters(), false);
1031 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), false);
1032
1033 i.unsetApplicationParameters(); // removes ParametersSha256DigestComponent
1034 BOOST_CHECK_EQUAL(i.getName(), "/P/Q");
1035 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
1036
1037 i.setName(Name("/P").appendParametersSha256DigestPlaceholder().append("Q"));
1038 i.setApplicationParameters("2404C0C1C2C3"_block); // updates ParametersSha256DigestComponent
1039 BOOST_CHECK_EQUAL(i.getName(),
1040 "/P/params-sha256=ff9100e04eaadcf30674d98026a051ba25f56b69bfa026dcccd72c6ea0f7315a/Q");
1041 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
1042
1043 i.setName("/A/B/C"); // auto-appends ParametersSha256DigestComponent
1044 BOOST_CHECK_EQUAL(i.getName(),
1045 "/A/B/C/params-sha256=ff9100e04eaadcf30674d98026a051ba25f56b69bfa026dcccd72c6ea0f7315a");
1046 BOOST_CHECK_EQUAL(i.hasApplicationParameters(), true);
1047 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
Eric Newberry6e262f02020-05-29 23:11:25 -07001048
1049 SignatureInfo si(tlv::SignatureSha256WithEcdsa);
1050 i.setSignatureInfo(si); // updates ParametersSha256DigestComponent
1051 BOOST_CHECK_EQUAL(i.getName(),
1052 "/A/B/C/params-sha256=6400cae1730c15fd7854b26be05794d53685423c94bc61e59c49bd640d646ae8");
1053 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
1054 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2404 C0C1C2C3"_block);
1055 BOOST_CHECK(i.getSignatureInfo() == si);
1056
1057 i.unsetApplicationParameters(); // removes ParametersSha256DigestComponent and InterestSignatureInfo
Davide Pesaventof6b45892023-03-13 15:00:51 -04001058 BOOST_CHECK(i.getSignatureInfo() == std::nullopt);
Eric Newberry6e262f02020-05-29 23:11:25 -07001059 BOOST_CHECK_EQUAL(i.getSignatureValue().isValid(), false);
1060 BOOST_CHECK_EQUAL(i.getName(), "/A/B/C");
1061
1062 i.setSignatureInfo(si); // auto-adds an empty ApplicationParameters element
1063 BOOST_CHECK_EQUAL(i.getName(),
1064 "/A/B/C/params-sha256=d2ac0eb1f60f60ab206fb80bf1d0f73cfef353bbec43ba6ea626117f671ca3bb");
1065 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
1066 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2400"_block);
1067 BOOST_CHECK(i.getSignatureInfo() == si);
1068
1069 Block sv("2E04 01020304"_block);
Davide Pesavento487e3d32022-05-05 18:06:23 -04001070 i.setSignatureValue(sv.value_bytes()); // updates ParametersDigestSha256Component
Eric Newberry6e262f02020-05-29 23:11:25 -07001071 BOOST_CHECK_EQUAL(i.getName(),
1072 "/A/B/C/params-sha256=f649845ef944638390d1c689e2f0618ea02e471eff236110cbeb822d5932d342");
1073 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
1074 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2400"_block);
1075 BOOST_CHECK(i.getSignatureInfo() == si);
1076 BOOST_CHECK_EQUAL(i.getSignatureValue(), sv);
1077
1078 i.setApplicationParameters("2404C0C1C2C3"_block); // updates ParametersSha256DigestComponent
1079 BOOST_CHECK_EQUAL(i.getName(),
1080 "/A/B/C/params-sha256=c5d7e567e6b251ddf36f7a6dbed95235b2d4a0b36215bb0f3cc403ac64ad0284");
1081 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
1082 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2404 C0C1C2C3"_block);
1083 BOOST_CHECK(i.getSignatureInfo() == si);
1084 BOOST_CHECK_EQUAL(i.getSignatureValue(), sv);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -04001085}
Junxiao Shi899277a2017-07-07 22:12:12 +00001086
Eric Newberryb74bbda2020-06-18 19:33:58 -07001087BOOST_AUTO_TEST_CASE(ExtractSignedRanges)
1088{
Davide Pesavento296c3a12023-05-04 21:40:40 -04001089 InputBuffers bufs;
1090
Eric Newberryb74bbda2020-06-18 19:33:58 -07001091 Interest i1;
Davide Pesavento296c3a12023-05-04 21:40:40 -04001092 BOOST_CHECK_EXCEPTION(bufs = i1.extractSignedRanges(), tlv::Error, [] (const auto& e) {
1093 return e.what() == "Name has zero name components"sv;
Eric Newberryb74bbda2020-06-18 19:33:58 -07001094 });
1095 i1.setName("/test/prefix");
1096 i1.setNonce(0x01020304);
1097 SignatureInfo sigInfo(tlv::DigestSha256);
1098 i1.setSignatureInfo(sigInfo);
1099
1100 // Test with previously unsigned Interest (no InterestSignatureValue)
1101 auto ranges1 = i1.extractSignedRanges();
1102 BOOST_REQUIRE_EQUAL(ranges1.size(), 2);
1103 const Block& wire1 = i1.wireEncode();
1104 // Ensure Name range captured properly
1105 Block nameWithoutDigest1 = i1.getName().getPrefix(-1).wireEncode();
Davide Pesavento765abc92021-12-27 00:44:04 -05001106 BOOST_CHECK_EQUAL_COLLECTIONS(ranges1.front().begin(), ranges1.front().end(),
Eric Newberryb74bbda2020-06-18 19:33:58 -07001107 nameWithoutDigest1.value_begin(), nameWithoutDigest1.value_end());
1108 // Ensure parameters range captured properly
1109 const auto& appParamsWire1 = wire1.find(tlv::ApplicationParameters);
1110 BOOST_REQUIRE(appParamsWire1 != wire1.elements_end());
Davide Pesavento765abc92021-12-27 00:44:04 -05001111 BOOST_CHECK_EQUAL_COLLECTIONS(ranges1.back().begin(), ranges1.back().end(),
Eric Newberryb74bbda2020-06-18 19:33:58 -07001112 appParamsWire1->begin(), wire1.end());
1113
1114 // Test with Interest with existing InterestSignatureValue
Davide Pesavento487e3d32022-05-05 18:06:23 -04001115 i1.setSignatureValue(std::make_shared<Buffer>());
Eric Newberryb74bbda2020-06-18 19:33:58 -07001116 auto ranges2 = i1.extractSignedRanges();
1117 BOOST_REQUIRE_EQUAL(ranges2.size(), 2);
1118 const auto& wire2 = i1.wireEncode();
1119 // Ensure Name range captured properly
1120 Block nameWithoutDigest2 = i1.getName().getPrefix(-1).wireEncode();
Davide Pesavento765abc92021-12-27 00:44:04 -05001121 BOOST_CHECK_EQUAL_COLLECTIONS(ranges2.front().begin(), ranges2.front().end(),
Eric Newberryb74bbda2020-06-18 19:33:58 -07001122 nameWithoutDigest2.value_begin(), nameWithoutDigest2.value_end());
1123 // Ensure parameters range captured properly
1124 const auto& appParamsWire2 = wire2.find(tlv::ApplicationParameters);
1125 BOOST_REQUIRE(appParamsWire2 != wire2.elements_end());
1126 const auto& sigValueWire2 = wire2.find(tlv::InterestSignatureValue);
1127 BOOST_REQUIRE(sigValueWire2 != wire2.elements_end());
Davide Pesavento765abc92021-12-27 00:44:04 -05001128 BOOST_CHECK_EQUAL_COLLECTIONS(ranges2.back().begin(), ranges2.back().end(),
Eric Newberryb74bbda2020-06-18 19:33:58 -07001129 appParamsWire2->begin(), sigValueWire2->begin());
1130
1131 // Test with decoded Interest
1132 const uint8_t WIRE[] = {
1133 0x05, 0x6f, // Interest
1134 0x07, 0x2e, // Name
1135 0x08, 0x04, // GenericNameComponent
1136 0x61, 0x62, 0x63, 0x64,
1137 0x08, 0x04, // GenericNameComponent
1138 0x65, 0x66, 0x67, 0x68,
1139 0x02, 0x20, // ParametersSha256DigestComponent
1140 0x6f, 0x29, 0x58, 0x60, 0x53, 0xee, 0x9f, 0xcc,
1141 0xd8, 0xa4, 0x22, 0x12, 0x29, 0x25, 0x28, 0x7c,
1142 0x0a, 0x18, 0x43, 0x5f, 0x40, 0x74, 0xc4, 0x0a,
1143 0xbb, 0x0d, 0x5b, 0x30, 0xe4, 0xaa, 0x62, 0x20,
1144 0x12, 0x00, // MustBeFresh
1145 0x0a, 0x04, // Nonce
1146 0x4c, 0x1e, 0xcb, 0x4a,
1147 0x24, 0x04, // ApplicationParameters
1148 0xc0, 0xc1, 0xc2, 0xc3,
1149 0x2c, 0x0d, // InterestSignatureInfo
1150 0x1b, 0x01, // SignatureType
1151 0x00,
1152 0x26, 0x08, // SignatureNonce
1153 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
1154 0x2e, 0x20, // InterestSignatureValue
1155 0x12, 0x47, 0x1a, 0xe0, 0xf8, 0x72, 0x3a, 0xc1,
1156 0x15, 0x6c, 0x37, 0x0a, 0x38, 0x71, 0x1e, 0xbe,
1157 0xbf, 0x28, 0x17, 0xde, 0x9b, 0x2d, 0xd9, 0x4e,
1158 0x9b, 0x7e, 0x62, 0xf1, 0x17, 0xb8, 0x76, 0xc1,
1159 };
Davide Pesaventofbea4fc2022-02-08 07:26:04 -05001160 Block wire3(WIRE);
Eric Newberryb74bbda2020-06-18 19:33:58 -07001161 Interest i2(wire3);
1162 auto ranges3 = i2.extractSignedRanges();
1163 BOOST_REQUIRE_EQUAL(ranges3.size(), 2);
1164 // Ensure Name range captured properly
Davide Pesavento765abc92021-12-27 00:44:04 -05001165 BOOST_CHECK_EQUAL_COLLECTIONS(ranges3.front().begin(), ranges3.front().end(), &WIRE[4], &WIRE[16]);
Eric Newberryb74bbda2020-06-18 19:33:58 -07001166 // Ensure parameters range captured properly
Davide Pesavento765abc92021-12-27 00:44:04 -05001167 BOOST_CHECK_EQUAL_COLLECTIONS(ranges3.back().begin(), ranges3.back().end(), &WIRE[58], &WIRE[79]);
Eric Newberryb74bbda2020-06-18 19:33:58 -07001168
Eric Newberryb74bbda2020-06-18 19:33:58 -07001169 Interest i3("/a");
Davide Pesavento296c3a12023-05-04 21:40:40 -04001170 // Failure due to missing ParametersSha256DigestComponent
1171 BOOST_CHECK_EXCEPTION(bufs = i3.extractSignedRanges(), tlv::Error, [] (const auto& e) {
1172 return e.what() == "Interest Name must end with a ParametersSha256DigestComponent"sv;
Eric Newberryb74bbda2020-06-18 19:33:58 -07001173 });
1174
Davide Pesavento296c3a12023-05-04 21:40:40 -04001175 i3.setApplicationParameters("");
1176 // Failure due to missing InterestSignatureInfo
1177 BOOST_CHECK_EXCEPTION(bufs = i3.extractSignedRanges(), tlv::Error, [] (const auto& e) {
1178 return e.what() == "Interest missing InterestSignatureInfo"sv;
Eric Newberryb74bbda2020-06-18 19:33:58 -07001179 });
1180}
1181
Davide Pesavento2fdb2742019-07-31 23:03:35 -04001182BOOST_AUTO_TEST_CASE(ToUri)
1183{
1184 Interest i;
Davide Pesavento2fdb2742019-07-31 23:03:35 -04001185 BOOST_CHECK_EQUAL(i.toUri(), "/");
1186
1187 i.setName("/foo");
1188 BOOST_CHECK_EQUAL(i.toUri(), "/foo");
1189
1190 i.setCanBePrefix(true);
1191 BOOST_CHECK_EQUAL(i.toUri(), "/foo?CanBePrefix");
1192
1193 i.setMustBeFresh(true);
1194 BOOST_CHECK_EQUAL(i.toUri(), "/foo?CanBePrefix&MustBeFresh");
1195
Davide Pesavento53533942020-03-04 23:10:06 -05001196 i.setNonce(0xa1b2c3);
1197 BOOST_CHECK_EQUAL(i.toUri(), "/foo?CanBePrefix&MustBeFresh&Nonce=00a1b2c3");
Davide Pesavento2fdb2742019-07-31 23:03:35 -04001198
1199 i.setInterestLifetime(2_s);
Davide Pesavento53533942020-03-04 23:10:06 -05001200 BOOST_CHECK_EQUAL(i.toUri(), "/foo?CanBePrefix&MustBeFresh&Nonce=00a1b2c3&Lifetime=2000");
Davide Pesavento2fdb2742019-07-31 23:03:35 -04001201
1202 i.setHopLimit(18);
Davide Pesavento53533942020-03-04 23:10:06 -05001203 BOOST_CHECK_EQUAL(i.toUri(), "/foo?CanBePrefix&MustBeFresh&Nonce=00a1b2c3&Lifetime=2000&HopLimit=18");
Davide Pesavento2fdb2742019-07-31 23:03:35 -04001204
1205 i.setCanBePrefix(false);
1206 i.setMustBeFresh(false);
Davide Pesaventof6b45892023-03-13 15:00:51 -04001207 i.setHopLimit(std::nullopt);
Davide Pesavento2fdb2742019-07-31 23:03:35 -04001208 i.setApplicationParameters("2402CAFE"_block);
1209 BOOST_CHECK_EQUAL(i.toUri(),
1210 "/foo/params-sha256=8621f5e8321f04104640c8d02877d7c5142cad6e203c5effda1783b1a0e476d6"
Davide Pesavento53533942020-03-04 23:10:06 -05001211 "?Nonce=00a1b2c3&Lifetime=2000");
Davide Pesavento2fdb2742019-07-31 23:03:35 -04001212}
1213
Davide Pesaventoeee3e822016-11-26 19:19:34 +01001214BOOST_AUTO_TEST_SUITE_END() // TestInterest
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -08001215
Davide Pesavento47ce2ee2023-05-09 01:33:33 -04001216} // namespace ndn::tests