blob: 684f0976506a2a6164d4f51336bf3361d3ceecdf [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
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -080027namespace ndn {
Alexander Afanasyev90164962014-03-06 08:29:59 +000028namespace tests {
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080029
Junxiao Shi899277a2017-07-07 22:12:12 +000030BOOST_AUTO_TEST_SUITE(TestInterest)
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080031
Davide Pesaventoadc9aa22019-06-30 19:00:20 -040032class DisableAutoCheckParametersDigest
33{
34public:
35 DisableAutoCheckParametersDigest()
36 : m_saved(Interest::getAutoCheckParametersDigest())
37 {
38 Interest::setAutoCheckParametersDigest(false);
39 }
40
41 ~DisableAutoCheckParametersDigest()
42 {
43 Interest::setAutoCheckParametersDigest(m_saved);
44 }
45
46private:
47 bool m_saved;
48};
Junxiao Shi899277a2017-07-07 22:12:12 +000049
50BOOST_AUTO_TEST_CASE(DefaultConstructor)
51{
52 Interest i;
Davide Pesaventoadc9aa22019-06-30 19:00:20 -040053 BOOST_CHECK_EQUAL(i.hasWire(), false);
Junxiao Shi899277a2017-07-07 22:12:12 +000054 BOOST_CHECK_EQUAL(i.getName(), "/");
Davide Pesavento478d3382021-03-17 12:46:08 -040055 BOOST_CHECK_EQUAL(i.getCanBePrefix(), false);
Junxiao Shi6efa3b72018-04-14 15:54:08 +000056 BOOST_CHECK_EQUAL(i.getMustBeFresh(), false);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -040057 BOOST_CHECK_EQUAL(i.getForwardingHint().empty(), true);
58 BOOST_CHECK_EQUAL(i.hasNonce(), false);
Junxiao Shi899277a2017-07-07 22:12:12 +000059 BOOST_CHECK_EQUAL(i.getInterestLifetime(), DEFAULT_INTEREST_LIFETIME);
Davide Pesaventof6b45892023-03-13 15:00:51 -040060 BOOST_CHECK(i.getHopLimit() == std::nullopt);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -040061 BOOST_CHECK_EQUAL(i.hasApplicationParameters(), false);
62 BOOST_CHECK_EQUAL(i.getApplicationParameters().isValid(), false);
63 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
Davide Pesaventof6b45892023-03-13 15:00:51 -040064 BOOST_CHECK(i.getSignatureInfo() == std::nullopt);
Eric Newberry6e262f02020-05-29 23:11:25 -070065 BOOST_CHECK_EQUAL(i.getSignatureValue().isValid(), false);
66 BOOST_CHECK_EQUAL(i.isSigned(), false);
Davide Pesaventofccb2dc2019-02-09 01:02:35 -050067}
68
Davide Pesavento0e0b3892019-07-30 21:05:05 -040069BOOST_AUTO_TEST_SUITE(Encode)
Davide Pesaventoadc9aa22019-06-30 19:00:20 -040070
71BOOST_AUTO_TEST_CASE(Basic)
Junxiao Shi899277a2017-07-07 22:12:12 +000072{
73 const uint8_t WIRE[] = {
74 0x05, 0x1c, // Interest
75 0x07, 0x14, // Name
Junxiao Shi4ffbb9d2018-03-31 17:16:35 +000076 0x08, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, // GenericNameComponent
77 0x08, 0x03, 0x6e, 0x64, 0x6e, // GenericNameComponent
78 0x08, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, // GenericNameComponent
Junxiao Shi899277a2017-07-07 22:12:12 +000079 0x0a, 0x04, // Nonce
Davide Pesavento53533942020-03-04 23:10:06 -050080 0x01, 0x02, 0x03, 0x04,
Junxiao Shi899277a2017-07-07 22:12:12 +000081 };
82
Davide Pesavento0e0b3892019-07-30 21:05:05 -040083 Interest i1;
84 i1.setName("/local/ndn/prefix");
Davide Pesavento53533942020-03-04 23:10:06 -050085 i1.setNonce(0x01020304);
Davide Pesavento0e0b3892019-07-30 21:05:05 -040086 BOOST_CHECK_EQUAL(i1.isParametersDigestValid(), true);
87
Junxiao Shi899277a2017-07-07 22:12:12 +000088 Block wire1 = i1.wireEncode();
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -050089 BOOST_TEST(wire1 == WIRE, boost::test_tools::per_element());
Junxiao Shi899277a2017-07-07 22:12:12 +000090
91 Interest i2(wire1);
92 BOOST_CHECK_EQUAL(i2.getName(), "/local/ndn/prefix");
Davide Pesavento0e0b3892019-07-30 21:05:05 -040093 BOOST_CHECK_EQUAL(i2.getCanBePrefix(), false);
94 BOOST_CHECK_EQUAL(i2.getMustBeFresh(), false);
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -040095 BOOST_CHECK_EQUAL(i2.getForwardingHint().empty(), true);
Davide Pesavento835f0272019-09-21 13:18:24 -040096 BOOST_CHECK_EQUAL(i2.hasNonce(), true);
Davide Pesavento53533942020-03-04 23:10:06 -050097 BOOST_CHECK_EQUAL(i2.getNonce(), 0x01020304);
Junxiao Shi899277a2017-07-07 22:12:12 +000098 BOOST_CHECK_EQUAL(i2.getInterestLifetime(), DEFAULT_INTEREST_LIFETIME);
Davide Pesaventof6b45892023-03-13 15:00:51 -040099 BOOST_CHECK(i2.getHopLimit() == std::nullopt);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400100 BOOST_CHECK_EQUAL(i2.hasApplicationParameters(), false);
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400101 BOOST_CHECK_EQUAL(i2.getApplicationParameters().isValid(), false);
Davide Pesaventof6b45892023-03-13 15:00:51 -0400102 BOOST_CHECK(i2.getSignatureInfo() == std::nullopt);
Eric Newberry6e262f02020-05-29 23:11:25 -0700103 BOOST_CHECK_EQUAL(i2.getSignatureValue().isValid(), false);
104 BOOST_CHECK_EQUAL(i2.isSigned(), false);
Junxiao Shi899277a2017-07-07 22:12:12 +0000105}
106
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400107BOOST_AUTO_TEST_CASE(WithParameters)
108{
109 const uint8_t WIRE[] = {
110 0x05, 0x44, // Interest
111 0x07, 0x36, // Name
112 0x08, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, // GenericNameComponent
113 0x08, 0x03, 0x6e, 0x64, 0x6e, // GenericNameComponent
114 0x08, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, // GenericNameComponent
115 0x02, 0x20, // ParametersSha256DigestComponent
116 0xff, 0x91, 0x00, 0xe0, 0x4e, 0xaa, 0xdc, 0xf3, 0x06, 0x74, 0xd9, 0x80,
117 0x26, 0xa0, 0x51, 0xba, 0x25, 0xf5, 0x6b, 0x69, 0xbf, 0xa0, 0x26, 0xdc,
118 0xcc, 0xd7, 0x2c, 0x6e, 0xa0, 0xf7, 0x31, 0x5a,
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700119 0x0a, 0x04, // Nonce
Davide Pesavento53533942020-03-04 23:10:06 -0500120 0x00, 0x00, 0x00, 0x01,
Davide Pesavento9c19a392019-04-06 15:07:54 -0400121 0x24, 0x04, // ApplicationParameters
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400122 0xc0, 0xc1, 0xc2, 0xc3
123 };
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700124
125 Interest i1;
126 i1.setName("/local/ndn/prefix");
Davide Pesavento53533942020-03-04 23:10:06 -0500127 i1.setNonce(0x1);
Davide Pesavento9c19a392019-04-06 15:07:54 -0400128 i1.setApplicationParameters("2404C0C1C2C3"_block);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400129 BOOST_CHECK_EQUAL(i1.isParametersDigestValid(), true);
130
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700131 Block wire1 = i1.wireEncode();
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500132 BOOST_TEST(wire1 == WIRE, boost::test_tools::per_element());
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700133
134 Interest i2(wire1);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400135 BOOST_CHECK_EQUAL(i2.getName(),
136 "/local/ndn/prefix/params-sha256=ff9100e04eaadcf30674d98026a051ba25f56b69bfa026dcccd72c6ea0f7315a");
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700137 BOOST_CHECK_EQUAL(i2.getCanBePrefix(), false);
138 BOOST_CHECK_EQUAL(i2.getMustBeFresh(), false);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400139 BOOST_CHECK_EQUAL(i2.getForwardingHint().empty(), true);
Davide Pesavento835f0272019-09-21 13:18:24 -0400140 BOOST_CHECK_EQUAL(i2.hasNonce(), true);
Davide Pesavento53533942020-03-04 23:10:06 -0500141 BOOST_CHECK_EQUAL(i2.getNonce(), 0x1);
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700142 BOOST_CHECK_EQUAL(i2.getInterestLifetime(), DEFAULT_INTEREST_LIFETIME);
Davide Pesaventof6b45892023-03-13 15:00:51 -0400143 BOOST_CHECK(i2.getHopLimit() == std::nullopt);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400144 BOOST_CHECK_EQUAL(i2.hasApplicationParameters(), true);
Davide Pesavento9c19a392019-04-06 15:07:54 -0400145 BOOST_CHECK_EQUAL(i2.getApplicationParameters(), "2404C0C1C2C3"_block);
Davide Pesaventof6b45892023-03-13 15:00:51 -0400146 BOOST_CHECK(i2.getSignatureInfo() == std::nullopt);
Eric Newberry6e262f02020-05-29 23:11:25 -0700147 BOOST_CHECK_EQUAL(i2.getSignatureValue().isValid(), false);
148 BOOST_CHECK_EQUAL(i2.isSigned(), false);
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700149}
150
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400151BOOST_AUTO_TEST_CASE(Full)
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700152{
153 const uint8_t WIRE[] = {
Junxiao Shie4603e12022-01-05 19:12:25 +0000154 0x05, 0x56, // Interest
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400155 0x07, 0x36, // Name
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700156 0x08, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, // GenericNameComponent
157 0x08, 0x03, 0x6e, 0x64, 0x6e, // GenericNameComponent
158 0x08, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, // GenericNameComponent
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400159 0x02, 0x20, // ParametersSha256DigestComponent
160 0xff, 0x91, 0x00, 0xe0, 0x4e, 0xaa, 0xdc, 0xf3, 0x06, 0x74, 0xd9, 0x80,
161 0x26, 0xa0, 0x51, 0xba, 0x25, 0xf5, 0x6b, 0x69, 0xbf, 0xa0, 0x26, 0xdc,
162 0xcc, 0xd7, 0x2c, 0x6e, 0xa0, 0xf7, 0x31, 0x5a,
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700163 0x21, 0x00, // CanBePrefix
164 0x12, 0x00, // MustBeFresh
Junxiao Shie4603e12022-01-05 19:12:25 +0000165 0x1e, 0x05, // ForwardingHint
166 0x07, 0x03, 0x08, 0x01, 0x48,
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700167 0x0a, 0x04, // Nonce
Davide Pesavento53533942020-03-04 23:10:06 -0500168 0x4c, 0x1e, 0xcb, 0x4a,
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400169 0x0c, 0x02, // InterestLifetime
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700170 0x76, 0xa1,
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400171 0x22, 0x01, // HopLimit
172 0xdc,
Davide Pesavento9c19a392019-04-06 15:07:54 -0400173 0x24, 0x04, // ApplicationParameters
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400174 0xc0, 0xc1, 0xc2, 0xc3
175 };
176
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700177 Interest i1;
178 i1.setName("/local/ndn/prefix");
179 i1.setMustBeFresh(true);
180 i1.setCanBePrefix(true);
Junxiao Shie4603e12022-01-05 19:12:25 +0000181 i1.setForwardingHint({"/H"});
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700182 i1.setNonce(0x4c1ecb4a);
183 i1.setInterestLifetime(30369_ms);
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400184 i1.setHopLimit(220);
Davide Pesavento9c19a392019-04-06 15:07:54 -0400185 i1.setApplicationParameters("2404C0C1C2C3"_block);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400186 BOOST_CHECK_EQUAL(i1.isParametersDigestValid(), true);
187
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700188 Block wire1 = i1.wireEncode();
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500189 BOOST_TEST(wire1 == WIRE, boost::test_tools::per_element());
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700190
191 Interest i2(wire1);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400192 BOOST_CHECK_EQUAL(i2.getName(),
193 "/local/ndn/prefix/params-sha256=ff9100e04eaadcf30674d98026a051ba25f56b69bfa026dcccd72c6ea0f7315a");
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700194 BOOST_CHECK_EQUAL(i2.getCanBePrefix(), true);
195 BOOST_CHECK_EQUAL(i2.getMustBeFresh(), true);
Junxiao Shie4603e12022-01-05 19:12:25 +0000196 BOOST_TEST(i2.getForwardingHint() == std::vector<Name>({"/H"}), boost::test_tools::per_element());
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400197 BOOST_CHECK_EQUAL(i2.hasNonce(), true);
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700198 BOOST_CHECK_EQUAL(i2.getNonce(), 0x4c1ecb4a);
199 BOOST_CHECK_EQUAL(i2.getInterestLifetime(), 30369_ms);
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400200 BOOST_CHECK_EQUAL(*i2.getHopLimit(), 220);
Davide Pesavento9c19a392019-04-06 15:07:54 -0400201 BOOST_CHECK_EQUAL(i2.getApplicationParameters(), "2404C0C1C2C3"_block);
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700202}
203
Eric Newberry6e262f02020-05-29 23:11:25 -0700204BOOST_AUTO_TEST_CASE(Signed)
205{
206 const uint8_t WIRE[] = {
207 0x05, 0x77, // Interest
208 0x07, 0x36, // Name
209 0x08, 0x05, // GenericNameComponent
210 0x6c, 0x6f, 0x63, 0x61, 0x6c,
211 0x08, 0x03, // GenericNameComponent
212 0x6e, 0x64, 0x6e,
213 0x08, 0x06, // GenericNameComponent
214 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
215 0x02, 0x20, // ParametersSha256DigestComponent
216 0x6f, 0x29, 0x58, 0x60, 0x53, 0xee, 0x9f, 0xcc,
217 0xd8, 0xa4, 0x22, 0x12, 0x29, 0x25, 0x28, 0x7c,
218 0x0a, 0x18, 0x43, 0x5f, 0x40, 0x74, 0xc4, 0x0a,
219 0xbb, 0x0d, 0x5b, 0x30, 0xe4, 0xaa, 0x62, 0x20,
220 0x12, 0x00, // MustBeFresh
221 0x0a, 0x04, // Nonce
222 0x4c, 0x1e, 0xcb, 0x4a,
223 0x24, 0x04, // ApplicationParameters
224 0xc0, 0xc1, 0xc2, 0xc3,
225 0x2c, 0x0d, // InterestSignatureInfo
226 0x1b, 0x01, // SignatureType
227 0x00,
228 0x26, 0x08, // SignatureNonce
229 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
230 0x2e, 0x20, // InterestSignatureValue
231 0x12, 0x47, 0x1a, 0xe0, 0xf8, 0x72, 0x3a, 0xc1,
232 0x15, 0x6c, 0x37, 0x0a, 0x38, 0x71, 0x1e, 0xbe,
233 0xbf, 0x28, 0x17, 0xde, 0x9b, 0x2d, 0xd9, 0x4e,
234 0x9b, 0x7e, 0x62, 0xf1, 0x17, 0xb8, 0x76, 0xc1,
235 };
236
237 SignatureInfo si(tlv::DigestSha256);
238 std::vector<uint8_t> nonce{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
239 si.setNonce(nonce);
240 Block sv("2E20 12471AE0F8723AC1156C370A38711EBEBF2817DE9B2DD94E9B7E62F117B876C1"_block);
241
Davide Pesaventofbea4fc2022-02-08 07:26:04 -0500242 Interest i1(Block{WIRE});
Eric Newberry6e262f02020-05-29 23:11:25 -0700243 BOOST_CHECK_EQUAL(i1.getName(),
244 "/local/ndn/prefix/params-sha256=6f29586053ee9fccd8a422122925287c0a18435f4074c40abb0d5b30e4aa6220");
245 BOOST_CHECK_EQUAL(i1.getCanBePrefix(), false);
246 BOOST_CHECK_EQUAL(i1.getMustBeFresh(), true);
247 BOOST_CHECK_EQUAL(i1.hasNonce(), true);
248 BOOST_CHECK_EQUAL(i1.getNonce(), 0x4c1ecb4a);
249 BOOST_CHECK_EQUAL(i1.getSignatureInfo()->getSignatureType(), tlv::DigestSha256);
250 BOOST_CHECK(i1.getSignatureInfo()->getNonce() == nonce);
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500251 BOOST_TEST(i1.getSignatureValue() == sv, boost::test_tools::per_element());
Eric Newberry6e262f02020-05-29 23:11:25 -0700252 BOOST_CHECK_EQUAL(i1.getApplicationParameters(), "2404C0C1C2C3"_block);
253 BOOST_CHECK_EQUAL(i1.isParametersDigestValid(), true);
254
255 // Reset wire
256 BOOST_CHECK_EQUAL(i1.hasWire(), true);
257 i1.setCanBePrefix(true);
258 i1.setCanBePrefix(false);
259 BOOST_CHECK_EQUAL(i1.hasWire(), false);
260
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500261 BOOST_TEST(i1.wireEncode() == WIRE, boost::test_tools::per_element());
Eric Newberry6e262f02020-05-29 23:11:25 -0700262
263 Interest i2("/local/ndn/prefix");
Eric Newberry6e262f02020-05-29 23:11:25 -0700264 i2.setMustBeFresh(true);
265 i2.setNonce(0x4c1ecb4a);
266 i2.setApplicationParameters("2404C0C1C2C3"_block);
267 i2.setSignatureInfo(si);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400268 i2.setSignatureValue(sv.value_bytes());
Eric Newberry6e262f02020-05-29 23:11:25 -0700269 BOOST_CHECK_EQUAL(i2.isParametersDigestValid(), true);
270
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500271 BOOST_TEST(i2.wireEncode() == WIRE, boost::test_tools::per_element());
Eric Newberry6e262f02020-05-29 23:11:25 -0700272}
273
274BOOST_AUTO_TEST_CASE(SignedApplicationElements)
275{
276 const uint8_t WIRE[] = {
277 0x05, 0x8f, // Interest
278 0x07, 0x36, // Name
279 0x08, 0x05, // GenericNameComponent
280 0x6c, 0x6f, 0x63, 0x61, 0x6c,
281 0x08, 0x03, // GenericNameComponent
282 0x6e, 0x64, 0x6e,
283 0x08, 0x06, // GenericNameComponent
284 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
285 0x02, 0x20, // ParametersSha256DigestComponent
286 0xbc, 0x36, 0x30, 0xa4, 0xd6, 0x5e, 0x0d, 0xb5,
287 0x48, 0x3d, 0xfa, 0x0d, 0x28, 0xb3, 0x31, 0x2f,
288 0xca, 0xc1, 0xd4, 0x41, 0xec, 0x89, 0x61, 0xd4,
289 0x17, 0x5e, 0x61, 0x75, 0x17, 0x78, 0x10, 0x8e,
290 0x12, 0x00, // MustBeFresh
291 0x0a, 0x04, // Nonce
292 0x4c, 0x1e, 0xcb, 0x4a,
293 0x24, 0x04, // ApplicationParameters
294 0xc0, 0xc1, 0xc2, 0xc3,
295 0xfd, 0x01, 0xfe, 0x08, // Application-specific element (Type 510)
296 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80,
297 0x2c, 0x0d, // InterestSignatureInfo
298 0x1b, 0x01, // SignatureType
299 0x00,
300 0x26, 0x08, // SignatureNonce
301 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
302 0x2e, 0x20, // InterestSignatureValue
303 0x12, 0x47, 0x1a, 0xe0, 0xf8, 0x72, 0x3a, 0xc1,
304 0x15, 0x6c, 0x37, 0x0a, 0x38, 0x71, 0x1e, 0xbe,
305 0xbf, 0x28, 0x17, 0xde, 0x9b, 0x2d, 0xd9, 0x4e,
306 0x9b, 0x7e, 0x62, 0xf1, 0x17, 0xb8, 0x76, 0xc1,
307 0xfd, 0x02, 0x00, 0x08, // Application-specific element (Type 512)
308 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88
309 };
310
311 SignatureInfo si(tlv::DigestSha256);
312 std::vector<uint8_t> nonce{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
313 si.setNonce(nonce);
314 Block sv("2E20 12471AE0F8723AC1156C370A38711EBEBF2817DE9B2DD94E9B7E62F117B876C1"_block);
315
Davide Pesaventofbea4fc2022-02-08 07:26:04 -0500316 Interest i1(Block{WIRE});
Eric Newberry6e262f02020-05-29 23:11:25 -0700317 BOOST_CHECK_EQUAL(i1.getName(),
318 "/local/ndn/prefix/params-sha256=bc3630a4d65e0db5483dfa0d28b3312fcac1d441ec8961d4175e61751778108e");
319 BOOST_CHECK_EQUAL(i1.getCanBePrefix(), false);
320 BOOST_CHECK_EQUAL(i1.getMustBeFresh(), true);
321 BOOST_CHECK_EQUAL(i1.hasNonce(), true);
322 BOOST_CHECK_EQUAL(i1.getNonce(), 0x4c1ecb4a);
323 BOOST_CHECK_EQUAL(i1.getSignatureInfo()->getSignatureType(), tlv::DigestSha256);
324 BOOST_CHECK(i1.getSignatureInfo()->getNonce() == nonce);
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500325 BOOST_TEST(i1.getSignatureValue() == sv, boost::test_tools::per_element());
Eric Newberry6e262f02020-05-29 23:11:25 -0700326 BOOST_CHECK_EQUAL(i1.getApplicationParameters(), "2404C0C1C2C3"_block);
327 BOOST_CHECK_EQUAL(i1.isParametersDigestValid(), true);
328
329 // Reset wire
330 BOOST_CHECK_EQUAL(i1.hasWire(), true);
331 i1.setCanBePrefix(true);
332 i1.setCanBePrefix(false);
333 BOOST_CHECK_EQUAL(i1.hasWire(), false);
334
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500335 BOOST_TEST(i1.wireEncode() == WIRE, boost::test_tools::per_element());
Eric Newberry6e262f02020-05-29 23:11:25 -0700336}
337
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400338BOOST_AUTO_TEST_CASE(MissingApplicationParameters)
339{
340 Interest i;
341 i.setName(Name("/A").appendParametersSha256DigestPlaceholder());
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400342 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), false);
Davide Pesavento905d40f2020-06-09 21:33:25 -0400343 BOOST_CHECK_EXCEPTION(i.wireEncode(), tlv::Error, [] (const auto& e) {
344 return e.what() == "Interest without parameters must not have a ParametersSha256DigestComponent"s;
345 });
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400346}
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400347
348BOOST_AUTO_TEST_CASE(MissingParametersSha256DigestComponent)
349{
350 // there's no way to create an Interest that fails this check via programmatic construction,
351 // so we have to decode an invalid Interest and force reencoding
352
353 DisableAutoCheckParametersDigest disabler;
354 Interest i("050F 0703(080149) 0A04F000F000 2402CAFE"_block);
355 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), false);
356 BOOST_CHECK_NO_THROW(i.wireEncode()); // this succeeds because it uses the cached wire encoding
357
Davide Pesavento905d40f2020-06-09 21:33:25 -0400358 // trigger reencoding
359 i.setNonce(42);
360 // now the check fails while attempting to reencode
361 BOOST_CHECK_EXCEPTION(i.wireEncode(), tlv::Error, [] (const auto& e) {
362 return e.what() == "Interest with parameters must have a ParametersSha256DigestComponent"s;
363 });
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400364}
365
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400366BOOST_AUTO_TEST_SUITE_END() // Encode
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400367
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400368class DecodeFixture
Junxiao Shi899277a2017-07-07 22:12:12 +0000369{
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000370protected:
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400371 DecodeFixture()
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000372 {
373 // initialize all elements to non-empty, to verify wireDecode clears them
374 i.setName("/A");
Junxiao Shie4603e12022-01-05 19:12:25 +0000375 i.setForwardingHint({"/F"});
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000376 i.setNonce(0x03d645a8);
377 i.setInterestLifetime(18554_ms);
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400378 i.setHopLimit(64);
Davide Pesavento9c19a392019-04-06 15:07:54 -0400379 i.setApplicationParameters("2404A0A1A2A3"_block);
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000380 }
Junxiao Shi899277a2017-07-07 22:12:12 +0000381
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000382protected:
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000383 Interest i;
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000384};
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000385
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400386BOOST_FIXTURE_TEST_SUITE(Decode, DecodeFixture)
387
388BOOST_AUTO_TEST_CASE(NotAnInterest)
389{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400390 BOOST_CHECK_EXCEPTION(i.wireDecode("4202CAFE"_block), tlv::Error, [] (const auto& e) {
391 return e.what() == "Expecting Interest element, but TLV has type 66"s;
392 });
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400393}
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000394
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400395BOOST_AUTO_TEST_CASE(NameOnly)
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000396{
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400397 i.wireDecode("0505 0703(080149)"_block);
Davide Pesavento835f0272019-09-21 13:18:24 -0400398 BOOST_CHECK_EQUAL(i.hasWire(), true);
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000399 BOOST_CHECK_EQUAL(i.getName(), "/I");
400 BOOST_CHECK_EQUAL(i.getCanBePrefix(), false);
401 BOOST_CHECK_EQUAL(i.getMustBeFresh(), false);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400402 BOOST_CHECK_EQUAL(i.getForwardingHint().empty(), true);
Davide Pesavento835f0272019-09-21 13:18:24 -0400403 BOOST_CHECK_EQUAL(i.hasNonce(), false);
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000404 BOOST_CHECK_EQUAL(i.getInterestLifetime(), DEFAULT_INTEREST_LIFETIME);
Davide Pesaventof6b45892023-03-13 15:00:51 -0400405 BOOST_CHECK(i.getHopLimit() == std::nullopt);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400406 BOOST_CHECK_EQUAL(i.hasApplicationParameters(), false);
407 BOOST_CHECK_EQUAL(i.getApplicationParameters().isValid(), false);
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000408
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400409 // modify then re-encode
Davide Pesavento53533942020-03-04 23:10:06 -0500410 i.setNonce(0x957c6554);
Davide Pesavento835f0272019-09-21 13:18:24 -0400411 BOOST_CHECK_EQUAL(i.hasWire(), false);
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400412 BOOST_CHECK_EQUAL(i.wireEncode(), "050B 0703(080149) 0A04957C6554"_block);
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000413}
414
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400415BOOST_AUTO_TEST_CASE(NameCanBePrefix)
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000416{
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400417 i.wireDecode("0507 0703(080149) 2100"_block);
Davide Pesavento835f0272019-09-21 13:18:24 -0400418 BOOST_CHECK_EQUAL(i.hasWire(), true);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400419 BOOST_CHECK_EQUAL(i.getName(), "/I");
420 BOOST_CHECK_EQUAL(i.getCanBePrefix(), true);
421 BOOST_CHECK_EQUAL(i.getMustBeFresh(), false);
422 BOOST_CHECK_EQUAL(i.getForwardingHint().empty(), true);
Davide Pesavento835f0272019-09-21 13:18:24 -0400423 BOOST_CHECK_EQUAL(i.hasNonce(), false);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400424 BOOST_CHECK_EQUAL(i.getInterestLifetime(), DEFAULT_INTEREST_LIFETIME);
Davide Pesaventof6b45892023-03-13 15:00:51 -0400425 BOOST_CHECK(i.getHopLimit() == std::nullopt);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400426 BOOST_CHECK_EQUAL(i.hasApplicationParameters(), false);
427 BOOST_CHECK_EQUAL(i.getApplicationParameters().isValid(), false);
428}
429
430BOOST_AUTO_TEST_CASE(FullWithoutParameters)
431{
432 i.wireDecode("0531 0703(080149) "
433 "FC00 2100 FC00 1200 FC00 1E0B(1F09 1E023E15 0703080148) "
434 "FC00 0A044ACB1E4C FC00 0C0276A1 FC00 2201D6 FC00"_block);
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000435 BOOST_CHECK_EQUAL(i.getName(), "/I");
436 BOOST_CHECK_EQUAL(i.getCanBePrefix(), true);
437 BOOST_CHECK_EQUAL(i.getMustBeFresh(), true);
Junxiao Shie4603e12022-01-05 19:12:25 +0000438 BOOST_TEST(i.getForwardingHint() == std::vector<Name>({"/H"}), boost::test_tools::per_element());
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400439 BOOST_CHECK_EQUAL(i.hasNonce(), true);
Davide Pesavento53533942020-03-04 23:10:06 -0500440 BOOST_CHECK_EQUAL(i.getNonce(), 0x4acb1e4c);
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000441 BOOST_CHECK_EQUAL(i.getInterestLifetime(), 30369_ms);
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400442 BOOST_CHECK_EQUAL(*i.getHopLimit(), 214);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400443 BOOST_CHECK_EQUAL(i.hasApplicationParameters(), false);
444 BOOST_CHECK_EQUAL(i.getApplicationParameters().isValid(), false);
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000445
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000446 // encode without modification: retain original wire encoding
Junxiao Shi8b753a22018-10-24 01:51:40 +0000447 BOOST_CHECK_EQUAL(i.wireEncode().value_size(), 49);
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000448
Junxiao Shie4603e12022-01-05 19:12:25 +0000449 // modify then re-encode:
450 // * unrecognized elements are discarded;
451 // * ForwardingHint is re-encoded as a sequence of Names
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000452 i.setName("/J");
Junxiao Shi72c0c642018-04-20 15:41:09 +0000453 BOOST_CHECK_EQUAL(i.wireEncode(),
Junxiao Shie4603e12022-01-05 19:12:25 +0000454 "051D 0703(08014A) "
455 "2100 1200 1E05(0703080148) "
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400456 "0A044ACB1E4C 0C0276A1 2201D6"_block);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400457}
458
459BOOST_AUTO_TEST_CASE(FullWithParameters)
460{
461 i.wireDecode("055B 0725(080149 0220F16DB273F40436A852063F864D5072B01EAD53151F5A688EA1560492BEBEDD05) "
462 "FC00 2100 FC00 1200 FC00 1E0B(1F09 1E023E15 0703080148) "
463 "FC00 0A044ACB1E4C FC00 0C0276A1 FC00 2201D6 FC00 2404C0C1C2C3 FC00"_block);
464 BOOST_CHECK_EQUAL(i.getName(),
465 "/I/params-sha256=f16db273f40436a852063f864d5072b01ead53151f5a688ea1560492bebedd05");
466 BOOST_CHECK_EQUAL(i.getCanBePrefix(), true);
467 BOOST_CHECK_EQUAL(i.getMustBeFresh(), true);
Junxiao Shie4603e12022-01-05 19:12:25 +0000468 BOOST_TEST(i.getForwardingHint() == std::vector<Name>({"/H"}), boost::test_tools::per_element());
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400469 BOOST_CHECK_EQUAL(i.hasNonce(), true);
Davide Pesavento53533942020-03-04 23:10:06 -0500470 BOOST_CHECK_EQUAL(i.getNonce(), 0x4acb1e4c);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400471 BOOST_CHECK_EQUAL(i.getInterestLifetime(), 30369_ms);
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400472 BOOST_CHECK_EQUAL(*i.getHopLimit(), 214);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400473 BOOST_CHECK_EQUAL(i.hasApplicationParameters(), true);
474 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2404C0C1C2C3"_block);
475
476 // encode without modification: retain original wire encoding
477 BOOST_CHECK_EQUAL(i.wireEncode().value_size(), 91);
478
Junxiao Shie4603e12022-01-05 19:12:25 +0000479 // modify then re-encode:
480 // * unrecognized elements after ApplicationParameters are preserved, the rest are discarded;
481 // * ForwardingHint is re-encoded as a sequence of Names
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400482 i.setName("/J");
483 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
484 BOOST_CHECK_EQUAL(i.wireEncode(),
Junxiao Shie4603e12022-01-05 19:12:25 +0000485 "0547 0725(08014A 0220F16DB273F40436A852063F864D5072B01EAD53151F5A688EA1560492BEBEDD05) "
486 "2100 1200 1E05(0703080148) "
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400487 "0A044ACB1E4C 0C0276A1 2201D6 2404C0C1C2C3 FC00"_block);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400488
489 // modify ApplicationParameters: unrecognized elements are preserved
490 i.setApplicationParameters("2402CAFE"_block);
491 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
492 BOOST_CHECK_EQUAL(i.wireEncode(),
Junxiao Shie4603e12022-01-05 19:12:25 +0000493 "0545 0725(08014A 02205FDA67967EE302FC457E41B7D3D51BA6A9379574D193FD88F64954BF16C2927A) "
494 "2100 1200 1E05(0703080148) "
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400495 "0A044ACB1E4C 0C0276A1 2201D6 2402CAFE FC00"_block);
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000496}
497
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000498BOOST_AUTO_TEST_CASE(CriticalElementOutOfOrder)
499{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400500 BOOST_CHECK_EXCEPTION(i.wireDecode(
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000501 "0529 2100 0703080149 1200 1E0B(1F09 1E023E15 0703080148) "
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500502 "0A044ACB1E4C 0C0276A1 2201D6 2404C0C1C2C3"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400503 tlv::Error,
504 [] (const auto& e) { return e.what() == "Name element is missing or out of order"s; });
505 BOOST_CHECK_EXCEPTION(i.wireDecode(
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000506 "0529 0703080149 1200 2100 1E0B(1F09 1E023E15 0703080148) "
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500507 "0A044ACB1E4C 0C0276A1 2201D6 2404C0C1C2C3"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400508 tlv::Error,
509 [] (const auto& e) { return e.what() == "CanBePrefix element is out of order"s; });
510 BOOST_CHECK_EXCEPTION(i.wireDecode(
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000511 "0529 0703080149 2100 1E0B(1F09 1E023E15 0703080148) 1200 "
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500512 "0A044ACB1E4C 0C0276A1 2201D6 2404C0C1C2C3"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400513 tlv::Error,
514 [] (const auto& e) { return e.what() == "MustBeFresh element is out of order"s; });
515 BOOST_CHECK_EXCEPTION(i.wireDecode(
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000516 "0529 0703080149 2100 1200 0A044ACB1E4C "
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500517 "1E0B(1F09 1E023E15 0703080148) 0C0276A1 2201D6 2404C0C1C2C3"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400518 tlv::Error,
519 [] (const auto& e) { return e.what() == "ForwardingHint element is out of order"s; });
520 BOOST_CHECK_EXCEPTION(i.wireDecode(
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000521 "0529 0703080149 2100 1200 1E0B(1F09 1E023E15 0703080148) "
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500522 "0C0276A1 0A044ACB1E4C 2201D6 2404C0C1C2C3"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400523 tlv::Error,
524 [] (const auto& e) { return e.what() == "Nonce element is out of order"s; });
525 BOOST_CHECK_EXCEPTION(i.wireDecode(
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000526 "0529 0703080149 2100 1200 1E0B(1F09 1E023E15 0703080148) "
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500527 "0A044ACB1E4C 2201D6 0C0276A1 2404C0C1C2C3"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400528 tlv::Error,
529 [] (const auto& e) { return e.what() == "InterestLifetime element is out of order"s; });
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000530}
531
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500532BOOST_AUTO_TEST_CASE(NonCriticalElementOutOfOrder)
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000533{
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400534 // duplicate HopLimit
535 i.wireDecode("0536 0725(080149 0220FF9100E04EAADCF30674D98026A051BA25F56B69BFA026DCCCD72C6EA0F7315A)"
536 "2201D6 2200 2404C0C1C2C3 22020101"_block);
537 BOOST_CHECK_EQUAL(i.getName(),
538 "/I/params-sha256=ff9100e04eaadcf30674d98026a051ba25f56b69bfa026dcccd72c6ea0f7315a");
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400539 BOOST_CHECK_EQUAL(*i.getHopLimit(), 214);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400540 BOOST_CHECK_EQUAL(i.hasApplicationParameters(), true);
Davide Pesavento9c19a392019-04-06 15:07:54 -0400541 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2404C0C1C2C3"_block);
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500542
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400543 // duplicate ApplicationParameters
544 i.wireDecode("0541 0725(080149 0220FF9100E04EAADCF30674D98026A051BA25F56B69BFA026DCCCD72C6EA0F7315A)"
545 "2100 1200 0A044ACB1E4C 0C0276A1 2201D6 2404C0C1C2C3 2401EE"_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 Pesavento9c19a392019-04-06 15:07:54 -0400549 BOOST_CHECK_EQUAL(i.hasApplicationParameters(), true);
550 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2404C0C1C2C3"_block);
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000551}
552
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400553BOOST_AUTO_TEST_CASE(MissingName)
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000554{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400555 BOOST_CHECK_EXCEPTION(i.wireDecode("0500"_block), tlv::Error,
556 [] (const auto& e) { return e.what() == "Name element is missing or out of order"s; });
557 BOOST_CHECK_EXCEPTION(i.wireDecode("0502 1200"_block), tlv::Error,
558 [] (const auto& e) { return e.what() == "Name element is missing or out of order"s; });
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000559}
560
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400561BOOST_AUTO_TEST_CASE(BadName)
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000562{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400563 BOOST_CHECK_EXCEPTION(i.wireDecode("0502 0700"_block), tlv::Error,
564 [] (const auto& e) { return e.what() == "Name has zero name components"s; });
565 BOOST_CHECK_EXCEPTION(i.wireDecode("054C 074A(080149"
566 "02200000000000000000000000000000000000000000000000000000000000000000"
567 "080132"
568 "02200000000000000000000000000000000000000000000000000000000000000000)"_block),
569 tlv::Error,
570 [] (const auto& e) { return e.what() == "Name has more than one ParametersSha256DigestComponent"s; });
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000571}
572
573BOOST_AUTO_TEST_CASE(BadCanBePrefix)
574{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400575 BOOST_CHECK_EXCEPTION(i.wireDecode("0508 0703080149 210102"_block), tlv::Error,
576 [] (const auto& e) { return e.what() == "CanBePrefix element has non-zero TLV-LENGTH"s; });
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000577}
578
579BOOST_AUTO_TEST_CASE(BadMustBeFresh)
580{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400581 BOOST_CHECK_EXCEPTION(i.wireDecode("0508 0703080149 120102"_block), tlv::Error,
582 [] (const auto& e) { return e.what() == "MustBeFresh element has non-zero TLV-LENGTH"s; });
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000583}
584
585BOOST_AUTO_TEST_CASE(BadNonce)
586{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400587 BOOST_CHECK_EXCEPTION(i.wireDecode("0507 0703080149 0A00"_block), tlv::Error,
588 [] (const auto& e) { return e.what() == "Nonce element is malformed"s; });
589 BOOST_CHECK_EXCEPTION(i.wireDecode("050A 0703080149 0A0304C263"_block), tlv::Error,
590 [] (const auto& e) { return e.what() == "Nonce element is malformed"s; });
591 BOOST_CHECK_EXCEPTION(i.wireDecode("050C 0703080149 0A05EFA420B262"_block), tlv::Error,
592 [] (const auto& e) { return e.what() == "Nonce element is malformed"s; });
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000593}
594
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500595BOOST_AUTO_TEST_CASE(BadHopLimit)
596{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400597 BOOST_CHECK_EXCEPTION(i.wireDecode("0507 0703080149 2200"_block), tlv::Error,
598 [] (const auto& e) { return e.what() == "HopLimit element is malformed"s; });
599 BOOST_CHECK_EXCEPTION(i.wireDecode("0509 0703080149 22021356"_block), tlv::Error,
600 [] (const auto& e) { return e.what() == "HopLimit element is malformed"s; });
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500601}
602
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400603BOOST_AUTO_TEST_CASE(BadParametersDigest)
604{
605 // ApplicationParameters without ParametersSha256DigestComponent
606 Block b1("0509 0703(080149) 2402CAFE"_block);
607 // ParametersSha256DigestComponent without ApplicationParameters
608 Block b2("0527 0725(080149 0220E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855)"_block);
609 // digest mismatch
610 Block b3("052B 0725(080149 02200000000000000000000000000000000000000000000000000000000000000000) "
611 "2402CAFE"_block);
612
613 BOOST_CHECK_THROW(i.wireDecode(b1), tlv::Error);
614 BOOST_CHECK_THROW(i.wireDecode(b2), tlv::Error);
615 BOOST_CHECK_THROW(i.wireDecode(b3), tlv::Error);
616
617 DisableAutoCheckParametersDigest disabler;
618 BOOST_CHECK_NO_THROW(i.wireDecode(b1));
619 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), false);
620 BOOST_CHECK_NO_THROW(i.wireDecode(b2));
621 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), false);
622 BOOST_CHECK_NO_THROW(i.wireDecode(b3));
623 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), false);
624}
625
Junxiao Shi8b753a22018-10-24 01:51:40 +0000626BOOST_AUTO_TEST_CASE(UnrecognizedNonCriticalElementBeforeName)
627{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400628 BOOST_CHECK_EXCEPTION(i.wireDecode("0507 FC00 0703080149"_block), tlv::Error,
629 [] (const auto& e) { return e.what() == "Name element is missing or out of order"s; });
Junxiao Shi8b753a22018-10-24 01:51:40 +0000630}
631
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000632BOOST_AUTO_TEST_CASE(UnrecognizedCriticalElement)
633{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400634 BOOST_CHECK_EXCEPTION(i.wireDecode("0507 0703080149 FB00"_block), tlv::Error,
635 [] (const auto& e) { return e.what() == "Unrecognized element of critical type 251"s; });
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400636 // v0.2 packet with Selectors
Davide Pesavento905d40f2020-06-09 21:33:25 -0400637 BOOST_CHECK_EXCEPTION(i.wireDecode("0510 0703080149 09030D0101 0A0401000000"_block), tlv::Error,
638 [] (const auto& e) { return e.what() == "Unrecognized element of critical type 9"s; });
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000639}
640
Davide Pesavento0e0b3892019-07-30 21:05:05 -0400641BOOST_AUTO_TEST_SUITE_END() // Decode
Junxiao Shi6efa3b72018-04-14 15:54:08 +0000642
Junxiao Shi899277a2017-07-07 22:12:12 +0000643BOOST_AUTO_TEST_CASE(MatchesData)
644{
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000645 auto interest = makeInterest("/A");
Junxiao Shi899277a2017-07-07 22:12:12 +0000646
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000647 auto data = makeData("/A");
648 BOOST_CHECK_EQUAL(interest->matchesData(*data), true);
Junxiao Shi899277a2017-07-07 22:12:12 +0000649
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000650 data->setName("/A/D");
651 BOOST_CHECK_EQUAL(interest->matchesData(*data), false); // violates CanBePrefix
Junxiao Shi899277a2017-07-07 22:12:12 +0000652
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000653 interest->setCanBePrefix(true);
654 BOOST_CHECK_EQUAL(interest->matchesData(*data), true);
Junxiao Shi899277a2017-07-07 22:12:12 +0000655
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000656 interest->setMustBeFresh(true);
657 BOOST_CHECK_EQUAL(interest->matchesData(*data), false); // violates MustBeFresh
Junxiao Shi899277a2017-07-07 22:12:12 +0000658
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000659 data->setFreshnessPeriod(1_s);
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("/H/I");
663 BOOST_CHECK_EQUAL(interest->matchesData(*data), false); // Name does not match
Junxiao Shi899277a2017-07-07 22:12:12 +0000664
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000665 data->wireEncode();
666 interest = makeInterest(data->getFullName());
667 BOOST_CHECK_EQUAL(interest->matchesData(*data), true);
Junxiao Shi899277a2017-07-07 22:12:12 +0000668
Davide Pesavento53533942020-03-04 23:10:06 -0500669 setNameComponent(*interest, -1,
670 name::Component::fromEscapedString("sha256digest=00000000000000000000000000"
671 "00000000000000000000000000000000000000"));
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000672 BOOST_CHECK_EQUAL(interest->matchesData(*data), false); // violates implicit digest
Junxiao Shi899277a2017-07-07 22:12:12 +0000673}
674
675BOOST_AUTO_TEST_CASE_EXPECTED_FAILURES(MatchesInterest, 1)
676BOOST_AUTO_TEST_CASE(MatchesInterest)
677{
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400678 Interest interest;
679 interest.setName("/A")
680 .setCanBePrefix(true)
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000681 .setMustBeFresh(true)
Junxiao Shie4603e12022-01-05 19:12:25 +0000682 .setForwardingHint({"/H"})
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000683 .setNonce(2228)
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400684 .setInterestLifetime(5_s)
685 .setHopLimit(90);
Junxiao Shi899277a2017-07-07 22:12:12 +0000686
687 Interest other;
688 BOOST_CHECK_EQUAL(interest.matchesInterest(other), false);
689
690 other.setName(interest.getName());
691 BOOST_CHECK_EQUAL(interest.matchesInterest(other), false);
692
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000693 other.setCanBePrefix(interest.getCanBePrefix());
694 BOOST_CHECK_EQUAL(interest.matchesInterest(other), false);
695
696 other.setMustBeFresh(interest.getMustBeFresh());
Junxiao Shi899277a2017-07-07 22:12:12 +0000697 BOOST_CHECK_EQUAL(interest.matchesInterest(other), false); // will match until #3162 implemented
698
Junxiao Shie4603e12022-01-05 19:12:25 +0000699 auto fh = interest.getForwardingHint();
700 other.setForwardingHint(std::vector<Name>(fh.begin(), fh.end()));
Junxiao Shi899277a2017-07-07 22:12:12 +0000701 BOOST_CHECK_EQUAL(interest.matchesInterest(other), true);
702
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000703 other.setNonce(9336);
Junxiao Shi899277a2017-07-07 22:12:12 +0000704 BOOST_CHECK_EQUAL(interest.matchesInterest(other), true);
705
Junxiao Shi2ad2fbe2019-05-24 03:11:05 +0000706 other.setInterestLifetime(3_s);
Junxiao Shi899277a2017-07-07 22:12:12 +0000707 BOOST_CHECK_EQUAL(interest.matchesInterest(other), true);
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400708
709 other.setHopLimit(31);
710 BOOST_CHECK_EQUAL(interest.matchesInterest(other), true);
Junxiao Shi899277a2017-07-07 22:12:12 +0000711}
712
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400713BOOST_AUTO_TEST_CASE(SetName)
714{
715 Interest i;
716 BOOST_CHECK_EQUAL(i.getName(), "/");
717 i.setName("/A/B");
718 BOOST_CHECK_EQUAL(i.getName(), "/A/B");
719 i.setName("/I/params-sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
720 BOOST_CHECK_EQUAL(i.getName(),
721 "/I/params-sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
722 BOOST_CHECK_THROW(i.setName("/I"
723 "/params-sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
724 "/params-sha256=0000000000000000000000000000000000000000000000000000000000000000"),
725 std::invalid_argument);
726}
Junxiao Shi899277a2017-07-07 22:12:12 +0000727
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400728BOOST_AUTO_TEST_CASE(SetCanBePrefix)
Junxiao Shi8d3f8342018-04-04 12:46:37 +0000729{
730 Interest i;
Junxiao Shi8d3f8342018-04-04 12:46:37 +0000731 BOOST_CHECK_EQUAL(i.getCanBePrefix(), false);
Junxiao Shi8d3f8342018-04-04 12:46:37 +0000732 i.setCanBePrefix(true);
733 BOOST_CHECK_EQUAL(i.getCanBePrefix(), true);
Davide Pesavento478d3382021-03-17 12:46:08 -0400734 i.setCanBePrefix(false);
735 BOOST_CHECK_EQUAL(i.getCanBePrefix(), false);
Junxiao Shi8d3f8342018-04-04 12:46:37 +0000736}
737
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400738BOOST_AUTO_TEST_CASE(SetMustBeFresh)
Junxiao Shi8d3f8342018-04-04 12:46:37 +0000739{
740 Interest i;
741 BOOST_CHECK_EQUAL(i.getMustBeFresh(), false);
742 i.setMustBeFresh(true);
743 BOOST_CHECK_EQUAL(i.getMustBeFresh(), true);
Junxiao Shi8d3f8342018-04-04 12:46:37 +0000744 i.setMustBeFresh(false);
745 BOOST_CHECK_EQUAL(i.getMustBeFresh(), false);
Junxiao Shi8d3f8342018-04-04 12:46:37 +0000746}
747
Junxiao Shi899277a2017-07-07 22:12:12 +0000748BOOST_AUTO_TEST_CASE(GetNonce)
749{
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000750 unique_ptr<Interest> i1, i2;
Davide Pesavento53533942020-03-04 23:10:06 -0500751 Interest::Nonce nonce1(0), nonce2(0);
Junxiao Shi899277a2017-07-07 22:12:12 +0000752
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000753 // getNonce automatically assigns a random Nonce.
754 // 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 -0500755 // identical Nonces in a row.
Junxiao Shi899277a2017-07-07 22:12:12 +0000756 int nIterations = 0;
757 do {
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000758 i1 = make_unique<Interest>();
759 nonce1 = i1->getNonce();
760 i2 = make_unique<Interest>();
761 nonce2 = i2->getNonce();
Junxiao Shi899277a2017-07-07 22:12:12 +0000762 }
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000763 while (nonce1 == nonce2 && ++nIterations < 100);
Davide Pesavento53533942020-03-04 23:10:06 -0500764
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000765 BOOST_CHECK_NE(nonce1, nonce2);
766 BOOST_CHECK(i1->hasNonce());
767 BOOST_CHECK(i2->hasNonce());
Junxiao Shi899277a2017-07-07 22:12:12 +0000768
769 // Once a Nonce is assigned, it should not change.
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000770 BOOST_CHECK_EQUAL(i1->getNonce(), nonce1);
Davide Pesavento53533942020-03-04 23:10:06 -0500771 BOOST_CHECK_EQUAL(i2->getNonce(), nonce2);
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000772}
773
774BOOST_AUTO_TEST_CASE(SetNonce)
775{
776 Interest i1("/A");
Davide Pesavento53533942020-03-04 23:10:06 -0500777 BOOST_CHECK(!i1.hasNonce());
778
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000779 i1.setNonce(1);
780 i1.wireEncode();
Davide Pesavento53533942020-03-04 23:10:06 -0500781 BOOST_CHECK(i1.hasNonce());
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000782 BOOST_CHECK_EQUAL(i1.getNonce(), 1);
783
784 Interest i2(i1);
Davide Pesavento53533942020-03-04 23:10:06 -0500785 BOOST_CHECK(i2.hasNonce());
Junxiao Shi2dd711d2017-07-21 13:40:52 +0000786 BOOST_CHECK_EQUAL(i2.getNonce(), 1);
787
788 i2.setNonce(2);
789 BOOST_CHECK_EQUAL(i2.getNonce(), 2);
Davide Pesavento53533942020-03-04 23:10:06 -0500790 BOOST_CHECK_EQUAL(i1.getNonce(), 1); // should not affect i1's Nonce (Bug #4168)
791
Davide Pesaventof6b45892023-03-13 15:00:51 -0400792 i2.setNonce(std::nullopt);
Davide Pesavento53533942020-03-04 23:10:06 -0500793 BOOST_CHECK(!i2.hasNonce());
Junxiao Shi899277a2017-07-07 22:12:12 +0000794}
795
796BOOST_AUTO_TEST_CASE(RefreshNonce)
797{
798 Interest i;
799 BOOST_CHECK(!i.hasNonce());
800 i.refreshNonce();
801 BOOST_CHECK(!i.hasNonce());
802
803 i.setNonce(1);
804 BOOST_CHECK(i.hasNonce());
805 i.refreshNonce();
806 BOOST_CHECK(i.hasNonce());
807 BOOST_CHECK_NE(i.getNonce(), 1);
808}
809
Davide Pesavento53533942020-03-04 23:10:06 -0500810BOOST_AUTO_TEST_CASE(NonceConversions)
811{
812 Interest i;
Davide Pesavento53533942020-03-04 23:10:06 -0500813
814 // 4-arg constructor
815 Interest::Nonce n1(1, 2, 3, 4);
816 i.setNonce(n1);
817 BOOST_CHECK_EQUAL(i.getNonce(), 0x01020304);
818
819 // 4-arg constructor + assignment
820 n1 = {0xf, 0xe, 0xd, 0xc};
821 i.setNonce(n1);
822 BOOST_CHECK_EQUAL(i.getNonce(), 0x0f0e0d0c);
823
824 // 1-arg constructor + assignment (implicit conversion)
825 Interest::Nonce n2;
826 n2 = 42;
827 BOOST_CHECK_NE(n1, n2);
828 i.setNonce(n2);
829 n2 = 21; // should not affect i's Nonce
830 BOOST_CHECK_EQUAL(i.getNonce(), 42);
831 BOOST_CHECK_EQUAL(i.toUri(), "/?Nonce=0000002a"); // stored in big-endian
832}
833
Junxiao Shi899277a2017-07-07 22:12:12 +0000834BOOST_AUTO_TEST_CASE(SetInterestLifetime)
835{
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500836 BOOST_CHECK_THROW(Interest("/A", -1_ms), std::invalid_argument);
Davide Pesavento0f830802018-01-16 23:58:58 -0500837 BOOST_CHECK_NO_THROW(Interest("/A", 0_ms));
Junxiao Shi899277a2017-07-07 22:12:12 +0000838
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400839 Interest i;
Junxiao Shi899277a2017-07-07 22:12:12 +0000840 BOOST_CHECK_EQUAL(i.getInterestLifetime(), DEFAULT_INTEREST_LIFETIME);
Davide Pesaventofccb2dc2019-02-09 01:02:35 -0500841 BOOST_CHECK_THROW(i.setInterestLifetime(-1_ms), std::invalid_argument);
Junxiao Shi899277a2017-07-07 22:12:12 +0000842 BOOST_CHECK_EQUAL(i.getInterestLifetime(), DEFAULT_INTEREST_LIFETIME);
Davide Pesavento0f830802018-01-16 23:58:58 -0500843 i.setInterestLifetime(0_ms);
844 BOOST_CHECK_EQUAL(i.getInterestLifetime(), 0_ms);
845 i.setInterestLifetime(1_ms);
846 BOOST_CHECK_EQUAL(i.getInterestLifetime(), 1_ms);
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400847
848 i = Interest("/B", 15_s);
849 BOOST_CHECK_EQUAL(i.getInterestLifetime(), 15_s);
850}
851
852BOOST_AUTO_TEST_CASE(SetHopLimit)
853{
854 Interest i;
Davide Pesaventof6b45892023-03-13 15:00:51 -0400855 BOOST_CHECK(i.getHopLimit() == std::nullopt);
Davide Pesavento2b0cc7b2019-07-14 16:50:04 -0400856 i.setHopLimit(42);
857 BOOST_CHECK(i.getHopLimit() == 42);
Davide Pesaventof6b45892023-03-13 15:00:51 -0400858 i.setHopLimit(std::nullopt);
859 BOOST_CHECK(i.getHopLimit() == std::nullopt);
Junxiao Shi899277a2017-07-07 22:12:12 +0000860}
861
Davide Pesavento9c19a392019-04-06 15:07:54 -0400862BOOST_AUTO_TEST_CASE(SetApplicationParameters)
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700863{
864 const uint8_t PARAMETERS1[] = {0xc1};
865 const uint8_t PARAMETERS2[] = {0xc2};
866
867 Interest i;
Davide Pesavento9c19a392019-04-06 15:07:54 -0400868 BOOST_CHECK(!i.hasApplicationParameters());
869 i.setApplicationParameters("2400"_block);
870 BOOST_CHECK(i.hasApplicationParameters());
871 i.unsetApplicationParameters();
872 BOOST_CHECK(!i.hasApplicationParameters());
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700873
Davide Pesavento38912442019-04-06 22:03:39 -0400874 // Block overload
Davide Pesavento38912442019-04-06 22:03:39 -0400875 i.setApplicationParameters("2401C0"_block);
Davide Pesavento9c19a392019-04-06 15:07:54 -0400876 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2401C0"_block);
Davide Pesavento38912442019-04-06 22:03:39 -0400877 i.setApplicationParameters("8001C1"_block);
Davide Pesavento9c19a392019-04-06 15:07:54 -0400878 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "24038001C1"_block);
Davide Pesavento81bd6962020-06-17 16:03:23 -0400879 BOOST_CHECK_THROW(i.setApplicationParameters(Block{}), std::invalid_argument);
Davide Pesavento38912442019-04-06 22:03:39 -0400880
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500881 // span overload
882 i.setApplicationParameters(PARAMETERS1);
Davide Pesavento38912442019-04-06 22:03:39 -0400883 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2401C1"_block);
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500884 i.setApplicationParameters(span<uint8_t>{});
Davide Pesavento38912442019-04-06 22:03:39 -0400885 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2400"_block);
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500886
Davide Pesavento38912442019-04-06 22:03:39 -0400887 // ConstBufferPtr overload
888 i.setApplicationParameters(make_shared<Buffer>(PARAMETERS2, sizeof(PARAMETERS2)));
889 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2401C2"_block);
890 i.setApplicationParameters(make_shared<Buffer>());
891 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2400"_block);
892 BOOST_CHECK_THROW(i.setApplicationParameters(nullptr), std::invalid_argument);
Arthi Padmanabhanb38664e2018-07-18 11:13:12 -0700893}
894
Eric Newberry6e262f02020-05-29 23:11:25 -0700895BOOST_AUTO_TEST_CASE(SetSignature)
896{
897 Interest i;
Eric Newberry6e262f02020-05-29 23:11:25 -0700898
Eric Newberry6e262f02020-05-29 23:11:25 -0700899 Block sv1("2E04 01020304"_block);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400900 BOOST_CHECK_EXCEPTION(i.setSignatureValue(sv1.value_bytes()), tlv::Error, [] (const auto& e) {
901 return e.what() == "InterestSignatureInfo must be present to set InterestSignatureValue"s;
902 });
903
Davide Pesaventof6b45892023-03-13 15:00:51 -0400904 BOOST_CHECK(i.getSignatureInfo() == std::nullopt);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400905 BOOST_CHECK_EQUAL(i.getSignatureValue().isValid(), false);
906 BOOST_CHECK_EQUAL(i.isSigned(), false);
Eric Newberry6e262f02020-05-29 23:11:25 -0700907
908 // Simple set/get case for InterestSignatureInfo (no prior set)
909 SignatureInfo si1(tlv::SignatureSha256WithEcdsa);
910 i.setSignatureInfo(si1);
911 BOOST_CHECK(i.getSignatureInfo() == si1);
912 BOOST_CHECK_EQUAL(i.isSigned(), false);
913
914 // Simple set/get case for InterestSignatureValue (no prior set)
Davide Pesavento487e3d32022-05-05 18:06:23 -0400915 auto svBuffer1 = make_shared<Buffer>(sv1.value_begin(), sv1.value_end());
Eric Newberry6e262f02020-05-29 23:11:25 -0700916 i.setSignatureValue(svBuffer1);
917 BOOST_CHECK_EQUAL(i.getSignatureValue(), sv1);
918 BOOST_CHECK_EQUAL(i.isSigned(), true);
919
920 // Throws because attempting to set InterestSignatureValue to nullptr
921 BOOST_CHECK_THROW(i.setSignatureValue(nullptr), std::invalid_argument);
922 BOOST_CHECK_EQUAL(i.getSignatureValue(), sv1);
923 BOOST_CHECK_EQUAL(i.isSigned(), true);
924
925 // Ensure that wire is not reset if specified InterestSignatureInfo is same
926 i.wireEncode();
927 BOOST_CHECK_EQUAL(i.hasWire(), true);
928 i.setSignatureInfo(si1);
929 BOOST_CHECK_EQUAL(i.hasWire(), true);
930 BOOST_CHECK(i.getSignatureInfo() == si1);
931 BOOST_CHECK_EQUAL(i.getSignatureValue(), sv1);
932 BOOST_CHECK_EQUAL(i.isSigned(), true);
933
934 // Ensure that wire is reset if specified InterestSignatureInfo is different
935 i.wireEncode();
936 BOOST_CHECK_EQUAL(i.hasWire(), true);
937 SignatureInfo si2(tlv::SignatureSha256WithRsa);
938 i.setSignatureInfo(si2);
939 BOOST_CHECK_EQUAL(i.hasWire(), false);
940 BOOST_CHECK(i.getSignatureInfo() == si2);
941 BOOST_CHECK_EQUAL(i.getSignatureValue(), sv1);
942 BOOST_CHECK_EQUAL(i.isSigned(), true);
943
944 // Ensure that wire is not reset if specified InterestSignatureValue is same
945 i.wireEncode();
946 BOOST_CHECK_EQUAL(i.hasWire(), true);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400947 i.setSignatureValue(sv1.value_bytes());
Eric Newberry6e262f02020-05-29 23:11:25 -0700948 BOOST_CHECK_EQUAL(i.hasWire(), true);
949 BOOST_CHECK(i.getSignatureInfo() == si2);
950 BOOST_CHECK_EQUAL(i.getSignatureValue(), sv1);
951 BOOST_CHECK_EQUAL(i.isSigned(), true);
952
953 // Ensure that wire is reset if specified InterestSignatureValue is different
954 i.wireEncode();
955 BOOST_CHECK_EQUAL(i.hasWire(), true);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400956 const uint8_t sv2[] = {0x99, 0x88, 0x77, 0x66};
957 i.setSignatureValue(sv2);
Eric Newberry6e262f02020-05-29 23:11:25 -0700958 BOOST_CHECK_EQUAL(i.hasWire(), false);
959 BOOST_CHECK(i.getSignatureInfo() == si2);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400960 BOOST_TEST(i.getSignatureValue().value_bytes() == sv2, boost::test_tools::per_element());
Eric Newberry6e262f02020-05-29 23:11:25 -0700961 BOOST_CHECK_EQUAL(i.isSigned(), true);
962}
963
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400964BOOST_AUTO_TEST_CASE(ParametersSha256DigestComponent)
965{
966 Interest i("/I");
967 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
968
969 i.setApplicationParameters("2404C0C1C2C3"_block); // auto-appends ParametersSha256DigestComponent
970 BOOST_CHECK_EQUAL(i.getName(),
971 "/I/params-sha256=ff9100e04eaadcf30674d98026a051ba25f56b69bfa026dcccd72c6ea0f7315a");
972 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
973
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500974 i.setApplicationParameters(span<uint8_t>{}); // updates ParametersSha256DigestComponent
Davide Pesaventoadc9aa22019-06-30 19:00:20 -0400975 BOOST_CHECK_EQUAL(i.getName(),
976 "/I/params-sha256=33b67cb5385ceddad93d0ee960679041613bed34b8b4a5e6362fe7539ba2d3ce");
977 BOOST_CHECK_EQUAL(i.hasApplicationParameters(), true);
978 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
979
980 i.unsetApplicationParameters(); // removes ParametersSha256DigestComponent
981 BOOST_CHECK_EQUAL(i.getName(), "/I");
982 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
983
984 i.setName(Name("/P").appendParametersSha256DigestPlaceholder().append("Q"));
985 BOOST_CHECK_EQUAL(i.hasApplicationParameters(), false);
986 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), false);
987
988 i.unsetApplicationParameters(); // removes ParametersSha256DigestComponent
989 BOOST_CHECK_EQUAL(i.getName(), "/P/Q");
990 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
991
992 i.setName(Name("/P").appendParametersSha256DigestPlaceholder().append("Q"));
993 i.setApplicationParameters("2404C0C1C2C3"_block); // updates ParametersSha256DigestComponent
994 BOOST_CHECK_EQUAL(i.getName(),
995 "/P/params-sha256=ff9100e04eaadcf30674d98026a051ba25f56b69bfa026dcccd72c6ea0f7315a/Q");
996 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
997
998 i.setName("/A/B/C"); // auto-appends ParametersSha256DigestComponent
999 BOOST_CHECK_EQUAL(i.getName(),
1000 "/A/B/C/params-sha256=ff9100e04eaadcf30674d98026a051ba25f56b69bfa026dcccd72c6ea0f7315a");
1001 BOOST_CHECK_EQUAL(i.hasApplicationParameters(), true);
1002 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
Eric Newberry6e262f02020-05-29 23:11:25 -07001003
1004 SignatureInfo si(tlv::SignatureSha256WithEcdsa);
1005 i.setSignatureInfo(si); // updates ParametersSha256DigestComponent
1006 BOOST_CHECK_EQUAL(i.getName(),
1007 "/A/B/C/params-sha256=6400cae1730c15fd7854b26be05794d53685423c94bc61e59c49bd640d646ae8");
1008 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
1009 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2404 C0C1C2C3"_block);
1010 BOOST_CHECK(i.getSignatureInfo() == si);
1011
1012 i.unsetApplicationParameters(); // removes ParametersSha256DigestComponent and InterestSignatureInfo
Davide Pesaventof6b45892023-03-13 15:00:51 -04001013 BOOST_CHECK(i.getSignatureInfo() == std::nullopt);
Eric Newberry6e262f02020-05-29 23:11:25 -07001014 BOOST_CHECK_EQUAL(i.getSignatureValue().isValid(), false);
1015 BOOST_CHECK_EQUAL(i.getName(), "/A/B/C");
1016
1017 i.setSignatureInfo(si); // auto-adds an empty ApplicationParameters element
1018 BOOST_CHECK_EQUAL(i.getName(),
1019 "/A/B/C/params-sha256=d2ac0eb1f60f60ab206fb80bf1d0f73cfef353bbec43ba6ea626117f671ca3bb");
1020 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
1021 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2400"_block);
1022 BOOST_CHECK(i.getSignatureInfo() == si);
1023
1024 Block sv("2E04 01020304"_block);
Davide Pesavento487e3d32022-05-05 18:06:23 -04001025 i.setSignatureValue(sv.value_bytes()); // updates ParametersDigestSha256Component
Eric Newberry6e262f02020-05-29 23:11:25 -07001026 BOOST_CHECK_EQUAL(i.getName(),
1027 "/A/B/C/params-sha256=f649845ef944638390d1c689e2f0618ea02e471eff236110cbeb822d5932d342");
1028 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
1029 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2400"_block);
1030 BOOST_CHECK(i.getSignatureInfo() == si);
1031 BOOST_CHECK_EQUAL(i.getSignatureValue(), sv);
1032
1033 i.setApplicationParameters("2404C0C1C2C3"_block); // updates ParametersSha256DigestComponent
1034 BOOST_CHECK_EQUAL(i.getName(),
1035 "/A/B/C/params-sha256=c5d7e567e6b251ddf36f7a6dbed95235b2d4a0b36215bb0f3cc403ac64ad0284");
1036 BOOST_CHECK_EQUAL(i.isParametersDigestValid(), true);
1037 BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2404 C0C1C2C3"_block);
1038 BOOST_CHECK(i.getSignatureInfo() == si);
1039 BOOST_CHECK_EQUAL(i.getSignatureValue(), sv);
Davide Pesaventoadc9aa22019-06-30 19:00:20 -04001040}
Junxiao Shi899277a2017-07-07 22:12:12 +00001041
Eric Newberryb74bbda2020-06-18 19:33:58 -07001042BOOST_AUTO_TEST_CASE(ExtractSignedRanges)
1043{
1044 Interest i1;
Eric Newberryb74bbda2020-06-18 19:33:58 -07001045 BOOST_CHECK_EXCEPTION(i1.extractSignedRanges(), tlv::Error, [] (const auto& e) {
Eric Newberryb74bbda2020-06-18 19:33:58 -07001046 return e.what() == "Name has zero name components"s;
1047 });
1048 i1.setName("/test/prefix");
1049 i1.setNonce(0x01020304);
1050 SignatureInfo sigInfo(tlv::DigestSha256);
1051 i1.setSignatureInfo(sigInfo);
1052
1053 // Test with previously unsigned Interest (no InterestSignatureValue)
1054 auto ranges1 = i1.extractSignedRanges();
1055 BOOST_REQUIRE_EQUAL(ranges1.size(), 2);
1056 const Block& wire1 = i1.wireEncode();
1057 // Ensure Name range captured properly
1058 Block nameWithoutDigest1 = i1.getName().getPrefix(-1).wireEncode();
Davide Pesavento765abc92021-12-27 00:44:04 -05001059 BOOST_CHECK_EQUAL_COLLECTIONS(ranges1.front().begin(), ranges1.front().end(),
Eric Newberryb74bbda2020-06-18 19:33:58 -07001060 nameWithoutDigest1.value_begin(), nameWithoutDigest1.value_end());
1061 // Ensure parameters range captured properly
1062 const auto& appParamsWire1 = wire1.find(tlv::ApplicationParameters);
1063 BOOST_REQUIRE(appParamsWire1 != wire1.elements_end());
Davide Pesavento765abc92021-12-27 00:44:04 -05001064 BOOST_CHECK_EQUAL_COLLECTIONS(ranges1.back().begin(), ranges1.back().end(),
Eric Newberryb74bbda2020-06-18 19:33:58 -07001065 appParamsWire1->begin(), wire1.end());
1066
1067 // Test with Interest with existing InterestSignatureValue
Davide Pesavento487e3d32022-05-05 18:06:23 -04001068 i1.setSignatureValue(std::make_shared<Buffer>());
Eric Newberryb74bbda2020-06-18 19:33:58 -07001069 auto ranges2 = i1.extractSignedRanges();
1070 BOOST_REQUIRE_EQUAL(ranges2.size(), 2);
1071 const auto& wire2 = i1.wireEncode();
1072 // Ensure Name range captured properly
1073 Block nameWithoutDigest2 = i1.getName().getPrefix(-1).wireEncode();
Davide Pesavento765abc92021-12-27 00:44:04 -05001074 BOOST_CHECK_EQUAL_COLLECTIONS(ranges2.front().begin(), ranges2.front().end(),
Eric Newberryb74bbda2020-06-18 19:33:58 -07001075 nameWithoutDigest2.value_begin(), nameWithoutDigest2.value_end());
1076 // Ensure parameters range captured properly
1077 const auto& appParamsWire2 = wire2.find(tlv::ApplicationParameters);
1078 BOOST_REQUIRE(appParamsWire2 != wire2.elements_end());
1079 const auto& sigValueWire2 = wire2.find(tlv::InterestSignatureValue);
1080 BOOST_REQUIRE(sigValueWire2 != wire2.elements_end());
Davide Pesavento765abc92021-12-27 00:44:04 -05001081 BOOST_CHECK_EQUAL_COLLECTIONS(ranges2.back().begin(), ranges2.back().end(),
Eric Newberryb74bbda2020-06-18 19:33:58 -07001082 appParamsWire2->begin(), sigValueWire2->begin());
1083
1084 // Test with decoded Interest
1085 const uint8_t WIRE[] = {
1086 0x05, 0x6f, // Interest
1087 0x07, 0x2e, // Name
1088 0x08, 0x04, // GenericNameComponent
1089 0x61, 0x62, 0x63, 0x64,
1090 0x08, 0x04, // GenericNameComponent
1091 0x65, 0x66, 0x67, 0x68,
1092 0x02, 0x20, // ParametersSha256DigestComponent
1093 0x6f, 0x29, 0x58, 0x60, 0x53, 0xee, 0x9f, 0xcc,
1094 0xd8, 0xa4, 0x22, 0x12, 0x29, 0x25, 0x28, 0x7c,
1095 0x0a, 0x18, 0x43, 0x5f, 0x40, 0x74, 0xc4, 0x0a,
1096 0xbb, 0x0d, 0x5b, 0x30, 0xe4, 0xaa, 0x62, 0x20,
1097 0x12, 0x00, // MustBeFresh
1098 0x0a, 0x04, // Nonce
1099 0x4c, 0x1e, 0xcb, 0x4a,
1100 0x24, 0x04, // ApplicationParameters
1101 0xc0, 0xc1, 0xc2, 0xc3,
1102 0x2c, 0x0d, // InterestSignatureInfo
1103 0x1b, 0x01, // SignatureType
1104 0x00,
1105 0x26, 0x08, // SignatureNonce
1106 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
1107 0x2e, 0x20, // InterestSignatureValue
1108 0x12, 0x47, 0x1a, 0xe0, 0xf8, 0x72, 0x3a, 0xc1,
1109 0x15, 0x6c, 0x37, 0x0a, 0x38, 0x71, 0x1e, 0xbe,
1110 0xbf, 0x28, 0x17, 0xde, 0x9b, 0x2d, 0xd9, 0x4e,
1111 0x9b, 0x7e, 0x62, 0xf1, 0x17, 0xb8, 0x76, 0xc1,
1112 };
Davide Pesaventofbea4fc2022-02-08 07:26:04 -05001113 Block wire3(WIRE);
Eric Newberryb74bbda2020-06-18 19:33:58 -07001114 Interest i2(wire3);
1115 auto ranges3 = i2.extractSignedRanges();
1116 BOOST_REQUIRE_EQUAL(ranges3.size(), 2);
1117 // Ensure Name range captured properly
Davide Pesavento765abc92021-12-27 00:44:04 -05001118 BOOST_CHECK_EQUAL_COLLECTIONS(ranges3.front().begin(), ranges3.front().end(), &WIRE[4], &WIRE[16]);
Eric Newberryb74bbda2020-06-18 19:33:58 -07001119 // Ensure parameters range captured properly
Davide Pesavento765abc92021-12-27 00:44:04 -05001120 BOOST_CHECK_EQUAL_COLLECTIONS(ranges3.back().begin(), ranges3.back().end(), &WIRE[58], &WIRE[79]);
Eric Newberryb74bbda2020-06-18 19:33:58 -07001121
1122 // Test failure with missing ParametersSha256DigestComponent
1123 Interest i3("/a");
Eric Newberryb74bbda2020-06-18 19:33:58 -07001124 BOOST_CHECK_EXCEPTION(i3.extractSignedRanges(), tlv::Error, [] (const auto& e) {
1125 return e.what() == "Interest Name must end with a ParametersSha256DigestComponent"s;
1126 });
1127
1128 // Test failure with missing InterestSignatureInfo
Davide Pesaventoa3d809e2022-02-06 11:55:02 -05001129 i3.setApplicationParameters(span<uint8_t>{});
Eric Newberryb74bbda2020-06-18 19:33:58 -07001130 BOOST_CHECK_EXCEPTION(i3.extractSignedRanges(), tlv::Error, [] (const auto& e) {
1131 return e.what() == "Interest missing InterestSignatureInfo"s;
1132 });
1133}
1134
Davide Pesavento2fdb2742019-07-31 23:03:35 -04001135BOOST_AUTO_TEST_CASE(ToUri)
1136{
1137 Interest i;
Davide Pesavento2fdb2742019-07-31 23:03:35 -04001138 BOOST_CHECK_EQUAL(i.toUri(), "/");
1139
1140 i.setName("/foo");
1141 BOOST_CHECK_EQUAL(i.toUri(), "/foo");
1142
1143 i.setCanBePrefix(true);
1144 BOOST_CHECK_EQUAL(i.toUri(), "/foo?CanBePrefix");
1145
1146 i.setMustBeFresh(true);
1147 BOOST_CHECK_EQUAL(i.toUri(), "/foo?CanBePrefix&MustBeFresh");
1148
Davide Pesavento53533942020-03-04 23:10:06 -05001149 i.setNonce(0xa1b2c3);
1150 BOOST_CHECK_EQUAL(i.toUri(), "/foo?CanBePrefix&MustBeFresh&Nonce=00a1b2c3");
Davide Pesavento2fdb2742019-07-31 23:03:35 -04001151
1152 i.setInterestLifetime(2_s);
Davide Pesavento53533942020-03-04 23:10:06 -05001153 BOOST_CHECK_EQUAL(i.toUri(), "/foo?CanBePrefix&MustBeFresh&Nonce=00a1b2c3&Lifetime=2000");
Davide Pesavento2fdb2742019-07-31 23:03:35 -04001154
1155 i.setHopLimit(18);
Davide Pesavento53533942020-03-04 23:10:06 -05001156 BOOST_CHECK_EQUAL(i.toUri(), "/foo?CanBePrefix&MustBeFresh&Nonce=00a1b2c3&Lifetime=2000&HopLimit=18");
Davide Pesavento2fdb2742019-07-31 23:03:35 -04001157
1158 i.setCanBePrefix(false);
1159 i.setMustBeFresh(false);
Davide Pesaventof6b45892023-03-13 15:00:51 -04001160 i.setHopLimit(std::nullopt);
Davide Pesavento2fdb2742019-07-31 23:03:35 -04001161 i.setApplicationParameters("2402CAFE"_block);
1162 BOOST_CHECK_EQUAL(i.toUri(),
1163 "/foo/params-sha256=8621f5e8321f04104640c8d02877d7c5142cad6e203c5effda1783b1a0e476d6"
Davide Pesavento53533942020-03-04 23:10:06 -05001164 "?Nonce=00a1b2c3&Lifetime=2000");
Davide Pesavento2fdb2742019-07-31 23:03:35 -04001165}
1166
Davide Pesaventoeee3e822016-11-26 19:19:34 +01001167BOOST_AUTO_TEST_SUITE_END() // TestInterest
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -08001168
Alexander Afanasyev90164962014-03-06 08:29:59 +00001169} // namespace tests
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -08001170} // namespace ndn