blob: 87add29156d30bd522b05fec6280dcbf288329bf [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 Pesaventofbea4fc2022-02-08 07:26:04 -05003 * Copyright (c) 2013-2022 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"
23#include "ndn-cxx/data.hpp"
Alexander Afanasyev4c9a3d52017-01-03 17:45:19 -080024
Davide Pesavento7e780642018-11-24 15:51:34 -050025#include "tests/boost-test.hpp"
Shock Jiangca7ea702014-10-02 11:23:25 -070026
27namespace ndn {
28namespace tests {
29
30BOOST_AUTO_TEST_SUITE(TestMetaInfo)
31
Davide Pesaventoef654dd2019-07-18 20:02:44 -040032BOOST_AUTO_TEST_CASE(EncodeDecode)
Shock Jiangca7ea702014-10-02 11:23:25 -070033{
Junxiao Shiebfe4a22018-04-01 23:53:40 +000034 // default values
35 MetaInfo a("1406 type=180100 freshness=190100"_block);
36 BOOST_CHECK_EQUAL(a.getType(), tlv::ContentType_Blob);
37 BOOST_CHECK_EQUAL(a.getFreshnessPeriod(), 0_ms);
Davide Pesaventoef654dd2019-07-18 20:02:44 -040038 BOOST_CHECK(a.getFinalBlock() == nullopt);
Shock Jiangca7ea702014-10-02 11:23:25 -070039
Shock Jiangca7ea702014-10-02 11:23:25 -070040 MetaInfo b;
Davide Pesaventoef654dd2019-07-18 20:02:44 -040041 BOOST_CHECK_NE(a.wireEncode(), b.wireEncode());
Junxiao Shiebfe4a22018-04-01 23:53:40 +000042 b.setType(a.getType());
43 b.setFreshnessPeriod(a.getFreshnessPeriod());
44 b.setFinalBlock(a.getFinalBlock());
Davide Pesaventoef654dd2019-07-18 20:02:44 -040045 BOOST_CHECK_NE(a.wireEncode(), b.wireEncode());
Junxiao Shi72c0c642018-04-20 15:41:09 +000046 BOOST_CHECK_EQUAL(b.wireEncode(), "1400"_block);
Shock Jiangca7ea702014-10-02 11:23:25 -070047
Junxiao Shiebfe4a22018-04-01 23:53:40 +000048 // non-default values
Davide Pesaventoef654dd2019-07-18 20:02:44 -040049 Block wire2("140C type=180101 freshness=190266B2 finalblock=1A03080141"_block);
Junxiao Shiebfe4a22018-04-01 23:53:40 +000050 a.wireDecode(wire2);
51 BOOST_CHECK_EQUAL(a.getType(), tlv::ContentType_Link);
52 BOOST_CHECK_EQUAL(a.getFreshnessPeriod(), 26290_ms);
Davide Pesaventoef654dd2019-07-18 20:02:44 -040053 BOOST_REQUIRE(a.getFinalBlock().has_value());
Junxiao Shiebfe4a22018-04-01 23:53:40 +000054 BOOST_CHECK_EQUAL(*a.getFinalBlock(), name::Component("A"));
Davide Pesaventoef654dd2019-07-18 20:02:44 -040055 BOOST_CHECK_NE(a.wireEncode(), b.wireEncode());
Shock Jiangca7ea702014-10-02 11:23:25 -070056
Junxiao Shiebfe4a22018-04-01 23:53:40 +000057 b.setType(a.getType());
58 b.setFreshnessPeriod(a.getFreshnessPeriod());
Davide Pesavento8dfd9132018-10-28 18:11:24 -040059 b.setFinalBlock(a.getFinalBlock());
Junxiao Shi72c0c642018-04-20 15:41:09 +000060 BOOST_CHECK_EQUAL(b.wireEncode(), wire2);
Shock Jiangca7ea702014-10-02 11:23:25 -070061
Davide Pesaventoef654dd2019-07-18 20:02:44 -040062 // FinalBlockId is a typed name component
Junxiao Shiebfe4a22018-04-01 23:53:40 +000063 Block wire3 = "1405 finalblock=1A03DD0141"_block;
64 a.wireDecode(wire3);
65 BOOST_CHECK_EQUAL(a.getType(), tlv::ContentType_Blob);
66 BOOST_CHECK_EQUAL(a.getFreshnessPeriod(), 0_ms);
Davide Pesaventoef654dd2019-07-18 20:02:44 -040067 BOOST_REQUIRE(a.getFinalBlock().has_value());
Junxiao Shiebfe4a22018-04-01 23:53:40 +000068 BOOST_CHECK_EQUAL(*a.getFinalBlock(), name::Component::fromEscapedString("221=A"));
Davide Pesaventoef654dd2019-07-18 20:02:44 -040069 BOOST_CHECK_NE(a.wireEncode(), b.wireEncode());
Shock Jiangca7ea702014-10-02 11:23:25 -070070
Junxiao Shiebfe4a22018-04-01 23:53:40 +000071 b.setType(a.getType());
72 b.setFreshnessPeriod(a.getFreshnessPeriod());
Davide Pesavento8dfd9132018-10-28 18:11:24 -040073 b.setFinalBlock(a.getFinalBlock());
Junxiao Shi72c0c642018-04-20 15:41:09 +000074 BOOST_CHECK_EQUAL(b.wireEncode(), wire3);
Shock Jiangca7ea702014-10-02 11:23:25 -070075}
76
77BOOST_AUTO_TEST_CASE(AppMetaInfo)
78{
79 MetaInfo info1;
80 info1.setType(196);
Davide Pesavento0f830802018-01-16 23:58:58 -050081 info1.setFreshnessPeriod(3600_ms);
Junxiao Shiebfe4a22018-04-01 23:53:40 +000082 info1.setFinalBlock(name::Component("/att/final"));
Shock Jiangca7ea702014-10-02 11:23:25 -070083
84 uint32_t ints[5] = {128, 129, 130, 131, 132};
85 std::string ss[5] = {"h", "hello", "hello, world", "hello, world, alex",
86 "hello, world, alex, I am Xiaoke Jiang"};
87
Davide Pesavento8dfd9132018-10-28 18:11:24 -040088 for (size_t i = 0; i < 5; i++) {
Shock Jiangca7ea702014-10-02 11:23:25 -070089 uint32_t type = 128 + i * 10;
Alexander Afanasyevd5c48e02015-06-24 11:58:14 -070090 info1.addAppMetaInfo(makeNonNegativeIntegerBlock(type, ints[i]));
Shock Jiangca7ea702014-10-02 11:23:25 -070091 type += 5;
Davide Pesaventoc2e12b42017-07-09 20:35:09 -040092 info1.addAppMetaInfo(makeStringBlock(type, ss[i]));
Shock Jiangca7ea702014-10-02 11:23:25 -070093 }
94
Junxiao Shi72c0c642018-04-20 15:41:09 +000095 BOOST_CHECK(info1.findAppMetaInfo(252) == nullptr);
Shock Jiangca7ea702014-10-02 11:23:25 -070096
Alexander Afanasyevd5c48e02015-06-24 11:58:14 -070097 info1.addAppMetaInfo(makeNonNegativeIntegerBlock(252, 1000));
Junxiao Shi72c0c642018-04-20 15:41:09 +000098 BOOST_CHECK(info1.findAppMetaInfo(252) != nullptr);
Shock Jiangca7ea702014-10-02 11:23:25 -070099
Alexander Afanasyevd5c48e02015-06-24 11:58:14 -0700100 info1.addAppMetaInfo(makeNonNegativeIntegerBlock(252, 1000));
Junxiao Shi72c0c642018-04-20 15:41:09 +0000101 BOOST_CHECK(info1.findAppMetaInfo(252) != nullptr);
Shock Jiangca7ea702014-10-02 11:23:25 -0700102
103 info1.removeAppMetaInfo(252);
Junxiao Shi72c0c642018-04-20 15:41:09 +0000104 BOOST_CHECK(info1.findAppMetaInfo(252) != nullptr);
Shock Jiangca7ea702014-10-02 11:23:25 -0700105
106 info1.removeAppMetaInfo(252);
Junxiao Shi72c0c642018-04-20 15:41:09 +0000107 BOOST_CHECK(info1.findAppMetaInfo(252) == nullptr);
Shock Jiangca7ea702014-10-02 11:23:25 -0700108
109 // // These octets are obtained by the snippet below.
110 // // This check is intended to detect unexpected encoding change in the future.
111 // const Block& wire = info1.wireEncode();
112 // for (Buffer::const_iterator it = wire.begin(); it != wire.end(); ++it) {
113 // printf("0x%02x, ", *it);
114 // }
Shock Jiangca7ea702014-10-02 11:23:25 -0700115 const uint8_t METAINFO[] = {0x14, 0x77, 0x18, 0x01, 0xc4, 0x19, 0x02, 0x0e, 0x10, 0x1a, 0x0c,
116 0x08, 0x0a, 0x2f, 0x61, 0x74, 0x74, 0x2f, 0x66, 0x69, 0x6e, 0x61,
117 0x6c, 0x80, 0x01, 0x80, 0x85, 0x01, 0x68, 0x8a, 0x01, 0x81, 0x8f,
118 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x94, 0x01, 0x82, 0x99, 0x0c,
119 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6c,
120 0x64, 0x9e, 0x01, 0x83, 0xa3, 0x12, 0x68, 0x65, 0x6c, 0x6c, 0x6f,
121 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x2c, 0x20, 0x61, 0x6c,
122 0x65, 0x78, 0xa8, 0x01, 0x84, 0xad, 0x25, 0x68, 0x65, 0x6c, 0x6c,
123 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x2c, 0x20, 0x61,
124 0x6c, 0x65, 0x78, 0x2c, 0x20, 0x49, 0x20, 0x61, 0x6d, 0x20, 0x58,
125 0x69, 0x61, 0x6f, 0x6b, 0x65, 0x20, 0x4a, 0x69, 0x61, 0x6e, 0x67};
126
Davide Pesaventofbea4fc2022-02-08 07:26:04 -0500127 BOOST_CHECK_EQUAL_COLLECTIONS(info1.wireEncode().begin(), info1.wireEncode().end(),
128 METAINFO, METAINFO + sizeof(METAINFO));
Shock Jiangca7ea702014-10-02 11:23:25 -0700129
130 MetaInfo info2;
Davide Pesaventofbea4fc2022-02-08 07:26:04 -0500131 info2.wireDecode(Block(METAINFO));
Shock Jiangca7ea702014-10-02 11:23:25 -0700132
Davide Pesavento8dfd9132018-10-28 18:11:24 -0400133 for (size_t i = 0; i < 5; i++) {
Shock Jiangca7ea702014-10-02 11:23:25 -0700134 uint32_t tlvType = 128 + i * 10;
135 const Block* block = info2.findAppMetaInfo(tlvType);
Davide Pesavento8dfd9132018-10-28 18:11:24 -0400136 BOOST_REQUIRE(block != nullptr);
Shock Jiangca7ea702014-10-02 11:23:25 -0700137 BOOST_CHECK_EQUAL(readNonNegativeInteger(*block), ints[i]);
138 tlvType += 5;
139
140 block = info2.findAppMetaInfo(tlvType);
Davide Pesavento8dfd9132018-10-28 18:11:24 -0400141 BOOST_REQUIRE(block != nullptr);
Shock Jiangca7ea702014-10-02 11:23:25 -0700142
Davide Pesavento8dfd9132018-10-28 18:11:24 -0400143 std::string s3(reinterpret_cast<const char*>(block->value()), block->value_size());
Shock Jiangca7ea702014-10-02 11:23:25 -0700144 BOOST_CHECK_EQUAL(s3, ss[i]);
145 }
146}
147
148BOOST_AUTO_TEST_CASE(AppMetaInfoTypeRange)
149{
150 MetaInfo info;
151
Alexander Afanasyevd5c48e02015-06-24 11:58:14 -0700152 BOOST_CHECK_NO_THROW(info.addAppMetaInfo(makeNonNegativeIntegerBlock(128, 1000)));
153 BOOST_CHECK_NO_THROW(info.addAppMetaInfo(makeNonNegativeIntegerBlock(252, 1000)));
Shock Jiangca7ea702014-10-02 11:23:25 -0700154
Alexander Afanasyevd5c48e02015-06-24 11:58:14 -0700155 BOOST_CHECK_THROW(info.addAppMetaInfo(makeNonNegativeIntegerBlock(127, 1000)), MetaInfo::Error);
156 BOOST_CHECK_THROW(info.addAppMetaInfo(makeNonNegativeIntegerBlock(253, 1000)), MetaInfo::Error);
Shock Jiangca7ea702014-10-02 11:23:25 -0700157}
158
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100159BOOST_AUTO_TEST_SUITE_END() // TestMetaInfo
Shock Jiangca7ea702014-10-02 11:23:25 -0700160
161} // namespace tests
162} // namespace ndn