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{
33 std::vector<sockaddr_in> ret;
34 ret.reserve(N);
35
36 for (size_t i = 0; i < N; i++) {
38 s.sin_family = AF_INET;
39 s.sin_port = htons(randint<in_port_t>(0, std::numeric_limits<in_port_t>::max()));
40 s.sin_addr = in_addr{randint<uint32_t>(0, std::numeric_limits<uint32_t>::max())};
41 ret.push_back(s);
42 }
43
44 return ret;
45}
46
47template <class StreamT>
48 requires Streamable<StreamT>
50{
51 char buf[INET_ADDRSTRLEN];
53 os << buf << ':' << ntohs(sa.sin_port);
54 return os;
55}
56
58
59} // namespace
60
62
64{
65 const auto uri = "192.168.1.3:443"s;
66 const auto ep = parse_dgram_endpoint(uri);
67 BOOST_CHECK_EQUAL(ep.protocol().family(), AF_INET);
68 BOOST_CHECK_EQUAL(ep.protocol().type(), SOCK_DGRAM);
69 BOOST_CHECK_EQUAL(ep.protocol().protocol(), IPPROTO_UDP);
70 BOOST_CHECK_EQUAL(to_string(ep), "udp4://"s + uri);
71}
72
74{
75 const auto uri = "[fe80::c8bf:7d86:cbdc:bda9]:443"s;
76 const auto ep = parse_dgram_endpoint(uri);
77 BOOST_CHECK_EQUAL(ep.protocol().family(), AF_INET6);
78 BOOST_CHECK_EQUAL(ep.protocol().type(), SOCK_DGRAM);
79 BOOST_CHECK_EQUAL(ep.protocol().protocol(), IPPROTO_UDP);
80 BOOST_CHECK_EQUAL(to_string(ep), "udp6://"s + uri);
81}
82
84{
85 const auto uri = "udp4://192.168.1.3:443"s;
86 const auto ep = parse_dgram_endpoint(uri);
87 BOOST_CHECK_EQUAL(ep.protocol().family(), AF_INET);
88 BOOST_CHECK_EQUAL(ep.protocol().type(), SOCK_DGRAM);
89 BOOST_CHECK_EQUAL(ep.protocol().protocol(), IPPROTO_UDP);
91}
92
94{
95 const auto uri = "udp6://[fe80::c8bf:7d86:cbdc:bda9]:443"s;
96 const auto ep = parse_dgram_endpoint(uri);
97 BOOST_CHECK_EQUAL(ep.protocol().family(), AF_INET6);
98 BOOST_CHECK_EQUAL(ep.protocol().type(), SOCK_DGRAM);
99 BOOST_CHECK_EQUAL(ep.protocol().protocol(), IPPROTO_UDP);
101}
102
104{
105 const auto uri = "unix:///tmp/foo.sock"s;
106 const auto ep = parse_dgram_endpoint(uri);
107 BOOST_CHECK_EQUAL(ep.protocol().family(), AF_UNIX);
108 BOOST_CHECK_EQUAL(ep.protocol().type(), SOCK_DGRAM);
109 BOOST_CHECK_EQUAL(ep.protocol().protocol(), 0);
111}
112
114{
115 const auto uri = "unix://|12345"s;
116 const auto ep = parse_dgram_endpoint(uri);
117 BOOST_CHECK_EQUAL(ep.protocol().family(), AF_UNIX);
118 BOOST_CHECK_EQUAL(ep.protocol().type(), SOCK_DGRAM);
119 BOOST_CHECK_EQUAL(ep.protocol().protocol(), 0);
121}
122
124{
125 const auto uri = "192.168.1.3:443"s;
126 const auto ep = parse_stream_endpoint(uri);
127 BOOST_CHECK_EQUAL(ep.protocol().family(), AF_INET);
128 BOOST_CHECK_EQUAL(ep.protocol().type(), SOCK_STREAM);
129 BOOST_CHECK_EQUAL(ep.protocol().protocol(), IPPROTO_TCP);
130 BOOST_CHECK_EQUAL(to_string(ep), "tcp4://"s + uri);
131}
132
134{
135 const auto uri = "[fe80::c8bf:7d86:cbdc:bda9]:443"s;
136 const auto ep = parse_stream_endpoint(uri);
137 BOOST_CHECK_EQUAL(ep.protocol().family(), AF_INET6);
138 BOOST_CHECK_EQUAL(ep.protocol().type(), SOCK_STREAM);
139 BOOST_CHECK_EQUAL(ep.protocol().protocol(), IPPROTO_TCP);
140 BOOST_CHECK_EQUAL(to_string(ep), "tcp6://"s + uri);
141}
142
144{
145 const auto uri = "tcp4://192.168.1.3:443"s;
146 const auto ep = parse_stream_endpoint(uri);
147 BOOST_CHECK_EQUAL(ep.protocol().family(), AF_INET);
148 BOOST_CHECK_EQUAL(ep.protocol().type(), SOCK_STREAM);
149 BOOST_CHECK_EQUAL(ep.protocol().protocol(), IPPROTO_TCP);
151}
152
154{
155 const auto uri = "tcp6://[fe80::c8bf:7d86:cbdc:bda9]:443"s;
156 const auto ep = parse_stream_endpoint(uri);
157 BOOST_CHECK_EQUAL(ep.protocol().family(), AF_INET6);
158 BOOST_CHECK_EQUAL(ep.protocol().type(), SOCK_STREAM);
159 BOOST_CHECK_EQUAL(ep.protocol().protocol(), IPPROTO_TCP);
161}
162
164{
165 const auto uri = "unix:///tmp/foo.sock"s;
166 const auto ep = parse_stream_endpoint(uri);
167 BOOST_CHECK_EQUAL(ep.protocol().family(), AF_UNIX);
168 BOOST_CHECK_EQUAL(ep.protocol().type(), SOCK_STREAM);
169 BOOST_CHECK_EQUAL(ep.protocol().protocol(), 0);
171}
172
174{
175 const auto uri = "unix://|12345"s;
176 const auto ep = parse_stream_endpoint(uri);
177 BOOST_CHECK_EQUAL(ep.protocol().family(), AF_UNIX);
178 BOOST_CHECK_EQUAL(ep.protocol().type(), SOCK_STREAM);
179 BOOST_CHECK_EQUAL(ep.protocol().protocol(), 0);
181}
182
184{
185 const auto ep = parse_stream_endpoint("tcp4://:80");
186 BOOST_CHECK_EQUAL(ep.protocol().family(), AF_INET);
187 BOOST_CHECK_EQUAL(ep.protocol().type(), SOCK_STREAM);
188 BOOST_CHECK_EQUAL(ep.protocol().protocol(), IPPROTO_TCP);
189 BOOST_CHECK_EQUAL(to_string(ep), "tcp4://0.0.0.0:80");
190}
191
193{
194 ipv4_os.set_storage(ipv4_os.make_storage());
195
196 const auto rand_ips = generate_random_ipv4_addresses(131'072);
197 for (const auto& ip : rand_ips) {
198 ipv4_os.reset();
199 ipv4_os << ip;
200 std::string our_str{ipv4_os.data(), ipv4_os.size()};
201
202 ipv4_os.reset();
204 std::string libc_str{ipv4_os.data(), ipv4_os.size()};
205
206 // min size = 9
207 // 0.0.0.0:0
208
209 // max size = 21
210 // 255.255.255.255:65535
211
212 BOOST_CHECK(our_str.size() >= 9);
213 BOOST_CHECK(libc_str.size() >= 9);
214 BOOST_CHECK(our_str.size() <= 21);
215 BOOST_CHECK(libc_str.size() <= 21);
217 }
218}
219
BOOST_AUTO_TEST_CASE(ParseDgramUnspec4Case)
BOOST_CHECK_EQUAL(v.size(), 10U)
OStream uses a dynamic storage acquired from the custom allocator.
Definition Stream.hpp:38
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:56
auto & remove_const(const ValueT &ref)
Definition Utility.hpp:35
constexpr auto bind() noexcept
Definition Slot.hpp:97
BOOST_CHECK(isnan(stod(""sv, numeric_limits< double >::quiet_NaN())))