blob: 5043d872a6583f6125d258d45784fcf08da03453 [file] [log] [blame]
Junxiao Shicde37ad2015-12-24 01:02:05 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Junxiao Shi0ba6d642017-07-17 00:53:22 +00002/*
Davide Pesaventoe422f9e2022-06-03 01:30:23 -04003 * Copyright (c) 2014-2022, Regents of the University of California,
Junxiao Shicde37ad2015-12-24 01:02:05 -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
26#include "face/websocket-factory.hpp"
27
Junxiao Shi3409cd32017-01-18 15:31:27 +000028#include "face-system-fixture.hpp"
Davide Pesaventob15276f2017-07-15 16:27:13 -040029#include "factory-test-common.hpp"
Junxiao Shicde37ad2015-12-24 01:02:05 -070030
Davide Pesaventoe422f9e2022-06-03 01:30:23 -040031namespace nfd::tests {
32
33using face::WebSocketChannel;
34using face::WebSocketFactory;
Junxiao Shicde37ad2015-12-24 01:02:05 -070035
Davide Pesavento4b89a6e2017-10-07 15:29:50 -040036class WebSocketFactoryFixture : public FaceSystemFactoryFixture<WebSocketFactory>
37{
38protected:
39 shared_ptr<WebSocketChannel>
40 createChannel(const std::string& localIp, const std::string& localPort)
41 {
Davide Pesavento9c33b902018-05-20 01:30:29 -040042 websocket::Endpoint endpoint(boost::asio::ip::address::from_string(localIp),
Davide Pesavento4b89a6e2017-10-07 15:29:50 -040043 boost::lexical_cast<uint16_t>(localPort));
44 return factory.createChannel(endpoint);
45 }
46};
Junxiao Shicde37ad2015-12-24 01:02:05 -070047
Junxiao Shi0ba6d642017-07-17 00:53:22 +000048BOOST_AUTO_TEST_SUITE(Face)
49BOOST_FIXTURE_TEST_SUITE(TestWebSocketFactory, WebSocketFactoryFixture)
50
51BOOST_AUTO_TEST_SUITE(ProcessConfig)
Junxiao Shi3409cd32017-01-18 15:31:27 +000052
Davide Pesavento494a9552018-02-04 22:16:05 -050053BOOST_AUTO_TEST_CASE(Defaults)
Junxiao Shi3409cd32017-01-18 15:31:27 +000054{
55 const std::string CONFIG = R"CONFIG(
56 face_system
57 {
58 websocket
Junxiao Shi3409cd32017-01-18 15:31:27 +000059 }
60 )CONFIG";
61
Junxiao Shi1b65ca12017-01-21 23:04:41 +000062 parseConfig(CONFIG, true);
63 parseConfig(CONFIG, false);
Junxiao Shi3409cd32017-01-18 15:31:27 +000064
Davide Pesavento096f86a2018-11-10 19:51:45 -050065 checkChannelListEqual(factory, {"ws://0.0.0.0:9696", "ws://[::]:9696"});
Davide Pesavento494a9552018-02-04 22:16:05 -050066 auto channels = factory.getChannels();
67 BOOST_CHECK(std::all_of(channels.begin(), channels.end(),
Davide Pesavento096f86a2018-11-10 19:51:45 -050068 [] (const auto& ch) { return ch->isListening(); }));
Junxiao Shi3409cd32017-01-18 15:31:27 +000069}
70
Davide Pesavento494a9552018-02-04 22:16:05 -050071BOOST_AUTO_TEST_CASE(DisableListen)
Junxiao Shi3409cd32017-01-18 15:31:27 +000072{
73 const std::string CONFIG = R"CONFIG(
74 face_system
75 {
76 websocket
77 {
Davide Pesavento494a9552018-02-04 22:16:05 -050078 listen no
79 port 7001
80 }
81 }
82 )CONFIG";
83
84 parseConfig(CONFIG, true);
85 parseConfig(CONFIG, false);
86
87 BOOST_CHECK_EQUAL(factory.getChannels().size(), 0);
88}
89
90BOOST_AUTO_TEST_CASE(DisableV4)
91{
92 const std::string CONFIG = R"CONFIG(
93 face_system
94 {
95 websocket
96 {
97 port 7001
98 enable_v4 no
99 enable_v6 yes
100 }
101 }
102 )CONFIG";
103
Davide Pesavento096f86a2018-11-10 19:51:45 -0500104 parseConfig(CONFIG, true);
105 parseConfig(CONFIG, false);
106
107 checkChannelListEqual(factory, {"ws://[::]:7001"});
Davide Pesavento494a9552018-02-04 22:16:05 -0500108}
109
110BOOST_AUTO_TEST_CASE(DisableV6)
111{
112 const std::string CONFIG = R"CONFIG(
113 face_system
114 {
115 websocket
116 {
117 port 7001
Junxiao Shi3409cd32017-01-18 15:31:27 +0000118 enable_v4 yes
119 enable_v6 no
120 }
121 }
122 )CONFIG";
123
Junxiao Shi1b65ca12017-01-21 23:04:41 +0000124 parseConfig(CONFIG, true);
125 parseConfig(CONFIG, false);
Junxiao Shi3409cd32017-01-18 15:31:27 +0000126
Davide Pesavento494a9552018-02-04 22:16:05 -0500127 checkChannelListEqual(factory, {"ws://0.0.0.0:7001"});
Junxiao Shi3409cd32017-01-18 15:31:27 +0000128}
129
Davide Pesavento096f86a2018-11-10 19:51:45 -0500130BOOST_AUTO_TEST_CASE(ChangePort)
Junxiao Shi3409cd32017-01-18 15:31:27 +0000131{
132 const std::string CONFIG1 = R"CONFIG(
133 face_system
134 {
135 websocket
136 {
137 port 9001
138 }
139 }
140 )CONFIG";
141
Junxiao Shi1b65ca12017-01-21 23:04:41 +0000142 parseConfig(CONFIG1, false);
Davide Pesavento096f86a2018-11-10 19:51:45 -0500143 checkChannelListEqual(factory, {"ws://0.0.0.0:9001", "ws://[::]:9001"});
Junxiao Shi3409cd32017-01-18 15:31:27 +0000144
145 const std::string CONFIG2 = R"CONFIG(
146 face_system
147 {
148 websocket
149 {
150 port 9002
151 }
152 }
153 )CONFIG";
154
Junxiao Shi1b65ca12017-01-21 23:04:41 +0000155 parseConfig(CONFIG2, false);
Davide Pesavento096f86a2018-11-10 19:51:45 -0500156 checkChannelListEqual(factory, {"ws://0.0.0.0:9001", "ws://[::]:9001",
157 "ws://0.0.0.0:9002", "ws://[::]:9002"});
Junxiao Shi3409cd32017-01-18 15:31:27 +0000158}
159
Davide Pesavento494a9552018-02-04 22:16:05 -0500160BOOST_AUTO_TEST_CASE(Omitted)
161{
162 const std::string CONFIG = R"CONFIG(
163 face_system
164 {
165 }
166 )CONFIG";
167
168 parseConfig(CONFIG, true);
169 parseConfig(CONFIG, false);
170
171 BOOST_CHECK_EQUAL(factory.getChannels().size(), 0);
172}
173
174BOOST_AUTO_TEST_CASE(AllDisabled)
175{
176 const std::string CONFIG = R"CONFIG(
177 face_system
178 {
179 websocket
180 {
181 enable_v4 no
182 enable_v6 no
183 }
184 }
185 )CONFIG";
186
187 BOOST_CHECK_THROW(parseConfig(CONFIG, true), ConfigFile::Error);
188 BOOST_CHECK_THROW(parseConfig(CONFIG, false), ConfigFile::Error);
189}
190
191BOOST_AUTO_TEST_CASE(BadListen)
192{
193 const std::string CONFIG = R"CONFIG(
194 face_system
195 {
196 websocket
197 {
198 listen hello
199 }
200 }
201 )CONFIG";
202
203 BOOST_CHECK_THROW(parseConfig(CONFIG, true), ConfigFile::Error);
204 BOOST_CHECK_THROW(parseConfig(CONFIG, false), ConfigFile::Error);
205}
206
Davide Pesavento494a9552018-02-04 22:16:05 -0500207BOOST_AUTO_TEST_CASE(BadPort)
208{
209 // not a number
210 const std::string CONFIG1 = R"CONFIG(
211 face_system
212 {
213 websocket
214 {
215 port hello
216 }
217 }
218 )CONFIG";
219
220 BOOST_CHECK_THROW(parseConfig(CONFIG1, true), ConfigFile::Error);
221 BOOST_CHECK_THROW(parseConfig(CONFIG1, false), ConfigFile::Error);
222
223 // negative number
224 const std::string CONFIG2 = R"CONFIG(
225 face_system
226 {
227 websocket
228 {
229 port -1
230 }
231 }
232 )CONFIG";
233
234 BOOST_CHECK_THROW(parseConfig(CONFIG2, true), ConfigFile::Error);
235 BOOST_CHECK_THROW(parseConfig(CONFIG2, false), ConfigFile::Error);
236
237 // out of range
238 const std::string CONFIG3 = R"CONFIG(
239 face_system
240 {
241 websocket
242 {
243 port 65536
244 }
245 }
246 )CONFIG";
247
248 BOOST_CHECK_THROW(parseConfig(CONFIG3, true), ConfigFile::Error);
249 BOOST_CHECK_THROW(parseConfig(CONFIG3, false), ConfigFile::Error);
250}
251
252BOOST_AUTO_TEST_CASE(UnknownOption)
253{
254 const std::string CONFIG = R"CONFIG(
255 face_system
256 {
257 websocket
258 {
259 hello
260 }
261 }
262 )CONFIG";
263
264 BOOST_CHECK_THROW(parseConfig(CONFIG, true), ConfigFile::Error);
265 BOOST_CHECK_THROW(parseConfig(CONFIG, false), ConfigFile::Error);
266}
267
Junxiao Shi3409cd32017-01-18 15:31:27 +0000268BOOST_AUTO_TEST_SUITE_END() // ProcessConfig
Junxiao Shicde37ad2015-12-24 01:02:05 -0700269
270BOOST_AUTO_TEST_CASE(GetChannels)
271{
Davide Pesaventob15276f2017-07-15 16:27:13 -0400272 BOOST_CHECK_EQUAL(factory.getChannels().empty(), true);
Junxiao Shicde37ad2015-12-24 01:02:05 -0700273
Davide Pesaventob15276f2017-07-15 16:27:13 -0400274 std::set<std::string> expected;
Davide Pesavento4b89a6e2017-10-07 15:29:50 -0400275 expected.insert(createChannel("127.0.0.1", "20070")->getUri().toString());
276 expected.insert(createChannel("127.0.0.1", "20071")->getUri().toString());
277 expected.insert(createChannel("::1", "20071")->getUri().toString());
Davide Pesaventob15276f2017-07-15 16:27:13 -0400278 checkChannelListEqual(factory, expected);
Junxiao Shicde37ad2015-12-24 01:02:05 -0700279}
280
Davide Pesavento096f86a2018-11-10 19:51:45 -0500281BOOST_AUTO_TEST_CASE(CreateChannel)
282{
283 auto channel1 = createChannel("127.0.0.1", "20070");
284 auto channel1a = createChannel("127.0.0.1", "20070");
285 BOOST_CHECK_EQUAL(channel1, channel1a);
286 BOOST_CHECK_EQUAL(channel1->getUri().toString(), "ws://127.0.0.1:20070");
287
288 auto channel2 = createChannel("127.0.0.1", "20071");
289 BOOST_CHECK_NE(channel1, channel2);
290
291 auto channel3 = createChannel("::1", "20071");
292 BOOST_CHECK_NE(channel2, channel3);
293 BOOST_CHECK_EQUAL(channel3->getUri().toString(), "ws://[::1]:20071");
294}
295
Davide Pesaventob15276f2017-07-15 16:27:13 -0400296BOOST_AUTO_TEST_CASE(UnsupportedCreateFace)
Junxiao Shicde37ad2015-12-24 01:02:05 -0700297{
Eric Newberry42602412016-08-27 09:33:18 -0700298 createFace(factory,
299 FaceUri("ws://127.0.0.1:20070"),
Eric Newberry78e32b02017-04-01 14:34:44 +0000300 {},
Eric Newberry812d6152018-06-06 15:06:01 -0700301 {ndn::nfd::FACE_PERSISTENCY_ON_DEMAND, {}, {}, {}, false, false, false},
Eric Newberry42602412016-08-27 09:33:18 -0700302 {CreateFaceExpectedResult::FAILURE, 406, "Unsupported protocol"});
Junxiao Shicde37ad2015-12-24 01:02:05 -0700303
Eric Newberry42602412016-08-27 09:33:18 -0700304 createFace(factory,
305 FaceUri("ws://127.0.0.1:20070"),
Eric Newberry78e32b02017-04-01 14:34:44 +0000306 {},
Eric Newberry812d6152018-06-06 15:06:01 -0700307 {ndn::nfd::FACE_PERSISTENCY_PERSISTENT, {}, {}, {}, false, false, false},
Eric Newberry42602412016-08-27 09:33:18 -0700308 {CreateFaceExpectedResult::FAILURE, 406, "Unsupported protocol"});
Junxiao Shicde37ad2015-12-24 01:02:05 -0700309
Eric Newberry42602412016-08-27 09:33:18 -0700310 createFace(factory,
311 FaceUri("ws://127.0.0.1:20070"),
Eric Newberry78e32b02017-04-01 14:34:44 +0000312 {},
Eric Newberry812d6152018-06-06 15:06:01 -0700313 {ndn::nfd::FACE_PERSISTENCY_PERMANENT, {}, {}, {}, false, false, false},
Eric Newberry42602412016-08-27 09:33:18 -0700314 {CreateFaceExpectedResult::FAILURE, 406, "Unsupported protocol"});
Junxiao Shicde37ad2015-12-24 01:02:05 -0700315}
316
317BOOST_AUTO_TEST_SUITE_END() // TestWebSocketFactory
318BOOST_AUTO_TEST_SUITE_END() // Face
319
Davide Pesaventoe422f9e2022-06-03 01:30:23 -0400320} // namespace nfd::tests