Full C++23 framework tree: runtime, observability, security, data, app, realtime, supervisor, clients, CLI, example plus enterprise tenancy, audit, operability, governance, supplychain. Postgres via docker compose for tests.
68 lines
2.6 KiB
C++
68 lines
2.6 KiB
C++
#include "framework.h"
|
|
|
|
#include <cstdlib>
|
|
|
|
#include "clients/proxy.h"
|
|
|
|
using namespace molo::clients;
|
|
|
|
TEST(proxy, no_proxy_match_matrix) {
|
|
ASSERT_TRUE(no_proxy_match("*", "anything.example.com"));
|
|
ASSERT_TRUE(no_proxy_match("example.com", "example.com"));
|
|
ASSERT_TRUE(no_proxy_match("example.com", "a.example.com"));
|
|
ASSERT_FALSE(no_proxy_match("example.com", "example.com.evil.com"));
|
|
ASSERT_TRUE(no_proxy_match(".example.com", "a.example.com"));
|
|
ASSERT_TRUE(no_proxy_match(".example.com", "example.com"));
|
|
ASSERT_TRUE(no_proxy_match("*.example.com", "a.example.com"));
|
|
ASSERT_FALSE(no_proxy_match("*.example.com", "example.com.evil.com"));
|
|
ASSERT_TRUE(no_proxy_match("10.0.0.0/8", "10.1.2.3"));
|
|
ASSERT_FALSE(no_proxy_match("10.0.0.0/8", "11.0.0.1"));
|
|
ASSERT_TRUE(no_proxy_match("192.168.1.0/24", "192.168.1.200"));
|
|
ASSERT_FALSE(no_proxy_match("192.168.1.0/24", "192.168.2.1"));
|
|
ASSERT_TRUE(no_proxy_match("127.0.0.1/32", "127.0.0.1"));
|
|
ASSERT_FALSE(no_proxy_match("not a cidr/8", "10.0.0.1"));
|
|
ASSERT_FALSE(no_proxy_match("", "example.com"));
|
|
}
|
|
|
|
TEST(proxy, ipv4_parse) {
|
|
std::uint32_t out = 0;
|
|
ASSERT_TRUE(parse_ipv4("127.0.0.1", out));
|
|
ASSERT_EQ(out, 0x7F000001u);
|
|
ASSERT_FALSE(parse_ipv4("999.1.1.1", out));
|
|
ASSERT_FALSE(parse_ipv4("1.2.3", out));
|
|
ASSERT_FALSE(parse_ipv4("::1", out));
|
|
}
|
|
|
|
TEST(proxy, select_and_bypass) {
|
|
ProxyConfig config;
|
|
config.http_proxy = "http://proxy:8080";
|
|
config.https_proxy = "http://proxy:8443";
|
|
config.no_proxy = {"internal.test", "10.0.0.0/8"};
|
|
ProxySelector selector(config);
|
|
auto plain = selector.select(Url::parse("http://example.com/x"));
|
|
ASSERT_TRUE(plain.has_value());
|
|
ASSERT_EQ(*plain, "http://proxy:8080");
|
|
auto secure = selector.select(Url::parse("https://example.com/x"));
|
|
ASSERT_TRUE(secure.has_value());
|
|
ASSERT_EQ(*secure, "http://proxy:8443");
|
|
ASSERT_FALSE(selector.select(Url::parse("http://internal.test/x")).has_value());
|
|
ASSERT_FALSE(selector.select(Url::parse("http://10.9.9.9/x")).has_value());
|
|
ASSERT_TRUE(selector.is_bypassed("internal.test:8080"));
|
|
}
|
|
|
|
TEST(proxy, from_env) {
|
|
setenv("HTTP_PROXY", "http://env:8080", 1);
|
|
setenv("NO_PROXY", "localhost, 127.0.0.1", 1);
|
|
unsetenv("HTTPS_PROXY");
|
|
unsetenv("https_proxy");
|
|
ProxyConfig config = ProxyConfig::from_env();
|
|
ASSERT_EQ(config.http_proxy, "http://env:8080");
|
|
ASSERT_EQ(config.no_proxy.size(), 2u);
|
|
ProxySelector selector(config);
|
|
ASSERT_FALSE(selector.select(Url::parse("http://localhost/x")).has_value());
|
|
auto other = selector.select(Url::parse("http://example.com/x"));
|
|
ASSERT_TRUE(other.has_value());
|
|
unsetenv("HTTP_PROXY");
|
|
unsetenv("NO_PROXY");
|
|
}
|