blob: 2bb5a1f7d3180cd3387483f710a20f459532b0b8 [file] [log] [blame]
Junxiao Shib8590312016-12-29 21:22:25 +00001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Junxiao Shi0ba6d642017-07-17 00:53:22 +00002/*
Junxiao Shi38b24c72017-01-05 02:59:31 +00003 * Copyright (c) 2014-2017, Regents of the University of California,
Junxiao Shib8590312016-12-29 21:22:25 +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#include "face/face-system.hpp"
Junxiao Shi38b24c72017-01-05 02:59:31 +000027#include "face-system-fixture.hpp"
Junxiao Shib8590312016-12-29 21:22:25 +000028
Junxiao Shib8590312016-12-29 21:22:25 +000029#include "tests/test-common.hpp"
30
31namespace nfd {
32namespace face {
33namespace tests {
34
Junxiao Shi38b24c72017-01-05 02:59:31 +000035BOOST_AUTO_TEST_SUITE(Face)
36BOOST_FIXTURE_TEST_SUITE(TestFaceSystem, FaceSystemFixture)
37
38BOOST_AUTO_TEST_SUITE(ProcessConfig)
39
40class DummyProtocolFactory : public ProtocolFactory
Junxiao Shib8590312016-12-29 21:22:25 +000041{
42public:
Junxiao Shi0ba6d642017-07-17 00:53:22 +000043 DummyProtocolFactory(const CtorParams& params)
44 : ProtocolFactory(params)
45 {
46 }
47
Junxiao Shi38b24c72017-01-05 02:59:31 +000048 void
49 processConfig(OptionalConfigSection configSection,
50 FaceSystem::ConfigContext& context) override
Junxiao Shib8590312016-12-29 21:22:25 +000051 {
Junxiao Shi38b24c72017-01-05 02:59:31 +000052 processConfigHistory.push_back({configSection, context.isDryRun});
53 if (!context.isDryRun) {
54 this->providedSchemes = this->newProvidedSchemes;
55 }
Junxiao Shib8590312016-12-29 21:22:25 +000056 }
57
58 void
Eric Newberry944f38b2017-07-20 20:54:22 -040059 createFace(const CreateFaceParams& params,
Junxiao Shi38b24c72017-01-05 02:59:31 +000060 const FaceCreatedCallback& onCreated,
61 const FaceCreationFailedCallback& onFailure) override
Junxiao Shib8590312016-12-29 21:22:25 +000062 {
Junxiao Shi38b24c72017-01-05 02:59:31 +000063 BOOST_FAIL("createFace should not be called");
Junxiao Shib8590312016-12-29 21:22:25 +000064 }
65
Junxiao Shi38b24c72017-01-05 02:59:31 +000066 std::vector<shared_ptr<const Channel>>
67 getChannels() const override
68 {
69 BOOST_FAIL("getChannels should not be called");
70 return {};
71 }
72
73public:
74 struct ProcessConfigArgs
75 {
76 OptionalConfigSection configSection;
77 bool isDryRun;
78 };
79 std::vector<ProcessConfigArgs> processConfigHistory;
80
81 std::set<std::string> newProvidedSchemes;
Junxiao Shib8590312016-12-29 21:22:25 +000082};
83
Junxiao Shi38b24c72017-01-05 02:59:31 +000084BOOST_AUTO_TEST_CASE(Normal)
85{
Junxiao Shi0ba6d642017-07-17 00:53:22 +000086 faceSystem.m_factories["f1"] = make_unique<DummyProtocolFactory>(faceSystem.makePFCtorParams());
87 faceSystem.m_factories["f2"] = make_unique<DummyProtocolFactory>(faceSystem.makePFCtorParams());
Junxiao Shib47247d2017-01-24 15:09:16 +000088 auto f1 = static_cast<DummyProtocolFactory*>(faceSystem.getFactoryById("f1"));
89 auto f2 = static_cast<DummyProtocolFactory*>(faceSystem.getFactoryById("f2"));
Junxiao Shi38b24c72017-01-05 02:59:31 +000090
91 const std::string CONFIG = R"CONFIG(
92 face_system
93 {
94 f1
95 {
96 key v1
97 }
98 f2
99 {
100 key v2
101 }
102 }
103 )CONFIG";
104
Junxiao Shib47247d2017-01-24 15:09:16 +0000105 parseConfig(CONFIG, true);
Junxiao Shi38b24c72017-01-05 02:59:31 +0000106 BOOST_REQUIRE_EQUAL(f1->processConfigHistory.size(), 1);
107 BOOST_CHECK_EQUAL(f1->processConfigHistory.back().isDryRun, true);
108 BOOST_CHECK_EQUAL(f1->processConfigHistory.back().configSection->get<std::string>("key"), "v1");
109 BOOST_REQUIRE_EQUAL(f2->processConfigHistory.size(), 1);
110 BOOST_CHECK_EQUAL(f2->processConfigHistory.back().isDryRun, true);
111 BOOST_CHECK_EQUAL(f2->processConfigHistory.back().configSection->get<std::string>("key"), "v2");
112
Junxiao Shib47247d2017-01-24 15:09:16 +0000113 parseConfig(CONFIG, false);
Junxiao Shi38b24c72017-01-05 02:59:31 +0000114 BOOST_REQUIRE_EQUAL(f1->processConfigHistory.size(), 2);
115 BOOST_CHECK_EQUAL(f1->processConfigHistory.back().isDryRun, false);
116 BOOST_CHECK_EQUAL(f1->processConfigHistory.back().configSection->get<std::string>("key"), "v1");
117 BOOST_REQUIRE_EQUAL(f2->processConfigHistory.size(), 2);
118 BOOST_CHECK_EQUAL(f2->processConfigHistory.back().isDryRun, false);
119 BOOST_CHECK_EQUAL(f2->processConfigHistory.back().configSection->get<std::string>("key"), "v2");
120}
121
122BOOST_AUTO_TEST_CASE(OmittedSection)
123{
Junxiao Shi0ba6d642017-07-17 00:53:22 +0000124 faceSystem.m_factories["f1"] = make_unique<DummyProtocolFactory>(faceSystem.makePFCtorParams());
125 faceSystem.m_factories["f2"] = make_unique<DummyProtocolFactory>(faceSystem.makePFCtorParams());
Junxiao Shib47247d2017-01-24 15:09:16 +0000126 auto f1 = static_cast<DummyProtocolFactory*>(faceSystem.getFactoryById("f1"));
127 auto f2 = static_cast<DummyProtocolFactory*>(faceSystem.getFactoryById("f2"));
Junxiao Shi38b24c72017-01-05 02:59:31 +0000128
129 const std::string CONFIG = R"CONFIG(
130 face_system
131 {
132 f1
133 {
134 }
135 }
136 )CONFIG";
137
Junxiao Shib47247d2017-01-24 15:09:16 +0000138 parseConfig(CONFIG, true);
Junxiao Shi38b24c72017-01-05 02:59:31 +0000139 BOOST_REQUIRE_EQUAL(f1->processConfigHistory.size(), 1);
140 BOOST_CHECK_EQUAL(f1->processConfigHistory.back().isDryRun, true);
141 BOOST_REQUIRE_EQUAL(f2->processConfigHistory.size(), 1);
142 BOOST_CHECK_EQUAL(f2->processConfigHistory.back().isDryRun, true);
143 BOOST_CHECK(!f2->processConfigHistory.back().configSection);
144
Junxiao Shib47247d2017-01-24 15:09:16 +0000145 parseConfig(CONFIG, false);
Junxiao Shi38b24c72017-01-05 02:59:31 +0000146 BOOST_REQUIRE_EQUAL(f1->processConfigHistory.size(), 2);
147 BOOST_CHECK_EQUAL(f1->processConfigHistory.back().isDryRun, false);
148 BOOST_REQUIRE_EQUAL(f2->processConfigHistory.size(), 2);
149 BOOST_CHECK_EQUAL(f2->processConfigHistory.back().isDryRun, false);
150 BOOST_CHECK(!f2->processConfigHistory.back().configSection);
151}
152
153BOOST_AUTO_TEST_CASE(UnknownSection)
154{
155 const std::string CONFIG = R"CONFIG(
156 face_system
157 {
158 f0
159 {
160 }
161 }
162 )CONFIG";
163
164 BOOST_CHECK_THROW(parseConfig(CONFIG, true), ConfigFile::Error);
165 BOOST_CHECK_THROW(parseConfig(CONFIG, false), ConfigFile::Error);
166}
167
168BOOST_AUTO_TEST_CASE(ChangeProvidedSchemes)
169{
Junxiao Shi0ba6d642017-07-17 00:53:22 +0000170 faceSystem.m_factories["f1"] = make_unique<DummyProtocolFactory>(faceSystem.makePFCtorParams());
Junxiao Shib47247d2017-01-24 15:09:16 +0000171 auto f1 = static_cast<DummyProtocolFactory*>(faceSystem.getFactoryById("f1"));
Junxiao Shi38b24c72017-01-05 02:59:31 +0000172
173 const std::string CONFIG = R"CONFIG(
174 face_system
175 {
176 f1
177 {
178 }
179 }
180 )CONFIG";
181
182 f1->newProvidedSchemes.insert("s1");
183 f1->newProvidedSchemes.insert("s2");
Junxiao Shib47247d2017-01-24 15:09:16 +0000184 parseConfig(CONFIG, false);
Junxiao Shi38b24c72017-01-05 02:59:31 +0000185 BOOST_CHECK(faceSystem.getFactoryByScheme("f1") == nullptr);
Junxiao Shib47247d2017-01-24 15:09:16 +0000186 BOOST_CHECK_EQUAL(faceSystem.getFactoryByScheme("s1"), f1);
187 BOOST_CHECK_EQUAL(faceSystem.getFactoryByScheme("s2"), f1);
Junxiao Shi38b24c72017-01-05 02:59:31 +0000188
189 f1->newProvidedSchemes.erase("s2");
190 f1->newProvidedSchemes.insert("s3");
Junxiao Shib47247d2017-01-24 15:09:16 +0000191 parseConfig(CONFIG, false);
Junxiao Shi38b24c72017-01-05 02:59:31 +0000192 BOOST_CHECK(faceSystem.getFactoryByScheme("f1") == nullptr);
Junxiao Shib47247d2017-01-24 15:09:16 +0000193 BOOST_CHECK_EQUAL(faceSystem.getFactoryByScheme("s1"), f1);
Junxiao Shi38b24c72017-01-05 02:59:31 +0000194 BOOST_CHECK(faceSystem.getFactoryByScheme("s2") == nullptr);
Junxiao Shib47247d2017-01-24 15:09:16 +0000195 BOOST_CHECK_EQUAL(faceSystem.getFactoryByScheme("s3"), f1);
Junxiao Shi38b24c72017-01-05 02:59:31 +0000196}
197
198BOOST_AUTO_TEST_SUITE_END() // ProcessConfig
199
Junxiao Shib8590312016-12-29 21:22:25 +0000200BOOST_AUTO_TEST_SUITE_END() // TestFaceSystem
201BOOST_AUTO_TEST_SUITE_END() // Mgmt
202
203} // namespace tests
204} // namespace face
205} // namespace nfd