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.
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
#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");
|
||||
}
|
||||
Reference in New Issue
Block a user