blob: a3a548837fb518c0c10ff4c03635f74d3df9c429 [file] [log] [blame]
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +01001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Alexander Afanasyev319f2c82015-01-07 14:56:53 -08003 * Copyright (c) 2014-2015, Regents of the University of California,
4 * 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.
Alexander Afanasyev9bcbc7c2014-04-06 19:37:37 -070010 *
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/>.
Steve DiBenedettoef04f272014-06-04 14:28:31 -060024 */
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +010025
Alexander Afanasyev0eb70652014-02-27 18:35:07 -080026#include "face/unix-stream-factory.hpp"
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +010027
Junxiao Shid9ee45c2014-02-27 15:38:11 -070028#include "tests/test-common.hpp"
Alexander Afanasyev613e2a92014-04-15 13:36:58 -070029#include "tests/limited-io.hpp"
Alexander Afanasyev650028d2014-04-25 18:39:10 -070030#include "dummy-stream-sender.hpp"
31#include "packet-datasets.hpp"
Junxiao Shid9ee45c2014-02-27 15:38:11 -070032
33namespace nfd {
34namespace tests {
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +010035
36using namespace boost::asio::local;
37
Junxiao Shi61e3cc52014-03-03 20:40:28 -070038#define CHANNEL_PATH1 "unix-stream-test.1.sock"
39#define CHANNEL_PATH2 "unix-stream-test.2.sock"
40
Junxiao Shid9ee45c2014-02-27 15:38:11 -070041BOOST_FIXTURE_TEST_SUITE(FaceUnixStream, BaseFixture)
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +010042
43BOOST_AUTO_TEST_CASE(ChannelMap)
44{
Alexander Afanasyev0eb70652014-02-27 18:35:07 -080045 UnixStreamFactory factory;
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +010046
Junxiao Shi61e3cc52014-03-03 20:40:28 -070047 shared_ptr<UnixStreamChannel> channel1 = factory.createChannel(CHANNEL_PATH1);
48 shared_ptr<UnixStreamChannel> channel1a = factory.createChannel(CHANNEL_PATH1);
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +010049 BOOST_CHECK_EQUAL(channel1, channel1a);
Junxiao Shi61e3cc52014-03-03 20:40:28 -070050 std::string channel1uri = channel1->getUri().toString();
51 BOOST_CHECK_EQUAL(channel1uri.find("unix:///"), 0); // third '/' is the path separator
52 BOOST_CHECK_EQUAL(channel1uri.rfind(CHANNEL_PATH1),
53 channel1uri.size() - std::string(CHANNEL_PATH1).size());
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +010054
Junxiao Shi61e3cc52014-03-03 20:40:28 -070055 shared_ptr<UnixStreamChannel> channel2 = factory.createChannel(CHANNEL_PATH2);
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +010056 BOOST_CHECK_NE(channel1, channel2);
57}
58
Steve DiBenedettoef04f272014-06-04 14:28:31 -060059BOOST_AUTO_TEST_CASE(GetChannels)
60{
61 UnixStreamFactory factory;
62 BOOST_REQUIRE_EQUAL(factory.getChannels().empty(), true);
63
64 std::vector<shared_ptr<const Channel> > expectedChannels;
65
66 expectedChannels.push_back(factory.createChannel(CHANNEL_PATH1));
67 expectedChannels.push_back(factory.createChannel(CHANNEL_PATH2));
68
69 std::list<shared_ptr<const Channel> > channels = factory.getChannels();
70 for (std::list<shared_ptr<const Channel> >::const_iterator i = channels.begin();
71 i != channels.end(); ++i)
72 {
73 std::vector<shared_ptr<const Channel> >::iterator pos =
74 std::find(expectedChannels.begin(), expectedChannels.end(), *i);
75
76 BOOST_REQUIRE(pos != expectedChannels.end());
77 expectedChannels.erase(pos);
78 }
79
80 BOOST_CHECK_EQUAL(expectedChannels.size(), 0);
81}
82
Junxiao Shid9ee45c2014-02-27 15:38:11 -070083class EndToEndFixture : protected BaseFixture
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +010084{
85public:
86 void
87 client_onConnect(const boost::system::error_code& error)
88 {
89 BOOST_CHECK_MESSAGE(!error, error.message());
90
Junxiao Shi79494162014-04-02 18:25:11 -070091 limitedIo.afterOp();
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +010092 }
93
94 void
Junxiao Shi61e3cc52014-03-03 20:40:28 -070095 channel1_onFaceCreated(const shared_ptr<Face>& newFace)
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +010096 {
Junxiao Shi79494162014-04-02 18:25:11 -070097 BOOST_CHECK(!static_cast<bool>(face1));
98 face1 = static_pointer_cast<UnixStreamFace>(newFace);
Junxiao Shic099ddb2014-12-25 20:53:20 -070099 face1->onReceiveInterest.connect(bind(&EndToEndFixture::face1_onReceiveInterest, this, _1));
100 face1->onReceiveData.connect(bind(&EndToEndFixture::face1_onReceiveData, this, _1));
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100101
Junxiao Shi79494162014-04-02 18:25:11 -0700102 limitedIo.afterOp();
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100103 }
104
105 void
106 channel1_onConnectFailed(const std::string& reason)
107 {
108 BOOST_CHECK_MESSAGE(false, reason);
109
Junxiao Shi79494162014-04-02 18:25:11 -0700110 limitedIo.afterOp();
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100111 }
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800112
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100113 void
114 face1_onReceiveInterest(const Interest& interest)
115 {
Junxiao Shi79494162014-04-02 18:25:11 -0700116 face1_receivedInterests.push_back(interest);
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100117
Junxiao Shi79494162014-04-02 18:25:11 -0700118 limitedIo.afterOp();
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100119 }
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800120
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100121 void
122 face1_onReceiveData(const Data& data)
123 {
Junxiao Shi79494162014-04-02 18:25:11 -0700124 face1_receivedDatas.push_back(data);
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100125
Junxiao Shi79494162014-04-02 18:25:11 -0700126 limitedIo.afterOp();
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100127 }
128
129 void
130 face2_onReceiveInterest(const Interest& interest)
131 {
Junxiao Shi79494162014-04-02 18:25:11 -0700132 face2_receivedInterests.push_back(interest);
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100133
Junxiao Shi79494162014-04-02 18:25:11 -0700134 limitedIo.afterOp();
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100135 }
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800136
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100137 void
138 face2_onReceiveData(const Data& data)
139 {
Junxiao Shi79494162014-04-02 18:25:11 -0700140 face2_receivedDatas.push_back(data);
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100141
Junxiao Shi79494162014-04-02 18:25:11 -0700142 limitedIo.afterOp();
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100143 }
144
145 void
Junxiao Shi61e3cc52014-03-03 20:40:28 -0700146 channel_onFaceCreated(const shared_ptr<Face>& newFace)
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100147 {
Junxiao Shi79494162014-04-02 18:25:11 -0700148 faces.push_back(static_pointer_cast<UnixStreamFace>(newFace));
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100149
Junxiao Shi79494162014-04-02 18:25:11 -0700150 limitedIo.afterOp();
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100151 }
152
153 void
154 channel_onConnectFailed(const std::string& reason)
155 {
156 BOOST_CHECK_MESSAGE(false, reason);
157
Junxiao Shi79494162014-04-02 18:25:11 -0700158 limitedIo.afterOp();
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100159 }
160
161protected:
Junxiao Shi79494162014-04-02 18:25:11 -0700162 LimitedIo limitedIo;
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100163
Junxiao Shi79494162014-04-02 18:25:11 -0700164 shared_ptr<UnixStreamFace> face1;
165 std::vector<Interest> face1_receivedInterests;
166 std::vector<Data> face1_receivedDatas;
167 shared_ptr<UnixStreamFace> face2;
168 std::vector<Interest> face2_receivedInterests;
169 std::vector<Data> face2_receivedDatas;
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100170
Junxiao Shi79494162014-04-02 18:25:11 -0700171 std::list< shared_ptr<UnixStreamFace> > faces;
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100172};
173
174
175BOOST_FIXTURE_TEST_CASE(EndToEnd, EndToEndFixture)
176{
Alexander Afanasyev0eb70652014-02-27 18:35:07 -0800177 UnixStreamFactory factory;
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100178
Junxiao Shi61e3cc52014-03-03 20:40:28 -0700179 shared_ptr<UnixStreamChannel> channel1 = factory.createChannel(CHANNEL_PATH1);
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100180 channel1->listen(bind(&EndToEndFixture::channel1_onFaceCreated, this, _1),
181 bind(&EndToEndFixture::channel1_onConnectFailed, this, _1));
182
Alexander Afanasyevf6980282014-05-13 18:28:40 -0700183 shared_ptr<stream_protocol::socket> client = make_shared<stream_protocol::socket>(ref(g_io));
Junxiao Shi61e3cc52014-03-03 20:40:28 -0700184 client->async_connect(stream_protocol::endpoint(CHANNEL_PATH1),
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100185 bind(&EndToEndFixture::client_onConnect, this, _1));
186
Junxiao Shi79494162014-04-02 18:25:11 -0700187 BOOST_CHECK_MESSAGE(limitedIo.run(2, time::seconds(1)) == LimitedIo::EXCEED_OPS,
Junxiao Shi7e2413b2014-03-02 11:15:09 -0700188 "UnixStreamChannel error: cannot connect or cannot accept connection");
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100189
Junxiao Shi79494162014-04-02 18:25:11 -0700190 BOOST_REQUIRE(static_cast<bool>(face1));
Davide Pesavento94279412015-02-27 01:29:32 +0100191 BOOST_CHECK_EQUAL(face1->isLocal(), true);
192 BOOST_CHECK_EQUAL(face1->isOnDemand(), true);
193 BOOST_CHECK_EQUAL(face1->isMultiAccess(), false);
Junxiao Shi79494162014-04-02 18:25:11 -0700194 BOOST_CHECK_EQUAL(face1->getRemoteUri().getScheme(), "fd");
195 BOOST_CHECK_NO_THROW(boost::lexical_cast<int>(face1->getRemoteUri().getHost()));
196 std::string face1localUri = face1->getLocalUri().toString();
197 BOOST_CHECK_EQUAL(face1localUri.find("unix:///"), 0); // third '/' is the path separator
198 BOOST_CHECK_EQUAL(face1localUri.rfind(CHANNEL_PATH1),
199 face1localUri.size() - std::string(CHANNEL_PATH1).size());
Alexander Afanasyeva39b90b2014-03-05 15:31:00 +0000200
Junxiao Shi79494162014-04-02 18:25:11 -0700201 face2 = make_shared<UnixStreamFace>(client);
Junxiao Shic099ddb2014-12-25 20:53:20 -0700202 face2->onReceiveInterest.connect(bind(&EndToEndFixture::face2_onReceiveInterest, this, _1));
203 face2->onReceiveData.connect(bind(&EndToEndFixture::face2_onReceiveData, this, _1));
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100204
Alexander Afanasyev650028d2014-04-25 18:39:10 -0700205 shared_ptr<Interest> interest1 = makeInterest("ndn:/TpnzGvW9R");
206 shared_ptr<Data> data1 = makeData("ndn:/KfczhUqVix");
207 shared_ptr<Interest> interest2 = makeInterest("ndn:/QWiIMfj5sL");
208 shared_ptr<Data> data2 = makeData("ndn:/XNBV796f");
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100209
Alexander Afanasyev650028d2014-04-25 18:39:10 -0700210 face1->sendInterest(*interest1);
211 face1->sendInterest(*interest1);
212 face1->sendInterest(*interest1);
213 face1->sendData (*data1 );
Junxiao Shi5dd26c32014-07-20 23:15:14 -0700214 size_t nBytesSent1 = interest1->wireEncode().size() * 3 + data1->wireEncode().size();
Alexander Afanasyev650028d2014-04-25 18:39:10 -0700215 face2->sendInterest(*interest2);
216 face2->sendData (*data2 );
217 face2->sendData (*data2 );
218 face2->sendData (*data2 );
Junxiao Shi5dd26c32014-07-20 23:15:14 -0700219 size_t nBytesSent2 = interest2->wireEncode().size() + data2->wireEncode().size() * 3;
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100220
Junxiao Shi79494162014-04-02 18:25:11 -0700221 BOOST_CHECK_MESSAGE(limitedIo.run(8, time::seconds(1)) == LimitedIo::EXCEED_OPS,
Junxiao Shi7e2413b2014-03-02 11:15:09 -0700222 "UnixStreamChannel error: cannot send or receive Interest/Data packets");
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100223
Junxiao Shi79494162014-04-02 18:25:11 -0700224 BOOST_REQUIRE_EQUAL(face1_receivedInterests.size(), 1);
225 BOOST_REQUIRE_EQUAL(face1_receivedDatas .size(), 3);
226 BOOST_REQUIRE_EQUAL(face2_receivedInterests.size(), 3);
227 BOOST_REQUIRE_EQUAL(face2_receivedDatas .size(), 1);
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100228
Alexander Afanasyev650028d2014-04-25 18:39:10 -0700229 BOOST_CHECK_EQUAL(face1_receivedInterests[0].getName(), interest2->getName());
230 BOOST_CHECK_EQUAL(face1_receivedDatas [0].getName(), data2->getName());
231 BOOST_CHECK_EQUAL(face2_receivedInterests[0].getName(), interest1->getName());
232 BOOST_CHECK_EQUAL(face2_receivedDatas [0].getName(), data1->getName());
Alexander Afanasyev7e698e62014-03-07 16:48:35 +0000233
Junxiao Shi5dd26c32014-07-20 23:15:14 -0700234 // needed to ensure NOutBytes counters are accurate
235 limitedIo.run(LimitedIo::UNLIMITED_OPS, time::seconds(1));
236
Junxiao Shi79494162014-04-02 18:25:11 -0700237 const FaceCounters& counters1 = face1->getCounters();
Junxiao Shi6e694322014-04-03 10:27:13 -0700238 BOOST_CHECK_EQUAL(counters1.getNInInterests() , 1);
239 BOOST_CHECK_EQUAL(counters1.getNInDatas() , 3);
240 BOOST_CHECK_EQUAL(counters1.getNOutInterests(), 3);
241 BOOST_CHECK_EQUAL(counters1.getNOutDatas() , 1);
Junxiao Shi5dd26c32014-07-20 23:15:14 -0700242 BOOST_CHECK_EQUAL(counters1.getNInBytes(), nBytesSent2);
243 BOOST_CHECK_EQUAL(counters1.getNOutBytes(), nBytesSent1);
Alexander Afanasyev7e698e62014-03-07 16:48:35 +0000244
Junxiao Shi79494162014-04-02 18:25:11 -0700245 const FaceCounters& counters2 = face2->getCounters();
Junxiao Shi6e694322014-04-03 10:27:13 -0700246 BOOST_CHECK_EQUAL(counters2.getNInInterests() , 3);
247 BOOST_CHECK_EQUAL(counters2.getNInDatas() , 1);
248 BOOST_CHECK_EQUAL(counters2.getNOutInterests(), 1);
249 BOOST_CHECK_EQUAL(counters2.getNOutDatas() , 3);
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100250}
251
252BOOST_FIXTURE_TEST_CASE(MultipleAccepts, EndToEndFixture)
253{
Alexander Afanasyev0eb70652014-02-27 18:35:07 -0800254 UnixStreamFactory factory;
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100255
Junxiao Shi61e3cc52014-03-03 20:40:28 -0700256 shared_ptr<UnixStreamChannel> channel = factory.createChannel(CHANNEL_PATH1);
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100257 channel->listen(bind(&EndToEndFixture::channel_onFaceCreated, this, _1),
258 bind(&EndToEndFixture::channel_onConnectFailed, this, _1));
259
Alexander Afanasyevf6980282014-05-13 18:28:40 -0700260 shared_ptr<stream_protocol::socket> client1 = make_shared<stream_protocol::socket>(ref(g_io));
Junxiao Shi61e3cc52014-03-03 20:40:28 -0700261 client1->async_connect(stream_protocol::endpoint(CHANNEL_PATH1),
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100262 bind(&EndToEndFixture::client_onConnect, this, _1));
263
Junxiao Shi79494162014-04-02 18:25:11 -0700264 BOOST_CHECK_MESSAGE(limitedIo.run(2, time::seconds(1)) == LimitedIo::EXCEED_OPS,
Junxiao Shi7e2413b2014-03-02 11:15:09 -0700265 "UnixStreamChannel error: cannot connect or cannot accept connection");
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100266
Junxiao Shi79494162014-04-02 18:25:11 -0700267 BOOST_CHECK_EQUAL(faces.size(), 1);
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100268
Alexander Afanasyevf6980282014-05-13 18:28:40 -0700269 shared_ptr<stream_protocol::socket> client2 = make_shared<stream_protocol::socket>(ref(g_io));
Junxiao Shi61e3cc52014-03-03 20:40:28 -0700270 client2->async_connect(stream_protocol::endpoint(CHANNEL_PATH1),
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100271 bind(&EndToEndFixture::client_onConnect, this, _1));
272
Junxiao Shi79494162014-04-02 18:25:11 -0700273 BOOST_CHECK_MESSAGE(limitedIo.run(2, time::seconds(1)) == LimitedIo::EXCEED_OPS,
Junxiao Shi7e2413b2014-03-02 11:15:09 -0700274 "UnixStreamChannel error: cannot accept multiple connections");
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100275
Junxiao Shi79494162014-04-02 18:25:11 -0700276 BOOST_CHECK_EQUAL(faces.size(), 2);
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100277
278 // now close one of the faces
Junxiao Shi79494162014-04-02 18:25:11 -0700279 faces.front()->close();
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100280
281 // we should still be able to send/receive with the other one
Junxiao Shi79494162014-04-02 18:25:11 -0700282 face1 = faces.back();
Junxiao Shic099ddb2014-12-25 20:53:20 -0700283 face1->onReceiveInterest.connect(bind(&EndToEndFixture::face1_onReceiveInterest, this, _1));
284 face1->onReceiveData.connect(bind(&EndToEndFixture::face1_onReceiveData, this, _1));
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100285
Junxiao Shi79494162014-04-02 18:25:11 -0700286 face2 = make_shared<UnixStreamFace>(client2);
Junxiao Shic099ddb2014-12-25 20:53:20 -0700287 face2->onReceiveInterest.connect(bind(&EndToEndFixture::face2_onReceiveInterest, this, _1));
288 face2->onReceiveData.connect(bind(&EndToEndFixture::face2_onReceiveData, this, _1));
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100289
Alexander Afanasyev650028d2014-04-25 18:39:10 -0700290 shared_ptr<Interest> interest1 = makeInterest("ndn:/TpnzGvW9R");
291 shared_ptr<Data> data1 = makeData("ndn:/KfczhUqVix");
292 shared_ptr<Interest> interest2 = makeInterest("ndn:/QWiIMfj5sL");
293 shared_ptr<Data> data2 = makeData("ndn:/XNBV796f");
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100294
Alexander Afanasyev650028d2014-04-25 18:39:10 -0700295 face1->sendInterest(*interest1);
296 face1->sendData (*data1 );
297 face2->sendInterest(*interest2);
298 face2->sendData (*data2 );
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100299
Junxiao Shi79494162014-04-02 18:25:11 -0700300 BOOST_CHECK_MESSAGE(limitedIo.run(4, time::seconds(1)) == LimitedIo::EXCEED_OPS,
Junxiao Shi7e2413b2014-03-02 11:15:09 -0700301 "UnixStreamChannel error: cannot send or receive Interest/Data packets");
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100302
Junxiao Shi79494162014-04-02 18:25:11 -0700303 BOOST_REQUIRE_EQUAL(face1_receivedInterests.size(), 1);
304 BOOST_REQUIRE_EQUAL(face1_receivedDatas .size(), 1);
305 BOOST_REQUIRE_EQUAL(face2_receivedInterests.size(), 1);
306 BOOST_REQUIRE_EQUAL(face2_receivedDatas .size(), 1);
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100307
Alexander Afanasyev650028d2014-04-25 18:39:10 -0700308 BOOST_CHECK_EQUAL(face1_receivedInterests[0].getName(), interest2->getName());
309 BOOST_CHECK_EQUAL(face1_receivedDatas [0].getName(), data2->getName());
310 BOOST_CHECK_EQUAL(face2_receivedInterests[0].getName(), interest1->getName());
311 BOOST_CHECK_EQUAL(face2_receivedDatas [0].getName(), data1->getName());
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100312}
313
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800314static inline void
315noOp()
316{
317}
318
319BOOST_FIXTURE_TEST_CASE(UnixStreamFaceLocalControlHeader, EndToEndFixture)
320{
Alexander Afanasyev0eb70652014-02-27 18:35:07 -0800321 UnixStreamFactory factory;
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800322
Junxiao Shi61e3cc52014-03-03 20:40:28 -0700323 shared_ptr<UnixStreamChannel> channel1 = factory.createChannel(CHANNEL_PATH1);
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800324 channel1->listen(bind(&EndToEndFixture::channel1_onFaceCreated, this, _1),
325 bind(&EndToEndFixture::channel1_onConnectFailed, this, _1));
326
Alexander Afanasyevf6980282014-05-13 18:28:40 -0700327 shared_ptr<stream_protocol::socket> client = make_shared<stream_protocol::socket>(ref(g_io));
Junxiao Shi61e3cc52014-03-03 20:40:28 -0700328 client->async_connect(stream_protocol::endpoint(CHANNEL_PATH1),
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800329 bind(&EndToEndFixture::client_onConnect, this, _1));
330
Junxiao Shi79494162014-04-02 18:25:11 -0700331 BOOST_CHECK_MESSAGE(limitedIo.run(2, time::seconds(1)) == LimitedIo::EXCEED_OPS,
Junxiao Shi7e2413b2014-03-02 11:15:09 -0700332 "UnixStreamChannel error: cannot connect or cannot accept connection");
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800333
Junxiao Shi79494162014-04-02 18:25:11 -0700334 BOOST_REQUIRE(static_cast<bool>(face1));
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800335
Junxiao Shi79494162014-04-02 18:25:11 -0700336 face2 = make_shared<UnixStreamFace>(client);
Junxiao Shic099ddb2014-12-25 20:53:20 -0700337 face2->onReceiveInterest.connect(bind(&EndToEndFixture::face2_onReceiveInterest, this, _1));
338 face2->onReceiveData.connect(bind(&EndToEndFixture::face2_onReceiveData, this, _1));
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800339
Alexander Afanasyev650028d2014-04-25 18:39:10 -0700340 shared_ptr<Interest> interest1 = makeInterest("ndn:/TpnzGvW9R");
341 shared_ptr<Data> data1 = makeData("ndn:/KfczhUqVix");
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800342
Junxiao Shi79494162014-04-02 18:25:11 -0700343 face1->setLocalControlHeaderFeature(LOCAL_CONTROL_FEATURE_INCOMING_FACE_ID);
344 face1->setLocalControlHeaderFeature(LOCAL_CONTROL_FEATURE_NEXT_HOP_FACE_ID);
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800345
Junxiao Shi79494162014-04-02 18:25:11 -0700346 BOOST_CHECK(face1->isLocalControlHeaderEnabled(LOCAL_CONTROL_FEATURE_INCOMING_FACE_ID));
347 BOOST_CHECK(face1->isLocalControlHeaderEnabled(LOCAL_CONTROL_FEATURE_NEXT_HOP_FACE_ID));
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800348
Junxiao Shi79494162014-04-02 18:25:11 -0700349 face2->setLocalControlHeaderFeature(LOCAL_CONTROL_FEATURE_INCOMING_FACE_ID);
350 face2->setLocalControlHeaderFeature(LOCAL_CONTROL_FEATURE_NEXT_HOP_FACE_ID);
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800351
Junxiao Shi79494162014-04-02 18:25:11 -0700352 BOOST_CHECK(face2->isLocalControlHeaderEnabled(LOCAL_CONTROL_FEATURE_INCOMING_FACE_ID));
353 BOOST_CHECK(face2->isLocalControlHeaderEnabled(LOCAL_CONTROL_FEATURE_NEXT_HOP_FACE_ID));
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800354
355 ////////////////////////////////////////////////////////
356
Alexander Afanasyev650028d2014-04-25 18:39:10 -0700357 interest1->setIncomingFaceId(11);
358 interest1->setNextHopFaceId(111);
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800359
Alexander Afanasyev650028d2014-04-25 18:39:10 -0700360 face1->sendInterest(*interest1);
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800361
Alexander Afanasyev650028d2014-04-25 18:39:10 -0700362 data1->setIncomingFaceId(22);
363 data1->getLocalControlHeader().setNextHopFaceId(222);
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800364
Alexander Afanasyev650028d2014-04-25 18:39:10 -0700365 face1->sendData(*data1);
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800366
367 //
368
Junxiao Shi79494162014-04-02 18:25:11 -0700369 BOOST_CHECK_MESSAGE(limitedIo.run(2, time::seconds(1)) == LimitedIo::EXCEED_OPS,
Junxiao Shi7e2413b2014-03-02 11:15:09 -0700370 "UnixStreamChannel error: cannot send or receive Interest/Data packets");
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800371
Junxiao Shi79494162014-04-02 18:25:11 -0700372 BOOST_REQUIRE_EQUAL(face2_receivedInterests.size(), 1);
373 BOOST_REQUIRE_EQUAL(face2_receivedDatas .size(), 1);
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800374
375 // sending allows only IncomingFaceId, receiving allows only NextHopFaceId
Junxiao Shi79494162014-04-02 18:25:11 -0700376 BOOST_CHECK_EQUAL(face2_receivedInterests[0].getLocalControlHeader().hasIncomingFaceId(), false);
377 BOOST_CHECK_EQUAL(face2_receivedInterests[0].getLocalControlHeader().hasNextHopFaceId(), false);
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800378
Junxiao Shi79494162014-04-02 18:25:11 -0700379 BOOST_CHECK_EQUAL(face2_receivedDatas[0].getLocalControlHeader().hasIncomingFaceId(), false);
380 BOOST_CHECK_EQUAL(face2_receivedDatas[0].getLocalControlHeader().hasNextHopFaceId(), false);
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800381
382 ////////////////////////////////////////////////////////
383
384 using namespace boost::asio;
385
386 std::vector<const_buffer> interestWithHeader;
Alexander Afanasyeva4ff44c2015-02-13 14:11:37 -0800387 Block iHeader = interest1->getLocalControlHeader().wireEncode(*interest1,
388 ndn::nfd::LocalControlHeader::ENCODE_INCOMING_FACE_ID |
389 ndn::nfd::LocalControlHeader::ENCODE_NEXT_HOP);
Alexander Afanasyev650028d2014-04-25 18:39:10 -0700390 Block iPayload = interest1->wireEncode();
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800391 interestWithHeader.push_back(buffer(iHeader.wire(), iHeader.size()));
392 interestWithHeader.push_back(buffer(iPayload.wire(), iPayload.size()));
393
394 std::vector<const_buffer> dataWithHeader;
Alexander Afanasyeva4ff44c2015-02-13 14:11:37 -0800395 Block dHeader = data1->getLocalControlHeader().wireEncode(*data1,
396 ndn::nfd::LocalControlHeader::ENCODE_INCOMING_FACE_ID |
397 ndn::nfd::LocalControlHeader::ENCODE_NEXT_HOP);
Alexander Afanasyev650028d2014-04-25 18:39:10 -0700398 Block dPayload = data1->wireEncode();
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800399 dataWithHeader.push_back(buffer(dHeader.wire(), dHeader.size()));
400 dataWithHeader.push_back(buffer(dPayload.wire(), dPayload.size()));
401
402 //
403
404 client->async_send(interestWithHeader, bind(&noOp));
405 client->async_send(dataWithHeader, bind(&noOp));
406
Junxiao Shi79494162014-04-02 18:25:11 -0700407 BOOST_CHECK_MESSAGE(limitedIo.run(2, time::seconds(1)) == LimitedIo::EXCEED_OPS,
Junxiao Shi7e2413b2014-03-02 11:15:09 -0700408 "UnixStreamChannel error: cannot send or receive Interest/Data packets");
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800409
Junxiao Shi79494162014-04-02 18:25:11 -0700410 BOOST_REQUIRE_EQUAL(face1_receivedInterests.size(), 1);
411 BOOST_REQUIRE_EQUAL(face1_receivedDatas .size(), 1);
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800412
Junxiao Shi79494162014-04-02 18:25:11 -0700413 BOOST_CHECK_EQUAL(face1_receivedInterests[0].getLocalControlHeader().hasIncomingFaceId(), false);
414 BOOST_CHECK_EQUAL(face1_receivedInterests[0].getLocalControlHeader().hasNextHopFaceId(), true);
415 BOOST_CHECK_EQUAL(face1_receivedInterests[0].getNextHopFaceId(), 111);
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800416
Junxiao Shi79494162014-04-02 18:25:11 -0700417 BOOST_CHECK_EQUAL(face1_receivedDatas[0].getLocalControlHeader().hasIncomingFaceId(), false);
418 BOOST_CHECK_EQUAL(face1_receivedDatas[0].getLocalControlHeader().hasNextHopFaceId(), false);
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800419}
420
Alexander Afanasyev650028d2014-04-25 18:39:10 -0700421
422class SimpleEndToEndFixture : protected BaseFixture
423{
424public:
425 void
426 onFaceCreated(const shared_ptr<Face>& face)
427 {
Junxiao Shic099ddb2014-12-25 20:53:20 -0700428 face->onReceiveInterest.connect(bind(&SimpleEndToEndFixture::onReceiveInterest, this, _1));
429 face->onReceiveData.connect(bind(&SimpleEndToEndFixture::onReceiveData, this, _1));
430 face->onFail.connect(bind(&SimpleEndToEndFixture::onFail, this, face));
Alexander Afanasyev650028d2014-04-25 18:39:10 -0700431
432 if (static_cast<bool>(dynamic_pointer_cast<LocalFace>(face))) {
433 static_pointer_cast<LocalFace>(face)->setLocalControlHeaderFeature(
434 LOCAL_CONTROL_FEATURE_INCOMING_FACE_ID);
435
436 static_pointer_cast<LocalFace>(face)->setLocalControlHeaderFeature(
437 LOCAL_CONTROL_FEATURE_NEXT_HOP_FACE_ID);
438 }
439
440 limitedIo.afterOp();
441 }
442
443 void
444 onConnectFailed(const std::string& reason)
445 {
446 BOOST_CHECK_MESSAGE(false, reason);
447
448 limitedIo.afterOp();
449 }
450
451 void
452 onReceiveInterest(const Interest& interest)
453 {
454 receivedInterests.push_back(interest);
455
456 limitedIo.afterOp();
457 }
458
459 void
460 onReceiveData(const Data& data)
461 {
462 receivedDatas.push_back(data);
463
464 limitedIo.afterOp();
465 }
466
467 void
468 onFail(const shared_ptr<Face>& face)
469 {
470 limitedIo.afterOp();
471 }
472
473public:
474 LimitedIo limitedIo;
475
476 std::vector<Interest> receivedInterests;
477 std::vector<Data> receivedDatas;
478};
479
480
481BOOST_FIXTURE_TEST_CASE_TEMPLATE(CorruptedInput, Dataset,
482 CorruptedPackets, SimpleEndToEndFixture)
483{
484 UnixStreamFactory factory;
485
486 shared_ptr<UnixStreamChannel> channel = factory.createChannel(CHANNEL_PATH1);
487 channel->listen(bind(&SimpleEndToEndFixture::onFaceCreated, this, _1),
488 bind(&SimpleEndToEndFixture::onConnectFailed, this, _1));
489
490 DummyStreamSender<stream_protocol, Dataset> sender;
491 sender.start(stream_protocol::endpoint(CHANNEL_PATH1));
492
493 BOOST_CHECK_MESSAGE(limitedIo.run(LimitedIo::UNLIMITED_OPS,
494 time::seconds(1)) == LimitedIo::EXCEED_TIME,
495 "Exception thrown for " + Dataset::getName());
496}
497
498
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100499BOOST_AUTO_TEST_SUITE_END()
500
Junxiao Shid9ee45c2014-02-27 15:38:11 -0700501} // namespace tests
Davide Pesaventobc4dd8c2014-02-14 20:01:01 +0100502} // namespace nfd