blob: 4a90c777f91414a77f49a735e6bbc20113621cc2 [file] [log] [blame]
Junxiao Shi5b8a2b22015-10-22 17:20:44 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Davide Pesavento22fba352017-10-17 15:53:51 -04002/*
Davide Pesaventod7083a52023-10-19 17:51:16 -04003 * Copyright (c) 2014-2023, Regents of the University of California,
Junxiao Shi5b8a2b22015-10-22 17:20:44 -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#ifndef NFD_TESTS_DAEMON_FACE_TRANSPORT_TEST_COMMON_HPP
27#define NFD_TESTS_DAEMON_FACE_TRANSPORT_TEST_COMMON_HPP
Junxiao Shi5b8a2b22015-10-22 17:20:44 -070028
29#include "face/transport.hpp"
Junxiao Shi5b8a2b22015-10-22 17:20:44 -070030#include "tests/test-common.hpp"
Davide Pesavento22fba352017-10-17 15:53:51 -040031#include "test-ip.hpp"
Junxiao Shi5b8a2b22015-10-22 17:20:44 -070032
Davide Pesaventoe422f9e2022-06-03 01:30:23 -040033namespace nfd::tests {
Junxiao Shi5b8a2b22015-10-22 17:20:44 -070034
Davide Pesaventod7083a52023-10-19 17:51:16 -040035/**
36 * \brief Check that a transport has all its static properties set after initialization.
Junxiao Shi5b8a2b22015-10-22 17:20:44 -070037 *
Davide Pesaventod7083a52023-10-19 17:51:16 -040038 * This check shall be inserted to the StaticProperties test case for each transport,
39 * in addition to checking the values of properties.
40 * When a new static property is defined, this test case shall be updated.
41 * Thus, if a transport forgets to set a static property, this check would fail.
Junxiao Shi5b8a2b22015-10-22 17:20:44 -070042 */
43inline void
Davide Pesaventoe422f9e2022-06-03 01:30:23 -040044checkStaticPropertiesInitialized(const face::Transport& transport)
Junxiao Shi5b8a2b22015-10-22 17:20:44 -070045{
Davide Pesaventod7083a52023-10-19 17:51:16 -040046 BOOST_TEST(transport.getLocalUri().getScheme().empty() == false);
47 BOOST_TEST(transport.getRemoteUri().getScheme().empty() == false);
48 BOOST_TEST(transport.getScope() != ndn::nfd::FACE_SCOPE_NONE);
49 BOOST_TEST(transport.getPersistency() != ndn::nfd::FACE_PERSISTENCY_NONE);
50 BOOST_TEST(transport.getLinkType() != ndn::nfd::LINK_TYPE_NONE);
51 BOOST_TEST(transport.getMtu() != face::MTU_INVALID);
Junxiao Shi5b8a2b22015-10-22 17:20:44 -070052}
53
Davide Pesaventod7083a52023-10-19 17:51:16 -040054/**
55 * \brief Generic wrapper for transport fixtures that require an IP address.
Davide Pesavento22fba352017-10-17 15:53:51 -040056 */
57template<typename TransportFixtureBase,
58 AddressFamily AF = AddressFamily::Any,
59 AddressScope AS = AddressScope::Any,
60 MulticastInterface MC = MulticastInterface::Any>
61class IpTransportFixture : public TransportFixtureBase
62{
63protected:
64 IpTransportFixture()
65 {
Davide Pesavento279af1c2022-08-29 20:18:32 -040066 std::tie(interface, address) = getTestInterfaceAndIp(AF, AS, MC);
67
Davide Pesavento22fba352017-10-17 15:53:51 -040068 BOOST_TEST_MESSAGE("Testing with AddressFamily=" << AF <<
69 " AddressScope=" << AS <<
70 " MulticastInterface=" << MC <<
Davide Pesavento279af1c2022-08-29 20:18:32 -040071 " TestInterface=" << (interface == nullptr ? "N/A" : interface->getName()) <<
72 " TestIp=" << (address.is_unspecified() ? "N/A" : address.to_string()));
Davide Pesavento22fba352017-10-17 15:53:51 -040073 }
74
Davide Pesavento279af1c2022-08-29 20:18:32 -040075 [[nodiscard]] std::tuple<bool, std::string>
Davide Pesavento22fba352017-10-17 15:53:51 -040076 checkPreconditions() const
77 {
Davide Pesavento279af1c2022-08-29 20:18:32 -040078 return {interface != nullptr && !address.is_unspecified(),
79 "no appropriate interface or IP address available"};
Davide Pesavento22fba352017-10-17 15:53:51 -040080 }
81
82 template<typename... Args>
83 void
84 initialize(Args&&... args)
85 {
Davide Pesavento279af1c2022-08-29 20:18:32 -040086 TransportFixtureBase::initialize(interface, address, std::forward<Args>(args)...);
Davide Pesavento22fba352017-10-17 15:53:51 -040087 }
88
89protected:
90 static constexpr AddressFamily addressFamily = AF;
91 static constexpr AddressScope addressScope = AS;
Davide Pesavento279af1c2022-08-29 20:18:32 -040092
93 shared_ptr<const ndn::net::NetworkInterface> interface;
94 boost::asio::ip::address address;
Davide Pesavento22fba352017-10-17 15:53:51 -040095};
96
Davide Pesaventoe422f9e2022-06-03 01:30:23 -040097} // namespace nfd::tests
Junxiao Shi5b8a2b22015-10-22 17:20:44 -070098
Davide Pesavento22fba352017-10-17 15:53:51 -040099#define GENERATE_IP_TRANSPORT_FIXTURE_INSTANTIATIONS(F) \
100 IpTransportFixture<F, AddressFamily::V4, AddressScope::Loopback>, \
101 IpTransportFixture<F, AddressFamily::V4, AddressScope::Global>, \
102 IpTransportFixture<F, AddressFamily::V6, AddressScope::Loopback>, \
103 IpTransportFixture<F, AddressFamily::V6, AddressScope::LinkLocal>, \
104 IpTransportFixture<F, AddressFamily::V6, AddressScope::Global>
105
106#define TRANSPORT_TEST_CHECK_PRECONDITIONS() \
107 do { \
Davide Pesaventoe422f9e2022-06-03 01:30:23 -0400108 auto [ok, reason] = this->checkPreconditions(); \
109 if (!ok) { \
110 BOOST_WARN_MESSAGE(false, "skipping test case: " << reason); \
Davide Pesavento22fba352017-10-17 15:53:51 -0400111 return; \
112 } \
113 } while (false)
114
115#define TRANSPORT_TEST_INIT(...) \
116 do { \
117 TRANSPORT_TEST_CHECK_PRECONDITIONS(); \
118 this->initialize(__VA_ARGS__); \
119 } while (false)
120
Eric Newberry8717e872015-11-23 12:41:50 -0700121#endif // NFD_TESTS_DAEMON_FACE_TRANSPORT_TEST_COMMON_HPP