OpenVPN 3 Core Library
Loading...
Searching...
No Matches
test_capture.cpp
Go to the documentation of this file.
1// OpenVPN -- An application to securely tunnel IP networks
2// over a single port, with support for SSL/TLS-based
3// session authentication and key exchange,
4// packet encryption, packet authentication, and
5// packet compression.
6//
7// Copyright (C) 2019- OpenVPN Inc.
8//
9// SPDX-License-Identifier: MPL-2.0 OR AGPL-3.0-only WITH openvpn3-openssl-exception
10//
11
12#include "test_common.hpp"
13#include "test_generators.hpp"
14#include <rapidcheck/state.h>
15
16#include <iostream>
17
20
21using namespace openvpn;
22
23TEST(Misc, Capture)
24{
25 DnsServer server;
26 server.addresses = {DnsAddress("8.8.8.8"), DnsAddress("8.8.4.4:53")};
28 dns_options.servers[0] = std::move(server);
29 dns_options.search_domains = {DnsDomain("yonan.net"), DnsDomain("openvpn.net")};
30
32
33 tbc->tun_builder_set_remote_address("52.7.171.249", false);
34 tbc->tun_builder_add_address("1.2.3.4", 24, "10.10.0.1", false, false);
35 tbc->tun_builder_add_address("fe80::c32:4ff:febf:97d9", 64, "9999::7777", true, false);
36 tbc->tun_builder_reroute_gw(true, false, 123);
37 tbc->tun_builder_add_route("192.168.0.0", 16, 33, false);
38 tbc->tun_builder_add_route("10.0.0.0", 8, -1, false);
39 tbc->tun_builder_add_route("2000::", 4, 55, true);
40 // tbc->tun_builder_add_route("X000::", 4, -1, true); // fixme
41 tbc->tun_builder_add_route("3000::", 4, -1, true);
42 tbc->tun_builder_add_route("fc00::", 7, 66, true);
43 tbc->tun_builder_exclude_route("10.10.0.0", 24, 77, false);
44 tbc->tun_builder_exclude_route("::1", 128, -1, true);
47 tbc->tun_builder_set_session_name("onewaytickettothemoon");
48 tbc->tun_builder_add_proxy_bypass("bypass.example.com");
49 tbc->tun_builder_set_proxy_auto_config_url("http://wpad.yonan.net/");
50 tbc->tun_builder_set_proxy_http("foo.bar.gov", 1234);
51 tbc->tun_builder_set_proxy_https("zoo.bar.gov", 4321);
54 tbc->tun_builder_set_allow_family(AF_INET6, true);
55
56 // OPENVPN_LOG("TEXT #1:\n" << tbc->to_string());
57
58 // const std::string fn1 = "cap1.txt";
59 const Json::Value j1 = tbc->to_json();
60 const std::string j1_txt = j1.toStyledString();
61
62 // OPENVPN_LOG("writing to " << fn1);
63
65 // OPENVPN_LOG("JSON #1:\n" << j1_txt);
66
67 // const std::string fn2 = "cap2.txt";
69 tbc2->validate();
70 const Json::Value j2 = tbc2->to_json();
71 const std::string j2_txt = j2.toStyledString();
72 // OPENVPN_LOG("writing to " << fn2);
73 // write_string(fn2, j2_txt);
74 // OPENVPN_LOG("JSON #2:\n" << j2_txt);
75
76 ASSERT_EQ(j1_txt, j2_txt) << "round trip failed";
77}
78
79// ===============================================================================================
80// RemoteAddress tests
81// ===============================================================================================
82
83TEST(RemoteAddress, EmptyIsNotDefined)
84{
86 ASSERT_FALSE(remote_address.defined());
87}
88
89RC_GTEST_PROP(RemoteAddress, NonEmptyIsDefined, ())
90{
91 const auto address = *rc::gen::nonEmpty<std::string>();
95}
96
97TEST(RemoteAddress, EmptyStringRepresentation)
98{
100 ASSERT_TRUE(remote_address.to_string().empty());
101}
102
103TEST(RemoteAddress, EmptyStringRepresentationIncludesIPv6Setting)
104{
106 remote_address.ipv6 = true;
107 ASSERT_EQ(remote_address.to_string(), " [IPv6]");
108}
109
110RC_GTEST_PROP(RemoteAddress, StringRepresentationReturnsAddress, (const std::string &address))
111{
115}
116
117RC_GTEST_PROP(RemoteAddress, StringRepresentationIncludesIPv6Setting, (const std::string &address))
118{
122 RC_ASSERT(remote_address.to_string() == address + " [IPv6]");
123}
124
125RC_GTEST_PROP(RemoteAddress, EmptyThrowsOnValidation, (const std::string &title))
126{
128 RC_ASSERT_THROWS_AS(remote_address.validate(title), openvpn::IP::ip_exception);
129}
130
131RC_GTEST_PROP(RemoteAddress, ValidatesIPv4, (const std::string &title))
132{
134 remote_address.address = *rc::IPv4Address().as("Valid IPv4 address");
136}
137
138RC_GTEST_PROP(RemoteAddress, ValidatesIPv6, (const std::string &title))
139{
141 remote_address.address = *rc::IPv6Address().as("Valid IPv6 address");
142 // Assumption: you have to specify manually and don't forget to set .ipv6 or else it throws
143 remote_address.ipv6 = true;
145}
146
147RC_GTEST_PROP(RemoteAddress, ThrowsValidatingMismatchedIPVersion, (const std::string &title, bool ipv6))
148{
150 // Intentionally generate IP Address with mismatched version: IPv4 if ipv6 is true, IPv6 otherwise
151 remote_address.address = ipv6 ? *rc::IPv4Address().as("Valid IPv4 address") : *rc::IPv6Address().as("Valid IPv6 address");
152 // Assumption: you have to specify manually
154 RC_ASSERT_THROWS_AS(remote_address.validate(title), openvpn::IP::ip_exception);
155}
156
157RC_GTEST_PROP(RemoteAddress, ThrowsValidatingInvalidIP, (const std::string &title, bool ipv6))
158{
160 remote_address.address = ipv6 ? *rc::IPv6Address(false).as("Invalid IPv6 address") : *rc::IPv4Address(false).as("Invalid IPv4 address");
161 // Assumption: you have to specify manually
163 RC_ASSERT_THROWS_AS(remote_address.validate(title), openvpn::IP::ip_exception);
164}
165
166RC_GTEST_PROP(RemoteAddress, EmptyJsonRoundTripHaveSameStringRepresentation, (const std::string &title))
167{
173}
174
175RC_GTEST_PROP(RemoteAddress, EmptyJsonRoundTripHaveSameDefinedStatus, (const std::string &title))
176{
182}
183
184RC_GTEST_PROP(RemoteAddress, EmptyJsonRoundTripThrowsOnValidation, (const std::string &title))
185{
187 RC_ASSERT_THROWS_AS(remote_address.validate(title), openvpn::IP::ip_exception);
191 RC_ASSERT_THROWS_AS(from_json.validate(title), openvpn::IP::ip_exception);
192}
193
194RC_GTEST_PROP(RemoteAddress, JsonRoundTripHaveSameStringRepresentation, (const std::string &address, const std::string &title, bool ipv6))
195{
203}
204
205RC_GTEST_PROP(RemoteAddress, JsonRoundTripHaveSameDefinedStatus, (const std::string &title))
206{
212}
213
214RC_GTEST_PROP(RemoteAddress, JsonRoundTripThrowsValidatingMismatchedIPVersion, (const std::string &title, bool ipv6))
215{
217 // Intentionally generate IP Address with mismatched version: IPv4 if ipv6 is true, IPv6 otherwise
218 remote_address.address = ipv6 ? *rc::IPv4Address().as("Valid IPv4 address") : *rc::IPv6Address().as("Valid IPv6 address");
220 RC_ASSERT_THROWS_AS(remote_address.validate(title), openvpn::IP::ip_exception);
224 RC_ASSERT_THROWS_AS(from_json.validate(title), openvpn::IP::ip_exception);
225}
226
227RC_GTEST_PROP(RemoteAddress, JsonRoundTripThrowsValidatingInvalidIP, (const std::string &title, bool ipv6))
228{
230 remote_address.address = ipv6 ? *rc::IPv6Address(false).as("Invalid IPv6 address") : *rc::IPv4Address(false).as("Invalid IPv4 address");
232 RC_ASSERT_THROWS_AS(remote_address.validate(title), openvpn::IP::ip_exception);
236 RC_ASSERT_THROWS_AS(from_json.validate(title), openvpn::IP::ip_exception);
237}
238
239RC_GTEST_PROP(RemoteAddress, JsonRoundTripValidatesCorrectIP, (const std::string &title, bool ipv6))
240{
242 remote_address.address = ipv6 ? *rc::IPv6Address().as("Valid IPv6 address") : *rc::IPv4Address().as("Valid IPv4 address");
248 from_json.validate(title);
249}
250
251RC_GTEST_PROP(RemoteAddress, FromInvalidJsonDoesNotChangeOriginalObject, (const std::string &address, const std::string &title, bool ipv6))
252{
256 const Json::Value invalid_json;
260}
261
262// ===============================================================================================
263// RerouteGW tests
264// ===============================================================================================
265
266TEST(RerouteGW, EmptyStringRepresentationReturnsUnsetOptions)
267{
269 ASSERT_EQ(reroute_gw.to_string(), "IPv4=0 IPv6=0 flags=[ ]");
270}
271
272RC_GTEST_PROP(RerouteGW, StringRepresentationReturnsSetOptions, (bool ipv4, bool ipv6, rc::RedirectGatewayFlagsValues flags))
273{
278 // TODO: refactor original code so there's no need to rewrite method
279 std::string ret;
280 ret += "[ ";
282 ret += "ENABLE ";
284 ret += "REROUTE_GW ";
286 ret += "LOCAL ";
288 ret += "AUTO_LOCAL ";
290 ret += "DEF1 ";
292 ret += "BYPASS_DHCP ";
294 ret += "BYPASS_DNS ";
296 ret += "BLOCK_LOCAL ";
298 ret += "IPv4 ";
300 ret += "IPv6 ";
301 ret += "]";
302 const std::string ipv4_and_ipv6_return_string = {"IPv4=" + std::to_string(ipv4) + " IPv6=" + std::to_string(ipv6) + " "};
304}
305
306RC_GTEST_PROP(RerouteGW, EmptyJsonRoundTripHaveSameStringRepresentation, (const std::string &title))
307{
313}
314
315RC_GTEST_PROP(RerouteGW, JsonRoundTripHaveSameStringRepresentation, (bool ipv4, bool ipv6, rc::RedirectGatewayFlagsValues flags, const std::string &title))
316{
325}
326
327RC_GTEST_PROP(RerouteGW, FromInvalidJsonThrows, (bool ipv4, bool ipv6, rc::RedirectGatewayFlagsValues flags, const std::string &title))
328{
330 from_json.ipv4 = ipv4;
332 from_json.flags = flags;
333 const Json::Value invalid_json;
335}
336
337// ===============================================================================================
338// RouteBased tests
339// ===============================================================================================
340
341RC_GTEST_PROP(RouteBased, EmptyStringRepresentationReturnsUnsetPrefixLength, (rc::RouteBased route_based))
342{
343 std::visit(
344 [](auto &&route_base_variant)
345 { RC_ASSERT(route_base_variant.to_string() == "/0"); },
346 route_based);
347}
348
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))
350{
351 std::visit(
352 [&address, prefix_length, metric, &gateway, ipv6, net30](auto &&route_base_variant)
353 {
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;
360 std::string output;
361 output += address + "/" + std::to_string(prefix_length);
362 if (!gateway.empty())
363 output += " -> " + gateway;
364 if (metric >= 0)
365 output += " [METRIC=" + std::to_string(metric) + "]";
366 if (ipv6)
367 output += " [IPv6]";
368 if (net30)
369 output += " [net30]";
370 RC_ASSERT(route_base_variant.to_string() == output);
371 },
372 route_based);
373}
374
375RC_GTEST_PROP(RouteBased, EmptyThrowsOnValidation, (rc::RouteBased route_based, const std::string &title))
376{
377 std::visit(
378 [&title](auto &&route_base_variant)
379 {
380 using T = std::decay_t<decltype(route_base_variant)>;
381 if constexpr (std::is_same_v<T, TunBuilderCapture::RouteBase>)
382 {
383 RC_DISCARD("RouteBase does not have public validate method");
384 }
385 else
386 {
387 RC_ASSERT_THROWS_AS(route_base_variant.validate(title), openvpn::IP::ip_exception);
388 }
389 },
390 route_based);
391}
392
393RC_GTEST_PROP(RouteBased, Validates, (rc::RouteBased route_based, bool ipv6, bool net30, const std::string &title))
394{
395 // TODO: move to generator
396 std::visit(
397 [ipv6, net30, &title](auto &&route_base_variant)
398 {
399 using T = std::decay_t<decltype(route_base_variant)>;
400 if constexpr (std::is_same_v<T, TunBuilderCapture::RouteBase>)
401 {
402 RC_DISCARD("RouteBase does not have public validate method");
403 }
404 else
405 {
406 // Performs canonicalization so Route is valid
407 // TODO: separate path for RouteAddress that can be not canonical
408 if (ipv6)
409 {
410 route_base_variant.ipv6 = true;
411 auto ipv6_route = route_from_string(*rc::IPv6Address(), title, IP::Addr::V6);
412 ipv6_route.force_canonical();
413 route_base_variant.address = ipv6_route.to_string_optional_prefix_len();
414 route_base_variant.prefix_length = IPv6::Addr::SIZE;
415 }
416 else
417 {
418 route_base_variant.ipv6 = false;
419 route_base_variant.address = *rc::IPv4Address().as("Valid IPv4 address");
420 auto [prefix_min, prefix_max] = rc::calculateIPPrefixRange(route_base_variant.address);
421 if (net30 && prefix_min <= 30 && prefix_max >= 30)
422 {
423 route_base_variant.net30 = true;
424 route_base_variant.prefix_length = 30;
425 }
426 else
427 {
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");
430 }
431 }
432 if (auto maybe_metric = *rc::gen::maybe(rc::gen::arbitrary<int>().as("Metric value")).as("Maybe metric"))
433 {
434 route_base_variant.metric = *maybe_metric;
435 }
436 if (auto maybe_gateway = ipv6 ? *rc::gen::maybe(rc::IPv6Address().as("Valid IPv6 gateway")) : *rc::gen::maybe(rc::IPv4Address().as("Valid IPv4 gateway")))
437 {
438 route_base_variant.gateway = *maybe_gateway;
439 }
440 route_base_variant.validate(title);
441 }
442 },
443 route_based);
444}
445
446
447RC_GTEST_PROP(RouteBased, EmptyJsonRoundTripHaveSameStringRepresentation, (rc::RouteBased route_based, const std::string &title))
448{
449 std::visit(
450 [&title](auto &&route_base_variant)
451 {
452 const auto route_based_as_json = route_base_variant.to_json();
453 using T = std::decay_t<decltype(route_base_variant)>;
454 T from_json;
455 from_json.from_json(route_based_as_json, title);
456 RC_ASSERT(route_base_variant.to_string() == from_json.to_string());
457 },
458 route_based);
459}
460
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))
462{
463 std::visit(
464 [&address, prefix_length, metric, &gateway, ipv6, net30, &title](auto &&route_base_variant)
465 {
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)>;
474 T from_json;
475 from_json.from_json(route_based_as_json, title);
476 RC_ASSERT(route_base_variant.to_string() == from_json.to_string());
477 },
478 route_based);
479}
480
481
482RC_GTEST_PROP(RouteBased, FromInvalidJsonThrows, (rc::RouteBased route_based, const std::string &title))
483{
484 std::visit(
485 [&title](auto &&route_base_variant)
486 {
487 const Json::Value invalid_json = {};
488 RC_ASSERT_THROWS_AS(route_base_variant.from_json(invalid_json, title), json::json_parse);
489 },
490 route_based);
491}
492
493// ===============================================================================================
494// ProxyBypass tests
495// ===============================================================================================
496
497TEST(ProxyBypass, EmptyIsNotDefined)
498{
500 ASSERT_FALSE(proxy_bypass.defined());
501}
502
503RC_GTEST_PROP(ProxyBypass, NonEmptyIsDefined, ())
504{
505 const auto bypass_host = *rc::gen::nonEmpty<std::string>();
509}
510
511TEST(ProxyBypass, EmptyStringRepresentation)
512{
514 ASSERT_TRUE(proxy_bypass.to_string().empty());
515}
516
517RC_GTEST_PROP(ProxyBypass, StringRepresentationReturnBypassHost, (const std::string &bypass_host))
518{
522}
523
524RC_GTEST_PROP(ProxyBypass, EmptyValidates, (const std::string &title))
525{
527 proxy_bypass.validate(title);
528}
529
530RC_GTEST_PROP(ProxyBypass, EmptyJsonRoundTripHaveSameStringRepresentation, (const std::string &title))
531{
537}
538
539RC_GTEST_PROP(ProxyBypass, EmptyJsonRoundTripHaveSameDefinedStatus, (const std::string &title))
540{
546}
547
548RC_GTEST_PROP(ProxyBypass, EmptyJsonRoundTripValidates, (const std::string &title))
549{
551 proxy_bypass.validate(title);
555 from_json.validate(title);
556}
557
558RC_GTEST_PROP(ProxyBypass, JsonRoundTripHaveSameStringRepresentation, (const std::string &bypass_host, const std::string &title))
559{
566}
567
568RC_GTEST_PROP(ProxyBypass, JsonRoundTripHaveSameDefinedStatus, (const std::string &bypass_host, const std::string &title))
569{
576}
577
578RC_GTEST_PROP(ProxyBypass, FromInvalidJsonThrows, (const std::string &title))
579{
581 const Json::Value invalid_json;
582 RC_ASSERT_THROWS_AS(from_json.from_json(invalid_json, title), json::json_parse);
583}
584
585// ===============================================================================================
586// ProxyAutoConfigURL tests
587// ===============================================================================================
588
589TEST(ProxyAutoConfigURL, EmptyIsNotDefined)
590{
592 ASSERT_FALSE(proxy_autoconfig_url.defined());
593}
594
595RC_GTEST_PROP(ProxyAutoConfigURL, NonEmptyIsDefined, ())
596{
597 const auto url = *rc::gen::nonEmpty<std::string>();
601}
602
603TEST(ProxyAutoConfigURL, EmptyStringRepresentation)
604{
606 ASSERT_TRUE(proxy_autoconfig_url.to_string().empty());
607}
608
609RC_GTEST_PROP(ProxyAutoConfigURL, StringRepresentationReturnsURL, (const std::string &url))
610{
614}
615
616RC_GTEST_PROP(ProxyAutoConfigURL, EmptyValidates, (const std::string &title))
617{
620}
621
622RC_GTEST_PROP(ProxyAutoConfigURL, EmptyJsonRoundTripHaveSameStringRepresentation, (const std::string &title))
623{
629}
630
631RC_GTEST_PROP(ProxyAutoConfigURL, EmptyJsonRoundTripHaveSameDefinedStatus, (const std::string &title))
632{
638}
639
640RC_GTEST_PROP(ProxyAutoConfigURL, EmptyJsonRoundTripValidates, (const std::string &title))
641{
647 from_json.validate(title);
648}
649
650RC_GTEST_PROP(ProxyAutoConfigURL, JsonRoundTripHaveSameStringRepresentation, (const std::string &url, const std::string &title))
651{
658}
659
660RC_GTEST_PROP(ProxyAutoConfigURL, JsonRoundTripHaveSameDefinedStatus, (const std::string &url, const std::string &title))
661{
668}
669
670RC_GTEST_PROP(ProxyAutoConfigURL, FromInvalidJsonDoesNotChangeOriginalObject, (const std::string &domain, const std::string &title))
671{
673 from_json.url = domain;
674 const Json::Value invalid_json;
676 RC_ASSERT(from_json.url == domain);
677}
678
679// ===============================================================================================
680// ProxyHostPort tests
681// ===============================================================================================
682
683TEST(ProxyHostPort, EmptyIsNotDefined)
684{
686 ASSERT_FALSE(proxy_host_port.defined());
687}
688
689RC_GTEST_PROP(ProxyHostPort, NonEmptyIsDefined, ())
690{
691 const auto host = *rc::gen::nonEmpty<std::string>();
695}
696
697TEST(ProxyHostPort, EmptyStringRepresentationReturnsDefaultPort)
698{
700 ASSERT_EQ(proxy_host_port.to_string(), std::string{" "} + std::to_string(proxy_host_port.port));
701}
702
703RC_GTEST_PROP(ProxyHostPort, StringRepresentationReturnsHostPort, (const std::string &host, const int port))
704{
708 RC_ASSERT(proxy_host_port.to_string() == host + std::string{" "} + std::to_string(port));
709}
710
711RC_GTEST_PROP(ProxyHostPort, EmptyValidates, (const std::string &title))
712{
715}
716
717RC_GTEST_PROP(ProxyHostPort, EmptyJsonRoundTripHaveSameStringRepresentation, (const std::string &title))
718{
724}
725
726RC_GTEST_PROP(ProxyHostPort, EmptyJsonRoundTripHaveSameDefinedStatus, (const std::string &title))
727{
733}
734
735RC_GTEST_PROP(ProxyHostPort, EmptyJsonRoundTripValidates, (const std::string &title))
736{
742 from_json.validate(title);
743}
744
745RC_GTEST_PROP(ProxyHostPort, JsonRoundTripHaveSameStringRepresentation, (const std::string &host, const int port, const std::string &title))
746{
754}
755
756RC_GTEST_PROP(ProxyHostPort, JsonRoundTripHaveSameDefinedStatus, (const std::string &host, const std::string &title))
757{
764}
765
766RC_GTEST_PROP(ProxyHostPort, FromInvalidJsonDoesNotChangeOriginalObject, (const std::string &host, const int port, const std::string &title))
767{
769 from_json.host = host;
770 from_json.port = port;
771 const Json::Value invalid_json;
773 RC_ASSERT(from_json.host == host);
774 RC_ASSERT(from_json.port == port);
775}
776
777// ===============================================================================================
778// WINSServer tests
779// ===============================================================================================
780
781TEST(WINSServer, EmptyStringRepresentation)
782{
783 const TunBuilderCapture::WINSServer wins_server;
784 ASSERT_TRUE(wins_server.to_string().empty());
785}
786
787RC_GTEST_PROP(WINSServer, StringRepresentationReturnsAddress, (const std::string &address))
788{
790 wins_server.address = address;
791 RC_ASSERT(wins_server.to_string() == address);
792}
793
794RC_GTEST_PROP(WINSServer, EmptyThrowsOnValidation, (const std::string &title))
795{
796 const TunBuilderCapture::WINSServer wins_server;
797 RC_ASSERT_THROWS_AS(wins_server.validate(title), openvpn::IP::ip_exception);
798}
799
800RC_GTEST_PROP(WINSServer, ValidatesAddress, (const std::string &title))
801{
803 wins_server.address = *rc::IPv4Address().as("Valid IPv4 address");
804 wins_server.validate(title);
805}
806
807RC_GTEST_PROP(WINSServer, ThrowsValidatingInvalidAddress, (const std::string &title))
808{
810 wins_server.address = *rc::IPv4Address(false).as("Invalid IPv4 address");
811 RC_ASSERT_THROWS_AS(wins_server.validate(title), openvpn::IP::ip_exception);
812}
813
814RC_GTEST_PROP(WINSServer, EmptyJsonRoundTripHaveSameStringRepresentation, (const std::string &title))
815{
816 const TunBuilderCapture::WINSServer wins_server;
817 const auto wins_server_as_json = wins_server.to_json();
820 RC_ASSERT(wins_server.to_string() == from_json.to_string());
821}
822
823RC_GTEST_PROP(WINSServer, EmptyJsonRoundTripThrowsOnValidation, (const std::string &title))
824{
825 const TunBuilderCapture::WINSServer wins_server;
826 RC_ASSERT_THROWS_AS(wins_server.validate(title), openvpn::IP::ip_exception);
827 const auto wins_server_as_json = wins_server.to_json();
830 RC_ASSERT_THROWS_AS(from_json.validate(title), openvpn::IP::ip_exception);
831}
832
833RC_GTEST_PROP(WINSServer, JsonRoundTripHaveSameStringRepresentation, (const std::string &address, const std::string &title))
834{
836 wins_server.address = address;
837 const auto wins_server_as_json = wins_server.to_json();
840 RC_ASSERT(wins_server.to_string() == from_json.to_string());
841}
842
843RC_GTEST_PROP(WINSServer, JsonRoundTripValidatesAddress, (const std::string &title))
844{
846 wins_server.address = *rc::IPv4Address().as("Valid IPv4 address");
847 wins_server.validate(title);
848 const auto wins_server_as_json = wins_server.to_json();
851 from_json.validate(title);
852}
853
854RC_GTEST_PROP(WINSServer, JsonRoundTripThrowsValidatingInvalidIP, (const std::string &title))
855{
857 wins_server.address = *rc::IPv4Address(false).as("Invalid IPv4 address");
858 RC_ASSERT_THROWS_AS(wins_server.validate(title), openvpn::IP::ip_exception);
859 const auto wins_server_as_json = wins_server.to_json();
862 RC_ASSERT_THROWS_AS(from_json.validate(title), openvpn::IP::ip_exception);
863}
864
865RC_GTEST_PROP(WINSServer, FromInvalidJsonThrows, (const std::string &title))
866{
868 const Json::Value invalid_json;
869 RC_ASSERT_THROWS_AS(from_json.from_json(invalid_json, title), json::json_parse);
870}
871
872// ===============================================================================================
873// TunBuilderCapture tests
874// ===============================================================================================
875
876RC_GTEST_PROP(TunBuilderCapture, SetsRemoteAddress, (const std::string &address, const bool ipv6))
877{
882}
883
884RC_GTEST_PROP(TunBuilderCapture, AddsAddress, (const std::string &address, const unsigned char prefix_length, const std::string &gateway, const bool ipv6, const bool net30))
885{
887 RC_ASSERT(tbc->tun_builder_add_address(address, prefix_length, gateway, ipv6, net30));
891 RC_ASSERT(vpn_address->prefix_length == prefix_length);
892 RC_ASSERT(vpn_address->gateway == gateway);
893 RC_ASSERT(vpn_address->net30 == net30);
894}
895
896RC_GTEST_PROP(TunBuilderCapture, SetsRerouteGW, (const bool ipv4, const bool ipv6, const unsigned int flags))
897{
903}
904
905RC_GTEST_PROP(TunBuilderCapture, SetsRouteMetricDefault, (const int metric))
906{
910}
911
912RC_GTEST_PROP(TunBuilderCapture, AddsRoute, (const std::string &address, const unsigned char prefix_length, const bool ipv6))
913{
915 const auto metric = *rc::gen::positive<int>().as("Valid route metric");
917 const auto &added_route = tbc->add_routes.back();
919 RC_ASSERT(added_route.prefix_length == prefix_length);
920 RC_ASSERT(added_route.metric == metric);
921 RC_ASSERT(added_route.ipv6 == ipv6);
922}
923
924RC_GTEST_PROP(TunBuilderCapture, ExcludesRoute, (const std::string &address, const unsigned char prefix_length, const int metric, const bool ipv6))
925{
928 const auto &excluded_route = tbc->exclude_routes.back();
930 RC_ASSERT(excluded_route.prefix_length == prefix_length);
933}
934
935RC_GTEST_PROP(TunBuilderCapture, SetsDNSOptions, (const std::string &search_domain))
936{
937 DnsServer server = {};
939 server.addresses.push_back(address);
941 dns_options.servers[0] = std::move(server);
945 RC_ASSERT(tbc->dns_options.search_domains.back().domain == search_domain);
946 RC_ASSERT(tbc->dns_options.servers.at(0).addresses.back().to_string() == address.to_string());
947}
948
949RC_GTEST_PROP(TunBuilderCapture, SetsLayer, ())
950{
952 const auto layer = *rc::gen::element(3, 2, 0).as("Layer - 3, 2 or 0");
955}
956
957RC_GTEST_PROP(TunBuilderCapture, SetsMTU, (const int mtu))
958{
961 RC_ASSERT(tbc->mtu == mtu);
962}
963
964RC_GTEST_PROP(TunBuilderCapture, SetsSessionName, (const std::string &session_name))
965{
968 RC_ASSERT(tbc->session_name == session_name);
969}
970
971RC_GTEST_PROP(TunBuilderCapture, AddsProxyBypass, (const std::string &bypass_host))
972{
975 RC_ASSERT(tbc->proxy_bypass.back().bypass_host == bypass_host);
976}
977
978RC_GTEST_PROP(TunBuilderCapture, SetsProxyAutoConfigURL, (const std::string &url))
979{
983}
984
985RC_GTEST_PROP(TunBuilderCapture, SetsProxyHTTP, (const std::string &host, const int port))
986{
991}
992
993RC_GTEST_PROP(TunBuilderCapture, SetsProxyHTTPS, (const std::string &host, const int port))
994{
999}
1000
1001RC_GTEST_PROP(TunBuilderCapture, AddsWINSServer, (const std::string &address))
1002{
1005 RC_ASSERT(tbc->wins_servers.back().address == address);
1006}
1007
1008RC_GTEST_PROP(TunBuilderCapture, SetsAllowFamily, (const bool allow))
1009{
1011 const auto allow_family = *rc::gen::element(AF_INET, AF_INET6).as("Allow family - AF_INET or AF_INET6");
1013 if (allow_family == AF_INET)
1014 {
1015 RC_ASSERT_FALSE(tbc->block_ipv4 == allow);
1016 }
1017 else
1018 {
1019 RC_ASSERT_FALSE(tbc->block_ipv6 == allow);
1020 }
1021}
1022
1023RC_GTEST_PROP(TunBuilderCapture, SetsAllowLocalDNS, (const bool allow))
1024{
1028}
1029
1030RC_GTEST_PROP(TunBuilderCapture, ResetsTunnelAddresses, (const std::string &address, const unsigned char prefix_length, const std::string &gateway, const bool ipv6, const bool net30))
1031{
1033 RC_ASSERT(tbc->tun_builder_add_address(address, prefix_length, gateway, ipv6, net30));
1034 RC_ASSERT(tbc->tun_builder_add_address(address, prefix_length, gateway, !ipv6, net30));
1042}
1043
1044RC_GTEST_PROP(TunBuilderCapture, ResetsDNSOptions, (const std::string &search_domain))
1045{
1046 DnsServer server = {};
1048 server.addresses.push_back(address);
1050 dns_options.servers[0] = std::move(server);
1051 dns_options.search_domains = {DnsDomain(search_domain)};
1056 RC_ASSERT(tbc->dns_options.to_string() == "Values from dhcp-options: false\n");
1057}
1058
1059RC_GTEST_PROP(TunBuilderCapture, ReturnsVPNIPv4, (const std::string &address, const unsigned char prefix_length, const std::string &gateway, const bool net30))
1060{
1062 RC_ASSERT(tbc->vpn_ipv4() == nullptr);
1063 RC_ASSERT(tbc->tun_builder_add_address(address, prefix_length, gateway, false, net30));
1066 RC_ASSERT(vpn_address->prefix_length == prefix_length);
1067 RC_ASSERT(vpn_address->gateway == gateway);
1068 RC_ASSERT(vpn_address->net30 == net30);
1069}
1070
1071RC_GTEST_PROP(TunBuilderCapture, ReturnsVPNIPv6, (const std::string &address, const unsigned char prefix_length, const std::string &gateway, const bool net30))
1072{
1074 RC_ASSERT(tbc->vpn_ipv6() == nullptr);
1075 RC_ASSERT(tbc->tun_builder_add_address(address, prefix_length, gateway, true, net30));
1078 RC_ASSERT(vpn_address->prefix_length == prefix_length);
1079 RC_ASSERT(vpn_address->gateway == gateway);
1080 RC_ASSERT(vpn_address->net30 == net30);
1081}
1082
1083RC_GTEST_PROP(TunBuilderCapture, ReturnsVPNIP, (const std::string &address, const unsigned char prefix_length, const std::string &gateway, const bool ipv6, const bool net30))
1084{
1087 RC_ASSERT(tbc->tun_builder_add_address(address, prefix_length, gateway, ipv6, net30));
1088 const auto ip_version = ipv6 ? IP::Addr::V6 : IP::Addr::V4;
1091 RC_ASSERT(vpn_address->prefix_length == prefix_length);
1092 RC_ASSERT(vpn_address->gateway == gateway);
1093 RC_ASSERT(vpn_address->net30 == net30);
1094}
1095
1096RC_GTEST_PROP(TunBuilderCapture, StringRepresentation, (const std::string &address, const unsigned char prefix_length, const std::string &gateway, const bool ipv6, const bool net30))
1097{
1099 std::ostringstream os = {};
1100 os << "Session Name: " << tbc->session_name << '\n';
1101 os << "Layer: " << tbc->layer.str() << '\n';
1102 os << "Remote Address: " << tbc->remote_address.to_string() << '\n';
1103 os << "Tunnel Addresses:\n";
1104 os << "Reroute Gateway: " << tbc->reroute_gw.to_string() << '\n';
1105 os << "Block IPv4: " << (tbc->block_ipv4 ? "yes" : "no") << '\n';
1106 os << "Block IPv6: " << (tbc->block_ipv6 ? "yes" : "no") << '\n';
1107 os << "Block local DNS: " << (tbc->block_outside_dns ? "yes" : "no") << '\n';
1108 os << "Add Routes:\n";
1109 os << "Exclude Routes:\n";
1110 RC_ASSERT(tbc->to_string() == os.str());
1111}
1112
1113struct TunBuilderCaptureModel
1114{
1115 std::string session_name;
1116 int mtu{0};
1119 std::vector<TunBuilderCapture::RouteAddress> tunnel_addresses;
1123 bool block_ipv4{false};
1124 bool block_ipv6{false};
1127 std::vector<TunBuilderCapture::Route> add_routes;
1128 std::vector<TunBuilderCapture::Route> exclude_routes;
1130 std::vector<TunBuilderCapture::ProxyBypass> proxy_bypass;
1134 std::vector<TunBuilderCapture::WINSServer> wins_servers{};
1135 static constexpr auto mtu_ipv4_maximum{65'535};
1136};
1137
1138struct SetRemoteAddress final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1139{
1140 std::string address;
1141 bool ipv6{false};
1142
1144 : address{*rc::gen::arbitrary<std::string>()}, ipv6{*rc::gen::arbitrary<bool>()}
1145 {
1146 }
1147
1148 auto apply(TunBuilderCaptureModel &model) const -> void override
1149 {
1150 model.remote_address.address = address;
1151 model.remote_address.ipv6 = ipv6;
1152 }
1153
1154 auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
1155 {
1159 }
1160
1161 auto show(std::ostream &os) const -> void override
1162 {
1163 os << "Set RemoteAddress to " << address << " " << (ipv6 ? "IPv6" : "IPv4");
1164 }
1165};
1166
1167struct AddAddress final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1168{
1169 std::string address;
1170 unsigned char prefix_length{0};
1171 int metric{-1};
1172 std::string gateway;
1173 bool ipv6{false};
1174 bool net30{false};
1175
1176 explicit AddAddress()
1177 : address{*rc::gen::arbitrary<std::string>()}, prefix_length{*rc::gen::arbitrary<unsigned char>()}, gateway{*rc::gen::arbitrary<std::string>()}, ipv6{*rc::gen::arbitrary<bool>()}, net30{*rc::gen::arbitrary<bool>()}
1178 {
1179 }
1180
1181 auto apply(TunBuilderCaptureModel &model) const -> void override
1182 {
1184 address.address = this->address;
1185 address.prefix_length = static_cast<unsigned char>(prefix_length);
1186 address.gateway = gateway;
1187 address.ipv6 = ipv6;
1188 address.net30 = net30;
1189 if (ipv6)
1190 {
1191 model.tunnel_address_index_ipv6 = static_cast<int>(model.tunnel_addresses.size());
1192 }
1193 else
1194 {
1195 model.tunnel_address_index_ipv4 = static_cast<int>(model.tunnel_addresses.size());
1196 }
1197 model.tunnel_addresses.push_back(std::move(address));
1198 }
1199
1200 auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
1201 {
1203 RC_ASSERT(sut.tunnel_addresses.size() == model.tunnel_addresses.size() + 1);
1204 if (ipv6)
1205 {
1206 RC_ASSERT(sut.tunnel_address_index_ipv6 == static_cast<int>(model.tunnel_addresses.size()));
1207 const auto *current_address = sut.vpn_ipv6();
1208 RC_ASSERT(current_address->address == address);
1209 RC_ASSERT(current_address->prefix_length == prefix_length);
1210 RC_ASSERT(current_address->gateway == gateway);
1211 RC_ASSERT(current_address->ipv6 == ipv6);
1212 RC_ASSERT(current_address->net30 == net30);
1213 }
1214 else
1215 {
1216 RC_ASSERT(sut.tunnel_address_index_ipv4 == static_cast<int>(model.tunnel_addresses.size()));
1217 const auto *current_address = sut.vpn_ipv4();
1218 RC_ASSERT(current_address->address == address);
1219 RC_ASSERT(current_address->prefix_length == prefix_length);
1220 RC_ASSERT(current_address->gateway == gateway);
1221 RC_ASSERT(current_address->ipv6 == ipv6);
1222 RC_ASSERT(current_address->net30 == net30);
1223 }
1224 const auto *current_address = sut.vpn_ip(ipv6 ? IP::Addr::V6 : IP::Addr::V4);
1225 RC_ASSERT(current_address->address == address);
1226 RC_ASSERT(current_address->prefix_length == prefix_length);
1227 RC_ASSERT(current_address->gateway == gateway);
1228 RC_ASSERT(current_address->ipv6 == ipv6);
1229 RC_ASSERT(current_address->net30 == net30);
1230 }
1231
1232 auto show(std::ostream &os) const -> void override
1233 {
1234 os << "Add address: " << address << " prefix_length: " << prefix_length << " gateway: " << gateway << (ipv6 ? "IPv6" : "IPv4") << " net30: " << net30;
1235 }
1236};
1237
1238struct RerouteGW final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1239{
1240 bool ipv4{false};
1241 bool ipv6{false};
1242 unsigned int flags{0};
1243
1244 explicit RerouteGW()
1245 : ipv4{*rc::gen::arbitrary<bool>()}, ipv6{*rc::gen::arbitrary<bool>()}, flags{*rc::gen::arbitrary<unsigned int>()}
1246 {
1247 }
1248
1249 auto apply(TunBuilderCaptureModel &model) const -> void override
1250 {
1251 model.reroute_gw.ipv4 = ipv4;
1252 model.reroute_gw.ipv6 = ipv6;
1253 model.reroute_gw.flags = flags;
1254 }
1255
1256 auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
1257 {
1262 }
1263
1264 auto show(std::ostream &os) const -> void override
1265 {
1266 os << "Set RerouteGW ipv4: " << ipv4 << " ipv6: " << ipv6 << " flags: " << flags;
1267 }
1268};
1269
1270struct SetRouteMetricDefault final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1271{
1272 int metric{};
1273
1275 : metric{*rc::gen::arbitrary<int>()}
1276 {
1277 }
1278
1279 auto apply(TunBuilderCaptureModel &model) const -> void override
1280 {
1281 model.route_metric_default = metric;
1282 }
1283
1284 auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
1285 {
1288 }
1289
1290 auto show(std::ostream &os) const -> void override
1291 {
1292 os << "Set route metric default to " << metric;
1293 }
1294};
1295
1296struct AddRoute final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1297{
1298 std::string address;
1299 unsigned char prefix_length{0};
1300 int metric{-1};
1301 std::string gateway;
1302 bool ipv6{false};
1303 bool net30{false};
1304
1305 explicit AddRoute()
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>()}
1307 {
1308 }
1309
1310 auto apply(TunBuilderCaptureModel &model) const -> void override
1311 {
1313 route.address = address;
1314 route.prefix_length = static_cast<unsigned char>(prefix_length);
1315 route.metric = (metric < 0 ? model.route_metric_default : metric);
1316 route.ipv6 = ipv6;
1317 model.add_routes.push_back(std::move(route));
1318 }
1319
1320 auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
1321 {
1323 RC_ASSERT(sut.add_routes.size() == model.add_routes.size() + 1);
1324 const auto &added_route = sut.add_routes.back();
1325 RC_ASSERT(added_route.address == address);
1326 RC_ASSERT(added_route.prefix_length == prefix_length);
1327 RC_ASSERT(added_route.metric == (metric < 0 ? model.route_metric_default : metric));
1328 RC_ASSERT(added_route.ipv6 == ipv6);
1329 }
1330
1331 auto show(std::ostream &os) const -> void override
1332 {
1333 os << "Add Route: " << address << " prefix length: " << prefix_length << " metric: " << metric << " ipv6: " << ipv6;
1334 }
1335};
1336
1337struct ExcludeRoute final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1338{
1339 std::string address;
1340 unsigned char prefix_length{0};
1341 int metric{-1};
1342 std::string gateway;
1343 bool ipv6{false};
1344 bool net30{false};
1345
1346 explicit ExcludeRoute()
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>()}
1348 {
1349 }
1350
1351 auto apply(TunBuilderCaptureModel &model) const -> void override
1352 {
1354 route.address = address;
1355 route.prefix_length = static_cast<unsigned char>(prefix_length);
1356 route.metric = metric;
1357 route.ipv6 = ipv6;
1358 model.exclude_routes.push_back(std::move(route));
1359 }
1360
1361 auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
1362 {
1364 RC_ASSERT(sut.exclude_routes.size() == model.exclude_routes.size() + 1);
1365 const auto &excluded_route = sut.exclude_routes.back();
1366 RC_ASSERT(excluded_route.address == address);
1367 RC_ASSERT(excluded_route.prefix_length == prefix_length);
1368 RC_ASSERT(excluded_route.metric == metric);
1369 RC_ASSERT(excluded_route.ipv6 == ipv6);
1370 }
1371
1372 auto show(std::ostream &os) const -> void override
1373 {
1374 os << "Add Exclude Route: " << address << " prefix length: " << prefix_length << " metric: " << metric << " ipv6: " << ipv6;
1375 }
1376};
1377
1378struct SetDNSOptions final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1379{
1381
1382 explicit SetDNSOptions()
1383 : options{*rc::genDNSOptions()}
1384 {
1385 }
1386
1387 auto apply(TunBuilderCaptureModel &model) const -> void override
1388 {
1389 model.dns_options = options;
1390 }
1391
1392 auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
1393 {
1396 }
1397
1398 auto show(std::ostream &os) const -> void override
1399 {
1400 os << "Set DNS Options with " << options.servers.size() << " servers and "
1401 << options.search_domains.size() << " search domains";
1402 }
1403};
1404
1405struct SetLayer final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1406{
1407 int layer{};
1408
1409 explicit SetLayer() : layer{*rc::gen::elementOf<std::vector<int>>({0, 2, 3})}
1410 {
1411 }
1412
1413 auto apply(TunBuilderCaptureModel &model) const -> void override
1414 {
1415 model.layer = Layer::from_value(layer);
1416 }
1417
1418 auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
1419 {
1422 }
1423
1424 auto show(std::ostream &os) const -> void override
1425 {
1426 os << "Set Layer to: " << layer;
1427 }
1428};
1429
1430struct SetMTU final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1431{
1432 int mtu{};
1433
1434 explicit SetMTU() : mtu(*rc::gen::arbitrary<int>())
1435 {
1436 }
1437
1438 auto apply(TunBuilderCaptureModel &model) const -> void override
1439 {
1440 model.mtu = mtu;
1441 }
1442
1443 auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
1444 {
1446 RC_ASSERT(sut.mtu == mtu);
1447 }
1448
1449 auto show(std::ostream &os) const -> void override
1450 {
1451 os << "Set mtu to " << mtu;
1452 }
1453};
1454
1455struct SetSessionName final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1456{
1457 std::string session_name{};
1458
1459 explicit SetSessionName() : session_name(*rc::gen::arbitrary<std::string>())
1460 {
1461 }
1462
1463 auto apply(TunBuilderCaptureModel &model) const -> void override
1464 {
1465 model.session_name = session_name;
1466 }
1467
1468 auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
1469 {
1472 }
1473
1474 auto show(std::ostream &os) const -> void override
1475 {
1476 os << "Set session name to " << session_name;
1477 }
1478};
1479
1480struct AddProxyBypass final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1481{
1482 std::string bypass_host{};
1483
1484 explicit AddProxyBypass() : bypass_host(*rc::gen::arbitrary<std::string>())
1485 {
1486 }
1487
1488 auto apply(TunBuilderCaptureModel &model) const -> void override
1489 {
1492 model.proxy_bypass.push_back(std::move(proxy_bypass));
1493 }
1494
1495 auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
1496 {
1498 RC_ASSERT(sut.proxy_bypass.size() == model.proxy_bypass.size() + 1);
1499 const auto &added_bypass_host = sut.proxy_bypass.back();
1500 RC_ASSERT(added_bypass_host.bypass_host == bypass_host);
1501 }
1502
1503 auto show(std::ostream &os) const -> void override
1504 {
1505 os << "Add ProxyBypass: " << bypass_host;
1506 }
1507};
1508
1509struct SetProxyAutoConfigURL final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1510{
1512
1513 explicit SetProxyAutoConfigURL() : proxy_auto_config_url(*rc::gen::arbitrary<std::string>())
1514 {
1515 }
1516
1517 auto apply(TunBuilderCaptureModel &model) const -> void override
1518 {
1519 model.proxy_auto_config_url.url = proxy_auto_config_url;
1520 }
1521
1522 auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
1523 {
1526 }
1527
1528 auto show(std::ostream &os) const -> void override
1529 {
1530 os << "Set ProxyAutoConfigURL to " << proxy_auto_config_url;
1531 }
1532};
1533
1534struct SetProxyHTTP final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1535{
1536 std::string host;
1537 int port{0};
1538
1539 explicit SetProxyHTTP()
1540 : host{*rc::gen::arbitrary<std::string>()}, port{*rc::gen::arbitrary<int>()}
1541 {
1542 }
1543
1544 auto apply(TunBuilderCaptureModel &model) const -> void override
1545 {
1546 model.http_proxy.host = host;
1547 model.http_proxy.port = port;
1548 }
1549
1550 auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
1551 {
1555 }
1556
1557 auto show(std::ostream &os) const -> void override
1558 {
1559 os << "Set ProxyHTTP to host: " << host << " port: " << port;
1560 }
1561};
1562
1563struct SetProxyHTTPS final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1564{
1565 std::string host;
1566 int port{0};
1567
1568 explicit SetProxyHTTPS()
1569 : host{*rc::gen::arbitrary<std::string>()}, port{*rc::gen::arbitrary<int>()}
1570 {
1571 }
1572
1573 auto apply(TunBuilderCaptureModel &model) const -> void override
1574 {
1575 model.https_proxy.host = host;
1576 model.https_proxy.port = port;
1577 }
1578
1579 auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
1580 {
1584 }
1585
1586 auto show(std::ostream &os) const -> void override
1587 {
1588 os << "Set ProxyHTTPS to host: " << host << " port: " << port;
1589 }
1590};
1591
1592struct AddWINSServer final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1593{
1594 std::string address{};
1595
1596 explicit AddWINSServer() : address(*rc::gen::arbitrary<std::string>())
1597 {
1598 }
1599
1600 auto apply(TunBuilderCaptureModel &model) const -> void override
1601 {
1603 wins.address = address;
1604 model.wins_servers.push_back(std::move(wins));
1605 }
1606
1607 auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
1608 {
1610 RC_ASSERT(sut.wins_servers.size() == model.wins_servers.size() + 1);
1611 RC_ASSERT(sut.wins_servers.back().address == address);
1612 }
1613
1614 auto show(std::ostream &os) const -> void override
1615 {
1616 os << "Add WINSServer: " << address;
1617 }
1618};
1619
1620struct SetAllowFamily final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1621{
1622 int af{};
1623 bool allow{false};
1624
1626 : af(*rc::gen::elementOf<std::vector<int>>({AF_INET, AF_INET6})),
1627 allow{*rc::gen::arbitrary<bool>()}
1628 {
1629 }
1630
1631 auto apply(TunBuilderCaptureModel &model) const -> void override
1632 {
1633 if (af == AF_INET)
1634 {
1635 model.block_ipv4 = !allow;
1636 }
1637 else if (af == AF_INET6)
1638 {
1639 model.block_ipv6 = !allow;
1640 }
1641 }
1642
1643 auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
1644 {
1646 if (af == AF_INET)
1647 {
1649 }
1650 else if (af == AF_INET6)
1651 {
1653 }
1654 }
1655
1656 auto show(std::ostream &os) const -> void override
1657 {
1658 os << "Set allow local family to " << af << allow;
1659 }
1660};
1661
1662struct SetAllowLocalDNS final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1663{
1664 bool allow{false};
1665
1667 : allow{*rc::gen::arbitrary<bool>()}
1668 {
1669 }
1670
1671 auto apply(TunBuilderCaptureModel &model) const -> void override
1672 {
1673 model.block_outside_dns = !allow;
1674 }
1675
1676 auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
1677 {
1680 }
1681
1682 auto show(std::ostream &os) const -> void override
1683 {
1684 os << "Set allow local DNS to " << !allow;
1685 }
1686};
1687
1688struct ResetTunnelAddresses final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1689{
1690 auto apply(TunBuilderCaptureModel &model) const -> void override
1691 {
1692 model.tunnel_addresses.clear();
1693 model.tunnel_address_index_ipv4 = -1;
1694 model.tunnel_address_index_ipv6 = -1;
1695 }
1696
1697 auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
1698 {
1703 }
1704
1705 auto show(std::ostream &os) const -> void override
1706 {
1707 os << "Reset Tunnel Addresses";
1708 }
1709};
1710
1711struct ResetDNSOptions final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1712{
1713 auto apply(TunBuilderCaptureModel &model) const -> void override
1714 {
1715 model.dns_options = {};
1716 }
1717
1718 auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
1719 {
1721 const DnsOptions dns_options{};
1723 }
1724
1725 auto show(std::ostream &os) const -> void override
1726 {
1727 os << "Reset DNS Options";
1728 }
1729};
1730
1731struct VPN_IPv4 final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1732{
1733 auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
1734 {
1735 if (model.tunnel_address_index_ipv4 >= 0)
1736 {
1737 const auto &ipv4_address = sut.vpn_ipv4();
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);
1744 }
1745 else
1746 {
1747 RC_ASSERT(sut.vpn_ipv4() == nullptr);
1748 }
1749 }
1750
1751 auto show(std::ostream &os) const -> void override
1752 {
1753 os << "VPN IPv4";
1754 }
1755};
1756
1757struct VPN_IPv6 final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1758{
1759 auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
1760 {
1761 if (model.tunnel_address_index_ipv6 >= 0)
1762 {
1763 const auto &ipv6_address = sut.vpn_ipv6();
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);
1770 }
1771 else
1772 {
1773 RC_ASSERT(sut.vpn_ipv6() == nullptr);
1774 }
1775 }
1776
1777 auto show(std::ostream &os) const -> void override
1778 {
1779 os << "VPN IPv6";
1780 }
1781};
1782
1783struct VPN_IP final : rc::state::Command<TunBuilderCaptureModel, TunBuilderCapture>
1784{
1786
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})} {};
1788
1789 auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
1790 {
1791 const auto &ip_address = sut.vpn_ip(version);
1792 if (version == IP::Addr::Version::UNSPEC)
1793 {
1794 RC_ASSERT(ip_address == nullptr);
1795 }
1796 else if (version == IP::Addr::Version::V4 && model.tunnel_address_index_ipv4 >= 0)
1797 {
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);
1804 }
1805 else if (version == IP::Addr::Version::V6 && model.tunnel_address_index_ipv6 >= 0)
1806 {
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);
1813 }
1814 }
1815
1816 auto show(std::ostream &os) const -> void override
1817 {
1818 os << "VPN IP";
1819 }
1820};
1821
1822RC_GTEST_PROP(TunBuilderCapture, Stateful, ())
1823{
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>());
1827}
static constexpr unsigned int SIZE
Definition ipv6.hpp:43
static Layer from_value(const int value)
Definition layer.hpp:102
int value() const
Definition layer.hpp:76
const char * str() const
Definition layer.hpp:61
Class for handling Proxy Auto-Configuration (PAC) URLs.
Definition capture.hpp:403
bool defined() const
Checks if the URL is defined.
Definition capture.hpp:421
std::string to_string() const
Returns the URL as a string.
Definition capture.hpp:411
void validate(const std::string &title) const
Validates the URL format.
Definition capture.hpp:434
Json::Value to_json() const
Converts the URL to a JSON object.
Definition capture.hpp:453
Class for managing proxy bypass host configurations.
Definition capture.hpp:332
void validate(const std::string &title) const
Validates the bypass host value.
Definition capture.hpp:363
std::string to_string() const
Converts the bypass host to a string representation.
Definition capture.hpp:340
bool defined() const
Checks if a bypass host is defined.
Definition capture.hpp:351
Json::Value to_json() const
Serializes the object to JSON.
Definition capture.hpp:375
Host and port configuration for proxy connections.
Definition capture.hpp:484
std::string to_string() const
Converts the host and port to a string representation.
Definition capture.hpp:494
void validate(const std::string &title) const
Validates the host and port.
Definition capture.hpp:518
bool defined() const
Checks if the proxy configuration is defined.
Definition capture.hpp:506
Json::Value to_json() const
Converts the object to a JSON representation.
Definition capture.hpp:533
Represents a remote IP address with IPv4/IPv6 designation.
Definition capture.hpp:55
void validate(const std::string &title) const
Validates the IP address format.
Definition capture.hpp:90
void from_json(const Json::Value &root, const std::string &title)
Deserializes the object from a JSON value.
Definition capture.hpp:116
Json::Value to_json() const
Serializes the object to a JSON value.
Definition capture.hpp:101
bool defined() const
Checks if the address is defined.
Definition capture.hpp:79
std::string to_string() const
Returns a string representation of the remote address.
Definition capture.hpp:66
Class for handling gateway rerouting configuration.
Definition capture.hpp:133
std::string to_string() const
Converts the object to a human-readable string representation.
Definition capture.hpp:145
Json::Value to_json() const
Serializes the object to a JSON value.
Definition capture.hpp:161
Route address class that may use non-canonical form.
Definition capture.hpp:295
Route class that must use canonical form.
Definition capture.hpp:313
Windows Internet Name Service (WINS) server configuration.
Definition capture.hpp:565
void validate(const std::string &title) const
Validates the WINS server address.
Definition capture.hpp:585
std::string to_string() const
Converts the WINS server to a string representation.
Definition capture.hpp:573
Json::Value to_json() const
Serializes the WINS server to a JSON object.
Definition capture.hpp:597
bool tun_builder_exclude_route(const std::string &address, int prefix_length, int metric, bool ipv6) override
Excludes a route from the tunnel.
Definition capture.hpp:720
RemoteAddress remote_address
Definition capture.hpp:1082
bool tun_builder_set_allow_family(int af, bool allow) override
Sets whether to allow a specific address family in the tunnel.
Definition capture.hpp:856
std::vector< RouteAddress > tunnel_addresses
Definition capture.hpp:1083
void validate() const
Validates the configuration of the tunnel.
Definition capture.hpp:946
bool tun_builder_add_proxy_bypass(const std::string &bypass_host) override
Adds a host to bypass proxy settings.
Definition capture.hpp:786
bool tun_builder_set_proxy_https(const std::string &host, int port) override
Sets the HTTPS proxy for the tunnel.
Definition capture.hpp:828
bool tun_builder_set_dns_options(const DnsOptions &dns) override
Set DNS options for use with tun builder.
Definition capture.hpp:737
bool tun_builder_add_route(const std::string &address, int prefix_length, int metric, bool ipv6) override
Adds a route to the tunnel.
Definition capture.hpp:699
bool tun_builder_set_allow_local_dns(bool allow) override
Sets whether to allow local DNS resolution.
Definition capture.hpp:871
bool tun_builder_set_route_metric_default(int metric) override
Sets the default route metric for VPN routes.
Definition capture.hpp:684
std::vector< Route > add_routes
Definition capture.hpp:1091
const RouteAddress * vpn_ip(const IP::Addr::Version v) const
Gets the tunnel address for the specified IP version.
Definition capture.hpp:927
ProxyAutoConfigURL proxy_auto_config_url
Definition capture.hpp:1096
bool tun_builder_set_session_name(const std::string &name) override
Sets a descriptive name for the VPN session.
Definition capture.hpp:773
void reset_dns_options()
Resets DNS options to default values.
Definition capture.hpp:892
bool tun_builder_set_remote_address(const std::string &address, bool ipv6) override
Sets the remote address for the TUN interface.
Definition capture.hpp:626
bool tun_builder_set_mtu(int mtu) override
Sets the Maximum Transmission Unit (MTU) for the tunnel.
Definition capture.hpp:761
static TunBuilderCapture::Ptr from_json(const Json::Value &root)
Creates a TunBuilderCapture instance from a JSON representation.
Definition capture.hpp:1049
Json::Value to_json() const
Serializes the tunnel configuration to a JSON object.
Definition capture.hpp:1011
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.
Definition capture.hpp:644
const RouteAddress * vpn_ipv6() const
Gets the IPv6 tunnel address.
Definition capture.hpp:914
bool tun_builder_set_layer(int layer) override
Sets the tunnel's network layer.
Definition capture.hpp:749
const RouteAddress * vpn_ipv4() const
Gets the IPv4 tunnel address.
Definition capture.hpp:902
bool tun_builder_set_proxy_http(const std::string &host, int port) override
Sets the HTTP proxy for the tunnel.
Definition capture.hpp:814
std::string to_string() const
Converts the tunnel configuration to a human-readable string representation.
Definition capture.hpp:968
bool tun_builder_set_proxy_auto_config_url(const std::string &url) override
Sets the URL for a proxy auto-configuration (PAC) file.
Definition capture.hpp:801
bool tun_builder_add_wins_server(const std::string &address) override
Adds a WINS server to the tunnel configuration.
Definition capture.hpp:841
std::vector< Route > exclude_routes
Definition capture.hpp:1092
bool tun_builder_reroute_gw(bool ipv4, bool ipv6, unsigned int flags) override
Configures global gateway rerouting through the VPN tunnel.
Definition capture.hpp:669
std::vector< ProxyBypass > proxy_bypass
Definition capture.hpp:1095
std::vector< WINSServer > wins_servers
Definition capture.hpp:1100
void reset_tunnel_addresses()
Resets all tunnel addresses.
Definition capture.hpp:881
Route route_from_string(const std::string &rtstr, const TITLE &title, const IP::Addr::Version required_version=IP::Addr::UNSPEC)
Definition route.hpp:387
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
std::string address
auto run(const TunBuilderCaptureModel &model, TunBuilderCapture &sut) const -> void override
auto apply(TunBuilderCaptureModel &model) const -> void override
std::string gateway
unsigned char prefix_length
std::string bypass_host
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
std::string gateway
auto apply(TunBuilderCaptureModel &model) const -> void override
std::string address
unsigned char prefix_length
std::string address
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
std::string gateway
std::string address
unsigned char prefix_length
auto show(std::ostream &os) const -> void override
auto apply(TunBuilderCaptureModel &model) const -> void override
unsigned int flags
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
DnsOptions options
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
std::string host
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
std::string host
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
std::string session_name
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.
A DNS domain name.
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
const auto metric
TunBuilderCapture::RerouteGW reroute_gw
const auto allow_family
reroute_gw flags
proxy_host_port port
const TunBuilderCapture::Ptr tbc(new TunBuilderCapture)
proxy_autoconfig_url url
TunBuilderCapture::RemoteAddress remote_address
TunBuilderCapture::ProxyHostPort http_proxy
const Json::Value invalid_json
std::vector< TunBuilderCapture::WINSServer > wins_servers
TEST(Misc, Capture)
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
remote_address ipv6
proxy_bypass bypass_host
TunBuilderCapture sut
TunBuilderCapture::ProxyHostPort https_proxy
const auto reroute_gw_as_json
TunBuilderCapture::ProxyHostPort proxy_host_port
bool block_outside_dns
TunBuilderCapture::RemoteAddress from_json
static constexpr auto mtu_ipv4_maximum
proxy_host_port host
const auto address_as_json
int route_metric_default
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
bool block_ipv4
reroute_gw ipv4
const auto & added_route
bool block_ipv6
const auto ip_version
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 >())
DnsOptions dns_options
const auto proxy_host_port_as_json
std::string ret
int tunnel_address_index_ipv6
remote_address address
std::ostringstream os
const auto layer