3#include <rapidcheck/state.h>
15 server.
addresses = {{{
"8.8.8.8"}, 0}, {{
"8.8.4.4"}, 53}};
49 const std::string j1_txt = j1.toStyledString();
59 Json::Value j2 = tbc2->
to_json();
60 const std::string j2_txt = j2.toStyledString();
65 ASSERT_EQ(j1_txt, j2_txt) <<
"round trip failed";
72TEST(RemoteAddress, EmptyIsNotDefined)
78RC_GTEST_PROP(RemoteAddress, NonEmptyIsDefined, ())
80 const auto address = *rc::gen::nonEmpty<std::string>();
86TEST(RemoteAddress, EmptyStringRepresentation)
92TEST(RemoteAddress, EmptyStringRepresentationIncludesIPv6Setting)
99RC_GTEST_PROP(RemoteAddress, StringRepresentationReturnsAddress, (
const std::string &
address))
106RC_GTEST_PROP(RemoteAddress, StringRepresentationIncludesIPv6Setting, (
const std::string &
address))
114RC_GTEST_PROP(RemoteAddress, EmptyThrowsOnValidation, (
const std::string &title))
120RC_GTEST_PROP(RemoteAddress, ValidatesIPv4, (
const std::string &title))
127RC_GTEST_PROP(RemoteAddress, ValidatesIPv6, (
const std::string &title))
136RC_GTEST_PROP(RemoteAddress, ThrowsValidatingMismatchedIPVersion, (
const std::string &title,
bool ipv6))
146RC_GTEST_PROP(RemoteAddress, ThrowsValidatingInvalidIP, (
const std::string &title,
bool ipv6))
155RC_GTEST_PROP(RemoteAddress, EmptyJsonRoundTripHaveSameStringRepresentation, (
const std::string &title))
164RC_GTEST_PROP(RemoteAddress, EmptyJsonRoundTripHaveSameDefinedStatus, (
const std::string &title))
173RC_GTEST_PROP(RemoteAddress, EmptyJsonRoundTripThrowsOnValidation, (
const std::string &title))
183RC_GTEST_PROP(RemoteAddress, JsonRoundTripHaveSameStringRepresentation, (
const std::string &
address,
const std::string &title,
bool ipv6))
194RC_GTEST_PROP(RemoteAddress, JsonRoundTripHaveSameDefinedStatus, (
const std::string &title))
203RC_GTEST_PROP(RemoteAddress, JsonRoundTripThrowsValidatingMismatchedIPVersion, (
const std::string &title,
bool ipv6))
216RC_GTEST_PROP(RemoteAddress, JsonRoundTripThrowsValidatingInvalidIP, (
const std::string &title,
bool ipv6))
228RC_GTEST_PROP(RemoteAddress, JsonRoundTripValidatesCorrectIP, (
const std::string &title,
bool ipv6))
240RC_GTEST_PROP(RemoteAddress, FromInvalidJsonDoesNotChangeOriginalObject, (
const std::string &
address,
const std::string &title,
bool ipv6))
273 ret +=
"REROUTE_GW ";
277 ret +=
"AUTO_LOCAL ";
281 ret +=
"BYPASS_DHCP ";
283 ret +=
"BYPASS_DNS ";
285 ret +=
"BLOCK_LOCAL ";
295RC_GTEST_PROP(
RerouteGW, EmptyJsonRoundTripHaveSameStringRepresentation, (
const std::string &title))
330RC_GTEST_PROP(RouteBased, EmptyStringRepresentationReturnsUnsetPrefixLength, (
rc::RouteBased route_based))
333 [](
auto &&route_base_variant)
334 {
RC_ASSERT(route_base_variant.to_string() ==
"/0"); },
338RC_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))
341 [&
address, prefix_length,
metric, &gateway,
ipv6, net30](
auto &&route_base_variant)
343 route_base_variant.address =
address;
344 route_base_variant.prefix_length = prefix_length;
345 route_base_variant.metric =
metric;
346 route_base_variant.gateway = gateway;
347 route_base_variant.ipv6 =
ipv6;
348 route_base_variant.net30 = net30;
350 output +=
address +
"/" + std::to_string(prefix_length);
351 if (!gateway.empty())
352 output +=
" -> " + gateway;
354 output +=
" [METRIC=" + std::to_string(
metric) +
"]";
358 output +=
" [net30]";
359 RC_ASSERT(route_base_variant.to_string() == output);
364RC_GTEST_PROP(RouteBased, EmptyThrowsOnValidation, (
rc::RouteBased route_based,
const std::string &title))
367 [&title](
auto &&route_base_variant)
369 using T = std::decay_t<
decltype(route_base_variant)>;
370 if constexpr (std::is_same_v<T, TunBuilderCapture::RouteBase>)
372 RC_DISCARD(
"RouteBase does not have public validate method");
382RC_GTEST_PROP(RouteBased, Validates, (
rc::RouteBased route_based,
bool ipv6,
bool net30,
const std::string &title))
386 [
ipv6, net30, &title](
auto &&route_base_variant)
388 using T = std::decay_t<
decltype(route_base_variant)>;
389 if constexpr (std::is_same_v<T, TunBuilderCapture::RouteBase>)
391 RC_DISCARD(
"RouteBase does not have public validate method");
399 route_base_variant.ipv6 =
true;
401 ipv6_route.force_canonical();
402 route_base_variant.address = ipv6_route.to_string_optional_prefix_len();
407 route_base_variant.ipv6 =
false;
408 route_base_variant.address = *
rc::IPv4Address().as(
"Valid IPv4 address");
410 if (net30 && prefix_min <= 30 && prefix_max >= 30)
412 route_base_variant.net30 =
true;
413 route_base_variant.prefix_length = 30;
417 route_base_variant.net30 =
false;
418 route_base_variant.prefix_length = *rc::gen::inRange(
static_cast<char>(prefix_min),
static_cast<char>(prefix_max + 1)).as(
"Valid prefix length");
421 if (
auto maybe_metric = *rc::gen::maybe(rc::gen::arbitrary<int>().as(
"Metric value")).as(
"Maybe metric"))
423 route_base_variant.metric = *maybe_metric;
427 route_base_variant.gateway = *maybe_gateway;
429 route_base_variant.validate(title);
436RC_GTEST_PROP(RouteBased, EmptyJsonRoundTripHaveSameStringRepresentation, (
rc::RouteBased route_based,
const std::string &title))
439 [&title](
auto &&route_base_variant)
441 const auto route_based_as_json = route_base_variant.to_json();
442 using T = std::decay_t<
decltype(route_base_variant)>;
450RC_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))
453 [&
address, prefix_length,
metric, &gateway,
ipv6, net30, &title](
auto &&route_base_variant)
455 route_base_variant.address =
address;
456 route_base_variant.prefix_length = prefix_length;
457 route_base_variant.metric =
metric;
458 route_base_variant.gateway = gateway;
459 route_base_variant.ipv6 =
ipv6;
460 route_base_variant.net30 = net30;
461 const auto route_based_as_json = route_base_variant.to_json();
462 using T = std::decay_t<
decltype(route_base_variant)>;
471RC_GTEST_PROP(RouteBased, FromInvalidJsonThrows, (
rc::RouteBased route_based,
const std::string &title))
474 [&title](
auto &&route_base_variant)
486TEST(ProxyBypass, EmptyIsNotDefined)
492RC_GTEST_PROP(ProxyBypass, NonEmptyIsDefined, ())
494 const auto bypass_host = *rc::gen::nonEmpty<std::string>();
500TEST(ProxyBypass, EmptyStringRepresentation)
506RC_GTEST_PROP(ProxyBypass, StringRepresentationReturnBypassHost, (
const std::string &
bypass_host))
513RC_GTEST_PROP(ProxyBypass, EmptyValidates, (
const std::string &title))
519RC_GTEST_PROP(ProxyBypass, EmptyJsonRoundTripHaveSameStringRepresentation, (
const std::string &title))
528RC_GTEST_PROP(ProxyBypass, EmptyJsonRoundTripHaveSameDefinedStatus, (
const std::string &title))
537RC_GTEST_PROP(ProxyBypass, EmptyJsonRoundTripValidates, (
const std::string &title))
547RC_GTEST_PROP(ProxyBypass, JsonRoundTripHaveSameStringRepresentation, (
const std::string &
bypass_host,
const std::string &title))
557RC_GTEST_PROP(ProxyBypass, JsonRoundTripHaveSameDefinedStatus, (
const std::string &
bypass_host,
const std::string &title))
567RC_GTEST_PROP(ProxyBypass, FromInvalidJsonThrows, (
const std::string &title))
578TEST(ProxyAutoConfigURL, EmptyIsNotDefined)
584RC_GTEST_PROP(ProxyAutoConfigURL, NonEmptyIsDefined, ())
586 const auto url = *rc::gen::nonEmpty<std::string>();
592TEST(ProxyAutoConfigURL, EmptyStringRepresentation)
598RC_GTEST_PROP(ProxyAutoConfigURL, StringRepresentationReturnsURL, (
const std::string &
url))
605RC_GTEST_PROP(ProxyAutoConfigURL, EmptyValidates, (
const std::string &title))
611RC_GTEST_PROP(ProxyAutoConfigURL, EmptyJsonRoundTripHaveSameStringRepresentation, (
const std::string &title))
620RC_GTEST_PROP(ProxyAutoConfigURL, EmptyJsonRoundTripHaveSameDefinedStatus, (
const std::string &title))
629RC_GTEST_PROP(ProxyAutoConfigURL, EmptyJsonRoundTripValidates, (
const std::string &title))
639RC_GTEST_PROP(ProxyAutoConfigURL, JsonRoundTripHaveSameStringRepresentation, (
const std::string &
url,
const std::string &title))
649RC_GTEST_PROP(ProxyAutoConfigURL, JsonRoundTripHaveSameDefinedStatus, (
const std::string &
url,
const std::string &title))
659RC_GTEST_PROP(ProxyAutoConfigURL, FromInvalidJsonDoesNotChangeOriginalObject, (
const std::string &domain,
const std::string &title))
672TEST(ProxyHostPort, EmptyIsNotDefined)
678RC_GTEST_PROP(ProxyHostPort, NonEmptyIsDefined, ())
680 const auto host = *rc::gen::nonEmpty<std::string>();
686TEST(ProxyHostPort, EmptyStringRepresentationReturnsDefaultPort)
692RC_GTEST_PROP(ProxyHostPort, StringRepresentationReturnsHostPort, (
const std::string &
host,
const int port))
700RC_GTEST_PROP(ProxyHostPort, EmptyValidates, (
const std::string &title))
706RC_GTEST_PROP(ProxyHostPort, EmptyJsonRoundTripHaveSameStringRepresentation, (
const std::string &title))
715RC_GTEST_PROP(ProxyHostPort, EmptyJsonRoundTripHaveSameDefinedStatus, (
const std::string &title))
724RC_GTEST_PROP(ProxyHostPort, EmptyJsonRoundTripValidates, (
const std::string &title))
734RC_GTEST_PROP(ProxyHostPort, JsonRoundTripHaveSameStringRepresentation, (
const std::string &
host,
const int port,
const std::string &title))
745RC_GTEST_PROP(ProxyHostPort, JsonRoundTripHaveSameDefinedStatus, (
const std::string &
host,
const std::string &title))
755RC_GTEST_PROP(ProxyHostPort, FromInvalidJsonDoesNotChangeOriginalObject, (
const std::string &
host,
const int port,
const std::string &title))
770TEST(WINSServer, EmptyStringRepresentation)
773 ASSERT_TRUE(wins_server.
to_string().empty());
776RC_GTEST_PROP(WINSServer, StringRepresentationReturnsAddress, (
const std::string &
address))
783RC_GTEST_PROP(WINSServer, EmptyThrowsOnValidation, (
const std::string &title))
789RC_GTEST_PROP(WINSServer, ValidatesAddress, (
const std::string &title))
796RC_GTEST_PROP(WINSServer, ThrowsValidatingInvalidAddress, (
const std::string &title))
803RC_GTEST_PROP(WINSServer, EmptyJsonRoundTripHaveSameStringRepresentation, (
const std::string &title))
812RC_GTEST_PROP(WINSServer, EmptyJsonRoundTripThrowsOnValidation, (
const std::string &title))
822RC_GTEST_PROP(WINSServer, JsonRoundTripHaveSameStringRepresentation, (
const std::string &
address,
const std::string &title))
832RC_GTEST_PROP(WINSServer, JsonRoundTripValidatesAddress, (
const std::string &title))
843RC_GTEST_PROP(WINSServer, JsonRoundTripThrowsValidatingInvalidIP, (
const std::string &title))
854RC_GTEST_PROP(WINSServer, FromInvalidJsonThrows, (
const std::string &title))
873RC_GTEST_PROP(
TunBuilderCapture, AddsAddress, (
const std::string &
address,
const unsigned char prefix_length,
const std::string &gateway,
const bool ipv6,
const bool net30))
904 const auto metric = *rc::gen::positive<int>().as(
"Valid route metric");
924RC_GTEST_PROP(
TunBuilderCapture, SetsDNSOptions, (
const std::string &
address,
const unsigned int port,
const std::string &search_domain))
940 const auto layer = *rc::gen::element(3, 2, 0).as(
"Layer - 3, 2 or 0");
952RC_GTEST_PROP(
TunBuilderCapture, SetsSessionName, (
const std::string &session_name))
999 const auto allow_family = *rc::gen::element(AF_INET, AF_INET6).as(
"Allow family - AF_INET or AF_INET6");
1018RC_GTEST_PROP(
TunBuilderCapture, ResetsTunnelAddresses, (
const std::string &
address,
const unsigned char prefix_length,
const std::string &gateway,
const bool ipv6,
const bool net30))
1032RC_GTEST_PROP(
TunBuilderCapture, ResetsDNSOptions, (
const std::string &
address,
const unsigned int port,
const std::string &search_domain))
1046RC_GTEST_PROP(
TunBuilderCapture, ReturnsVPNIPv4, (
const std::string &
address,
const unsigned char prefix_length,
const std::string &gateway,
const bool net30))
1058RC_GTEST_PROP(
TunBuilderCapture, ReturnsVPNIPv6, (
const std::string &
address,
const unsigned char prefix_length,
const std::string &gateway,
const bool net30))
1070RC_GTEST_PROP(
TunBuilderCapture, ReturnsVPNIP, (
const std::string &
address,
const unsigned char prefix_length,
const std::string &gateway,
const bool ipv6,
const bool net30))
1083RC_GTEST_PROP(
TunBuilderCapture, StringRepresentation, (
const std::string &
address,
const unsigned char prefix_length,
const std::string &gateway,
const bool ipv6,
const bool net30))
1086 std::ostringstream
os = {};
1090 os <<
"Tunnel Addresses:\n";
1095 os <<
"Add Routes:\n";
1096 os <<
"Exclude Routes:\n";
1100struct TunBuilderCaptureModel
1102 std::string session_name;
1117 std::vector<TunBuilderCapture::ProxyBypass>
proxy_bypass;
1131 :
address{*
rc::gen::arbitrary<std::string>()},
ipv6{*
rc::gen::arbitrary<bool>()}
1135 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1137 model.remote_address.address =
address;
1138 model.remote_address.ipv6 =
ipv6;
1148 auto show(std::ostream &
os)
const ->
void override
1150 os <<
"Set RemoteAddress to " <<
address <<
" " << (
ipv6 ?
"IPv6" :
"IPv4");
1154struct AddAddress final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1168 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1178 model.tunnel_address_index_ipv6 =
static_cast<int>(model.tunnel_addresses.size());
1182 model.tunnel_address_index_ipv4 =
static_cast<int>(model.tunnel_addresses.size());
1184 model.tunnel_addresses.push_back(std::move(
address));
1219 auto show(std::ostream &
os)
const ->
void override
1225struct RerouteGW final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1232 :
ipv4{*
rc::gen::arbitrary<bool>()},
ipv6{*
rc::gen::arbitrary<bool>()},
flags{*
rc::gen::arbitrary<unsigned int>()}
1236 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1238 model.reroute_gw.ipv4 =
ipv4;
1239 model.reroute_gw.ipv6 =
ipv6;
1240 model.reroute_gw.flags =
flags;
1251 auto show(std::ostream &
os)
const ->
void override
1253 os <<
"Set RerouteGW ipv4: " <<
ipv4 <<
" ipv6: " <<
ipv6 <<
" flags: " <<
flags;
1262 :
metric{*
rc::gen::arbitrary<int>()}
1266 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1268 model.route_metric_default =
metric;
1277 auto show(std::ostream &
os)
const ->
void override
1279 os <<
"Set route metric default to " <<
metric;
1283struct AddRoute final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1293 :
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>()}
1297 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1304 model.add_routes.push_back(std::move(route));
1318 auto show(std::ostream &
os)
const ->
void override
1324struct ExcludeRoute final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1334 :
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>()}
1338 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1345 model.exclude_routes.push_back(std::move(route));
1359 auto show(std::ostream &
os)
const ->
void override
1365struct SetLayer final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1373 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1384 auto show(std::ostream &
os)
const ->
void override
1386 os <<
"Set Layer to: " <<
layer;
1390struct SetMTU final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1398 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1409 auto show(std::ostream &
os)
const ->
void override
1411 os <<
"Set mtu to " <<
mtu;
1415struct SetSessionName final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1423 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1434 auto show(std::ostream &
os)
const ->
void override
1440struct AddProxyBypass final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1448 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1463 auto show(std::ostream &
os)
const ->
void override
1477 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1488 auto show(std::ostream &
os)
const ->
void override
1494struct SetProxyHTTP final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1500 :
host{*
rc::gen::arbitrary<std::string>()},
port{*
rc::gen::arbitrary<int>()}
1504 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1506 model.http_proxy.host =
host;
1507 model.http_proxy.port =
port;
1517 auto show(std::ostream &
os)
const ->
void override
1519 os <<
"Set ProxyHTTP to host: " <<
host <<
" port: " <<
port;
1523struct SetProxyHTTPS final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1529 :
host{*
rc::gen::arbitrary<std::string>()},
port{*
rc::gen::arbitrary<int>()}
1533 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1535 model.https_proxy.host =
host;
1536 model.https_proxy.port =
port;
1546 auto show(std::ostream &
os)
const ->
void override
1548 os <<
"Set ProxyHTTPS to host: " <<
host <<
" port: " <<
port;
1552struct AddWINSServer final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1560 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1564 model.wins_servers.push_back(std::move(wins));
1574 auto show(std::ostream &
os)
const ->
void override
1580struct SetAllowFamily final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1586 :
af(*
rc::gen::elementOf<std::vector<int>>({AF_INET, AF_INET6})),
1587 allow{*rc::gen::arbitrary<bool>()}
1591 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1595 model.block_ipv4 = !
allow;
1597 else if (
af == AF_INET6)
1599 model.block_ipv6 = !
allow;
1610 else if (
af == AF_INET6)
1616 auto show(std::ostream &
os)
const ->
void override
1618 os <<
"Set allow local family to " <<
af <<
allow;
1627 :
allow{*
rc::gen::arbitrary<bool>()}
1631 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1633 model.block_outside_dns = !
allow;
1642 auto show(std::ostream &
os)
const ->
void override
1644 os <<
"Set allow local DNS to " << !
allow;
1650 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1652 model.tunnel_addresses.clear();
1653 model.tunnel_address_index_ipv4 = -1;
1654 model.tunnel_address_index_ipv6 = -1;
1665 auto show(std::ostream &
os)
const ->
void override
1667 os <<
"Reset Tunnel Addresses";
1671struct ResetDNSOptions final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1673 auto apply(TunBuilderCaptureModel &model)
const ->
void override
1675 model.dns_options = {};
1685 auto show(std::ostream &
os)
const ->
void override
1687 os <<
"Reset DNS Options";
1691struct VPN_IPv4 final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1695 if (model.tunnel_address_index_ipv4 >= 0)
1698 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv4].address == ipv4_address->address);
1699 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv4].prefix_length == ipv4_address->prefix_length);
1700 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv4].metric == ipv4_address->metric);
1701 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv4].gateway == ipv4_address->gateway);
1702 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv4].ipv6 == ipv4_address->ipv6);
1703 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv4].net30 == ipv4_address->net30);
1711 auto show(std::ostream &
os)
const ->
void override
1717struct VPN_IPv6 final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1721 if (model.tunnel_address_index_ipv6 >= 0)
1724 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv6].address == ipv6_address->address);
1725 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv6].prefix_length == ipv6_address->prefix_length);
1726 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv6].metric == ipv6_address->metric);
1727 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv6].gateway == ipv6_address->gateway);
1728 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv6].ipv6 == ipv6_address->ipv6);
1729 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv6].net30 == ipv6_address->net30);
1737 auto show(std::ostream &
os)
const ->
void override
1743struct VPN_IP final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1747 explicit VPN_IP() :
version{*
rc::gen::elementOf<std::vector<IP::Addr::Version>>({IP::Addr::Version::V4, IP::Addr::Version::V6, IP::Addr::Version::UNSPEC})} {};
1751 const auto &ip_address =
sut.
vpn_ip(version);
1752 if (version == IP::Addr::Version::UNSPEC)
1756 else if (version == IP::Addr::Version::V4 && model.tunnel_address_index_ipv4 >= 0)
1758 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv4].address == ip_address->address);
1759 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv4].prefix_length == ip_address->prefix_length);
1760 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv4].metric == ip_address->metric);
1761 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv4].gateway == ip_address->gateway);
1762 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv4].ipv6 == ip_address->ipv6);
1763 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv4].net30 == ip_address->net30);
1765 else if (version == IP::Addr::Version::V6 && model.tunnel_address_index_ipv6 >= 0)
1767 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv6].address == ip_address->address);
1768 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv6].prefix_length == ip_address->prefix_length);
1769 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv6].metric == ip_address->metric);
1770 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv6].gateway == ip_address->gateway);
1771 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv6].ipv6 == ip_address->ipv6);
1772 RC_ASSERT(model.tunnel_addresses[model.tunnel_address_index_ipv6].net30 == ip_address->net30);
1776 auto show(std::ostream &
os)
const ->
void override
1784 const TunBuilderCaptureModel model{};
1786 check(model,
sut, rc::state::gen::execOneOfWithArgs<SetRemoteAddress, AddAddress, RerouteGW, SetRouteMetricDefault, AddRoute, ExcludeRoute, SetLayer, SetMTU, SetSessionName, AddProxyBypass, SetProxyAutoConfigURL, SetProxyHTTP, SetProxyHTTPS, AddWINSServer, SetAllowFamily, SetAllowLocalDNS, ResetTunnelAddresses, ResetDNSOptions, VPN_IPv4, VPN_IPv6, VPN_IP>());
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.
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 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
All DNS options set with the –dns or –dhcp-option directive.
std::map< int, DnsServer > servers
std::vector< DnsDomain > search_domains
std::string to_string() const
DNS settings for a name server.
std::vector< DnsAddress > addresses
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
check(model, sut, rc::state::gen::execOneOfWithArgs< SetRemoteAddress, AddAddress, RerouteGW, SetRouteMetricDefault, AddRoute, ExcludeRoute, SetLayer, SetMTU, SetSessionName, AddProxyBypass, SetProxyAutoConfigURL, SetProxyHTTP, SetProxyHTTPS, AddWINSServer, SetAllowFamily, SetAllowLocalDNS, ResetTunnelAddresses, ResetDNSOptions, VPN_IPv4, VPN_IPv6, VPN_IP >())
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
const auto proxy_host_port_as_json
int tunnel_address_index_ipv6