Toolbox snapshot
The Reactive C++ Toolbox
Loading...
Searching...
No Matches
Endpoint.ut.cpp
Go to the documentation of this file.
1// The Reactive C++ Toolbox.
2// Copyright (C) 2013-2019 Swirly Cloud Limited
3// Copyright (C) 2021 Reactive Markets Limited
4//
5// Licensed under the Apache License, Version 2.0 (the "License");
6// you may not use this file except in compliance with the License.
7// You may obtain a copy of the License at
8//
9// http://www.apache.org/licenses/LICENSE-2.0
10//
11// Unless required by applicable law or agreed to in writing, software
12// distributed under the License is distributed on an "AS IS" BASIS,
13// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14// See the License for the specific language governing permissions and
15// limitations under the License.
16
17#include "Endpoint.hpp"
18
22
23#include <boost/test/unit_test.hpp>
24
25#include <vector>
26
27using namespace std;
28using namespace toolbox;
29
30namespace {
31std::vector<sockaddr_in> generate_random_ipv4_addresses(size_t N) {
32 std::vector<sockaddr_in> ret;
33 ret.reserve(N);
34
35 for (size_t i = 0; i < N; i++) {
37 s.sin_family = AF_INET;
38 s.sin_port = htons(randint<in_port_t>(0, std::numeric_limits<in_port_t>::max()));
39 s.sin_addr = in_addr{randint<uint32_t>(0, std::numeric_limits<uint32_t>::max())};
40 ret.push_back(s);
41 }
42
43 return ret;
44}
45
46template <class StreamT>
47 requires Streamable<StreamT>
49{
50 char buf[INET_ADDRSTRLEN];
52 os << buf << ':' << ntohs(sa.sin_port);
53 return os;
54}
55
57
58} // namespace
59
61
63{
64 const auto uri = "192.168.1.3:443"s;
65 const auto ep = parse_dgram_endpoint(uri);
66 BOOST_CHECK_EQUAL(ep.protocol().family(), AF_INET);
67 BOOST_CHECK_EQUAL(ep.protocol().type(), SOCK_DGRAM);
68 BOOST_CHECK_EQUAL(ep.protocol().protocol(), IPPROTO_UDP);
69 BOOST_CHECK_EQUAL(to_string(ep), "udp4://"s + uri);
70}
71
73{
74 const auto uri = "[fe80::c8bf:7d86:cbdc:bda9]:443"s;
75 const auto ep = parse_dgram_endpoint(uri);
76 BOOST_CHECK_EQUAL(ep.protocol().family(), AF_INET6);
77 BOOST_CHECK_EQUAL(ep.protocol().type(), SOCK_DGRAM);
78 BOOST_CHECK_EQUAL(ep.protocol().protocol(), IPPROTO_UDP);
79 BOOST_CHECK_EQUAL(to_string(ep), "udp6://"s + uri);
80}
81
83{
84 const auto uri = "udp4://192.168.1.3:443"s;
85 const auto ep = parse_dgram_endpoint(uri);
86 BOOST_CHECK_EQUAL(ep.protocol().family(), AF_INET);
87 BOOST_CHECK_EQUAL(ep.protocol().type(), SOCK_DGRAM);
88 BOOST_CHECK_EQUAL(ep.protocol().protocol(), IPPROTO_UDP);
90}
91
93{
94 const auto uri = "udp6://[fe80::c8bf:7d86:cbdc:bda9]:443"s;
95 const auto ep = parse_dgram_endpoint(uri);
96 BOOST_CHECK_EQUAL(ep.protocol().family(), AF_INET6);
97 BOOST_CHECK_EQUAL(ep.protocol().type(), SOCK_DGRAM);
98 BOOST_CHECK_EQUAL(ep.protocol().protocol(), IPPROTO_UDP);
100}
101
103{
104 const auto uri = "unix:///tmp/foo.sock"s;
105 const auto ep = parse_dgram_endpoint(uri);
106 BOOST_CHECK_EQUAL(ep.protocol().family(), AF_UNIX);
107 BOOST_CHECK_EQUAL(ep.protocol().type(), SOCK_DGRAM);
108 BOOST_CHECK_EQUAL(ep.protocol().protocol(), 0);
110}
111
113{
114 const auto uri = "unix://|12345"s;
115 const auto ep = parse_dgram_endpoint(uri);
116 BOOST_CHECK_EQUAL(ep.protocol().family(), AF_UNIX);
117 BOOST_CHECK_EQUAL(ep.protocol().type(), SOCK_DGRAM);
118 BOOST_CHECK_EQUAL(ep.protocol().protocol(), 0);
120}
121
123{
124 const auto uri = "192.168.1.3:443"s;
125 const auto ep = parse_stream_endpoint(uri);
126 BOOST_CHECK_EQUAL(ep.protocol().family(), AF_INET);
127 BOOST_CHECK_EQUAL(ep.protocol().type(), SOCK_STREAM);
128 BOOST_CHECK_EQUAL(ep.protocol().protocol(), IPPROTO_TCP);
129 BOOST_CHECK_EQUAL(to_string(ep), "tcp4://"s + uri);
130}
131
133{
134 const auto uri = "[fe80::c8bf:7d86:cbdc:bda9]:443"s;
135 const auto ep = parse_stream_endpoint(uri);
136 BOOST_CHECK_EQUAL(ep.protocol().family(), AF_INET6);
137 BOOST_CHECK_EQUAL(ep.protocol().type(), SOCK_STREAM);
138 BOOST_CHECK_EQUAL(ep.protocol().protocol(), IPPROTO_TCP);
139 BOOST_CHECK_EQUAL(to_string(ep), "tcp6://"s + uri);
140}
141
143{
144 const auto uri = "tcp4://192.168.1.3:443"s;
145 const auto ep = parse_stream_endpoint(uri);
146 BOOST_CHECK_EQUAL(ep.protocol().family(), AF_INET);
147 BOOST_CHECK_EQUAL(ep.protocol().type(), SOCK_STREAM);
148 BOOST_CHECK_EQUAL(ep.protocol().protocol(), IPPROTO_TCP);
150}
151
153{
154 const auto uri = "tcp6://[fe80::c8bf:7d86:cbdc:bda9]:443"s;
155 const auto ep = parse_stream_endpoint(uri);
156 BOOST_CHECK_EQUAL(ep.protocol().family(), AF_INET6);
157 BOOST_CHECK_EQUAL(ep.protocol().type(), SOCK_STREAM);
158 BOOST_CHECK_EQUAL(ep.protocol().protocol(), IPPROTO_TCP);
160}
161
163{
164 const auto uri = "unix:///tmp/foo.sock"s;
165 const auto ep = parse_stream_endpoint(uri);
166 BOOST_CHECK_EQUAL(ep.protocol().family(), AF_UNIX);
167 BOOST_CHECK_EQUAL(ep.protocol().type(), SOCK_STREAM);
168 BOOST_CHECK_EQUAL(ep.protocol().protocol(), 0);
170}
171
173{
174 const auto uri = "unix://|12345"s;
175 const auto ep = parse_stream_endpoint(uri);
176 BOOST_CHECK_EQUAL(ep.protocol().family(), AF_UNIX);
177 BOOST_CHECK_EQUAL(ep.protocol().type(), SOCK_STREAM);
178 BOOST_CHECK_EQUAL(ep.protocol().protocol(), 0);
180}
181
183{
184 const auto ep = parse_stream_endpoint("tcp4://:80");
185 BOOST_CHECK_EQUAL(ep.protocol().family(), AF_INET);
186 BOOST_CHECK_EQUAL(ep.protocol().type(), SOCK_STREAM);
187 BOOST_CHECK_EQUAL(ep.protocol().protocol(), IPPROTO_TCP);
188 BOOST_CHECK_EQUAL(to_string(ep), "tcp4://0.0.0.0:80");
189}
190
192{
193 ipv4_os.set_storage(ipv4_os.make_storage());
194
195 const auto rand_ips = generate_random_ipv4_addresses(131'072);
196 for (const auto& ip : rand_ips) {
197 ipv4_os.reset();
198 ipv4_os << ip;
199 std::string our_str {ipv4_os.data(), ipv4_os.size()};
200
201 ipv4_os.reset();
203 std::string libc_str {ipv4_os.data(), ipv4_os.size()};
204
205 // min size = 9
206 // 0.0.0.0:0
207
208 // max size = 21
209 // 255.255.255.255:65535
210
211 BOOST_CHECK(our_str.size() >= 9);
212 BOOST_CHECK(libc_str.size() >= 9);
213 BOOST_CHECK(our_str.size() <= 21);
214 BOOST_CHECK(libc_str.size() <= 21);
216 }
217}
218
BOOST_AUTO_TEST_CASE(ParseDgramUnspec4Case)
BOOST_CHECK_EQUAL(v.size(), 10U)
OStream uses a dynamic storage acquired from the custom allocator.
Definition Stream.hpp:101
STL namespace.
DgramEndpoint parse_dgram_endpoint(std::string_view uri)
Definition Endpoint.hpp:52
StreamEndpoint parse_stream_endpoint(std::string_view uri)
Definition Endpoint.hpp:58
std::string to_string(ValueT &&val)
Definition String.hpp:54
auto & remove_const(const ValueT &ref)
Definition Utility.hpp:35
constexpr auto bind() noexcept
Definition Slot.hpp:92
BOOST_CHECK(isnan(stod(""sv, numeric_limits< double >::quiet_NaN())))