blob: aee3b699b3e02a2ed01a96761f76b768295b5994 [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 Pesavento0f830802018-01-16 23:58:58 -05003 * Copyright (c) 2013-2018 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
22#include "meta-info.hpp"
Shock Jiangca7ea702014-10-02 11:23:25 -070023#include "data.hpp"
Alexander Afanasyev4c9a3d52017-01-03 17:45:19 -080024
Junxiao Shiebfe4a22018-04-01 23:53:40 +000025#include "block-literal.hpp"
Shock Jiangca7ea702014-10-02 11:23:25 -070026#include "boost-test.hpp"
27
28namespace ndn {
29namespace tests {
30
31BOOST_AUTO_TEST_SUITE(TestMetaInfo)
32
Junxiao Shiebfe4a22018-04-01 23:53:40 +000033BOOST_AUTO_TEST_CASE_EXPECTED_FAILURES(EncodeDecodeEquality, 1)
34BOOST_AUTO_TEST_CASE(EncodeDecodeEquality)
Shock Jiangca7ea702014-10-02 11:23:25 -070035{
Junxiao Shiebfe4a22018-04-01 23:53:40 +000036 // default values
37 MetaInfo a("1406 type=180100 freshness=190100"_block);
38 BOOST_CHECK_EQUAL(a.getType(), tlv::ContentType_Blob);
39 BOOST_CHECK_EQUAL(a.getFreshnessPeriod(), 0_ms);
40 BOOST_CHECK(!a.getFinalBlock());
41 BOOST_CHECK_EQUAL(a.getFinalBlockId(), name::Component());
42 BOOST_CHECK_EQUAL(a, a);
Shock Jiangca7ea702014-10-02 11:23:25 -070043
Shock Jiangca7ea702014-10-02 11:23:25 -070044 MetaInfo b;
Junxiao Shiebfe4a22018-04-01 23:53:40 +000045 BOOST_CHECK_NE(a, b);
46 b.setType(a.getType());
47 b.setFreshnessPeriod(a.getFreshnessPeriod());
48 b.setFinalBlock(a.getFinalBlock());
Junxiao Shi72c0c642018-04-20 15:41:09 +000049 BOOST_CHECK_EQUAL(b.wireEncode(), "1400"_block);
Junxiao Shiebfe4a22018-04-01 23:53:40 +000050 BOOST_CHECK_EQUAL(a, b); // expected failure #4569
Shock Jiangca7ea702014-10-02 11:23:25 -070051
Junxiao Shiebfe4a22018-04-01 23:53:40 +000052 // non-default values
53 Block wire2 = "140C type=180101 freshness=190266B2 finalblock=1A03080141"_block;
54 a.wireDecode(wire2);
55 BOOST_CHECK_EQUAL(a.getType(), tlv::ContentType_Link);
56 BOOST_CHECK_EQUAL(a.getFreshnessPeriod(), 26290_ms);
57 BOOST_CHECK_EQUAL(*a.getFinalBlock(), name::Component("A"));
58 BOOST_CHECK_EQUAL(a.getFinalBlockId(), name::Component("A"));
59 BOOST_CHECK_NE(a, b);
Shock Jiangca7ea702014-10-02 11:23:25 -070060
Junxiao Shiebfe4a22018-04-01 23:53:40 +000061 b.setType(a.getType());
62 b.setFreshnessPeriod(a.getFreshnessPeriod());
63 b.setFinalBlockId(a.getFinalBlockId());
Junxiao Shi72c0c642018-04-20 15:41:09 +000064 BOOST_CHECK_EQUAL(b.wireEncode(), wire2);
Junxiao Shiebfe4a22018-04-01 23:53:40 +000065 BOOST_CHECK_EQUAL(a, b);
Shock Jiangca7ea702014-10-02 11:23:25 -070066
Junxiao Shiebfe4a22018-04-01 23:53:40 +000067 // FinalBlockId is typed name component
68 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);
72 BOOST_CHECK_EQUAL(*a.getFinalBlock(), name::Component::fromEscapedString("221=A"));
73 BOOST_CHECK_NE(a, b);
Shock Jiangca7ea702014-10-02 11:23:25 -070074
Junxiao Shiebfe4a22018-04-01 23:53:40 +000075 b.setType(a.getType());
76 b.setFreshnessPeriod(a.getFreshnessPeriod());
77 b.setFinalBlockId(a.getFinalBlockId());
Junxiao Shi72c0c642018-04-20 15:41:09 +000078 BOOST_CHECK_EQUAL(b.wireEncode(), wire3);
Junxiao Shiebfe4a22018-04-01 23:53:40 +000079 BOOST_CHECK_EQUAL(a, b);
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
93 for (int i = 0; i < 5; i++) {
94 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();
117 // for (Buffer::const_iterator it = wire.begin(); it != wire.end(); ++it) {
118 // printf("0x%02x, ", *it);
119 // }
120
121 const uint8_t METAINFO[] = {0x14, 0x77, 0x18, 0x01, 0xc4, 0x19, 0x02, 0x0e, 0x10, 0x1a, 0x0c,
122 0x08, 0x0a, 0x2f, 0x61, 0x74, 0x74, 0x2f, 0x66, 0x69, 0x6e, 0x61,
123 0x6c, 0x80, 0x01, 0x80, 0x85, 0x01, 0x68, 0x8a, 0x01, 0x81, 0x8f,
124 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x94, 0x01, 0x82, 0x99, 0x0c,
125 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6c,
126 0x64, 0x9e, 0x01, 0x83, 0xa3, 0x12, 0x68, 0x65, 0x6c, 0x6c, 0x6f,
127 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x2c, 0x20, 0x61, 0x6c,
128 0x65, 0x78, 0xa8, 0x01, 0x84, 0xad, 0x25, 0x68, 0x65, 0x6c, 0x6c,
129 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x2c, 0x20, 0x61,
130 0x6c, 0x65, 0x78, 0x2c, 0x20, 0x49, 0x20, 0x61, 0x6d, 0x20, 0x58,
131 0x69, 0x61, 0x6f, 0x6b, 0x65, 0x20, 0x4a, 0x69, 0x61, 0x6e, 0x67};
132
133 BOOST_REQUIRE_EQUAL_COLLECTIONS(info1.wireEncode().begin(), info1.wireEncode().end(),
134 METAINFO, METAINFO + sizeof(METAINFO));
135
136 MetaInfo info2;
137 info2.wireDecode(Block(METAINFO, sizeof(METAINFO)));
138
139 for (int i = 0; i < 5; i++) {
140 uint32_t tlvType = 128 + i * 10;
141 const Block* block = info2.findAppMetaInfo(tlvType);
142 BOOST_REQUIRE(block != 0);
143 BOOST_CHECK_EQUAL(readNonNegativeInteger(*block), ints[i]);
144 tlvType += 5;
145
146 block = info2.findAppMetaInfo(tlvType);
147 BOOST_REQUIRE(block != 0);
148
149 std::string s3 = std::string(reinterpret_cast<const char*>(block->value()),
150 block->value_size());
151 BOOST_CHECK_EQUAL(s3, ss[i]);
152 }
153}
154
155BOOST_AUTO_TEST_CASE(AppMetaInfoTypeRange)
156{
157 MetaInfo info;
158
Alexander Afanasyevd5c48e02015-06-24 11:58:14 -0700159 BOOST_CHECK_NO_THROW(info.addAppMetaInfo(makeNonNegativeIntegerBlock(128, 1000)));
160 BOOST_CHECK_NO_THROW(info.addAppMetaInfo(makeNonNegativeIntegerBlock(252, 1000)));
Shock Jiangca7ea702014-10-02 11:23:25 -0700161
Alexander Afanasyevd5c48e02015-06-24 11:58:14 -0700162 BOOST_CHECK_THROW(info.addAppMetaInfo(makeNonNegativeIntegerBlock(127, 1000)), MetaInfo::Error);
163 BOOST_CHECK_THROW(info.addAppMetaInfo(makeNonNegativeIntegerBlock(253, 1000)), MetaInfo::Error);
Shock Jiangca7ea702014-10-02 11:23:25 -0700164}
165
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100166BOOST_AUTO_TEST_SUITE_END() // TestMetaInfo
Shock Jiangca7ea702014-10-02 11:23:25 -0700167
168} // namespace tests
169} // namespace ndn