blob: 106541af8a2cf41a54324fb66f17fd3ef569cac4 [file] [log] [blame]
Spyridon Mastorakis3b54e852015-04-07 08:03:25 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Davide Pesaventoc2e12b42017-07-09 20:35:09 -04002/*
Davide Pesavento152ef442023-04-22 02:02:29 -04003 * Copyright (c) 2013-2023 Regents of the University of California.
Spyridon Mastorakis3b54e852015-04-07 08:03: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/link.hpp"
Spyridon Mastorakis3b54e852015-04-07 08:03:25 -070023
Davide Pesavento4c1ad4c2020-11-16 21:12:02 -050024#include "tests/test-common.hpp"
Spyridon Mastorakis3b54e852015-04-07 08:03:25 -070025
26namespace ndn {
27namespace tests {
28
Davide Pesavento152ef442023-04-22 02:02:29 -040029BOOST_CONCEPT_ASSERT((boost::EqualityComparable<Link>));
30BOOST_CONCEPT_ASSERT((WireEncodable<Link>));
31BOOST_CONCEPT_ASSERT((WireEncodableWithEncodingBuffer<Link>));
32BOOST_CONCEPT_ASSERT((WireDecodable<Link>));
33static_assert(std::is_convertible_v<Link::Error*, Data::Error*>,
34 "Link::Error should inherit from Data::Error");
35
Davide Pesaventoeee3e822016-11-26 19:19:34 +010036BOOST_AUTO_TEST_SUITE(TestLink)
37
Junxiao Shid21abd32017-06-30 02:56:40 +000038const uint8_t GOOD_LINK[] = {
Junxiao Shie4603e12022-01-05 19:12:25 +0000390x06, 0xd0, // Data
Spyridon Mastorakis3b54e852015-04-07 08:03:25 -070040 0x07, 0x14, // Name
41 0x08, 0x05,
42 0x6c, 0x6f, 0x63, 0x61, 0x6c,
43 0x08, 0x03,
44 0x6e, 0x64, 0x6e,
45 0x08, 0x06,
46 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
47 0x14, 0x07, // MetaInfo
48 0x18, 0x01, // ContentType
49 0x01,
50 0x19, 0x02, // FreshnessPeriod
51 0x27, 0x10,
Junxiao Shie4603e12022-01-05 19:12:25 +000052 0x15, 0x10, // Content
53 0x07, 0x07, // Name
54 0x08, 0x05,
55 0x6c, 0x6f, 0x63, 0x61, 0x6c,
56 0x07, 0x05, // Name
57 0x08, 0x03,
58 0x6e, 0x64, 0x6e,
Spyridon Mastorakis3b54e852015-04-07 08:03:25 -070059 0x16, 0x1b, // SignatureInfo
60 0x1b, 0x01, // SignatureType
61 0x01,
62 0x1c, 0x16, // KeyLocator
63 0x07, 0x14, // Name
64 0x08, 0x04,
65 0x74, 0x65, 0x73, 0x74,
66 0x08, 0x03,
67 0x6b, 0x65, 0x79,
68 0x08, 0x07,
69 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,
70 0x17, 0x80, // SignatureValue
71 0x2f, 0xd6, 0xf1, 0x6e, 0x80, 0x6f, 0x10, 0xbe, 0xb1, 0x6f, 0x3e, 0x31, 0xec,
72 0xe3, 0xb9, 0xea, 0x83, 0x30, 0x40, 0x03, 0xfc, 0xa0, 0x13, 0xd9, 0xb3, 0xc6,
73 0x25, 0x16, 0x2d, 0xa6, 0x58, 0x41, 0x69, 0x62, 0x56, 0xd8, 0xb3, 0x6a, 0x38,
74 0x76, 0x56, 0xea, 0x61, 0xb2, 0x32, 0x70, 0x1c, 0xb6, 0x4d, 0x10, 0x1d, 0xdc,
75 0x92, 0x8e, 0x52, 0xa5, 0x8a, 0x1d, 0xd9, 0x96, 0x5e, 0xc0, 0x62, 0x0b, 0xcf,
76 0x3a, 0x9d, 0x7f, 0xca, 0xbe, 0xa1, 0x41, 0x71, 0x85, 0x7a, 0x8b, 0x5d, 0xa9,
77 0x64, 0xd6, 0x66, 0xb4, 0xe9, 0x8d, 0x0c, 0x28, 0x43, 0xee, 0xa6, 0x64, 0xe8,
78 0x55, 0xf6, 0x1c, 0x19, 0x0b, 0xef, 0x99, 0x25, 0x1e, 0xdc, 0x78, 0xb3, 0xa7,
79 0xaa, 0x0d, 0x14, 0x58, 0x30, 0xe5, 0x37, 0x6a, 0x6d, 0xdb, 0x56, 0xac, 0xa3,
80 0xfc, 0x90, 0x7a, 0xb8, 0x66, 0x9c, 0x0e, 0xf6, 0xb7, 0x64, 0xd1
81};
82
Junxiao Shid21abd32017-06-30 02:56:40 +000083BOOST_AUTO_TEST_SUITE(EncodeDecode)
Spyridon Mastorakis3b54e852015-04-07 08:03:25 -070084
85BOOST_AUTO_TEST_CASE(Decode)
86{
Davide Pesaventofbea4fc2022-02-08 07:26:04 -050087 Link link(Block{GOOD_LINK});
Spyridon Mastorakis3b54e852015-04-07 08:03:25 -070088 BOOST_CHECK_EQUAL(link.getName(), Name("/local/ndn/prefix"));
Junxiao Shie4603e12022-01-05 19:12:25 +000089 BOOST_TEST(link.getDelegationList() == std::vector<Name>({"/local", "/ndn"}),
90 boost::test_tools::per_element());
Spyridon Mastorakis3b54e852015-04-07 08:03:25 -070091}
92
Junxiao Shid21abd32017-06-30 02:56:40 +000093BOOST_AUTO_TEST_CASE(DecodeBadContentType)
Spyridon Mastorakisc8188b32015-04-18 18:33:38 -070094{
Davide Pesaventofbea4fc2022-02-08 07:26:04 -050095 Data linkData(Block{GOOD_LINK});
Junxiao Shid21abd32017-06-30 02:56:40 +000096 linkData.setContentType(tlv::ContentType_Key);
97 Block badLink = linkData.wireEncode();
98
Davide Pesaventofbea4fc2022-02-08 07:26:04 -050099 BOOST_CHECK_THROW(Link{badLink}, Link::Error);
Junxiao Shid21abd32017-06-30 02:56:40 +0000100 Link link;
101 BOOST_CHECK_THROW(link.wireDecode(badLink), Link::Error);
102}
103
104BOOST_AUTO_TEST_CASE(Encode)
105{
Junxiao Shie4603e12022-01-05 19:12:25 +0000106 Link link1("/test", {"/test1", "/test2", "/test3"});
Junxiao Shid21abd32017-06-30 02:56:40 +0000107 signData(link1);
108 Block wire = link1.wireEncode();
109
110 Link link2(wire);
111 BOOST_CHECK_EQUAL(link2.getName(), "/test");
Junxiao Shie4603e12022-01-05 19:12:25 +0000112 BOOST_TEST(link2.getDelegationList() == std::vector<Name>({"/test1", "/test2", "/test3"}),
113 boost::test_tools::per_element());
Junxiao Shid21abd32017-06-30 02:56:40 +0000114}
115
116BOOST_AUTO_TEST_SUITE_END() // EncodeDecode
117
118BOOST_AUTO_TEST_SUITE(Modify)
119
120BOOST_AUTO_TEST_CASE(SetDelegationList)
121{
122 Link link("/test");
Junxiao Shie4603e12022-01-05 19:12:25 +0000123 BOOST_CHECK(link.getDelegationList().empty());
Junxiao Shid21abd32017-06-30 02:56:40 +0000124
Junxiao Shie4603e12022-01-05 19:12:25 +0000125 link.setDelegationList(std::vector<Name>({"/test1", "/test2"}));
126 BOOST_TEST(link.getDelegationList() == std::vector<Name>({"/test1", "/test2"}),
127 boost::test_tools::per_element());
Junxiao Shid21abd32017-06-30 02:56:40 +0000128}
129
130BOOST_AUTO_TEST_CASE(AddDelegation)
131{
Junxiao Shie4603e12022-01-05 19:12:25 +0000132 Link link1("/test", {"/test1", "/test2", "/test3"});
133 BOOST_TEST(link1.getDelegationList() == std::vector<Name>({"/test1", "/test2", "/test3"}),
134 boost::test_tools::per_element());
Junxiao Shid21abd32017-06-30 02:56:40 +0000135
Junxiao Shie4603e12022-01-05 19:12:25 +0000136 BOOST_CHECK(link1.addDelegation("/test4"));
137 BOOST_TEST(link1.getDelegationList() == std::vector<Name>({"/test1", "/test2", "/test3", "/test4"}),
138 boost::test_tools::per_element());
Junxiao Shid21abd32017-06-30 02:56:40 +0000139
Junxiao Shie4603e12022-01-05 19:12:25 +0000140 BOOST_CHECK(!link1.addDelegation("/test2"));
141 BOOST_TEST(link1.getDelegationList() == std::vector<Name>({"/test1", "/test2", "/test3", "/test4"}),
142 boost::test_tools::per_element());
Junxiao Shid21abd32017-06-30 02:56:40 +0000143
144 signData(link1);
145 Link link2(link1.wireEncode());
Junxiao Shie4603e12022-01-05 19:12:25 +0000146 BOOST_TEST(link2.getDelegationList() == std::vector<Name>({"/test1", "/test2", "/test3", "/test4"}),
147 boost::test_tools::per_element());
Junxiao Shid21abd32017-06-30 02:56:40 +0000148}
149
150BOOST_AUTO_TEST_CASE(RemoveDelegation)
151{
Junxiao Shie4603e12022-01-05 19:12:25 +0000152 Link link1("/test", {"/test1", "/test2", "/test3"});
153 BOOST_TEST(link1.getDelegationList() == std::vector<Name>({"/test1", "/test2", "/test3"}),
154 boost::test_tools::per_element());
Junxiao Shid21abd32017-06-30 02:56:40 +0000155
Junxiao Shie4603e12022-01-05 19:12:25 +0000156 BOOST_CHECK(!link1.removeDelegation("/test4")); // non-existent
157 BOOST_TEST(link1.getDelegationList() == std::vector<Name>({"/test1", "/test2", "/test3"}),
158 boost::test_tools::per_element());
Junxiao Shid21abd32017-06-30 02:56:40 +0000159
Junxiao Shie4603e12022-01-05 19:12:25 +0000160 BOOST_CHECK(link1.removeDelegation("/test2"));
161 BOOST_TEST(link1.getDelegationList() == std::vector<Name>({"/test1", "/test3"}),
162 boost::test_tools::per_element());
Junxiao Shid21abd32017-06-30 02:56:40 +0000163
164 signData(link1);
165 Link link2(link1.wireEncode());
Junxiao Shie4603e12022-01-05 19:12:25 +0000166 BOOST_TEST(link2.getDelegationList() == std::vector<Name>({"/test1", "/test3"}),
167 boost::test_tools::per_element());
Junxiao Shid21abd32017-06-30 02:56:40 +0000168
169 link1.removeDelegation("/test1");
170 link1.removeDelegation("/test3");
Junxiao Shie4603e12022-01-05 19:12:25 +0000171 BOOST_CHECK(link1.getDelegationList().empty());
Junxiao Shid21abd32017-06-30 02:56:40 +0000172}
173
174BOOST_AUTO_TEST_SUITE_END() // Modify
175
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100176BOOST_AUTO_TEST_SUITE_END() // TestLink
Spyridon Mastorakis3b54e852015-04-07 08:03:25 -0700177
178} // namespace tests
179} // namespace ndn