blob: b7254faba019ab49172959d4ae611a3ad0d2e7f8 [file] [log] [blame]
Junxiao Shi38b24c72017-01-05 02:59:31 +00001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Junxiao Shi2d491752017-07-14 21:32:05 +00002/*
Junxiao Shieef49a92018-11-10 12:19:36 +00003 * Copyright (c) 2014-2018, Regents of the University of California,
Junxiao Shi38b24c72017-01-05 02:59:31 +00004 * 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
26#ifndef NFD_TESTS_DAEMON_FACE_FACE_SYSTEM_FIXTURE_HPP
27#define NFD_TESTS_DAEMON_FACE_FACE_SYSTEM_FIXTURE_HPP
28
Junxiao Shi7003c602017-01-10 13:35:28 +000029#include "face/face.hpp"
Junxiao Shi38b24c72017-01-05 02:59:31 +000030#include "face/face-system.hpp"
Junxiao Shi64d99f22017-01-21 23:06:36 +000031#include "face/protocol-factory.hpp"
Junxiao Shi38b24c72017-01-05 02:59:31 +000032#include "fw/face-table.hpp"
33
34#include "tests/test-common.hpp"
Davide Pesavento22fba352017-10-17 15:53:51 -040035#include "test-netif.hpp"
Junxiao Shi2d491752017-07-14 21:32:05 +000036#include <ndn-cxx/net/network-monitor-stub.hpp>
Junxiao Shi38b24c72017-01-05 02:59:31 +000037
38namespace nfd {
39namespace face {
40namespace tests {
41
42using namespace nfd::tests;
43
Junxiao Shi7003c602017-01-10 13:35:28 +000044class FaceSystemFixture : public virtual BaseFixture
Junxiao Shi38b24c72017-01-05 02:59:31 +000045{
46public:
47 FaceSystemFixture()
Junxiao Shi2d491752017-07-14 21:32:05 +000048 : netmon(make_shared<ndn::net::NetworkMonitorStub>(~0))
49 , faceSystem(faceTable, netmon)
Junxiao Shieef49a92018-11-10 12:19:36 +000050 , netdevBound(*faceSystem.m_netdevBound)
Junxiao Shi38b24c72017-01-05 02:59:31 +000051 {
52 faceSystem.setConfigFile(configFile);
53 }
54
Junxiao Shi79a92082017-08-08 02:40:59 +000055 /** \brief Copy a snapshot of NetworkInterface information to \p netmon
56 * \pre netmon contains no NetworkInterface
57 */
58 void
59 copyRealNetifsToNetmon()
60 {
61 BOOST_ASSERT(netmon->listNetworkInterfaces().empty());
62 for (const auto& netif : collectNetworkInterfaces()) {
63 auto copy = netmon->makeNetworkInterface();
64 copy->setIndex(netif->getIndex());
65 copy->setName(netif->getName());
66 copy->setType(netif->getType());
67 copy->setFlags(netif->getFlags());
68 copy->setState(netif->getState());
69 copy->setMtu(netif->getMtu());
70 copy->setEthernetAddress(netif->getEthernetAddress());
71 copy->setEthernetBroadcastAddress(netif->getEthernetBroadcastAddress());
72 for (const auto& na : netif->getNetworkAddresses()) {
73 copy->addNetworkAddress(na);
74 }
75 netmon->addInterface(copy);
76 }
77 netmon->emitEnumerationCompleted();
78 }
79
Junxiao Shi38b24c72017-01-05 02:59:31 +000080 void
81 parseConfig(const std::string& text, bool isDryRun)
82 {
83 configFile.parse(text, isDryRun, "test-config");
84 }
85
86 /** \brief get ProtocolFactory from FaceSystem
87 * \tparam F ProtocolFactory subclass
88 *
89 * If ProtocolFactory with \p scheme does not exist or has an incompatible type,
90 * this fails the test case.
91 */
92 template<typename F>
93 F&
94 getFactoryById(const std::string& id)
95 {
96 F* factory = dynamic_cast<F*>(faceSystem.getFactoryById(id));
97 BOOST_REQUIRE(factory != nullptr);
98 return *factory;
99 }
100
101 /** \brief get ProtocolFactory from FaceSystem
102 * \tparam F ProtocolFactory subclass
103 *
104 * If ProtocolFactory with \p scheme does not exist or has an incompatible type,
105 * this fails the test case.
106 */
107 template<typename F>
108 F&
109 getFactoryByScheme(const std::string& scheme)
110 {
111 F* factory = dynamic_cast<F*>(faceSystem.getFactoryByScheme(scheme));
112 BOOST_REQUIRE(factory != nullptr);
113 return *factory;
114 }
115
Junxiao Shi7003c602017-01-10 13:35:28 +0000116 /** \brief list faces of specified scheme from FaceTable
117 * \param scheme local or remote FaceUri scheme
118 * \param linkType if not NONE, filter by specified LinkType
119 */
120 std::vector<const Face*>
121 listFacesByScheme(const std::string& scheme,
122 ndn::nfd::LinkType linkType = ndn::nfd::LINK_TYPE_NONE) const
123 {
124 std::vector<const Face*> faces;
125 for (const Face& face : faceTable) {
126 if ((face.getLocalUri().getScheme() == scheme ||
127 face.getRemoteUri().getScheme() == scheme) &&
128 (linkType == ndn::nfd::LINK_TYPE_NONE ||
129 face.getLinkType() == linkType)) {
130 faces.push_back(&face);
131 }
132 }
133 return faces;
134 }
135
Junxiao Shi38b24c72017-01-05 02:59:31 +0000136protected:
137 ConfigFile configFile;
138 FaceTable faceTable;
Junxiao Shi2d491752017-07-14 21:32:05 +0000139 shared_ptr<ndn::net::NetworkMonitorStub> netmon;
Junxiao Shi38b24c72017-01-05 02:59:31 +0000140 FaceSystem faceSystem;
Junxiao Shieef49a92018-11-10 12:19:36 +0000141 NetdevBound& netdevBound;
Junxiao Shi38b24c72017-01-05 02:59:31 +0000142};
143
Junxiao Shi0ba6d642017-07-17 00:53:22 +0000144/** \brief FaceSystemFixture with a ProtocolFactory reference
145 */
146template<typename FactoryType>
147class FaceSystemFactoryFixture : public FaceSystemFixture
148{
149protected:
150 FaceSystemFactoryFixture()
151 : factory(getFactoryById<FactoryType>(FactoryType::getId()))
152 {
153 }
154
155protected:
156 FactoryType& factory;
157};
158
Junxiao Shieef49a92018-11-10 12:19:36 +0000159/** \brief A dummy ProtocolFactory for testing FaceSystem configuration parsing.
160 */
161class DummyProtocolFactory : public ProtocolFactory
162{
163public:
Davide Pesaventod27841b2018-11-13 00:22:24 -0500164 using ProtocolFactory::ProtocolFactory;
Junxiao Shieef49a92018-11-10 12:19:36 +0000165
166 void
Davide Pesaventod27841b2018-11-13 00:22:24 -0500167 doProcessConfig(OptionalConfigSection configSection,
168 FaceSystem::ConfigContext& context) final
Junxiao Shieef49a92018-11-10 12:19:36 +0000169 {
170 processConfigHistory.push_back({configSection, context.isDryRun,
171 context.generalConfig.wantCongestionMarking});
172 if (!context.isDryRun) {
Davide Pesaventod27841b2018-11-13 00:22:24 -0500173 providedSchemes = newProvidedSchemes;
Junxiao Shieef49a92018-11-10 12:19:36 +0000174 }
175 }
176
Junxiao Shieef49a92018-11-10 12:19:36 +0000177public:
178 struct ProcessConfigArgs
179 {
180 OptionalConfigSection configSection;
181 bool isDryRun;
182 bool wantCongestionMarking;
183 };
184 std::vector<ProcessConfigArgs> processConfigHistory;
185
186 std::set<std::string> newProvidedSchemes;
187};
188
Junxiao Shi38b24c72017-01-05 02:59:31 +0000189} // namespace tests
190} // namespace face
191} // namespace nfd
192
193#endif // NFD_TESTS_DAEMON_FACE_FACE_SYSTEM_FIXTURE_HPP