Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
176 changes: 173 additions & 3 deletions src/tests/test_policies.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,38 @@ version: "1.0"
- "slack.com"
)";

auto policies_config_merge = R"(
visor:
taps:
anycast_merge:
input_type: mock
config:
iface: eth0
policies:
default_merge:
config:
merge_like_handlers: true
kind: collection
input:
tap: anycast_merge
input_type: mock
config:
sample: value
handlers:
window_config:
num_periods: 5
deep_sample_rate: 100
modules:
default_dns_1:
type: dns
default_dns_2:
type: dns
default_net_1:
type: net
default_net_2:
type: net
)";

auto policies_config_hseq = R"(
visor:
taps:
Expand Down Expand Up @@ -201,6 +233,13 @@ version: "1.0"
type: net
)";

auto policies_config_bad0 = R"(
version: "1.0"

visor:
no_policies:
)";

auto policies_config_bad1 = R"(
version: "2.0"

Expand Down Expand Up @@ -251,8 +290,6 @@ version: "1.0"
)";

auto policies_config_bad4 = R"(
version: "1.0"

visor:
taps:
anycast:
Expand Down Expand Up @@ -492,6 +529,28 @@ version: "1.0"
type: net
)";

auto policies_config_bad14 = R"(
version: "1.0"

visor:
taps:
anycast:
input_type: mock
config:
iface: eth0
policies:
default_view:
config: not_a_map
kind: collection
input:
tap: anycast
input_type: mock
handlers:
modules:
default_net:
type: net
)";

auto policies_config_hseq_bad2 = R"(
version: "1.0"

Expand Down Expand Up @@ -767,6 +826,35 @@ TEST_CASE("Policies", "[policies]")
CHECK(policy->modules()[0]->running());
CHECK(policy->modules()[1]->running());
CHECK(policy->modules()[2]->running());

json j;
REQUIRE_NOTHROW(policy->info_json(j));
CHECK(j["input"] != nullptr);
CHECK(j["modules"]["default_view-anycast-default_net"] != nullptr);
CHECK(j["taps"]["anycast"]["config"]["iface"] == "eth0");
}

SECTION("Good Config merge like handlers")
{
CoreRegistry registry;
registry.start(nullptr);
YAML::Node config_file = YAML::Load(policies_config_merge);
CHECK(config_file["visor"]["policies"]);
CHECK(config_file["visor"]["policies"].IsMap());
REQUIRE_NOTHROW(registry.tap_manager()->load(config_file["visor"]["taps"]));
REQUIRE_NOTHROW(registry.policy_manager()->load(config_file["visor"]["policies"]));

REQUIRE(registry.policy_manager()->module_exists("default_merge"));
auto [policy, lock] = registry.policy_manager()->module_get_locked("default_merge");
CHECK(policy->name() == "default_merge");
CHECK(policy->input_stream().back()->name().find("anycast_merge-") != std::string::npos);
CHECK(policy->modules()[0]->name() == "default_merge-anycast_merge-default_dns_1");
CHECK(policy->modules()[1]->name() == "default_merge-anycast_merge-default_dns_2");
CHECK(policy->modules()[2]->name() == "default_merge-anycast_merge-default_net_1");
CHECK(policy->modules()[3]->name() == "default_merge-anycast_merge-default_net_2");
CHECK(policy->input_stream().back()->running());
CHECK(policy->modules()[0]->running());
CHECK(policy->modules()[1]->running());
}

SECTION("Good Config sequence modules")
Expand Down Expand Up @@ -834,7 +922,13 @@ TEST_CASE("Policies", "[policies]")
REQUIRE(registry.policy_manager()->module_exists("default_view"));
}

SECTION("Bad Config")
SECTION("Bad Config: no policies schema")
{
CoreRegistry registry;
REQUIRE_THROWS_WITH(registry.policy_manager()->load_from_str(policies_config_bad0), "no policies found in schema");
}

SECTION("Bad Config: no policies map config")
{
CoreRegistry registry;
YAML::Node config_file = YAML::Load(policies_config_bad1);
Expand Down Expand Up @@ -977,6 +1071,16 @@ TEST_CASE("Policies", "[policies]")
REQUIRE_THROWS_WITH(registry.handler_manager()->set_default_handler_config(config_file["visor"]["global_handler_config"]), "expecting global_handler_config configuration map");
}

SECTION("Bad Config: policy config not a map")
{
CoreRegistry registry;
registry.start(nullptr);
YAML::Node config_file = YAML::Load(policies_config_bad14);

REQUIRE_NOTHROW(registry.tap_manager()->load(config_file["visor"]["taps"], true));
REQUIRE_THROWS_WITH(registry.policy_manager()->load(config_file["visor"]["policies"]), "policy configuration is not a map");
}

SECTION("Bad Config: invalid handler modules YAML type")
{
CoreRegistry registry;
Expand Down Expand Up @@ -1200,3 +1304,69 @@ TEST_CASE("Policies", "[policies]")
lock2.unlock();
}
}

TEST_CASE("Policies and Metrics", "[policies][metrics]")
{
CoreRegistry registry;
registry.start(nullptr);
YAML::Node config_file = YAML::Load(policies_config);
CHECK(config_file["visor"]["policies"]);
CHECK(config_file["visor"]["policies"].IsMap());
REQUIRE_NOTHROW(registry.tap_manager()->load(config_file["visor"]["taps"]));
REQUIRE_NOTHROW(registry.policy_manager()->load(config_file["visor"]["policies"]));
REQUIRE(registry.policy_manager()->module_exists("default_view"));

SECTION("JSON")
{
auto [policy, lock] = registry.policy_manager()->module_get_locked("default_view");
json j;
policy->json_metrics(j, 0, false);
CHECK(j["default_view"]["default_view-anycast-default_dns"] != nullptr);
CHECK(j["default_view"]["default_view-anycast-default_net"] != nullptr);
}

SECTION("Prometheus")
{
auto [policy, lock] = registry.policy_manager()->module_get_locked("default_view");
std::stringstream out;
REQUIRE_NOTHROW(policy->prometheus_metrics(out));
}

SECTION("Opentelemetry")
{
auto [policy, lock] = registry.policy_manager()->module_get_locked("default_view");
metrics::v1::ScopeMetrics scope;
REQUIRE_NOTHROW(policy->opentelemetry_metrics(scope));
}

config_file = YAML::Load(policies_config_merge);
CHECK(config_file["visor"]["policies"]);
CHECK(config_file["visor"]["policies"].IsMap());
REQUIRE_NOTHROW(registry.tap_manager()->load(config_file["visor"]["taps"]));
REQUIRE_NOTHROW(registry.policy_manager()->load(config_file["visor"]["policies"]));
REQUIRE(registry.policy_manager()->module_exists("default_merge"));

SECTION("JSON merge_like_handlers")
{
auto [policy, lock] = registry.policy_manager()->module_get_locked("default_merge");
json j;
policy->json_metrics(j, 0, false);
std::cout << j.dump();
CHECK(j["default_merge"]["dns_merged"] != nullptr);
CHECK(j["default_merge"]["packets_merged"] != nullptr);
}

SECTION("Prometheus merge_like_handlers")
{
auto [policy, lock] = registry.policy_manager()->module_get_locked("default_merge");
std::stringstream out;
REQUIRE_NOTHROW(policy->prometheus_metrics(out));
}

SECTION("Opentelemetry merge_like_handlers")
{
auto [policy, lock] = registry.policy_manager()->module_get_locked("default_merge");
metrics::v1::ScopeMetrics scope;
REQUIRE_NOTHROW(policy->opentelemetry_metrics(scope));
}
}