blob: 57371c3e166151f4a956df7e471ad4b7283d05a2 [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
Shock Jiangca7ea702014-10-02 11:23:25 -070025#include "boost-test.hpp"
26
27namespace ndn {
28namespace tests {
29
30BOOST_AUTO_TEST_SUITE(TestMetaInfo)
31
Junxiao Shiebfe4a22018-04-01 23:53:40 +000032BOOST_AUTO_TEST_CASE_EXPECTED_FAILURES(EncodeDecodeEquality, 1)
33BOOST_AUTO_TEST_CASE(EncodeDecodeEquality)
Shock Jiangca7ea702014-10-02 11:23:25 -070034{
Junxiao Shiebfe4a22018-04-01 23:53:40 +000035 // default values
36 MetaInfo a("1406 type=180100 freshness=190100"_block);
37 BOOST_CHECK_EQUAL(a.getType(), tlv::ContentType_Blob);
38 BOOST_CHECK_EQUAL(a.getFreshnessPeriod(), 0_ms);
39 BOOST_CHECK(!a.getFinalBlock());
40 BOOST_CHECK_EQUAL(a.getFinalBlockId(), name::Component());
41 BOOST_CHECK_EQUAL(a, a);
Shock Jiangca7ea702014-10-02 11:23:25 -070042
Shock Jiangca7ea702014-10-02 11:23:25 -070043 MetaInfo b;
Junxiao Shiebfe4a22018-04-01 23:53:40 +000044 BOOST_CHECK_NE(a, b);
45 b.setType(a.getType());
46 b.setFreshnessPeriod(a.getFreshnessPeriod());
47 b.setFinalBlock(a.getFinalBlock());
Junxiao Shi72c0c642018-04-20 15:41:09 +000048 BOOST_CHECK_EQUAL(b.wireEncode(), "1400"_block);
Junxiao Shiebfe4a22018-04-01 23:53:40 +000049 BOOST_CHECK_EQUAL(a, b); // expected failure #4569
Shock Jiangca7ea702014-10-02 11:23:25 -070050
Junxiao Shiebfe4a22018-04-01 23:53:40 +000051 // non-default values
52 Block wire2 = "140C type=180101 freshness=190266B2 finalblock=1A03080141"_block;
53 a.wireDecode(wire2);
54 BOOST_CHECK_EQUAL(a.getType(), tlv::ContentType_Link);
55 BOOST_CHECK_EQUAL(a.getFreshnessPeriod(), 26290_ms);
56 BOOST_CHECK_EQUAL(*a.getFinalBlock(), name::Component("A"));
57 BOOST_CHECK_EQUAL(a.getFinalBlockId(), name::Component("A"));
58 BOOST_CHECK_NE(a, b);
Shock Jiangca7ea702014-10-02 11:23:25 -070059
Junxiao Shiebfe4a22018-04-01 23:53:40 +000060 b.setType(a.getType());
61 b.setFreshnessPeriod(a.getFreshnessPeriod());
62 b.setFinalBlockId(a.getFinalBlockId());
Junxiao Shi72c0c642018-04-20 15:41:09 +000063 BOOST_CHECK_EQUAL(b.wireEncode(), wire2);
Junxiao Shiebfe4a22018-04-01 23:53:40 +000064 BOOST_CHECK_EQUAL(a, b);
Shock Jiangca7ea702014-10-02 11:23:25 -070065
Junxiao Shiebfe4a22018-04-01 23:53:40 +000066 // FinalBlockId is typed name component
67 Block wire3 = "1405 finalblock=1A03DD0141"_block;
68 a.wireDecode(wire3);
69 BOOST_CHECK_EQUAL(a.getType(), tlv::ContentType_Blob);
70 BOOST_CHECK_EQUAL(a.getFreshnessPeriod(), 0_ms);
71 BOOST_CHECK_EQUAL(*a.getFinalBlock(), name::Component::fromEscapedString("221=A"));
72 BOOST_CHECK_NE(a, b);
Shock Jiangca7ea702014-10-02 11:23:25 -070073
Junxiao Shiebfe4a22018-04-01 23:53:40 +000074 b.setType(a.getType());
75 b.setFreshnessPeriod(a.getFreshnessPeriod());
76 b.setFinalBlockId(a.getFinalBlockId());
Junxiao Shi72c0c642018-04-20 15:41:09 +000077 BOOST_CHECK_EQUAL(b.wireEncode(), wire3);
Junxiao Shiebfe4a22018-04-01 23:53:40 +000078 BOOST_CHECK_EQUAL(a, b);
Shock Jiangca7ea702014-10-02 11:23:25 -070079}
80
81BOOST_AUTO_TEST_CASE(AppMetaInfo)
82{
83 MetaInfo info1;
84 info1.setType(196);
Davide Pesavento0f830802018-01-16 23:58:58 -050085 info1.setFreshnessPeriod(3600_ms);
Junxiao Shiebfe4a22018-04-01 23:53:40 +000086 info1.setFinalBlock(name::Component("/att/final"));
Shock Jiangca7ea702014-10-02 11:23:25 -070087
88 uint32_t ints[5] = {128, 129, 130, 131, 132};
89 std::string ss[5] = {"h", "hello", "hello, world", "hello, world, alex",
90 "hello, world, alex, I am Xiaoke Jiang"};
91
92 for (int i = 0; i < 5; i++) {
93 uint32_t type = 128 + i * 10;
Alexander Afanasyevd5c48e02015-06-24 11:58:14 -070094 info1.addAppMetaInfo(makeNonNegativeIntegerBlock(type, ints[i]));
Shock Jiangca7ea702014-10-02 11:23:25 -070095 type += 5;
Davide Pesaventoc2e12b42017-07-09 20:35:09 -040096 info1.addAppMetaInfo(makeStringBlock(type, ss[i]));
Shock Jiangca7ea702014-10-02 11:23:25 -070097 }
98
Junxiao Shi72c0c642018-04-20 15:41:09 +000099 BOOST_CHECK(info1.findAppMetaInfo(252) == nullptr);
Shock Jiangca7ea702014-10-02 11:23:25 -0700100
Alexander Afanasyevd5c48e02015-06-24 11:58:14 -0700101 info1.addAppMetaInfo(makeNonNegativeIntegerBlock(252, 1000));
Junxiao Shi72c0c642018-04-20 15:41:09 +0000102 BOOST_CHECK(info1.findAppMetaInfo(252) != nullptr);
Shock Jiangca7ea702014-10-02 11:23:25 -0700103
Alexander Afanasyevd5c48e02015-06-24 11:58:14 -0700104 info1.addAppMetaInfo(makeNonNegativeIntegerBlock(252, 1000));
Junxiao Shi72c0c642018-04-20 15:41:09 +0000105 BOOST_CHECK(info1.findAppMetaInfo(252) != nullptr);
Shock Jiangca7ea702014-10-02 11:23:25 -0700106
107 info1.removeAppMetaInfo(252);
Junxiao Shi72c0c642018-04-20 15:41:09 +0000108 BOOST_CHECK(info1.findAppMetaInfo(252) != nullptr);
Shock Jiangca7ea702014-10-02 11:23:25 -0700109
110 info1.removeAppMetaInfo(252);
Junxiao Shi72c0c642018-04-20 15:41:09 +0000111 BOOST_CHECK(info1.findAppMetaInfo(252) == nullptr);
Shock Jiangca7ea702014-10-02 11:23:25 -0700112
113 // // These octets are obtained by the snippet below.
114 // // This check is intended to detect unexpected encoding change in the future.
115 // const Block& wire = info1.wireEncode();
116 // for (Buffer::const_iterator it = wire.begin(); it != wire.end(); ++it) {
117 // printf("0x%02x, ", *it);
118 // }
119
120 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
132 BOOST_REQUIRE_EQUAL_COLLECTIONS(info1.wireEncode().begin(), info1.wireEncode().end(),
133 METAINFO, METAINFO + sizeof(METAINFO));
134
135 MetaInfo info2;
136 info2.wireDecode(Block(METAINFO, sizeof(METAINFO)));
137
138 for (int i = 0; i < 5; i++) {
139 uint32_t tlvType = 128 + i * 10;
140 const Block* block = info2.findAppMetaInfo(tlvType);
141 BOOST_REQUIRE(block != 0);
142 BOOST_CHECK_EQUAL(readNonNegativeInteger(*block), ints[i]);
143 tlvType += 5;
144
145 block = info2.findAppMetaInfo(tlvType);
146 BOOST_REQUIRE(block != 0);
147
148 std::string s3 = std::string(reinterpret_cast<const char*>(block->value()),
149 block->value_size());
150 BOOST_CHECK_EQUAL(s3, ss[i]);
151 }
152}
153
154BOOST_AUTO_TEST_CASE(AppMetaInfoTypeRange)
155{
156 MetaInfo info;
157
Alexander Afanasyevd5c48e02015-06-24 11:58:14 -0700158 BOOST_CHECK_NO_THROW(info.addAppMetaInfo(makeNonNegativeIntegerBlock(128, 1000)));
159 BOOST_CHECK_NO_THROW(info.addAppMetaInfo(makeNonNegativeIntegerBlock(252, 1000)));
Shock Jiangca7ea702014-10-02 11:23:25 -0700160
Alexander Afanasyevd5c48e02015-06-24 11:58:14 -0700161 BOOST_CHECK_THROW(info.addAppMetaInfo(makeNonNegativeIntegerBlock(127, 1000)), MetaInfo::Error);
162 BOOST_CHECK_THROW(info.addAppMetaInfo(makeNonNegativeIntegerBlock(253, 1000)), MetaInfo::Error);
Shock Jiangca7ea702014-10-02 11:23:25 -0700163}
164
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100165BOOST_AUTO_TEST_SUITE_END() // TestMetaInfo
Shock Jiangca7ea702014-10-02 11:23:25 -0700166
167} // namespace tests
168} // namespace ndn