blob: bdda72ead7328f70fbd3957adf5ebf50ffb817ea [file] [log] [blame]
Yanbiao Li698f4fe2015-08-19 16:30:16 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Junxiao Shi7d30d852017-01-22 03:29:26 +00003 * Copyright (c) 2014-2017, Regents of the University of California,
Yanbiao Li698f4fe2015-08-19 16:30:16 -07004 * Arizona Board of Regents,
5 * Colorado State University,
6 * University Pierre & Marie Curie, Sorbonne University,
7 * Washington University in St. Louis,
8 * Beijing Institute of Technology,
9 * The University of Memphis.
10 *
11 * This file is part of NFD (Named Data Networking Forwarding Daemon).
12 * See AUTHORS.md for complete list of NFD authors and contributors.
13 *
14 * NFD is free software: you can redistribute it and/or modify it under the terms
15 * of the GNU General Public License as published by the Free Software Foundation,
16 * either version 3 of the License, or (at your option) any later version.
17 *
18 * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
19 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
20 * PURPOSE. See the GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License along with
23 * NFD, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
24 */
25
26#include "manager-common-fixture.hpp"
Junxiao Shi9ddf1b52016-08-22 03:58:55 +000027#include <ndn-cxx/security/signing-helpers.hpp>
Yanbiao Li698f4fe2015-08-19 16:30:16 -070028
29namespace nfd {
30namespace tests {
31
Junxiao Shi8a1f1702017-07-03 00:05:08 +000032const Name CommandInterestSignerFixture::DEFAULT_COMMAND_SIGNER_IDENTITY("/CommandInterestSignerFixture-identity");
33
34CommandInterestSignerFixture::CommandInterestSignerFixture()
35 : m_commandInterestSigner(m_keyChain)
36{
37 BOOST_REQUIRE(this->addIdentity(DEFAULT_COMMAND_SIGNER_IDENTITY));
38}
39
40Interest
41CommandInterestSignerFixture::makeCommandInterest(const Name& name, const Name& identity)
42{
43 return m_commandInterestSigner.makeCommandInterest(name, ndn::security::signingByIdentity(identity));
44}
45
46Interest
47CommandInterestSignerFixture::makeControlCommandRequest(Name commandName,
48 const ControlParameters& params,
49 const Name& identity)
50{
51 commandName.append(params.wireEncode());
52 return this->makeCommandInterest(commandName, identity);
53}
54
Yanbiao Li698f4fe2015-08-19 16:30:16 -070055ManagerCommonFixture::ManagerCommonFixture()
Junxiao Shi221b6fe2016-07-14 18:21:56 +000056 : m_face(getGlobalIoService(), m_keyChain, {true, true})
57 , m_dispatcher(m_face, m_keyChain, ndn::security::SigningInfo())
58 , m_responses(m_face.sentData)
Yanbiao Li698f4fe2015-08-19 16:30:16 -070059{
60}
61
62void
Yanbiao Lidf846e52016-01-30 21:53:47 -080063ManagerCommonFixture::setTopPrefix(const Name& topPrefix)
Yanbiao Li698f4fe2015-08-19 16:30:16 -070064{
65 m_dispatcher.addTopPrefix(topPrefix); // such that all filters are added
66 advanceClocks(time::milliseconds(1));
Yanbiao Li698f4fe2015-08-19 16:30:16 -070067}
68
Yanbiao Li698f4fe2015-08-19 16:30:16 -070069void
Junxiao Shi8a1f1702017-07-03 00:05:08 +000070ManagerCommonFixture::receiveInterest(const Interest& interest)
Yanbiao Li698f4fe2015-08-19 16:30:16 -070071{
Junxiao Shi8a1f1702017-07-03 00:05:08 +000072 m_face.receive(interest);
Yanbiao Li698f4fe2015-08-19 16:30:16 -070073 advanceClocks(time::milliseconds(1));
74}
75
76ControlResponse
77ManagerCommonFixture::makeResponse(uint32_t code, const std::string& text,
78 const ControlParameters& parameters)
79{
80 return ControlResponse(code, text).setBody(parameters.wireEncode());
81}
82
83ManagerCommonFixture::CheckResponseResult
84ManagerCommonFixture::checkResponse(size_t idx,
85 const Name& expectedName,
86 const ControlResponse& expectedResponse,
87 int expectedContentType /*= -1*/)
88{
89 Data data;
90 try {
91 data = m_responses.at(idx);
92 }
93 catch (const std::out_of_range&) {
Junxiao Shi7d30d852017-01-22 03:29:26 +000094 BOOST_TEST_MESSAGE("response[" << idx << "] does not exist");
Yanbiao Li698f4fe2015-08-19 16:30:16 -070095 return CheckResponseResult::OUT_OF_BOUNDARY;
96 }
97
98 if (data.getName() != expectedName) {
Junxiao Shi7d30d852017-01-22 03:29:26 +000099 BOOST_TEST_MESSAGE("response[" << idx << "] has wrong name " << data.getName());
Yanbiao Li698f4fe2015-08-19 16:30:16 -0700100 return CheckResponseResult::WRONG_NAME;
101 }
102
103 if (expectedContentType != -1 &&
104 data.getContentType() != static_cast<uint32_t>(expectedContentType)) {
Junxiao Shi7d30d852017-01-22 03:29:26 +0000105 BOOST_TEST_MESSAGE("response[" << idx << "] has wrong ContentType " << data.getContentType());
Yanbiao Li698f4fe2015-08-19 16:30:16 -0700106 return CheckResponseResult::WRONG_CONTENT_TYPE;
107 }
108
109 ControlResponse response;
110 try {
111 response.wireDecode(data.getContent().blockFromValue());
112 }
113 catch (const tlv::Error&) {
Junxiao Shi7d30d852017-01-22 03:29:26 +0000114 BOOST_TEST_MESSAGE("response[" << idx << "] cannot be decoded");
Yanbiao Li698f4fe2015-08-19 16:30:16 -0700115 return CheckResponseResult::INVALID_RESPONSE;
116 }
117
118 if (response.getCode() != expectedResponse.getCode()) {
Junxiao Shi7d30d852017-01-22 03:29:26 +0000119 BOOST_TEST_MESSAGE("response[" << idx << "] has wrong StatusCode " << response.getCode());
Yanbiao Li698f4fe2015-08-19 16:30:16 -0700120 return CheckResponseResult::WRONG_CODE;
121 }
122
123 if (response.getText() != expectedResponse.getText()) {
Junxiao Shi7d30d852017-01-22 03:29:26 +0000124 BOOST_TEST_MESSAGE("response[" << idx << "] has wrong StatusText " << response.getText());
Yanbiao Li698f4fe2015-08-19 16:30:16 -0700125 return CheckResponseResult::WRONG_TEXT;
126 }
127
128 const Block& body = response.getBody();
129 const Block& expectedBody = expectedResponse.getBody();
130 if (body.value_size() != expectedBody.value_size()) {
Junxiao Shi7d30d852017-01-22 03:29:26 +0000131 BOOST_TEST_MESSAGE("response[" << idx << "] has wrong body size " << body.value_size());
Yanbiao Li698f4fe2015-08-19 16:30:16 -0700132 return CheckResponseResult::WRONG_BODY_SIZE;
133 }
134 if (body.value_size() > 0 && memcmp(body.value(), expectedBody.value(), body.value_size()) != 0) {
Junxiao Shi7d30d852017-01-22 03:29:26 +0000135 BOOST_TEST_MESSAGE("response[" << idx << "] has wrong body value");
Yanbiao Li698f4fe2015-08-19 16:30:16 -0700136 return CheckResponseResult::WRONG_BODY_VALUE;
137 }
138
139 return CheckResponseResult::OK;
140}
141
142Block
143ManagerCommonFixture::concatenateResponses(size_t startIndex, size_t nResponses)
144{
Yanbiao Li150b80d2016-03-18 15:30:10 +0800145 auto isFinalSegment = [] (const Data& data) -> bool {
Yanbiao Lidf846e52016-01-30 21:53:47 -0800146 const name::Component& lastComponent = data.getName().at(-1);
147 return !lastComponent.isSegment() || lastComponent == data.getFinalBlockId();
Yanbiao Li150b80d2016-03-18 15:30:10 +0800148 };
149
Yanbiao Lidf846e52016-01-30 21:53:47 -0800150 while (!isFinalSegment(m_responses.back())) {
151 const Name& name = m_responses.back().getName();
152 Name prefix = name.getPrefix(-1);
153 uint64_t segmentNo = name.at(-1).toSegment() + 1;
Yanbiao Li150b80d2016-03-18 15:30:10 +0800154 // request for the next segment
Junxiao Shi8a1f1702017-07-03 00:05:08 +0000155 receiveInterest(Interest(prefix.appendSegment(segmentNo)));
Yanbiao Li150b80d2016-03-18 15:30:10 +0800156 }
157
Yanbiao Li698f4fe2015-08-19 16:30:16 -0700158 size_t endIndex = startIndex + nResponses; // not included
159 if (nResponses == startIndex || endIndex > m_responses.size()) {
160 endIndex = m_responses.size();
161 }
162
163 ndn::EncodingBuffer encoder;
164 size_t valueLength = 0;
165 for (size_t i = startIndex; i < endIndex ; i ++) {
166 valueLength += encoder.appendByteArray(m_responses[i].getContent().value(),
167 m_responses[i].getContent().value_size());
168 }
169 encoder.prependVarNumber(valueLength);
170 encoder.prependVarNumber(tlv::Content);
171 return encoder.block();
172}
173
174std::ostream&
Junxiao Shi8a1f1702017-07-03 00:05:08 +0000175operator<<(std::ostream& os, const ManagerCommonFixture::CheckResponseResult& result)
Yanbiao Li698f4fe2015-08-19 16:30:16 -0700176{
177 switch (result) {
Junxiao Shi8a1f1702017-07-03 00:05:08 +0000178 case ManagerCommonFixture::CheckResponseResult::OK:
179 return os << "OK";
180 case ManagerCommonFixture::CheckResponseResult::OUT_OF_BOUNDARY:
181 return os << "OUT_OF_BOUNDARY";
182 case ManagerCommonFixture::CheckResponseResult::WRONG_NAME:
183 return os << "WRONG_NAME";
184 case ManagerCommonFixture::CheckResponseResult::WRONG_CONTENT_TYPE:
185 return os << "WRONG_CONTENT_TYPE";
186 case ManagerCommonFixture::CheckResponseResult::INVALID_RESPONSE:
187 return os << "INVALID_RESPONSE";
188 case ManagerCommonFixture::CheckResponseResult::WRONG_CODE:
189 return os << "WRONG_CODE";
190 case ManagerCommonFixture::CheckResponseResult::WRONG_TEXT:
191 return os << "WRONG_TEXT";
192 case ManagerCommonFixture::CheckResponseResult::WRONG_BODY_SIZE:
193 return os << "WRONG_BODY_SIZE";
194 case ManagerCommonFixture::CheckResponseResult::WRONG_BODY_VALUE:
195 return os << "WRONG_BODY_VALUE";
196 }
197 return os << static_cast<int>(result);
Yanbiao Li698f4fe2015-08-19 16:30:16 -0700198}
199
200} // namespace tests
201} // namespace nfd