14#include <rapidcheck/state.h>
60 const std::string j1_txt = j1.toStyledString();
70 const Json::Value j2 = tbc2->
to_json();
71 const std::string j2_txt = j2.toStyledString();
76 ASSERT_EQ(j1_txt, j2_txt) <<
"round trip failed";
83TEST(RemoteAddress, EmptyIsNotDefined)
89RC_GTEST_PROP(RemoteAddress, NonEmptyIsDefined, ())
91 const auto address = *rc::gen::nonEmpty<std::string>();
97TEST(RemoteAddress, EmptyStringRepresentation)
103TEST(RemoteAddress, EmptyStringRepresentationIncludesIPv6Setting)
110RC_GTEST_PROP(RemoteAddress, StringRepresentationReturnsAddress, (
const std::string &
address))
117RC_GTEST_PROP(RemoteAddress, StringRepresentationIncludesIPv6Setting, (
const std::string &
address))
125RC_GTEST_PROP(RemoteAddress, EmptyThrowsOnValidation, (
const std::string &title))
131RC_GTEST_PROP(RemoteAddress, ValidatesIPv4, (
const std::string &title))
138RC_GTEST_PROP(RemoteAddress, ValidatesIPv6, (
const std::string &title))
147RC_GTEST_PROP(RemoteAddress, ThrowsValidatingMismatchedIPVersion, (
const std::string &title,
bool ipv6))
157RC_GTEST_PROP(RemoteAddress, ThrowsValidatingInvalidIP, (
const std::string &title,
bool ipv6))
166RC_GTEST_PROP(RemoteAddress, EmptyJsonRoundTripHaveSameStringRepresentation, (
const std::string &title))
175RC_GTEST_PROP(RemoteAddress, EmptyJsonRoundTripHaveSameDefinedStatus, (
const std::string &title))
184RC_GTEST_PROP(RemoteAddress, EmptyJsonRoundTripThrowsOnValidation, (
const std::string &title))
194RC_GTEST_PROP(RemoteAddress, JsonRoundTripHaveSameStringRepresentation, (
const std::string &
address,
const std::string &title,
bool ipv6))
205RC_GTEST_PROP(RemoteAddress, JsonRoundTripHaveSameDefinedStatus, (
const std::string &title))
214RC_GTEST_PROP(RemoteAddress, JsonRoundTripThrowsValidatingMismatchedIPVersion, (
const std::string &title,
bool ipv6))
227RC_GTEST_PROP(RemoteAddress, JsonRoundTripThrowsValidatingInvalidIP, (
const std::string &title,
bool ipv6))
239RC_GTEST_PROP(RemoteAddress, JsonRoundTripValidatesCorrectIP, (
const std::string &title,
bool ipv6))
251RC_GTEST_PROP(RemoteAddress, FromInvalidJsonDoesNotChangeOriginalObject, (
const std::string &
address,
const std::string &title,
bool ipv6))
284 ret +=
"REROUTE_GW ";
288 ret +=
"AUTO_LOCAL ";
292 ret +=
"BYPASS_DHCP ";
294 ret +=
"BYPASS_DNS ";
296 ret +=
"BLOCK_LOCAL ";
306RC_GTEST_PROP(
RerouteGW, EmptyJsonRoundTripHaveSameStringRepresentation, (
const std::string &title))
341RC_GTEST_PROP(RouteBased, EmptyStringRepresentationReturnsUnsetPrefixLength, (
rc::RouteBased route_based))
344 [](
auto &&route_base_variant)
345 {
RC_ASSERT(route_base_variant.to_string() ==
"/0"); },
349RC_GTEST_PROP(RouteBased, StringRepresentationReturnsSetOptions, (
rc::RouteBased route_based,
const std::string &
address,
unsigned char prefix_length,
int metric,
const std::string &gateway,
bool ipv6,
bool net30))
352 [&
address, prefix_length,
metric, &gateway,
ipv6, net30](
auto &&route_base_variant)
354 route_base_variant.address =
address;
355 route_base_variant.prefix_length = prefix_length;
356 route_base_variant.metric =
metric;
357 route_base_variant.gateway = gateway;
358 route_base_variant.ipv6 =
ipv6;
359 route_base_variant.net30 = net30;
361 output +=
address +
"/" + std::to_string(prefix_length);
362 if (!gateway.empty())
363 output +=
" -> " + gateway;
365 output +=
" [METRIC=" + std::to_string(
metric) +
"]";
369 output +=
" [net30]";
370 RC_ASSERT(route_base_variant.to_string() == output);
375RC_GTEST_PROP(RouteBased, EmptyThrowsOnValidation, (
rc::RouteBased route_based,
const std::string &title))
378 [&title](
auto &&route_base_variant)
380 using T = std::decay_t<
decltype(route_base_variant)>;
381 if constexpr (std::is_same_v<T, TunBuilderCapture::RouteBase>)
383 RC_DISCARD(
"RouteBase does not have public validate method");
393RC_GTEST_PROP(RouteBased, Validates, (
rc::RouteBased route_based,
bool ipv6,
bool net30,
const std::string &title))
397 [
ipv6, net30, &title](
auto &&route_base_variant)
399 using T = std::decay_t<
decltype(route_base_variant)>;
400 if constexpr (std::is_same_v<T, TunBuilderCapture::RouteBase>)
402 RC_DISCARD(
"RouteBase does not have public validate method");
410 route_base_variant.ipv6 =
true;
412 ipv6_route.force_canonical();
413 route_base_variant.address = ipv6_route.to_string_optional_prefix_len();
418 route_base_variant.ipv6 =
false;
419 route_base_variant.address = *
rc::IPv4Address().as(
"Valid IPv4 address");
421 if (net30 && prefix_min <= 30 && prefix_max >= 30)
423 route_base_variant.net30 =
true;
424 route_base_variant.prefix_length = 30;
428 route_base_variant.net30 =
false;
429 route_base_variant.prefix_length = *rc::gen::inRange(
static_cast<char>(prefix_min),
static_cast<char>(prefix_max + 1)).as(
"Valid prefix length");
432 if (
auto maybe_metric = *rc::gen::maybe(rc::gen::arbitrary<int>().as(
"Metric value")).as(
"Maybe metric"))
434 route_base_variant.metric = *maybe_metric;
438 route_base_variant.gateway = *maybe_gateway;
440 route_base_variant.validate(title);
447RC_GTEST_PROP(RouteBased, EmptyJsonRoundTripHaveSameStringRepresentation, (
rc::RouteBased route_based,
const std::string &title))
450 [&title](
auto &&route_base_variant)
452 const auto route_based_as_json = route_base_variant.to_json();
453 using T = std::decay_t<
decltype(route_base_variant)>;
461RC_GTEST_PROP(RouteBased, JsonRoundTripHaveSameStringRepresentation, (
rc::RouteBased route_based,
const std::string &
address,
unsigned char prefix_length,
int metric,
const std::string &gateway,
bool ipv6,
bool net30,
const std::string &title))
464 [&
address, prefix_length,
metric, &gateway,
ipv6, net30, &title](
auto &&route_base_variant)
466 route_base_variant.address =
address;
467 route_base_variant.prefix_length = prefix_length;
468 route_base_variant.metric =
metric;
469 route_base_variant.gateway = gateway;
470 route_base_variant.ipv6 =
ipv6;
471 route_base_variant.net30 = net30;
472 const auto route_based_as_json = route_base_variant.to_json();
473 using T = std::decay_t<
decltype(route_base_variant)>;
482RC_GTEST_PROP(RouteBased, FromInvalidJsonThrows, (
rc::RouteBased route_based,
const std::string &title))
485 [&title](
auto &&route_base_variant)
497TEST(ProxyBypass, EmptyIsNotDefined)
503RC_GTEST_PROP(ProxyBypass, NonEmptyIsDefined, ())
505 const auto bypass_host = *rc::gen::nonEmpty<std::string>();
511TEST(ProxyBypass, EmptyStringRepresentation)
517RC_GTEST_PROP(ProxyBypass, StringRepresentationReturnBypassHost, (
const std::string &
bypass_host))
524RC_GTEST_PROP(ProxyBypass, EmptyValidates, (
const std::string &title))
530RC_GTEST_PROP(ProxyBypass, EmptyJsonRoundTripHaveSameStringRepresentation, (
const std::string &title))
539RC_GTEST_PROP(ProxyBypass, EmptyJsonRoundTripHaveSameDefinedStatus, (
const std::string &title))
548RC_GTEST_PROP(ProxyBypass, EmptyJsonRoundTripValidates, (
const std::string &title))
558RC_GTEST_PROP(ProxyBypass, JsonRoundTripHaveSameStringRepresentation, (
const std::string &
bypass_host,
const std::string &title))
568RC_GTEST_PROP(ProxyBypass, JsonRoundTripHaveSameDefinedStatus, (
const std::string &
bypass_host,
const std::string &title))
578RC_GTEST_PROP(ProxyBypass, FromInvalidJsonThrows, (
const std::string &title))
589TEST(ProxyAutoConfigURL, EmptyIsNotDefined)
595RC_GTEST_PROP(ProxyAutoConfigURL, NonEmptyIsDefined, ())
597 const auto url = *rc::gen::nonEmpty<std::string>();
603TEST(ProxyAutoConfigURL, EmptyStringRepresentation)
609RC_GTEST_PROP(ProxyAutoConfigURL, StringRepresentationReturnsURL, (
const std::string &
url))
616RC_GTEST_PROP(ProxyAutoConfigURL, EmptyValidates, (
const std::string &title))
622RC_GTEST_PROP(ProxyAutoConfigURL, EmptyJsonRoundTripHaveSameStringRepresentation, (
const std::string &title))
631RC_GTEST_PROP(ProxyAutoConfigURL, EmptyJsonRoundTripHaveSameDefinedStatus, (
const std::string &title))
640RC_GTEST_PROP(ProxyAutoConfigURL, EmptyJsonRoundTripValidates, (
const std::string &title))
650RC_GTEST_PROP(ProxyAutoConfigURL, JsonRoundTripHaveSameStringRepresentation, (
const std::string &
url,
const std::string &title))
660RC_GTEST_PROP(ProxyAutoConfigURL, JsonRoundTripHaveSameDefinedStatus, (
const std::string &
url,
const std::string &title))
670RC_GTEST_PROP(ProxyAutoConfigURL, FromInvalidJsonDoesNotChangeOriginalObject, (
const std::string &domain,
const std::string &title))
683TEST(ProxyHostPort, EmptyIsNotDefined)
689RC_GTEST_PROP(ProxyHostPort, NonEmptyIsDefined, ())
691 const auto host = *rc::gen::nonEmpty<std::string>();
697TEST(ProxyHostPort, EmptyStringRepresentationReturnsDefaultPort)
703RC_GTEST_PROP(ProxyHostPort, StringRepresentationReturnsHostPort, (
const std::string &
host,
const int port))
711RC_GTEST_PROP(ProxyHostPort, EmptyValidates, (
const std::string &title))
717RC_GTEST_PROP(ProxyHostPort, EmptyJsonRoundTripHaveSameStringRepresentation, (
const std::string &title))
726RC_GTEST_PROP(ProxyHostPort, EmptyJsonRoundTripHaveSameDefinedStatus, (
const std::string &title))
735RC_GTEST_PROP(ProxyHostPort, EmptyJsonRoundTripValidates, (
const std::string &title))
745RC_GTEST_PROP(ProxyHostPort, JsonRoundTripHaveSameStringRepresentation, (
const std::string &
host,
const int port,
const std::string &title))
756RC_GTEST_PROP(ProxyHostPort, JsonRoundTripHaveSameDefinedStatus, (
const std::string &
host,
const std::string &title))
766RC_GTEST_PROP(ProxyHostPort, FromInvalidJsonDoesNotChangeOriginalObject, (
const std::string &
host,
const int port,
const std::string &title))
781TEST(WINSServer, EmptyStringRepresentation)
784 ASSERT_TRUE(wins_server.
to_string().empty());
787RC_GTEST_PROP(WINSServer, StringRepresentationReturnsAddress, (
const std::string &
address))
794RC_GTEST_PROP(WINSServer, EmptyThrowsOnValidation, (
const std::string &title))
800RC_GTEST_PROP(WINSServer, ValidatesAddress, (
const std::string &title))
807RC_GTEST_PROP(WINSServer, ThrowsValidatingInvalidAddress, (
const std::string &title))
814RC_GTEST_PROP(WINSServer, EmptyJsonRoundTripHaveSameStringRepresentation, (
const std::string &title))
823RC_GTEST_PROP(WINSServer, EmptyJsonRoundTripThrowsOnValidation, (
const std::string &title))
833RC_GTEST_PROP(WINSServer, JsonRoundTripHaveSameStringRepresentation, (
const std::string &
address,
const std::string &title))
843RC_GTEST_PROP(WINSServer, JsonRoundTripValidatesAddress, (
const std::string &title))
854RC_GTEST_PROP(WINSServer, JsonRoundTripThrowsValidatingInvalidIP, (
const std::string &title))
865RC_GTEST_PROP(WINSServer, FromInvalidJsonThrows, (
const std::string &title))
884RC_GTEST_PROP(
TunBuilderCapture, AddsAddress, (
const std::string &
address,
const unsigned char prefix_length,
const std::string &gateway,
const bool ipv6,
const bool net30))
915 const auto metric = *rc::gen::positive<int>().as(
"Valid route metric");
935RC_GTEST_PROP(
TunBuilderCapture, SetsDNSOptions, (
const std::string &search_domain))
952 const auto layer = *rc::gen::element(3, 2, 0).as(
"Layer - 3, 2 or 0");
964RC_GTEST_PROP(
TunBuilderCapture, SetsSessionName, (
const std::string &session_name))
1011 const auto allow_family = *rc::gen::element(AF_INET, AF_INET6).as(
"Allow family - AF_INET or AF_INET6");
1030RC_GTEST_PROP(
TunBuilderCapture, ResetsTunnelAddresses, (
const std::string &
address,
const unsigned char prefix_length,
const std::string &gateway,
const bool ipv6,
const bool net30))
1044RC_GTEST_PROP(
TunBuilderCapture, ResetsDNSOptions, (
const std::string &search_domain))
1059RC_GTEST_PROP(
TunBuilderCapture, ReturnsVPNIPv4, (
const std::string &
address,
const unsigned char prefix_length,
const std::string &gateway,
const bool net30))
1071RC_GTEST_PROP(
TunBuilderCapture, ReturnsVPNIPv6, (
const std::string &
address,
const unsigned char prefix_length,
const std::string &gateway,
const bool net30))
1083RC_GTEST_PROP(
TunBuilderCapture, ReturnsVPNIP, (
const std::string &
address,
const unsigned char prefix_length,
const std::string &gateway,
const bool ipv6,
const bool net30))
1096RC_GTEST_PROP(
TunBuilderCapture, StringRepresentation, (
const std::string &
address,
const unsigned char prefix_length,
const std::string &gateway,
const bool ipv6,
const bool net30))
1099 std::ostringstream
os = {};
1103 os <<
"Tunnel Addresses:\n";
1108 os <<
"Add Routes:\n";
1109 os <<
"Exclude Routes:\n";
1113struct TunBuilderCaptureModel
1115 std::string session_name;
1130 std::vector<TunBuilderCapture::ProxyBypass>
proxy_bypass;
1144 :
address{*
rc::gen::arbitrary<std::string>()},
ipv6{*
rc::gen::arbitrary<bool>()}
1148 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1150 model.remote_address.address =
address;
1151 model.remote_address.ipv6 =
ipv6;
1161 auto show(std::ostream &
os)
const ->
void override
1163 os <<
"Set RemoteAddress to " <<
address <<
" " << (
ipv6 ?
"IPv6" :
"IPv4");
1167struct AddAddress final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1181 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1191 model.tunnel_address_index_ipv6 =
static_cast<int>(model.tunnel_addresses.size());
1195 model.tunnel_address_index_ipv4 =
static_cast<int>(model.tunnel_addresses.size());
1197 model.tunnel_addresses.push_back(std::move(
address));
1232 auto show(std::ostream &
os)
const ->
void override
1238struct RerouteGW final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1245 :
ipv4{*
rc::gen::arbitrary<bool>()},
ipv6{*
rc::gen::arbitrary<bool>()},
flags{*
rc::gen::arbitrary<unsigned int>()}
1249 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1251 model.reroute_gw.ipv4 =
ipv4;
1252 model.reroute_gw.ipv6 =
ipv6;
1253 model.reroute_gw.flags =
flags;
1264 auto show(std::ostream &
os)
const ->
void override
1266 os <<
"Set RerouteGW ipv4: " <<
ipv4 <<
" ipv6: " <<
ipv6 <<
" flags: " <<
flags;
1275 :
metric{*
rc::gen::arbitrary<int>()}
1279 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1281 model.route_metric_default =
metric;
1290 auto show(std::ostream &
os)
const ->
void override
1292 os <<
"Set route metric default to " <<
metric;
1296struct AddRoute final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1306 :
address{*
rc::gen::arbitrary<std::string>()},
prefix_length{static_cast<unsigned char>(*
rc::gen::arbitrary<int>())},
metric{*
rc::gen::arbitrary<int>()},
ipv6{*
rc::gen::arbitrary<bool>()}
1310 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1317 model.add_routes.push_back(std::move(route));
1331 auto show(std::ostream &
os)
const ->
void override
1337struct ExcludeRoute final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1347 :
address{*
rc::gen::arbitrary<std::string>()},
prefix_length{static_cast<unsigned char>(*
rc::gen::arbitrary<int>())},
metric{*
rc::gen::arbitrary<int>()},
ipv6{*
rc::gen::arbitrary<bool>()}
1351 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1358 model.exclude_routes.push_back(std::move(route));
1372 auto show(std::ostream &
os)
const ->
void override
1378struct SetDNSOptions final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1387 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1398 auto show(std::ostream &
os)
const ->
void override
1405struct SetLayer final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1413 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1424 auto show(std::ostream &
os)
const ->
void override
1426 os <<
"Set Layer to: " <<
layer;
1430struct SetMTU final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1438 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1449 auto show(std::ostream &
os)
const ->
void override
1451 os <<
"Set mtu to " <<
mtu;
1455struct SetSessionName final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1463 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1474 auto show(std::ostream &
os)
const ->
void override
1480struct AddProxyBypass final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1488 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1503 auto show(std::ostream &
os)
const ->
void override
1517 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1528 auto show(std::ostream &
os)
const ->
void override
1534struct SetProxyHTTP final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1540 :
host{*
rc::gen::arbitrary<std::string>()},
port{*
rc::gen::arbitrary<int>()}
1544 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1546 model.http_proxy.host =
host;
1547 model.http_proxy.port =
port;
1557 auto show(std::ostream &
os)
const ->
void override
1559 os <<
"Set ProxyHTTP to host: " <<
host <<
" port: " <<
port;
1563struct SetProxyHTTPS final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1569 :
host{*
rc::gen::arbitrary<std::string>()},
port{*
rc::gen::arbitrary<int>()}
1573 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1575 model.https_proxy.host =
host;
1576 model.https_proxy.port =
port;
1586 auto show(std::ostream &
os)
const ->
void override
1588 os <<
"Set ProxyHTTPS to host: " <<
host <<
" port: " <<
port;
1592struct AddWINSServer final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1600 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1604 model.wins_servers.push_back(std::move(wins));
1614 auto show(std::ostream &
os)
const ->
void override
1620struct SetAllowFamily final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1626 :
af(*
rc::gen::elementOf<std::vector<int>>({AF_INET, AF_INET6})),
1627 allow{*rc::gen::arbitrary<bool>()}
1631 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1635 model.block_ipv4 = !
allow;
1637 else if (
af == AF_INET6)
1639 model.block_ipv6 = !
allow;
1650 else if (
af == AF_INET6)
1656 auto show(std::ostream &
os)
const ->
void override
1658 os <<
"Set allow local family to " <<
af <<
allow;
1667 :
allow{*
rc::gen::arbitrary<bool>()}
1671 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1673 model.block_outside_dns = !
allow;
1682 auto show(std::ostream &
os)
const ->
void override
1684 os <<
"Set allow local DNS to " << !
allow;
1690 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1692 model.tunnel_addresses.clear();
1693 model.tunnel_address_index_ipv4 = -1;
1694 model.tunnel_address_index_ipv6 = -1;
1705 auto show(std::ostream &
os)
const ->
void override
1707 os <<
"Reset Tunnel Addresses";
1711struct ResetDNSOptions final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1713 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1715 model.dns_options = {};
1725 auto show(std::ostream &
os)
const ->
void override
1727 os <<
"Reset DNS Options";
1731struct VPN_IPv4 final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1735 if (model.tunnel_address_index_ipv4 >= 0)
1738 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv4].address == ipv4_address->address);
1739 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv4].prefix_length == ipv4_address->prefix_length);
1740 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv4].metric == ipv4_address->metric);
1741 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv4].gateway == ipv4_address->gateway);
1742 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv4].ipv6 == ipv4_address->ipv6);
1743 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv4].net30 == ipv4_address->net30);
1751 auto show(std::ostream &
os)
const ->
void override
1757struct VPN_IPv6 final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1761 if (model.tunnel_address_index_ipv6 >= 0)
1764 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv6].address == ipv6_address->address);
1765 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv6].prefix_length == ipv6_address->prefix_length);
1766 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv6].metric == ipv6_address->metric);
1767 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv6].gateway == ipv6_address->gateway);
1768 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv6].ipv6 == ipv6_address->ipv6);
1769 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv6].net30 == ipv6_address->net30);
1777 auto show(std::ostream &
os)
const ->
void override
1783struct VPN_IP final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1787 explicit VPN_IP() :
version{*
rc::gen::elementOf<std::vector<IP::Addr::Version>>({IP::Addr::Version::V4, IP::Addr::Version::V6, IP::Addr::Version::UNSPEC})} {};
1791 const auto &ip_address =
sut.
vpn_ip(version);
1792 if (version == IP::Addr::Version::UNSPEC)
1796 else if (version == IP::Addr::Version::V4 && model.tunnel_address_index_ipv4 >= 0)
1798 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv4].address == ip_address->address);
1799 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv4].prefix_length == ip_address->prefix_length);
1800 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv4].metric == ip_address->metric);
1801 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv4].gateway == ip_address->gateway);
1802 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv4].ipv6 == ip_address->ipv6);
1803 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv4].net30 == ip_address->net30);
1805 else if (version == IP::Addr::Version::V6 && model.tunnel_address_index_ipv6 >= 0)
1807 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv6].address == ip_address->address);
1808 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv6].prefix_length == ip_address->prefix_length);
1809 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv6].metric == ip_address->metric);
1810 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv6].gateway == ip_address->gateway);
1811 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv6].ipv6 == ip_address->ipv6);
1812 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv6].net30 == ip_address->net30);
1816 auto show(std::ostream &
os)
const ->
void override
1824 const TunBuilderCaptureModel model{};
1826 check(model,
sut, rc::state::gen::execOneOfWithArgs<SetRemoteAddress, AddAddress, RerouteGW, SetRouteMetricDefault, AddRoute, ExcludeRoute, SetDNSOptions, SetLayer, SetMTU, SetSessionName, AddProxyBypass, SetProxyAutoConfigURL, SetProxyHTTP, SetProxyHTTPS, AddWINSServer, SetAllowFamily, SetAllowLocalDNS, ResetTunnelAddresses, ResetDNSOptions, VPN_IPv4, VPN_IPv6, VPN_IP>());
static constexpr unsigned int SIZE
static Layer from_value(const int value)
Class for handling Proxy Auto-Configuration (PAC) URLs.
bool defined() const
Checks if the URL is defined.
std::string to_string() const
Returns the URL as a string.
void validate(const std::string &title) const
Validates the URL format.
Json::Value to_json() const
Converts the URL to a JSON object.
Class for managing proxy bypass host configurations.
void validate(const std::string &title) const
Validates the bypass host value.
std::string to_string() const
Converts the bypass host to a string representation.
bool defined() const
Checks if a bypass host is defined.
Json::Value to_json() const
Serializes the object to JSON.
Host and port configuration for proxy connections.
std::string to_string() const
Converts the host and port to a string representation.
void validate(const std::string &title) const
Validates the host and port.
bool defined() const
Checks if the proxy configuration is defined.
Json::Value to_json() const
Converts the object to a JSON representation.
Represents a remote IP address with IPv4/IPv6 designation.
void validate(const std::string &title) const
Validates the IP address format.
void from_json(const Json::Value &root, const std::string &title)
Deserializes the object from a JSON value.
Json::Value to_json() const
Serializes the object to a JSON value.
bool defined() const
Checks if the address is defined.
std::string to_string() const
Returns a string representation of the remote address.
Class for handling gateway rerouting configuration.
std::string to_string() const
Converts the object to a human-readable string representation.
Json::Value to_json() const
Serializes the object to a JSON value.
Route address class that may use non-canonical form.
unsigned char prefix_length
Route class that must use canonical form.
Windows Internet Name Service (WINS) server configuration.
void validate(const std::string &title) const
Validates the WINS server address.
std::string to_string() const
Converts the WINS server to a string representation.
Json::Value to_json() const
Serializes the WINS server to a JSON object.
bool tun_builder_exclude_route(const std::string &address, int prefix_length, int metric, bool ipv6) override
Excludes a route from the tunnel.
RemoteAddress remote_address
bool tun_builder_set_allow_family(int af, bool allow) override
Sets whether to allow a specific address family in the tunnel.
std::vector< RouteAddress > tunnel_addresses
void validate() const
Validates the configuration of the tunnel.
bool tun_builder_add_proxy_bypass(const std::string &bypass_host) override
Adds a host to bypass proxy settings.
bool tun_builder_set_proxy_https(const std::string &host, int port) override
Sets the HTTPS proxy for the tunnel.
bool tun_builder_set_dns_options(const DnsOptions &dns) override
Set DNS options for use with tun builder.
bool tun_builder_add_route(const std::string &address, int prefix_length, int metric, bool ipv6) override
Adds a route to the tunnel.
bool tun_builder_set_allow_local_dns(bool allow) override
Sets whether to allow local DNS resolution.
bool tun_builder_set_route_metric_default(int metric) override
Sets the default route metric for VPN routes.
std::vector< Route > add_routes
const RouteAddress * vpn_ip(const IP::Addr::Version v) const
Gets the tunnel address for the specified IP version.
ProxyAutoConfigURL proxy_auto_config_url
int tunnel_address_index_ipv4
bool tun_builder_set_session_name(const std::string &name) override
Sets a descriptive name for the VPN session.
void reset_dns_options()
Resets DNS options to default values.
bool tun_builder_set_remote_address(const std::string &address, bool ipv6) override
Sets the remote address for the TUN interface.
bool tun_builder_set_mtu(int mtu) override
Sets the Maximum Transmission Unit (MTU) for the tunnel.
static TunBuilderCapture::Ptr from_json(const Json::Value &root)
Creates a TunBuilderCapture instance from a JSON representation.
Json::Value to_json() const
Serializes the tunnel configuration to a JSON object.
bool tun_builder_add_address(const std::string &address, int prefix_length, const std::string &gateway, bool ipv6, bool net30) override
Adds a local address to the TUN interface.
const RouteAddress * vpn_ipv6() const
Gets the IPv6 tunnel address.
bool tun_builder_set_layer(int layer) override
Sets the tunnel's network layer.
const RouteAddress * vpn_ipv4() const
Gets the IPv4 tunnel address.
bool tun_builder_set_proxy_http(const std::string &host, int port) override
Sets the HTTP proxy for the tunnel.
std::string to_string() const
Converts the tunnel configuration to a human-readable string representation.
bool tun_builder_set_proxy_auto_config_url(const std::string &url) override
Sets the URL for a proxy auto-configuration (PAC) file.
bool tun_builder_add_wins_server(const std::string &address) override
Adds a WINS server to the tunnel configuration.
std::vector< Route > exclude_routes
bool tun_builder_reroute_gw(bool ipv4, bool ipv6, unsigned int flags) override
Configures global gateway rerouting through the VPN tunnel.
std::vector< ProxyBypass > proxy_bypass
std::vector< WINSServer > wins_servers
void reset_tunnel_addresses()
Resets all tunnel addresses.
ProxyHostPort https_proxy
int tunnel_address_index_ipv6
Route route_from_string(const std::string &rtstr, const TITLE &title, const IP::Addr::Version required_version=IP::Addr::UNSPEC)
auto calculateIPPrefixRange(const std::string &ipAddress) -> std::tuple< int, int >
Calculates the valid IP prefix range for a given IP address.
auto genDnsAddressAsStr(const bool valid=true) -> Gen< std::string >
Generates a DNS address as a string.
std::variant< openvpn::TunBuilderCapture::Route, openvpn::TunBuilderCapture::RouteAddress, openvpn::TunBuilderCapture::RouteBase > RouteBased
Alias representing a route-based variant type.
auto IPv4Address(const bool valid=true) -> Gen< std::string >
Generates a random IPv4 address.
auto IPv6Address(const bool valid=true) -> Gen< std::string >
Generates a random IPv6 address.
auto show(std::ostream &os) const -> void override
auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
auto apply(TunBuilderCaptureModel &model) const -> void override
unsigned char prefix_length
auto apply(TunBuilderCaptureModel &model) const -> void override
auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
auto show(std::ostream &os) const -> void override
auto show(std::ostream &os) const -> void override
auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
auto apply(TunBuilderCaptureModel &model) const -> void override
unsigned char prefix_length
auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
auto apply(TunBuilderCaptureModel &model) const -> void override
auto show(std::ostream &os) const -> void override
auto show(std::ostream &os) const -> void override
auto apply(TunBuilderCaptureModel &model) const -> void override
auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
unsigned char prefix_length
auto show(std::ostream &os) const -> void override
auto apply(TunBuilderCaptureModel &model) const -> void override
auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
auto show(std::ostream &os) const -> void override
auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
auto apply(TunBuilderCaptureModel &model) const -> void override
auto show(std::ostream &os) const -> void override
auto apply(TunBuilderCaptureModel &model) const -> void override
auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
auto apply(TunBuilderCaptureModel &model) const -> void override
auto show(std::ostream &os) const -> void override
auto show(std::ostream &os) const -> void override
auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
auto apply(TunBuilderCaptureModel &model) const -> void override
auto apply(TunBuilderCaptureModel &model) const -> void override
auto show(std::ostream &os) const -> void override
auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
auto apply(TunBuilderCaptureModel &model) const -> void override
auto show(std::ostream &os) const -> void override
auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
auto apply(TunBuilderCaptureModel &model) const -> void override
auto show(std::ostream &os) const -> void override
auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
auto show(std::ostream &os) const -> void override
std::string proxy_auto_config_url
auto apply(TunBuilderCaptureModel &model) const -> void override
auto apply(TunBuilderCaptureModel &model) const -> void override
auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
auto show(std::ostream &os) const -> void override
auto apply(TunBuilderCaptureModel &model) const -> void override
auto show(std::ostream &os) const -> void override
auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
auto apply(TunBuilderCaptureModel &model) const -> void override
auto show(std::ostream &os) const -> void override
auto apply(TunBuilderCaptureModel &model) const -> void override
auto show(std::ostream &os) const -> void override
auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
auto apply(TunBuilderCaptureModel &model) const -> void override
auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
auto show(std::ostream &os) const -> void override
IP::Addr::Version version
auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
auto show(std::ostream &os) const -> void override
auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
auto show(std::ostream &os) const -> void override
auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
auto show(std::ostream &os) const -> void override
A name server address and optional port.
All DNS options set with the –dns or –dhcp-option directive.
std::map< int, DnsServer > servers
List of DNS servers to use, according to the list of priority.
std::vector< DnsDomain > search_domains
List of global DNS search domains to use.
std::string to_string() const
DNS settings for a name server.
std::vector< DnsAddress > addresses
Parsed from –dns server n address ADDRESS[:PORT] [...] or –dhcp-option DNS/DNS6.
int tunnel_address_index_ipv4
RC_ASSERT_THROWS_AS(remote_address.validate(title), openvpn::IP::ip_exception)
const auto & excluded_route
TunBuilderCapture::RerouteGW reroute_gw
const TunBuilderCapture::Ptr tbc(new TunBuilderCapture)
TunBuilderCapture::RemoteAddress remote_address
TunBuilderCapture::ProxyHostPort http_proxy
const Json::Value invalid_json
std::vector< TunBuilderCapture::WINSServer > wins_servers
TunBuilderCapture::ProxyBypass proxy_bypass
TunBuilderCapture::ProxyAutoConfigURL proxy_auto_config_url
const auto wins_server_as_json
const std::string ipv4_and_ipv6_return_string
const TunBuilderCapture::RouteAddress * vpn_address
TunBuilderCapture::ProxyHostPort https_proxy
const auto reroute_gw_as_json
TunBuilderCapture::ProxyHostPort proxy_host_port
TunBuilderCapture::RemoteAddress from_json
static constexpr auto mtu_ipv4_maximum
const auto address_as_json
RC_ASSERT_FALSE(tbc->block_outside_dns==allow)
RC_ASSERT(remote_address.defined())
std::vector< TunBuilderCapture::Route > add_routes
os<< "Block IPv4: "<<(tbc->block_ipv4 ? "yes" :"no")<< '\n';os<< "Block IPv6: "<<(tbc->block_ipv6 ? "yes" :"no")<< '\n';os<< "Block local DNS: "<<(tbc->block_outside_dns ? "yes" :"no")<< '\n';os<< "Add Routes:\n";os<< "Exclude Routes:\n";RC_ASSERT(tbc->to_string()==os.str());}struct TunBuilderCaptureModel{ std::string session_name;int mtu{0};Layer layer{Layer::OSI_LAYER_3};TunBuilderCapture::RemoteAddress remote_address{};std::vector< TunBuilderCapture::RouteAddress > tunnel_addresses
const auto proxy_autoconfig_url_as_json
TunBuilderCapture::ProxyAutoConfigURL proxy_autoconfig_url
const auto proxy_bypass_as_json
std::vector< TunBuilderCapture::Route > exclude_routes
check(model, sut, rc::state::gen::execOneOfWithArgs< SetRemoteAddress, AddAddress, RerouteGW, SetRouteMetricDefault, AddRoute, ExcludeRoute, SetDNSOptions, SetLayer, SetMTU, SetSessionName, AddProxyBypass, SetProxyAutoConfigURL, SetProxyHTTP, SetProxyHTTPS, AddWINSServer, SetAllowFamily, SetAllowLocalDNS, ResetTunnelAddresses, ResetDNSOptions, VPN_IPv4, VPN_IPv6, VPN_IP >())
const auto proxy_host_port_as_json
int tunnel_address_index_ipv6