blob: 3eb43b76b299c8ccf04e6285a80e118d26cfb836 [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 Pesavento4c957712024-01-01 15:40:06 -05003 * Copyright (c) 2014-2024, 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/unix-stream-factory.hpp"
27
Junxiao Shi406deb52017-01-05 20:07:44 +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 Pesavento401d1a42024-12-19 21:10:22 -050031#include <filesystem>
Davide Pesavento4c957712024-01-01 15:40:06 -050032
Davide Pesaventoe422f9e2022-06-03 01:30:23 -040033namespace nfd::tests {
34
Davide Pesavento4c957712024-01-01 15:40:06 -050035using UnixStreamFactoryFixture = FaceSystemFactoryFixture<face::UnixStreamFactory>;
Junxiao Shi0ba6d642017-07-17 00:53:22 +000036
Junxiao Shicde37ad2015-12-24 01:02:05 -070037BOOST_AUTO_TEST_SUITE(Face)
Junxiao Shi0ba6d642017-07-17 00:53:22 +000038BOOST_FIXTURE_TEST_SUITE(TestUnixStreamFactory, UnixStreamFactoryFixture)
Junxiao Shicde37ad2015-12-24 01:02:05 -070039
Junxiao Shi0ba6d642017-07-17 00:53:22 +000040BOOST_AUTO_TEST_SUITE(ProcessConfig)
Junxiao Shi406deb52017-01-05 20:07:44 +000041
Davide Pesavento4c957712024-01-01 15:40:06 -050042BOOST_AUTO_TEST_CASE(AbsolutePath)
Junxiao Shi406deb52017-01-05 20:07:44 +000043{
44 const std::string CONFIG = R"CONFIG(
45 face_system
46 {
47 unix
48 {
Davide Pesavento494a9552018-02-04 22:16:05 -050049 path /tmp/nfd-test.sock
Junxiao Shi406deb52017-01-05 20:07:44 +000050 }
51 }
52 )CONFIG";
53
Junxiao Shi1b65ca12017-01-21 23:04:41 +000054 parseConfig(CONFIG, true);
55 parseConfig(CONFIG, false);
Junxiao Shi406deb52017-01-05 20:07:44 +000056
Davide Pesavento494a9552018-02-04 22:16:05 -050057 BOOST_REQUIRE_EQUAL(factory.getChannels().size(), 1);
Davide Pesavento4c957712024-01-01 15:40:06 -050058 BOOST_TEST(factory.getChannels().front()->isListening());
59
Davide Pesavento494a9552018-02-04 22:16:05 -050060 const auto& uri = factory.getChannels().front()->getUri();
Davide Pesavento4c957712024-01-01 15:40:06 -050061 BOOST_TEST(uri.getScheme() == "unix");
Davide Pesavento401d1a42024-12-19 21:10:22 -050062 BOOST_TEST(uri.getPath() == std::filesystem::canonical("/tmp/nfd-test.sock"));
Davide Pesavento4c957712024-01-01 15:40:06 -050063}
64
65BOOST_AUTO_TEST_CASE(RelativePath)
66{
67 const std::string CONFIG = R"CONFIG(
68 face_system
69 {
70 unix
71 {
72 path nfd-test.sock
73 }
74 }
75 )CONFIG";
76
77 parseConfig(CONFIG, true);
78 parseConfig(CONFIG, false);
79
80 BOOST_REQUIRE_EQUAL(factory.getChannels().size(), 1);
81 BOOST_TEST(factory.getChannels().front()->isListening());
82
83 const auto& uri = factory.getChannels().front()->getUri();
84 BOOST_TEST(uri.getScheme() == "unix");
Davide Pesavento401d1a42024-12-19 21:10:22 -050085 BOOST_TEST(uri.getPath() == std::filesystem::canonical("nfd-test.sock"));
Junxiao Shi406deb52017-01-05 20:07:44 +000086}
87
88BOOST_AUTO_TEST_CASE(Omitted)
89{
90 const std::string CONFIG = R"CONFIG(
91 face_system
92 {
93 }
94 )CONFIG";
95
Junxiao Shi1b65ca12017-01-21 23:04:41 +000096 parseConfig(CONFIG, true);
97 parseConfig(CONFIG, false);
Junxiao Shi406deb52017-01-05 20:07:44 +000098
Junxiao Shi406deb52017-01-05 20:07:44 +000099 BOOST_CHECK_EQUAL(factory.getChannels().size(), 0);
100}
101
102BOOST_AUTO_TEST_CASE(UnknownOption)
103{
104 const std::string CONFIG = R"CONFIG(
105 face_system
106 {
107 unix
108 {
109 hello
110 }
111 }
112 )CONFIG";
113
114 BOOST_CHECK_THROW(parseConfig(CONFIG, true), ConfigFile::Error);
115 BOOST_CHECK_THROW(parseConfig(CONFIG, false), ConfigFile::Error);
116}
117
118BOOST_AUTO_TEST_SUITE_END() // ProcessConfig
119
Davide Pesavento4c957712024-01-01 15:40:06 -0500120const std::string CHANNEL_PATH1("unix-stream-test.1.sock");
121const std::string CHANNEL_PATH2("unix-stream-test.2.sock");
122
Davide Pesaventob15276f2017-07-15 16:27:13 -0400123BOOST_AUTO_TEST_CASE(GetChannels)
Junxiao Shicde37ad2015-12-24 01:02:05 -0700124{
Davide Pesaventob15276f2017-07-15 16:27:13 -0400125 BOOST_CHECK_EQUAL(factory.getChannels().empty(), true);
Junxiao Shicde37ad2015-12-24 01:02:05 -0700126
Davide Pesaventob15276f2017-07-15 16:27:13 -0400127 std::set<std::string> expected;
128 expected.insert(factory.createChannel(CHANNEL_PATH1)->getUri().toString());
129 expected.insert(factory.createChannel(CHANNEL_PATH2)->getUri().toString());
130 checkChannelListEqual(factory, expected);
131}
132
133BOOST_AUTO_TEST_CASE(CreateChannel)
134{
Davide Pesavento4c957712024-01-01 15:40:06 -0500135 auto channel1 = factory.createChannel("./" + CHANNEL_PATH1); // test path normalization
Davide Pesaventob15276f2017-07-15 16:27:13 -0400136 auto channel1a = factory.createChannel(CHANNEL_PATH1);
Davide Pesavento401d1a42024-12-19 21:10:22 -0500137 auto channel1b = factory.createChannel(std::filesystem::absolute(CHANNEL_PATH1));
Davide Pesavento4c957712024-01-01 15:40:06 -0500138 auto channel1c = factory.createChannel("foo//../" + CHANNEL_PATH1);
Davide Pesaventob15276f2017-07-15 16:27:13 -0400139 BOOST_CHECK_EQUAL(channel1, channel1a);
Davide Pesavento4c957712024-01-01 15:40:06 -0500140 BOOST_CHECK_EQUAL(channel1, channel1b);
141 BOOST_CHECK_EQUAL(channel1, channel1c);
Davide Pesaventoa9ec67c2023-10-19 20:04:04 -0400142 BOOST_CHECK_EQUAL(factory.getChannels().size(), 1);
Davide Pesavento494a9552018-02-04 22:16:05 -0500143
144 const auto& uri = channel1->getUri();
Davide Pesavento4c957712024-01-01 15:40:06 -0500145 BOOST_TEST_INFO_SCOPE(uri);
Davide Pesavento494a9552018-02-04 22:16:05 -0500146 BOOST_CHECK_EQUAL(uri.getScheme(), "unix");
147 BOOST_CHECK_EQUAL(uri.getHost(), "");
148 BOOST_CHECK_EQUAL(uri.getPort(), "");
Davide Pesavento401d1a42024-12-19 21:10:22 -0500149 std::filesystem::path path1(uri.getPath());
Davide Pesavento4c957712024-01-01 15:40:06 -0500150 BOOST_TEST(path1.filename() == CHANNEL_PATH1);
151 BOOST_TEST(path1.is_absolute()); // path should always be absolute
152 BOOST_TEST(path1.lexically_normal() == path1); // path should be in normal form
Davide Pesaventob15276f2017-07-15 16:27:13 -0400153
154 auto channel2 = factory.createChannel(CHANNEL_PATH2);
Junxiao Shicde37ad2015-12-24 01:02:05 -0700155 BOOST_CHECK_NE(channel1, channel2);
Davide Pesaventoa9ec67c2023-10-19 20:04:04 -0400156 BOOST_CHECK_EQUAL(factory.getChannels().size(), 2);
Junxiao Shicde37ad2015-12-24 01:02:05 -0700157}
158
Davide Pesaventoa9ec67c2023-10-19 20:04:04 -0400159BOOST_AUTO_TEST_CASE(CreateFace)
Junxiao Shicde37ad2015-12-24 01:02:05 -0700160{
Eric Newberry42602412016-08-27 09:33:18 -0700161 createFace(factory,
162 FaceUri("unix:///var/run/nfd.sock"),
Eric Newberry78e32b02017-04-01 14:34:44 +0000163 {},
Eric Newberry812d6152018-06-06 15:06:01 -0700164 {ndn::nfd::FACE_PERSISTENCY_ON_DEMAND, {}, {}, {}, false, false, false},
Eric Newberry42602412016-08-27 09:33:18 -0700165 {CreateFaceExpectedResult::FAILURE, 406, "Unsupported protocol"});
Junxiao Shicde37ad2015-12-24 01:02:05 -0700166
Eric Newberry42602412016-08-27 09:33:18 -0700167 createFace(factory,
168 FaceUri("unix:///var/run/nfd.sock"),
Eric Newberry78e32b02017-04-01 14:34:44 +0000169 {},
Eric Newberry812d6152018-06-06 15:06:01 -0700170 {ndn::nfd::FACE_PERSISTENCY_PERSISTENT, {}, {}, {}, false, false, false},
Eric Newberry42602412016-08-27 09:33:18 -0700171 {CreateFaceExpectedResult::FAILURE, 406, "Unsupported protocol"});
Junxiao Shicde37ad2015-12-24 01:02:05 -0700172
Eric Newberry42602412016-08-27 09:33:18 -0700173 createFace(factory,
174 FaceUri("unix:///var/run/nfd.sock"),
Eric Newberry78e32b02017-04-01 14:34:44 +0000175 {},
Eric Newberry812d6152018-06-06 15:06:01 -0700176 {ndn::nfd::FACE_PERSISTENCY_PERMANENT, {}, {}, {}, false, false, false},
Eric Newberry42602412016-08-27 09:33:18 -0700177 {CreateFaceExpectedResult::FAILURE, 406, "Unsupported protocol"});
Junxiao Shicde37ad2015-12-24 01:02:05 -0700178}
179
180BOOST_AUTO_TEST_SUITE_END() // TestUnixStreamFactory
181BOOST_AUTO_TEST_SUITE_END() // Face
182
Davide Pesaventoe422f9e2022-06-03 01:30:23 -0400183} // namespace nfd::tests