blob: f909565e0c005e6f9ff7fbaeeda76be6d288c74b [file] [log] [blame]
Shock Jiangca7ea702014-10-02 11:23:25 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Davide Pesaventoc2e12b42017-07-09 20:35:09 -04002/*
Davide Pesaventof6b45892023-03-13 15:00:51 -04003 * Copyright (c) 2013-2023 Regents of the University of California.
Shock Jiangca7ea702014-10-02 11:23:25 -07004 *
5 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
6 *
7 * 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.
20 */
21
Davide Pesavento7e780642018-11-24 15:51:34 -050022#include "ndn-cxx/meta-info.hpp"
Alexander Afanasyev4c9a3d52017-01-03 17:45:19 -080023
Davide Pesavento7e780642018-11-24 15:51:34 -050024#include "tests/boost-test.hpp"
Shock Jiangca7ea702014-10-02 11:23:25 -070025
26namespace ndn {
27namespace tests {
28
Davide Pesavento152ef442023-04-22 02:02:29 -040029BOOST_CONCEPT_ASSERT((WireEncodable<MetaInfo>));
30BOOST_CONCEPT_ASSERT((WireEncodableWithEncodingBuffer<MetaInfo>));
31BOOST_CONCEPT_ASSERT((WireDecodable<MetaInfo>));
32static_assert(std::is_convertible_v<MetaInfo::Error*, tlv::Error*>,
33 "MetaInfo::Error must inherit from tlv::Error");
34
Shock Jiangca7ea702014-10-02 11:23:25 -070035BOOST_AUTO_TEST_SUITE(TestMetaInfo)
36
Davide Pesaventoef654dd2019-07-18 20:02:44 -040037BOOST_AUTO_TEST_CASE(EncodeDecode)
Shock Jiangca7ea702014-10-02 11:23:25 -070038{
Junxiao Shiebfe4a22018-04-01 23:53:40 +000039 // default values
40 MetaInfo a("1406 type=180100 freshness=190100"_block);
41 BOOST_CHECK_EQUAL(a.getType(), tlv::ContentType_Blob);
42 BOOST_CHECK_EQUAL(a.getFreshnessPeriod(), 0_ms);
Davide Pesaventof6b45892023-03-13 15:00:51 -040043 BOOST_CHECK(a.getFinalBlock() == std::nullopt);
Shock Jiangca7ea702014-10-02 11:23:25 -070044
Shock Jiangca7ea702014-10-02 11:23:25 -070045 MetaInfo b;
Davide Pesaventoef654dd2019-07-18 20:02:44 -040046 BOOST_CHECK_NE(a.wireEncode(), b.wireEncode());
Junxiao Shiebfe4a22018-04-01 23:53:40 +000047 b.setType(a.getType());
48 b.setFreshnessPeriod(a.getFreshnessPeriod());
49 b.setFinalBlock(a.getFinalBlock());
Davide Pesaventoef654dd2019-07-18 20:02:44 -040050 BOOST_CHECK_NE(a.wireEncode(), b.wireEncode());
Junxiao Shi72c0c642018-04-20 15:41:09 +000051 BOOST_CHECK_EQUAL(b.wireEncode(), "1400"_block);
Shock Jiangca7ea702014-10-02 11:23:25 -070052
Junxiao Shiebfe4a22018-04-01 23:53:40 +000053 // non-default values
Davide Pesaventoef654dd2019-07-18 20:02:44 -040054 Block wire2("140C type=180101 freshness=190266B2 finalblock=1A03080141"_block);
Junxiao Shiebfe4a22018-04-01 23:53:40 +000055 a.wireDecode(wire2);
56 BOOST_CHECK_EQUAL(a.getType(), tlv::ContentType_Link);
57 BOOST_CHECK_EQUAL(a.getFreshnessPeriod(), 26290_ms);
Davide Pesaventoef654dd2019-07-18 20:02:44 -040058 BOOST_REQUIRE(a.getFinalBlock().has_value());
Junxiao Shiebfe4a22018-04-01 23:53:40 +000059 BOOST_CHECK_EQUAL(*a.getFinalBlock(), name::Component("A"));
Davide Pesaventoef654dd2019-07-18 20:02:44 -040060 BOOST_CHECK_NE(a.wireEncode(), b.wireEncode());
Shock Jiangca7ea702014-10-02 11:23:25 -070061
Junxiao Shiebfe4a22018-04-01 23:53:40 +000062 b.setType(a.getType());
63 b.setFreshnessPeriod(a.getFreshnessPeriod());
Davide Pesavento8dfd9132018-10-28 18:11:24 -040064 b.setFinalBlock(a.getFinalBlock());
Junxiao Shi72c0c642018-04-20 15:41:09 +000065 BOOST_CHECK_EQUAL(b.wireEncode(), wire2);
Shock Jiangca7ea702014-10-02 11:23:25 -070066
Davide Pesaventoef654dd2019-07-18 20:02:44 -040067 // FinalBlockId is a typed name component
Junxiao Shiebfe4a22018-04-01 23:53:40 +000068 Block wire3 = "1405 finalblock=1A03DD0141"_block;
69 a.wireDecode(wire3);
70 BOOST_CHECK_EQUAL(a.getType(), tlv::ContentType_Blob);
71 BOOST_CHECK_EQUAL(a.getFreshnessPeriod(), 0_ms);
Davide Pesaventoef654dd2019-07-18 20:02:44 -040072 BOOST_REQUIRE(a.getFinalBlock().has_value());
Junxiao Shiebfe4a22018-04-01 23:53:40 +000073 BOOST_CHECK_EQUAL(*a.getFinalBlock(), name::Component::fromEscapedString("221=A"));
Davide Pesaventoef654dd2019-07-18 20:02:44 -040074 BOOST_CHECK_NE(a.wireEncode(), b.wireEncode());
Shock Jiangca7ea702014-10-02 11:23:25 -070075
Junxiao Shiebfe4a22018-04-01 23:53:40 +000076 b.setType(a.getType());
77 b.setFreshnessPeriod(a.getFreshnessPeriod());
Davide Pesavento8dfd9132018-10-28 18:11:24 -040078 b.setFinalBlock(a.getFinalBlock());
Junxiao Shi72c0c642018-04-20 15:41:09 +000079 BOOST_CHECK_EQUAL(b.wireEncode(), wire3);
Shock Jiangca7ea702014-10-02 11:23:25 -070080}
81
82BOOST_AUTO_TEST_CASE(AppMetaInfo)
83{
84 MetaInfo info1;
85 info1.setType(196);
Davide Pesavento0f830802018-01-16 23:58:58 -050086 info1.setFreshnessPeriod(3600_ms);
Junxiao Shiebfe4a22018-04-01 23:53:40 +000087 info1.setFinalBlock(name::Component("/att/final"));
Shock Jiangca7ea702014-10-02 11:23:25 -070088
89 uint32_t ints[5] = {128, 129, 130, 131, 132};
90 std::string ss[5] = {"h", "hello", "hello, world", "hello, world, alex",
91 "hello, world, alex, I am Xiaoke Jiang"};
92
Davide Pesavento8dfd9132018-10-28 18:11:24 -040093 for (size_t i = 0; i < 5; i++) {
Shock Jiangca7ea702014-10-02 11:23:25 -070094 uint32_t type = 128 + i * 10;
Alexander Afanasyevd5c48e02015-06-24 11:58:14 -070095 info1.addAppMetaInfo(makeNonNegativeIntegerBlock(type, ints[i]));
Shock Jiangca7ea702014-10-02 11:23:25 -070096 type += 5;
Davide Pesaventoc2e12b42017-07-09 20:35:09 -040097 info1.addAppMetaInfo(makeStringBlock(type, ss[i]));
Shock Jiangca7ea702014-10-02 11:23:25 -070098 }
99
Junxiao Shi72c0c642018-04-20 15:41:09 +0000100 BOOST_CHECK(info1.findAppMetaInfo(252) == nullptr);
Shock Jiangca7ea702014-10-02 11:23:25 -0700101
Alexander Afanasyevd5c48e02015-06-24 11:58:14 -0700102 info1.addAppMetaInfo(makeNonNegativeIntegerBlock(252, 1000));
Junxiao Shi72c0c642018-04-20 15:41:09 +0000103 BOOST_CHECK(info1.findAppMetaInfo(252) != nullptr);
Shock Jiangca7ea702014-10-02 11:23:25 -0700104
Alexander Afanasyevd5c48e02015-06-24 11:58:14 -0700105 info1.addAppMetaInfo(makeNonNegativeIntegerBlock(252, 1000));
Junxiao Shi72c0c642018-04-20 15:41:09 +0000106 BOOST_CHECK(info1.findAppMetaInfo(252) != nullptr);
Shock Jiangca7ea702014-10-02 11:23:25 -0700107
108 info1.removeAppMetaInfo(252);
Junxiao Shi72c0c642018-04-20 15:41:09 +0000109 BOOST_CHECK(info1.findAppMetaInfo(252) != nullptr);
Shock Jiangca7ea702014-10-02 11:23:25 -0700110
111 info1.removeAppMetaInfo(252);
Junxiao Shi72c0c642018-04-20 15:41:09 +0000112 BOOST_CHECK(info1.findAppMetaInfo(252) == nullptr);
Shock Jiangca7ea702014-10-02 11:23:25 -0700113
114 // // These octets are obtained by the snippet below.
115 // // This check is intended to detect unexpected encoding change in the future.
116 // const Block& wire = info1.wireEncode();
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500117 // for (auto it = wire.begin(); it != wire.end(); ++it) {
Shock Jiangca7ea702014-10-02 11:23:25 -0700118 // printf("0x%02x, ", *it);
119 // }
Shock Jiangca7ea702014-10-02 11:23:25 -0700120 const uint8_t METAINFO[] = {0x14, 0x77, 0x18, 0x01, 0xc4, 0x19, 0x02, 0x0e, 0x10, 0x1a, 0x0c,
121 0x08, 0x0a, 0x2f, 0x61, 0x74, 0x74, 0x2f, 0x66, 0x69, 0x6e, 0x61,
122 0x6c, 0x80, 0x01, 0x80, 0x85, 0x01, 0x68, 0x8a, 0x01, 0x81, 0x8f,
123 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x94, 0x01, 0x82, 0x99, 0x0c,
124 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6c,
125 0x64, 0x9e, 0x01, 0x83, 0xa3, 0x12, 0x68, 0x65, 0x6c, 0x6c, 0x6f,
126 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x2c, 0x20, 0x61, 0x6c,
127 0x65, 0x78, 0xa8, 0x01, 0x84, 0xad, 0x25, 0x68, 0x65, 0x6c, 0x6c,
128 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x2c, 0x20, 0x61,
129 0x6c, 0x65, 0x78, 0x2c, 0x20, 0x49, 0x20, 0x61, 0x6d, 0x20, 0x58,
130 0x69, 0x61, 0x6f, 0x6b, 0x65, 0x20, 0x4a, 0x69, 0x61, 0x6e, 0x67};
131
Davide Pesaventofbea4fc2022-02-08 07:26:04 -0500132 BOOST_CHECK_EQUAL_COLLECTIONS(info1.wireEncode().begin(), info1.wireEncode().end(),
133 METAINFO, METAINFO + sizeof(METAINFO));
Shock Jiangca7ea702014-10-02 11:23:25 -0700134
135 MetaInfo info2;
Davide Pesaventofbea4fc2022-02-08 07:26:04 -0500136 info2.wireDecode(Block(METAINFO));
Shock Jiangca7ea702014-10-02 11:23:25 -0700137
Davide Pesavento8dfd9132018-10-28 18:11:24 -0400138 for (size_t i = 0; i < 5; i++) {
Shock Jiangca7ea702014-10-02 11:23:25 -0700139 uint32_t tlvType = 128 + i * 10;
140 const Block* block = info2.findAppMetaInfo(tlvType);
Davide Pesavento8dfd9132018-10-28 18:11:24 -0400141 BOOST_REQUIRE(block != nullptr);
Shock Jiangca7ea702014-10-02 11:23:25 -0700142 BOOST_CHECK_EQUAL(readNonNegativeInteger(*block), ints[i]);
143 tlvType += 5;
144
145 block = info2.findAppMetaInfo(tlvType);
Davide Pesavento8dfd9132018-10-28 18:11:24 -0400146 BOOST_REQUIRE(block != nullptr);
Davide Pesavento258d51a2022-02-27 21:26:28 -0500147 BOOST_CHECK_EQUAL(readString(*block), ss[i]);
Shock Jiangca7ea702014-10-02 11:23:25 -0700148 }
149}
150
151BOOST_AUTO_TEST_CASE(AppMetaInfoTypeRange)
152{
153 MetaInfo info;
154
Alexander Afanasyevd5c48e02015-06-24 11:58:14 -0700155 BOOST_CHECK_NO_THROW(info.addAppMetaInfo(makeNonNegativeIntegerBlock(128, 1000)));
156 BOOST_CHECK_NO_THROW(info.addAppMetaInfo(makeNonNegativeIntegerBlock(252, 1000)));
Shock Jiangca7ea702014-10-02 11:23:25 -0700157
Alexander Afanasyevd5c48e02015-06-24 11:58:14 -0700158 BOOST_CHECK_THROW(info.addAppMetaInfo(makeNonNegativeIntegerBlock(127, 1000)), MetaInfo::Error);
159 BOOST_CHECK_THROW(info.addAppMetaInfo(makeNonNegativeIntegerBlock(253, 1000)), MetaInfo::Error);
Shock Jiangca7ea702014-10-02 11:23:25 -0700160}
161
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100162BOOST_AUTO_TEST_SUITE_END() // TestMetaInfo
Shock Jiangca7ea702014-10-02 11:23:25 -0700163
164} // namespace tests
165} // namespace ndn