blob: b85747da6c46861c3c1df1de9425a646364a39f3 [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 Pesaventoae430302023-05-11 01:42:46 -04003 * Copyright (c) 2014-2023, 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 Newberry65caf202015-12-17 15:08:16 -070026#include "unicast-udp-transport-fixture.hpp"
27
Davide Pesavento22fba352017-10-17 15:53:51 -040028#include <boost/mpl/vector.hpp>
29#include <boost/mpl/vector_c.hpp>
30
Davide Pesaventoe422f9e2022-06-03 01:30:23 -040031namespace nfd::tests {
32
33using namespace nfd::face;
Junxiao Shi13546112015-10-14 19:33:07 -070034
Junxiao Shi13546112015-10-14 19:33:07 -070035BOOST_AUTO_TEST_SUITE(Face)
Davide Pesavento22fba352017-10-17 15:53:51 -040036BOOST_FIXTURE_TEST_SUITE(TestUnicastUdpTransport, IpTransportFixture<UnicastUdpTransportFixture>)
Junxiao Shi13546112015-10-14 19:33:07 -070037
Davide Pesavento22fba352017-10-17 15:53:51 -040038using UnicastUdpTransportFixtures = boost::mpl::vector<
39 GENERATE_IP_TRANSPORT_FIXTURE_INSTANTIATIONS(UnicastUdpTransportFixture)
40>;
41
42BOOST_FIXTURE_TEST_CASE_TEMPLATE(StaticProperties, T, UnicastUdpTransportFixtures, T)
Junxiao Shi13546112015-10-14 19:33:07 -070043{
Davide Pesavento22fba352017-10-17 15:53:51 -040044 TRANSPORT_TEST_INIT();
Junxiao Shi13546112015-10-14 19:33:07 -070045
Davide Pesavento22fba352017-10-17 15:53:51 -040046 checkStaticPropertiesInitialized(*this->transport);
Eric Newberry65caf202015-12-17 15:08:16 -070047
Davide Pesavento22fba352017-10-17 15:53:51 -040048 BOOST_CHECK_EQUAL(this->transport->getLocalUri(), FaceUri(udp::endpoint(this->address, this->localEp.port())));
49 BOOST_CHECK_EQUAL(this->transport->getRemoteUri(), FaceUri(udp::endpoint(this->address, 7070)));
50 BOOST_CHECK_EQUAL(this->transport->getScope(), ndn::nfd::FACE_SCOPE_NON_LOCAL); // UDP is never local
51 BOOST_CHECK_EQUAL(this->transport->getPersistency(), ndn::nfd::FACE_PERSISTENCY_PERSISTENT);
52 BOOST_CHECK_EQUAL(this->transport->getLinkType(), ndn::nfd::LINK_TYPE_POINT_TO_POINT);
53 BOOST_CHECK_EQUAL(this->transport->getMtu(),
54 this->addressFamily == AddressFamily::V4 ? (65535 - 60 - 8) : (65535 - 8));
Eric Newberryb49313d2017-12-24 20:22:27 -070055 BOOST_CHECK_GT(this->transport->getSendQueueCapacity(), 0);
Eric Newberry65caf202015-12-17 15:08:16 -070056}
57
Davide Pesavento32065652017-01-15 01:52:21 -050058BOOST_AUTO_TEST_CASE(PersistencyChange)
59{
Davide Pesavento22fba352017-10-17 15:53:51 -040060 TRANSPORT_TEST_INIT();
Davide Pesavento32065652017-01-15 01:52:21 -050061
62 BOOST_CHECK_EQUAL(transport->canChangePersistencyTo(ndn::nfd::FACE_PERSISTENCY_ON_DEMAND), true);
63 BOOST_CHECK_EQUAL(transport->canChangePersistencyTo(ndn::nfd::FACE_PERSISTENCY_PERSISTENT), true);
64 BOOST_CHECK_EQUAL(transport->canChangePersistencyTo(ndn::nfd::FACE_PERSISTENCY_PERMANENT), true);
65}
66
Davide Pesavento1816d4b2017-07-02 12:20:48 -040067BOOST_AUTO_TEST_CASE(ExpirationTime)
68{
Davide Pesavento22fba352017-10-17 15:53:51 -040069 TRANSPORT_TEST_INIT(ndn::nfd::FACE_PERSISTENCY_ON_DEMAND);
Davide Pesaventoae430302023-05-11 01:42:46 -040070 BOOST_CHECK_NE(transport->getExpirationTime(), time::steady_clock::time_point::max());
Davide Pesavento1816d4b2017-07-02 12:20:48 -040071
72 transport->setPersistency(ndn::nfd::FACE_PERSISTENCY_PERSISTENT);
Davide Pesaventoae430302023-05-11 01:42:46 -040073 BOOST_CHECK_EQUAL(transport->getExpirationTime(), time::steady_clock::time_point::max());
Davide Pesavento1816d4b2017-07-02 12:20:48 -040074
75 transport->setPersistency(ndn::nfd::FACE_PERSISTENCY_ON_DEMAND);
Davide Pesaventoae430302023-05-11 01:42:46 -040076 BOOST_CHECK_NE(transport->getExpirationTime(), time::steady_clock::time_point::max());
Davide Pesavento1816d4b2017-07-02 12:20:48 -040077}
78
Eric Newberry65caf202015-12-17 15:08:16 -070079BOOST_AUTO_TEST_CASE(IdleClose)
80{
Davide Pesavento22fba352017-10-17 15:53:51 -040081 TRANSPORT_TEST_INIT(ndn::nfd::FACE_PERSISTENCY_ON_DEMAND);
Davide Pesaventoeee53aa2016-04-11 17:20:21 +020082
Eric Newberry65caf202015-12-17 15:08:16 -070083 int nStateChanges = 0;
Davide Pesavento1816d4b2017-07-02 12:20:48 -040084 transport->afterStateChange.connect(
Davide Pesaventob3a23ca2019-05-04 20:40:21 -040085 [this, &nStateChanges] (auto oldState, auto newState) {
Eric Newberry65caf202015-12-17 15:08:16 -070086 switch (nStateChanges) {
87 case 0:
88 BOOST_CHECK_EQUAL(oldState, TransportState::UP);
89 BOOST_CHECK_EQUAL(newState, TransportState::CLOSING);
90 break;
91 case 1:
92 BOOST_CHECK_EQUAL(oldState, TransportState::CLOSING);
93 BOOST_CHECK_EQUAL(newState, TransportState::CLOSED);
94 break;
95 default:
96 BOOST_CHECK(false);
97 }
98 nStateChanges++;
Davide Pesaventob3a23ca2019-05-04 20:40:21 -040099 this->limitedIo.afterOp();
Eric Newberry65caf202015-12-17 15:08:16 -0700100 });
101
Davide Pesavento14e71f02019-03-28 17:35:25 -0400102 BOOST_REQUIRE_EQUAL(limitedIo.run(2, 8_s), LimitedIo::EXCEED_OPS);
Eric Newberry65caf202015-12-17 15:08:16 -0700103 BOOST_CHECK_EQUAL(nStateChanges, 2);
104}
105
Davide Pesavento22fba352017-10-17 15:53:51 -0400106using RemoteCloseFixture = IpTransportFixture<UnicastUdpTransportFixture,
107 AddressFamily::Any, AddressScope::Loopback>;
108using RemoteClosePersistencies = boost::mpl::vector_c<ndn::nfd::FacePersistency,
109 ndn::nfd::FACE_PERSISTENCY_ON_DEMAND,
110 ndn::nfd::FACE_PERSISTENCY_PERSISTENT>;
Eric Newberry65caf202015-12-17 15:08:16 -0700111
Davide Pesavento22fba352017-10-17 15:53:51 -0400112BOOST_FIXTURE_TEST_CASE_TEMPLATE(RemoteClose, Persistency, RemoteClosePersistencies, RemoteCloseFixture)
Eric Newberry65caf202015-12-17 15:08:16 -0700113{
Davide Pesavento22fba352017-10-17 15:53:51 -0400114 TRANSPORT_TEST_INIT(Persistency::value);
Eric Newberry65caf202015-12-17 15:08:16 -0700115
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400116 transport->afterStateChange.connectSingleShot([this] (auto oldState, auto newState) {
Eric Newberry65caf202015-12-17 15:08:16 -0700117 BOOST_CHECK_EQUAL(oldState, TransportState::UP);
118 BOOST_CHECK_EQUAL(newState, TransportState::FAILED);
119 this->limitedIo.afterOp();
120 });
121
122 remoteSocket.close();
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400123 transport->send(ndn::encoding::makeStringBlock(300, "hello")); // trigger ICMP error
Davide Pesavento14e71f02019-03-28 17:35:25 -0400124 BOOST_REQUIRE_EQUAL(limitedIo.run(1, 1_s), LimitedIo::EXCEED_OPS);
Eric Newberry65caf202015-12-17 15:08:16 -0700125
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400126 transport->afterStateChange.connectSingleShot([this] (auto oldState, auto newState) {
Eric Newberry65caf202015-12-17 15:08:16 -0700127 BOOST_CHECK_EQUAL(oldState, TransportState::FAILED);
128 BOOST_CHECK_EQUAL(newState, TransportState::CLOSED);
129 this->limitedIo.afterOp();
130 });
131
Davide Pesavento14e71f02019-03-28 17:35:25 -0400132 BOOST_REQUIRE_EQUAL(limitedIo.run(1, 1_s), LimitedIo::EXCEED_OPS);
Eric Newberry65caf202015-12-17 15:08:16 -0700133}
134
Davide Pesavento22fba352017-10-17 15:53:51 -0400135BOOST_FIXTURE_TEST_CASE(RemoteClosePermanent, RemoteCloseFixture)
Eric Newberry65caf202015-12-17 15:08:16 -0700136{
Davide Pesavento22fba352017-10-17 15:53:51 -0400137 TRANSPORT_TEST_INIT(ndn::nfd::FACE_PERSISTENCY_PERMANENT);
Eric Newberry65caf202015-12-17 15:08:16 -0700138
139 remoteSocket.close();
140
141 Block block1 = ndn::encoding::makeStringBlock(300, "hello");
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400142 transport->send(block1);
Eric Newberry65caf202015-12-17 15:08:16 -0700143 BOOST_CHECK_EQUAL(transport->getCounters().nOutPackets, 1);
144 BOOST_CHECK_EQUAL(transport->getCounters().nOutBytes, block1.size());
145
Davide Pesavento14e71f02019-03-28 17:35:25 -0400146 limitedIo.defer(1_s);
Eric Newberry65caf202015-12-17 15:08:16 -0700147 BOOST_CHECK_EQUAL(transport->getState(), TransportState::UP);
148
149 remoteConnect();
150
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400151 transport->send(block1);
Eric Newberry65caf202015-12-17 15:08:16 -0700152 BOOST_CHECK_EQUAL(transport->getCounters().nOutPackets, 2);
153 BOOST_CHECK_EQUAL(transport->getCounters().nOutBytes, 2 * block1.size());
154
155 std::vector<uint8_t> readBuf(block1.size());
156 remoteSocket.async_receive(boost::asio::buffer(readBuf),
157 [this] (const boost::system::error_code& error, size_t) {
158 BOOST_REQUIRE_EQUAL(error, boost::system::errc::success);
Davide Pesavento1816d4b2017-07-02 12:20:48 -0400159 limitedIo.afterOp();
Eric Newberry65caf202015-12-17 15:08:16 -0700160 });
Davide Pesavento14e71f02019-03-28 17:35:25 -0400161 BOOST_REQUIRE_EQUAL(limitedIo.run(1, 1_s), LimitedIo::EXCEED_OPS);
Eric Newberry65caf202015-12-17 15:08:16 -0700162
Davide Pesaventoa3a7a4e2022-05-29 16:06:22 -0400163 BOOST_TEST(readBuf == block1, boost::test_tools::per_element());
Eric Newberry65caf202015-12-17 15:08:16 -0700164
165 Block block2 = ndn::encoding::makeStringBlock(301, "world");
166 ndn::Buffer buf(block2.begin(), block2.end());
167 remoteWrite(buf);
168
169 BOOST_CHECK_EQUAL(transport->getCounters().nInPackets, 1);
170 BOOST_CHECK_EQUAL(transport->getCounters().nInBytes, block2.size());
171 BOOST_CHECK_EQUAL(receivedPackets->size(), 1);
172 BOOST_CHECK_EQUAL(transport->getState(), TransportState::UP);
Junxiao Shi13546112015-10-14 19:33:07 -0700173}
174
Junxiao Shi13546112015-10-14 19:33:07 -0700175BOOST_AUTO_TEST_SUITE_END() // TestUnicastUdpTransport
176BOOST_AUTO_TEST_SUITE_END() // Face
177
Davide Pesaventoe422f9e2022-06-03 01:30:23 -0400178} // namespace nfd::tests