blob: 24d47fd5775148cdd02ebaa9472652513bc1d579 [file] [log] [blame]
Junxiao Shi13546112015-10-14 19:33:07 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Junxiao Shi84d62cb2017-07-12 16:15:18 +00002/*
Davide Pesaventoa3a7a4e2022-05-29 16:06:22 -04003 * Copyright (c) 2014-2022, Regents of the University of California,
Junxiao Shi13546112015-10-14 19:33:07 -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
Eric Newberry8717e872015-11-23 12:41:50 -070026#include "transport-test-common.hpp"
Junxiao Shi13546112015-10-14 19:33:07 -070027
Eric Newberry65caf202015-12-17 15:08:16 -070028#include "unicast-udp-transport-fixture.hpp"
29
Davide Pesavento22fba352017-10-17 15:53:51 -040030#include <boost/mpl/vector.hpp>
31#include <boost/mpl/vector_c.hpp>
32
Junxiao Shi13546112015-10-14 19:33:07 -070033namespace nfd {
34namespace face {
35namespace tests {
36
Junxiao Shi13546112015-10-14 19:33:07 -070037BOOST_AUTO_TEST_SUITE(Face)
Davide Pesavento22fba352017-10-17 15:53:51 -040038BOOST_FIXTURE_TEST_SUITE(TestUnicastUdpTransport, IpTransportFixture<UnicastUdpTransportFixture>)
Junxiao Shi13546112015-10-14 19:33:07 -070039
Davide Pesavento22fba352017-10-17 15:53:51 -040040using UnicastUdpTransportFixtures = boost::mpl::vector<
41 GENERATE_IP_TRANSPORT_FIXTURE_INSTANTIATIONS(UnicastUdpTransportFixture)
42>;
43
44BOOST_FIXTURE_TEST_CASE_TEMPLATE(StaticProperties, T, UnicastUdpTransportFixtures, T)
Junxiao Shi13546112015-10-14 19:33:07 -070045{
Davide Pesavento22fba352017-10-17 15:53:51 -040046 TRANSPORT_TEST_INIT();
Junxiao Shi13546112015-10-14 19:33:07 -070047
Davide Pesavento22fba352017-10-17 15:53:51 -040048 checkStaticPropertiesInitialized(*this->transport);
Eric Newberry65caf202015-12-17 15:08:16 -070049
Davide Pesavento22fba352017-10-17 15:53:51 -040050 BOOST_CHECK_EQUAL(this->transport->getLocalUri(), FaceUri(udp::endpoint(this->address, this->localEp.port())));
51 BOOST_CHECK_EQUAL(this->transport->getRemoteUri(), FaceUri(udp::endpoint(this->address, 7070)));
52 BOOST_CHECK_EQUAL(this->transport->getScope(), ndn::nfd::FACE_SCOPE_NON_LOCAL); // UDP is never local
53 BOOST_CHECK_EQUAL(this->transport->getPersistency(), ndn::nfd::FACE_PERSISTENCY_PERSISTENT);
54 BOOST_CHECK_EQUAL(this->transport->getLinkType(), ndn::nfd::LINK_TYPE_POINT_TO_POINT);
55 BOOST_CHECK_EQUAL(this->transport->getMtu(),
56 this->addressFamily == AddressFamily::V4 ? (65535 - 60 - 8) : (65535 - 8));
Eric Newberryb49313d2017-12-24 20:22:27 -070057 BOOST_CHECK_GT(this->transport->getSendQueueCapacity(), 0);
Eric Newberry65caf202015-12-17 15:08:16 -070058}
59
Davide Pesavento32065652017-01-15 01:52:21 -050060BOOST_AUTO_TEST_CASE(PersistencyChange)
61{
Davide Pesavento22fba352017-10-17 15:53:51 -040062 TRANSPORT_TEST_INIT();
Davide Pesavento32065652017-01-15 01:52:21 -050063
64 BOOST_CHECK_EQUAL(transport->canChangePersistencyTo(ndn::nfd::FACE_PERSISTENCY_ON_DEMAND), true);
65 BOOST_CHECK_EQUAL(transport->canChangePersistencyTo(ndn::nfd::FACE_PERSISTENCY_PERSISTENT), true);
66 BOOST_CHECK_EQUAL(transport->canChangePersistencyTo(ndn::nfd::FACE_PERSISTENCY_PERMANENT), true);
67}
68
Davide Pesavento1816d4b2017-07-02 12:20:48 -040069BOOST_AUTO_TEST_CASE(ExpirationTime)
70{
Davide Pesavento22fba352017-10-17 15:53:51 -040071 TRANSPORT_TEST_INIT(ndn::nfd::FACE_PERSISTENCY_ON_DEMAND);
Davide Pesavento1816d4b2017-07-02 12:20:48 -040072 BOOST_CHECK_NE(transport->getExpirationTime(), time::steady_clock::TimePoint::max());
73
74 transport->setPersistency(ndn::nfd::FACE_PERSISTENCY_PERSISTENT);
75 BOOST_CHECK_EQUAL(transport->getExpirationTime(), time::steady_clock::TimePoint::max());
76
77 transport->setPersistency(ndn::nfd::FACE_PERSISTENCY_ON_DEMAND);
78 BOOST_CHECK_NE(transport->getExpirationTime(), time::steady_clock::TimePoint::max());
79}
80
Eric Newberry65caf202015-12-17 15:08:16 -070081BOOST_AUTO_TEST_CASE(IdleClose)
82{
Davide Pesavento22fba352017-10-17 15:53:51 -040083 TRANSPORT_TEST_INIT(ndn::nfd::FACE_PERSISTENCY_ON_DEMAND);
Davide Pesaventoeee53aa2016-04-11 17:20:21 +020084
Eric Newberry65caf202015-12-17 15:08:16 -070085 int nStateChanges = 0;
Davide Pesavento1816d4b2017-07-02 12:20:48 -040086 transport->afterStateChange.connect(
Davide Pesaventob3a23ca2019-05-04 20:40:21 -040087 [this, &nStateChanges] (auto oldState, auto newState) {
Eric Newberry65caf202015-12-17 15:08:16 -070088 switch (nStateChanges) {
89 case 0:
90 BOOST_CHECK_EQUAL(oldState, TransportState::UP);
91 BOOST_CHECK_EQUAL(newState, TransportState::CLOSING);
92 break;
93 case 1:
94 BOOST_CHECK_EQUAL(oldState, TransportState::CLOSING);
95 BOOST_CHECK_EQUAL(newState, TransportState::CLOSED);
96 break;
97 default:
98 BOOST_CHECK(false);
99 }
100 nStateChanges++;
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400101 this->limitedIo.afterOp();
Eric Newberry65caf202015-12-17 15:08:16 -0700102 });
103
Davide Pesavento14e71f02019-03-28 17:35:25 -0400104 BOOST_REQUIRE_EQUAL(limitedIo.run(2, 8_s), LimitedIo::EXCEED_OPS);
Eric Newberry65caf202015-12-17 15:08:16 -0700105 BOOST_CHECK_EQUAL(nStateChanges, 2);
106}
107
Davide Pesavento22fba352017-10-17 15:53:51 -0400108using RemoteCloseFixture = IpTransportFixture<UnicastUdpTransportFixture,
109 AddressFamily::Any, AddressScope::Loopback>;
110using RemoteClosePersistencies = boost::mpl::vector_c<ndn::nfd::FacePersistency,
111 ndn::nfd::FACE_PERSISTENCY_ON_DEMAND,
112 ndn::nfd::FACE_PERSISTENCY_PERSISTENT>;
Eric Newberry65caf202015-12-17 15:08:16 -0700113
Davide Pesavento22fba352017-10-17 15:53:51 -0400114BOOST_FIXTURE_TEST_CASE_TEMPLATE(RemoteClose, Persistency, RemoteClosePersistencies, RemoteCloseFixture)
Eric Newberry65caf202015-12-17 15:08:16 -0700115{
Davide Pesavento22fba352017-10-17 15:53:51 -0400116 TRANSPORT_TEST_INIT(Persistency::value);
Eric Newberry65caf202015-12-17 15:08:16 -0700117
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400118 transport->afterStateChange.connectSingleShot([this] (auto oldState, auto newState) {
Eric Newberry65caf202015-12-17 15:08:16 -0700119 BOOST_CHECK_EQUAL(oldState, TransportState::UP);
120 BOOST_CHECK_EQUAL(newState, TransportState::FAILED);
121 this->limitedIo.afterOp();
122 });
123
124 remoteSocket.close();
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400125 transport->send(ndn::encoding::makeStringBlock(300, "hello")); // trigger ICMP error
Davide Pesavento14e71f02019-03-28 17:35:25 -0400126 BOOST_REQUIRE_EQUAL(limitedIo.run(1, 1_s), LimitedIo::EXCEED_OPS);
Eric Newberry65caf202015-12-17 15:08:16 -0700127
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400128 transport->afterStateChange.connectSingleShot([this] (auto oldState, auto newState) {
Eric Newberry65caf202015-12-17 15:08:16 -0700129 BOOST_CHECK_EQUAL(oldState, TransportState::FAILED);
130 BOOST_CHECK_EQUAL(newState, TransportState::CLOSED);
131 this->limitedIo.afterOp();
132 });
133
Davide Pesavento14e71f02019-03-28 17:35:25 -0400134 BOOST_REQUIRE_EQUAL(limitedIo.run(1, 1_s), LimitedIo::EXCEED_OPS);
Eric Newberry65caf202015-12-17 15:08:16 -0700135}
136
Davide Pesavento22fba352017-10-17 15:53:51 -0400137BOOST_FIXTURE_TEST_CASE(RemoteClosePermanent, RemoteCloseFixture)
Eric Newberry65caf202015-12-17 15:08:16 -0700138{
Davide Pesavento22fba352017-10-17 15:53:51 -0400139 TRANSPORT_TEST_INIT(ndn::nfd::FACE_PERSISTENCY_PERMANENT);
Eric Newberry65caf202015-12-17 15:08:16 -0700140
141 remoteSocket.close();
142
143 Block block1 = ndn::encoding::makeStringBlock(300, "hello");
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400144 transport->send(block1);
Eric Newberry65caf202015-12-17 15:08:16 -0700145 BOOST_CHECK_EQUAL(transport->getCounters().nOutPackets, 1);
146 BOOST_CHECK_EQUAL(transport->getCounters().nOutBytes, block1.size());
147
Davide Pesavento14e71f02019-03-28 17:35:25 -0400148 limitedIo.defer(1_s);
Eric Newberry65caf202015-12-17 15:08:16 -0700149 BOOST_CHECK_EQUAL(transport->getState(), TransportState::UP);
150
151 remoteConnect();
152
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400153 transport->send(block1);
Eric Newberry65caf202015-12-17 15:08:16 -0700154 BOOST_CHECK_EQUAL(transport->getCounters().nOutPackets, 2);
155 BOOST_CHECK_EQUAL(transport->getCounters().nOutBytes, 2 * block1.size());
156
157 std::vector<uint8_t> readBuf(block1.size());
158 remoteSocket.async_receive(boost::asio::buffer(readBuf),
159 [this] (const boost::system::error_code& error, size_t) {
160 BOOST_REQUIRE_EQUAL(error, boost::system::errc::success);
Davide Pesavento1816d4b2017-07-02 12:20:48 -0400161 limitedIo.afterOp();
Eric Newberry65caf202015-12-17 15:08:16 -0700162 });
Davide Pesavento14e71f02019-03-28 17:35:25 -0400163 BOOST_REQUIRE_EQUAL(limitedIo.run(1, 1_s), LimitedIo::EXCEED_OPS);
Eric Newberry65caf202015-12-17 15:08:16 -0700164
Davide Pesaventoa3a7a4e2022-05-29 16:06:22 -0400165 BOOST_TEST(readBuf == block1, boost::test_tools::per_element());
Eric Newberry65caf202015-12-17 15:08:16 -0700166
167 Block block2 = ndn::encoding::makeStringBlock(301, "world");
168 ndn::Buffer buf(block2.begin(), block2.end());
169 remoteWrite(buf);
170
171 BOOST_CHECK_EQUAL(transport->getCounters().nInPackets, 1);
172 BOOST_CHECK_EQUAL(transport->getCounters().nInBytes, block2.size());
173 BOOST_CHECK_EQUAL(receivedPackets->size(), 1);
174 BOOST_CHECK_EQUAL(transport->getState(), TransportState::UP);
Junxiao Shi13546112015-10-14 19:33:07 -0700175}
176
Junxiao Shi13546112015-10-14 19:33:07 -0700177BOOST_AUTO_TEST_SUITE_END() // TestUnicastUdpTransport
178BOOST_AUTO_TEST_SUITE_END() // Face
179
180} // namespace tests
181} // namespace face
182} // namespace nfd