Files
moloapp/tests/src/clients/test_proxy.cpp
T
retoor 3c4334cec9 feat: implement MoloApp plans 01-15 with integration
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.
2026-10-23 18:20:04 +02:00

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");
}