blob: d908804f4daef1f605e7eea51d77a241beffdb3c [file] [log] [blame]
Junxiao Shi96dc0c42014-01-30 23:51:59 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
3 * Copyright (C) 2014 Named Data Networking Project
4 * See COPYING for copyright and distribution information.
5 */
6
Alexander Afanasyev0eb70652014-02-27 18:35:07 -08007#include "face/tcp-factory.hpp"
Junxiao Shi96dc0c42014-01-30 23:51:59 -07008#include <ndn-cpp-dev/security/key-chain.hpp>
9
Junxiao Shid9ee45c2014-02-27 15:38:11 -070010#include "tests/test-common.hpp"
Junxiao Shi7e2413b2014-03-02 11:15:09 -070011#include "tests/core/limited-io.hpp"
Junxiao Shi96dc0c42014-01-30 23:51:59 -070012
13namespace nfd {
Junxiao Shid9ee45c2014-02-27 15:38:11 -070014namespace tests {
Junxiao Shi96dc0c42014-01-30 23:51:59 -070015
Junxiao Shid9ee45c2014-02-27 15:38:11 -070016BOOST_FIXTURE_TEST_SUITE(FaceTcp, BaseFixture)
Junxiao Shi96dc0c42014-01-30 23:51:59 -070017
18BOOST_AUTO_TEST_CASE(ChannelMap)
19{
Alexander Afanasyev0eb70652014-02-27 18:35:07 -080020 TcpFactory factory;
Alexander Afanasyev5f1ec252014-02-28 10:59:17 -080021
Alexander Afanasyevd6655302014-02-28 08:41:28 -080022 shared_ptr<TcpChannel> channel1 = factory.createChannel("127.0.0.1", "20070");
23 shared_ptr<TcpChannel> channel1a = factory.createChannel("127.0.0.1", "20070");
Junxiao Shi96dc0c42014-01-30 23:51:59 -070024 BOOST_CHECK_EQUAL(channel1, channel1a);
Junxiao Shi61e3cc52014-03-03 20:40:28 -070025 BOOST_CHECK_EQUAL(channel1->getUri().toString(), "tcp4://127.0.0.1:20070");
Alexander Afanasyev5f1ec252014-02-28 10:59:17 -080026
Alexander Afanasyevd6655302014-02-28 08:41:28 -080027 shared_ptr<TcpChannel> channel2 = factory.createChannel("127.0.0.1", "20071");
Junxiao Shi96dc0c42014-01-30 23:51:59 -070028 BOOST_CHECK_NE(channel1, channel2);
Junxiao Shi61e3cc52014-03-03 20:40:28 -070029
30 shared_ptr<TcpChannel> channel3 = factory.createChannel("::1", "20071");
31 BOOST_CHECK_NE(channel2, channel3);
32 BOOST_CHECK_EQUAL(channel3->getUri().toString(), "tcp6://[::1]:20071");
Junxiao Shi96dc0c42014-01-30 23:51:59 -070033}
34
Junxiao Shid9ee45c2014-02-27 15:38:11 -070035class EndToEndFixture : protected BaseFixture
Junxiao Shi96dc0c42014-01-30 23:51:59 -070036{
37public:
38 void
Alexander Afanasyevbd220a02014-02-20 00:29:56 -080039 channel1_onFaceCreated(const shared_ptr<Face>& newFace)
Junxiao Shi96dc0c42014-01-30 23:51:59 -070040 {
41 BOOST_CHECK(!static_cast<bool>(m_face1));
42 m_face1 = newFace;
43 m_face1->onReceiveInterest +=
44 bind(&EndToEndFixture::face1_onReceiveInterest, this, _1);
45 m_face1->onReceiveData +=
46 bind(&EndToEndFixture::face1_onReceiveData, this, _1);
Alexander Afanasyev5f1ec252014-02-28 10:59:17 -080047 m_face1->onFail +=
Alexander Afanasyeva0a10fb2014-02-13 19:56:15 -080048 bind(&EndToEndFixture::face1_onFail, this);
Junxiao Shi96dc0c42014-01-30 23:51:59 -070049
Junxiao Shi7e2413b2014-03-02 11:15:09 -070050 m_limitedIo.afterOp();
Junxiao Shi96dc0c42014-01-30 23:51:59 -070051 }
52
53 void
54 channel1_onConnectFailed(const std::string& reason)
55 {
56 BOOST_CHECK_MESSAGE(false, reason);
57
Junxiao Shi7e2413b2014-03-02 11:15:09 -070058 m_limitedIo.afterOp();
Junxiao Shi96dc0c42014-01-30 23:51:59 -070059 }
Alexander Afanasyev5f1ec252014-02-28 10:59:17 -080060
Junxiao Shi96dc0c42014-01-30 23:51:59 -070061 void
62 face1_onReceiveInterest(const Interest& interest)
63 {
64 m_face1_receivedInterests.push_back(interest);
65
Junxiao Shi7e2413b2014-03-02 11:15:09 -070066 m_limitedIo.afterOp();
Junxiao Shi96dc0c42014-01-30 23:51:59 -070067 }
Alexander Afanasyev5f1ec252014-02-28 10:59:17 -080068
Junxiao Shi96dc0c42014-01-30 23:51:59 -070069 void
70 face1_onReceiveData(const Data& data)
71 {
72 m_face1_receivedDatas.push_back(data);
73
Junxiao Shi7e2413b2014-03-02 11:15:09 -070074 m_limitedIo.afterOp();
Junxiao Shi96dc0c42014-01-30 23:51:59 -070075 }
76
77 void
Alexander Afanasyeva0a10fb2014-02-13 19:56:15 -080078 face1_onFail()
79 {
80 m_face1.reset();
Junxiao Shi7e2413b2014-03-02 11:15:09 -070081 m_limitedIo.afterOp();
Alexander Afanasyeva0a10fb2014-02-13 19:56:15 -080082 }
83
84 void
Alexander Afanasyevbd220a02014-02-20 00:29:56 -080085 channel2_onFaceCreated(const shared_ptr<Face>& newFace)
Junxiao Shi96dc0c42014-01-30 23:51:59 -070086 {
87 BOOST_CHECK(!static_cast<bool>(m_face2));
88 m_face2 = newFace;
89 m_face2->onReceiveInterest +=
90 bind(&EndToEndFixture::face2_onReceiveInterest, this, _1);
91 m_face2->onReceiveData +=
92 bind(&EndToEndFixture::face2_onReceiveData, this, _1);
Alexander Afanasyev5f1ec252014-02-28 10:59:17 -080093 m_face2->onFail +=
Alexander Afanasyeva0a10fb2014-02-13 19:56:15 -080094 bind(&EndToEndFixture::face2_onFail, this);
Junxiao Shi96dc0c42014-01-30 23:51:59 -070095
Junxiao Shi7e2413b2014-03-02 11:15:09 -070096 m_limitedIo.afterOp();
Junxiao Shi96dc0c42014-01-30 23:51:59 -070097 }
98
99 void
100 channel2_onConnectFailed(const std::string& reason)
101 {
102 BOOST_CHECK_MESSAGE(false, reason);
103
Junxiao Shi7e2413b2014-03-02 11:15:09 -0700104 m_limitedIo.afterOp();
Junxiao Shi96dc0c42014-01-30 23:51:59 -0700105 }
Alexander Afanasyev5f1ec252014-02-28 10:59:17 -0800106
Junxiao Shi96dc0c42014-01-30 23:51:59 -0700107 void
108 face2_onReceiveInterest(const Interest& interest)
109 {
110 m_face2_receivedInterests.push_back(interest);
111
Junxiao Shi7e2413b2014-03-02 11:15:09 -0700112 m_limitedIo.afterOp();
Junxiao Shi96dc0c42014-01-30 23:51:59 -0700113 }
Alexander Afanasyev5f1ec252014-02-28 10:59:17 -0800114
Junxiao Shi96dc0c42014-01-30 23:51:59 -0700115 void
116 face2_onReceiveData(const Data& data)
117 {
118 m_face2_receivedDatas.push_back(data);
119
Junxiao Shi7e2413b2014-03-02 11:15:09 -0700120 m_limitedIo.afterOp();
Junxiao Shi96dc0c42014-01-30 23:51:59 -0700121 }
122
123 void
Alexander Afanasyeva0a10fb2014-02-13 19:56:15 -0800124 face2_onFail()
125 {
126 m_face2.reset();
Junxiao Shi7e2413b2014-03-02 11:15:09 -0700127 m_limitedIo.afterOp();
Alexander Afanasyeva0a10fb2014-02-13 19:56:15 -0800128 }
129
130 void
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800131 channel_onFaceCreated(const shared_ptr<Face>& newFace)
Alexander Afanasyeva16abd22014-01-31 18:12:29 -0800132 {
133 m_faces.push_back(newFace);
Junxiao Shi7e2413b2014-03-02 11:15:09 -0700134 m_limitedIo.afterOp();
Alexander Afanasyeva16abd22014-01-31 18:12:29 -0800135 }
136
137 void
138 channel_onConnectFailed(const std::string& reason)
139 {
140 BOOST_CHECK_MESSAGE(false, reason);
141
Junxiao Shi7e2413b2014-03-02 11:15:09 -0700142 m_limitedIo.afterOp();
Alexander Afanasyeva16abd22014-01-31 18:12:29 -0800143 }
144
145 void
146 checkFaceList(size_t shouldBe)
147 {
148 BOOST_CHECK_EQUAL(m_faces.size(), shouldBe);
149 }
Alexander Afanasyev5f1ec252014-02-28 10:59:17 -0800150
Junxiao Shi96dc0c42014-01-30 23:51:59 -0700151public:
Junxiao Shi7e2413b2014-03-02 11:15:09 -0700152 LimitedIo m_limitedIo;
Junxiao Shi96dc0c42014-01-30 23:51:59 -0700153
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800154 shared_ptr<Face> m_face1;
Junxiao Shi96dc0c42014-01-30 23:51:59 -0700155 std::vector<Interest> m_face1_receivedInterests;
156 std::vector<Data> m_face1_receivedDatas;
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800157 shared_ptr<Face> m_face2;
Junxiao Shi96dc0c42014-01-30 23:51:59 -0700158 std::vector<Interest> m_face2_receivedInterests;
159 std::vector<Data> m_face2_receivedDatas;
Alexander Afanasyeva16abd22014-01-31 18:12:29 -0800160
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800161 std::list< shared_ptr<Face> > m_faces;
Junxiao Shi96dc0c42014-01-30 23:51:59 -0700162};
163
164
Alexander Afanasyeva39b90b2014-03-05 15:31:00 +0000165BOOST_FIXTURE_TEST_CASE(EndToEnd4, EndToEndFixture)
Junxiao Shi96dc0c42014-01-30 23:51:59 -0700166{
Alexander Afanasyev0eb70652014-02-27 18:35:07 -0800167 TcpFactory factory;
Junxiao Shi96dc0c42014-01-30 23:51:59 -0700168
Alexander Afanasyevd6655302014-02-28 08:41:28 -0800169 shared_ptr<TcpChannel> channel1 = factory.createChannel("127.0.0.1", "20070");
Alexander Afanasyeva39b90b2014-03-05 15:31:00 +0000170 factory.createChannel("127.0.0.1", "20071");
Alexander Afanasyev5f1ec252014-02-28 10:59:17 -0800171
Junxiao Shi96dc0c42014-01-30 23:51:59 -0700172 channel1->listen(bind(&EndToEndFixture::channel1_onFaceCreated, this, _1),
173 bind(&EndToEndFixture::channel1_onConnectFailed, this, _1));
Alexander Afanasyev5f1ec252014-02-28 10:59:17 -0800174
Alexander Afanasyeva39b90b2014-03-05 15:31:00 +0000175 factory.createFace(FaceUri("tcp://127.0.0.1:20070"),
176 bind(&EndToEndFixture::channel2_onFaceCreated, this, _1),
177 bind(&EndToEndFixture::channel2_onConnectFailed, this, _1));
Junxiao Shi96dc0c42014-01-30 23:51:59 -0700178
Junxiao Shi7e2413b2014-03-02 11:15:09 -0700179 BOOST_CHECK_MESSAGE(m_limitedIo.run(2, time::seconds(10)) == LimitedIo::EXCEED_OPS,
180 "TcpChannel error: cannot connect or cannot accept connection");
Junxiao Shi96dc0c42014-01-30 23:51:59 -0700181
182 BOOST_REQUIRE(static_cast<bool>(m_face1));
183 BOOST_REQUIRE(static_cast<bool>(m_face2));
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800184
Alexander Afanasyev355c0662014-03-20 18:08:17 -0700185 BOOST_CHECK(m_face1->isOnDemand());
186 BOOST_CHECK(!m_face2->isOnDemand());
187
Alexander Afanasyeva39b90b2014-03-05 15:31:00 +0000188 BOOST_CHECK_EQUAL(m_face2->getUri().toString(), "tcp4://127.0.0.1:20070");
189 // face1 has an unknown URI, since the source port is automatically chosen by OS
190
191 BOOST_CHECK_EQUAL(m_face1->isLocal(), true);
192 BOOST_CHECK_EQUAL(m_face2->isLocal(), true);
193
194 BOOST_CHECK_EQUAL(static_cast<bool>(dynamic_pointer_cast<LocalFace>(m_face1)), true);
195 BOOST_CHECK_EQUAL(static_cast<bool>(dynamic_pointer_cast<LocalFace>(m_face2)), true);
196
197 // integrated tests needs to check that TcpFace for non-loopback fails these tests...
198
199 Interest interest1("ndn:/TpnzGvW9R");
200 Data data1 ("ndn:/KfczhUqVix");
201 data1.setContent(0, 0);
202 Interest interest2("ndn:/QWiIMfj5sL");
203 Data data2 ("ndn:/XNBV796f");
204 data2.setContent(0, 0);
205
206 ndn::SignatureSha256WithRsa fakeSignature;
207 fakeSignature.setValue(ndn::dataBlock(tlv::SignatureValue, reinterpret_cast<const uint8_t*>(0), 0));
208
209 // set fake signature on data1 and data2
210 data1.setSignature(fakeSignature);
211 data2.setSignature(fakeSignature);
212
213 m_face1->sendInterest(interest1);
Alexander Afanasyev7e698e62014-03-07 16:48:35 +0000214 m_face1->sendInterest(interest1);
215 m_face1->sendInterest(interest1);
Alexander Afanasyeva39b90b2014-03-05 15:31:00 +0000216 m_face1->sendData (data1 );
217 m_face2->sendInterest(interest2);
218 m_face2->sendData (data2 );
Alexander Afanasyev7e698e62014-03-07 16:48:35 +0000219 m_face2->sendData (data2 );
220 m_face2->sendData (data2 );
Alexander Afanasyeva39b90b2014-03-05 15:31:00 +0000221
Alexander Afanasyev7e698e62014-03-07 16:48:35 +0000222 BOOST_CHECK_MESSAGE(m_limitedIo.run(8, time::seconds(10)) == LimitedIo::EXCEED_OPS,
Alexander Afanasyeva39b90b2014-03-05 15:31:00 +0000223 "TcpChannel error: cannot send or receive Interest/Data packets");
224
225
226 BOOST_REQUIRE_EQUAL(m_face1_receivedInterests.size(), 1);
Alexander Afanasyev7e698e62014-03-07 16:48:35 +0000227 BOOST_REQUIRE_EQUAL(m_face1_receivedDatas .size(), 3);
228 BOOST_REQUIRE_EQUAL(m_face2_receivedInterests.size(), 3);
Alexander Afanasyeva39b90b2014-03-05 15:31:00 +0000229 BOOST_REQUIRE_EQUAL(m_face2_receivedDatas .size(), 1);
230
231 BOOST_CHECK_EQUAL(m_face1_receivedInterests[0].getName(), interest2.getName());
232 BOOST_CHECK_EQUAL(m_face1_receivedDatas [0].getName(), data2.getName());
233 BOOST_CHECK_EQUAL(m_face2_receivedInterests[0].getName(), interest1.getName());
234 BOOST_CHECK_EQUAL(m_face2_receivedDatas [0].getName(), data1.getName());
Alexander Afanasyev7e698e62014-03-07 16:48:35 +0000235
236 const FaceCounters& counters1 = m_face1->getCounters();
237 BOOST_CHECK_EQUAL(counters1.getInInterest() , 1);
238 BOOST_CHECK_EQUAL(counters1.getInData() , 3);
239 BOOST_CHECK_EQUAL(counters1.getOutInterest(), 3);
240 BOOST_CHECK_EQUAL(counters1.getOutData() , 1);
241
242 const FaceCounters& counters2 = m_face2->getCounters();
243 BOOST_CHECK_EQUAL(counters2.getInInterest() , 3);
244 BOOST_CHECK_EQUAL(counters2.getInData() , 1);
245 BOOST_CHECK_EQUAL(counters2.getOutInterest(), 1);
246 BOOST_CHECK_EQUAL(counters2.getOutData() , 3);
Alexander Afanasyeva39b90b2014-03-05 15:31:00 +0000247}
248
249BOOST_FIXTURE_TEST_CASE(EndToEnd6, EndToEndFixture)
250{
251 TcpFactory factory;
252
253 shared_ptr<TcpChannel> channel1 = factory.createChannel("::1", "20070");
254 shared_ptr<TcpChannel> channel2 = factory.createChannel("::1", "20071");
255
256 channel1->listen(bind(&EndToEndFixture::channel1_onFaceCreated, this, _1),
257 bind(&EndToEndFixture::channel1_onConnectFailed, this, _1));
258
259 factory.createFace(FaceUri("tcp://[::1]:20070"),
260 bind(&EndToEndFixture::channel2_onFaceCreated, this, _1),
261 bind(&EndToEndFixture::channel2_onConnectFailed, this, _1));
262
263 BOOST_CHECK_MESSAGE(m_limitedIo.run(2, time::seconds(10)) == LimitedIo::EXCEED_OPS,
264 "TcpChannel error: cannot connect or cannot accept connection");
265
266 BOOST_REQUIRE(static_cast<bool>(m_face1));
267 BOOST_REQUIRE(static_cast<bool>(m_face2));
268
269 BOOST_CHECK_EQUAL(m_face2->getUri().toString(), "tcp6://[::1]:20070");
270 // face1 has an unknown URI, since the source port is automatically chosen by OS
271
Alexander Afanasyevbd220a02014-02-20 00:29:56 -0800272 BOOST_CHECK_EQUAL(m_face1->isLocal(), true);
273 BOOST_CHECK_EQUAL(m_face2->isLocal(), true);
274
275 BOOST_CHECK_EQUAL(static_cast<bool>(dynamic_pointer_cast<LocalFace>(m_face1)), true);
276 BOOST_CHECK_EQUAL(static_cast<bool>(dynamic_pointer_cast<LocalFace>(m_face2)), true);
277
278 // integrated tests needs to check that TcpFace for non-loopback fails these tests...
Alexander Afanasyev5f1ec252014-02-28 10:59:17 -0800279
Junxiao Shi96dc0c42014-01-30 23:51:59 -0700280 Interest interest1("ndn:/TpnzGvW9R");
281 Data data1 ("ndn:/KfczhUqVix");
282 data1.setContent(0, 0);
283 Interest interest2("ndn:/QWiIMfj5sL");
284 Data data2 ("ndn:/XNBV796f");
285 data2.setContent(0, 0);
286
287 ndn::SignatureSha256WithRsa fakeSignature;
288 fakeSignature.setValue(ndn::dataBlock(tlv::SignatureValue, reinterpret_cast<const uint8_t*>(0), 0));
Alexander Afanasyev5f1ec252014-02-28 10:59:17 -0800289
Junxiao Shi96dc0c42014-01-30 23:51:59 -0700290 // set fake signature on data1 and data2
291 data1.setSignature(fakeSignature);
292 data2.setSignature(fakeSignature);
Alexander Afanasyev5f1ec252014-02-28 10:59:17 -0800293
Junxiao Shi96dc0c42014-01-30 23:51:59 -0700294 m_face1->sendInterest(interest1);
295 m_face1->sendData (data1 );
296 m_face2->sendInterest(interest2);
297 m_face2->sendData (data2 );
298
Junxiao Shi7e2413b2014-03-02 11:15:09 -0700299 BOOST_CHECK_MESSAGE(m_limitedIo.run(4, time::seconds(10)) == LimitedIo::EXCEED_OPS,
300 "TcpChannel error: cannot send or receive Interest/Data packets");
301
Junxiao Shi96dc0c42014-01-30 23:51:59 -0700302
303 BOOST_REQUIRE_EQUAL(m_face1_receivedInterests.size(), 1);
304 BOOST_REQUIRE_EQUAL(m_face1_receivedDatas .size(), 1);
305 BOOST_REQUIRE_EQUAL(m_face2_receivedInterests.size(), 1);
306 BOOST_REQUIRE_EQUAL(m_face2_receivedDatas .size(), 1);
Alexander Afanasyev5f1ec252014-02-28 10:59:17 -0800307
Junxiao Shi96dc0c42014-01-30 23:51:59 -0700308 BOOST_CHECK_EQUAL(m_face1_receivedInterests[0].getName(), interest2.getName());
309 BOOST_CHECK_EQUAL(m_face1_receivedDatas [0].getName(), data2.getName());
310 BOOST_CHECK_EQUAL(m_face2_receivedInterests[0].getName(), interest1.getName());
311 BOOST_CHECK_EQUAL(m_face2_receivedDatas [0].getName(), data1.getName());
312}
313
Alexander Afanasyeva16abd22014-01-31 18:12:29 -0800314BOOST_FIXTURE_TEST_CASE(MultipleAccepts, EndToEndFixture)
315{
Alexander Afanasyev0eb70652014-02-27 18:35:07 -0800316 TcpFactory factory;
Alexander Afanasyeva16abd22014-01-31 18:12:29 -0800317
Alexander Afanasyevd6655302014-02-28 08:41:28 -0800318 shared_ptr<TcpChannel> channel1 = factory.createChannel("127.0.0.1", "20070");
319 shared_ptr<TcpChannel> channel2 = factory.createChannel("127.0.0.1", "20071");
Alexander Afanasyev5f1ec252014-02-28 10:59:17 -0800320
Alexander Afanasyeva16abd22014-01-31 18:12:29 -0800321 channel1->listen(bind(&EndToEndFixture::channel_onFaceCreated, this, _1),
322 bind(&EndToEndFixture::channel_onConnectFailed, this, _1));
Alexander Afanasyev5f1ec252014-02-28 10:59:17 -0800323
Alexander Afanasyeva16abd22014-01-31 18:12:29 -0800324 channel2->connect("127.0.0.1", "20070",
325 bind(&EndToEndFixture::channel_onFaceCreated, this, _1),
326 bind(&EndToEndFixture::channel_onConnectFailed, this, _1),
Alexander Afanasyevc1e2ee02014-02-25 17:02:07 -0800327 time::seconds(4)); // very short timeout
Alexander Afanasyeva16abd22014-01-31 18:12:29 -0800328
Junxiao Shi7e2413b2014-03-02 11:15:09 -0700329 BOOST_CHECK_MESSAGE(m_limitedIo.run(2, time::seconds(10)) == LimitedIo::EXCEED_OPS,
330 "TcpChannel error: cannot connect or cannot accept connection");
331
Alexander Afanasyeva16abd22014-01-31 18:12:29 -0800332
333 BOOST_CHECK_EQUAL(m_faces.size(), 2);
Alexander Afanasyev5f1ec252014-02-28 10:59:17 -0800334
Alexander Afanasyevd6655302014-02-28 08:41:28 -0800335 shared_ptr<TcpChannel> channel3 = factory.createChannel("127.0.0.1", "20072");
Alexander Afanasyeva16abd22014-01-31 18:12:29 -0800336 channel3->connect("127.0.0.1", "20070",
337 bind(&EndToEndFixture::channel_onFaceCreated, this, _1),
338 bind(&EndToEndFixture::channel_onConnectFailed, this, _1),
Alexander Afanasyevc1e2ee02014-02-25 17:02:07 -0800339 time::seconds(4)); // very short timeout
Alexander Afanasyeva16abd22014-01-31 18:12:29 -0800340
341
Alexander Afanasyevd6655302014-02-28 08:41:28 -0800342 shared_ptr<TcpChannel> channel4 = factory.createChannel("127.0.0.1", "20073");
Alexander Afanasyeva16abd22014-01-31 18:12:29 -0800343
344 BOOST_CHECK_NE(channel3, channel4);
Alexander Afanasyev5f1ec252014-02-28 10:59:17 -0800345
Junxiao Shi7e2413b2014-03-02 11:15:09 -0700346 scheduler::schedule(time::seconds(1),
347 bind(&TcpChannel::connect, channel4, "127.0.0.1", "20070",
Alexander Afanasyeva16abd22014-01-31 18:12:29 -0800348 // does not work without static_cast
Junxiao Shi7e2413b2014-03-02 11:15:09 -0700349 static_cast<TcpChannel::FaceCreatedCallback>(
350 bind(&EndToEndFixture::channel_onFaceCreated, this, _1)),
351 static_cast<TcpChannel::ConnectFailedCallback>(
352 bind(&EndToEndFixture::channel_onConnectFailed, this, _1)),
353 time::seconds(4)));
Alexander Afanasyeva16abd22014-01-31 18:12:29 -0800354
Alexander Afanasyeveb3197f2014-03-17 19:28:18 -0700355 scheduler::schedule(time::milliseconds(500),
Alexander Afanasyev7329e022014-02-27 14:47:22 -0800356 bind(&EndToEndFixture::checkFaceList, this, 4));
Alexander Afanasyev5f1ec252014-02-28 10:59:17 -0800357
Junxiao Shi7e2413b2014-03-02 11:15:09 -0700358 BOOST_CHECK_MESSAGE(m_limitedIo.run(4,// 2 connects and 2 accepts
359 time::seconds(10)) == LimitedIo::EXCEED_OPS,
360 "TcpChannel error: cannot connect or cannot accept multiple connections");
Alexander Afanasyev7329e022014-02-27 14:47:22 -0800361
Alexander Afanasyeva16abd22014-01-31 18:12:29 -0800362 BOOST_CHECK_EQUAL(m_faces.size(), 6);
363}
364
Alexander Afanasyeva0a10fb2014-02-13 19:56:15 -0800365
366BOOST_FIXTURE_TEST_CASE(FaceClosing, EndToEndFixture)
367{
Alexander Afanasyev0eb70652014-02-27 18:35:07 -0800368 TcpFactory factory;
Alexander Afanasyeva0a10fb2014-02-13 19:56:15 -0800369
Alexander Afanasyevd6655302014-02-28 08:41:28 -0800370 shared_ptr<TcpChannel> channel1 = factory.createChannel("127.0.0.1", "20070");
371 shared_ptr<TcpChannel> channel2 = factory.createChannel("127.0.0.1", "20071");
Alexander Afanasyev5f1ec252014-02-28 10:59:17 -0800372
Alexander Afanasyeva0a10fb2014-02-13 19:56:15 -0800373 channel1->listen(bind(&EndToEndFixture::channel1_onFaceCreated, this, _1),
374 bind(&EndToEndFixture::channel1_onConnectFailed, this, _1));
Alexander Afanasyev5f1ec252014-02-28 10:59:17 -0800375
Alexander Afanasyeva0a10fb2014-02-13 19:56:15 -0800376 channel2->connect("127.0.0.1", "20070",
377 bind(&EndToEndFixture::channel2_onFaceCreated, this, _1),
378 bind(&EndToEndFixture::channel2_onConnectFailed, this, _1),
Alexander Afanasyevc1e2ee02014-02-25 17:02:07 -0800379 time::seconds(4)); // very short timeout
Alexander Afanasyeva0a10fb2014-02-13 19:56:15 -0800380
Junxiao Shi7e2413b2014-03-02 11:15:09 -0700381 BOOST_CHECK_MESSAGE(m_limitedIo.run(2, time::seconds(10)) == LimitedIo::EXCEED_OPS,
382 "TcpChannel error: cannot connect or cannot accept connection");
Alexander Afanasyeva0a10fb2014-02-13 19:56:15 -0800383
384 BOOST_CHECK_EQUAL(channel1->size(), 1);
385 BOOST_CHECK_EQUAL(channel2->size(), 1);
386
Alexander Afanasyeva0a10fb2014-02-13 19:56:15 -0800387 BOOST_REQUIRE(static_cast<bool>(m_face1));
388 BOOST_CHECK(static_cast<bool>(m_face2));
389
Junxiao Shi7e2413b2014-03-02 11:15:09 -0700390 // Face::close must be invoked during io run to be counted as an op
Alexander Afanasyeveb3197f2014-03-17 19:28:18 -0700391 scheduler::schedule(time::milliseconds(100), bind(&Face::close, m_face1));
Alexander Afanasyev5f1ec252014-02-28 10:59:17 -0800392
Junxiao Shi7e2413b2014-03-02 11:15:09 -0700393 BOOST_CHECK_MESSAGE(m_limitedIo.run(2, time::seconds(10)) == LimitedIo::EXCEED_OPS,
394 "FaceClosing error: cannot properly close faces");
Alexander Afanasyeva0a10fb2014-02-13 19:56:15 -0800395
396 // both faces should get closed
397 BOOST_CHECK(!static_cast<bool>(m_face1));
398 BOOST_CHECK(!static_cast<bool>(m_face2));
Alexander Afanasyev5f1ec252014-02-28 10:59:17 -0800399
Alexander Afanasyeva0a10fb2014-02-13 19:56:15 -0800400 BOOST_CHECK_EQUAL(channel1->size(), 0);
401 BOOST_CHECK_EQUAL(channel2->size(), 0);
402}
403
404
Junxiao Shi96dc0c42014-01-30 23:51:59 -0700405BOOST_AUTO_TEST_SUITE_END()
406
Junxiao Shid9ee45c2014-02-27 15:38:11 -0700407} // namespace tests
Junxiao Shi96dc0c42014-01-30 23:51:59 -0700408} // namespace nfd