From 3b39550590dcc330b08819acc8b31f3ae83d9a0f Mon Sep 17 00:00:00 2001 From: Jakub Smolar Date: Fri, 12 Jan 2024 16:16:07 +0100 Subject: [PATCH] Add RLP route rule test --- testsuite/tests/kuadrant/conftest.py | 17 +++++--- .../kuadrant/limitador/test_basic_limit.py | 1 + .../limitador/test_multiple_iterations.py | 1 + .../kuadrant/limitador/test_route_rule.py | 39 +++++++++++++++++++ .../tests/kuadrant/test_rate_limit_authz.py | 1 + 5 files changed, 53 insertions(+), 6 deletions(-) create mode 100644 testsuite/tests/kuadrant/limitador/test_route_rule.py diff --git a/testsuite/tests/kuadrant/conftest.py b/testsuite/tests/kuadrant/conftest.py index 4310c5dc..5f879c6e 100644 --- a/testsuite/tests/kuadrant/conftest.py +++ b/testsuite/tests/kuadrant/conftest.py @@ -43,13 +43,18 @@ def authorization(authorino, kuadrant, oidc_provider, route, authorization_name, return None -@pytest.fixture(scope="module", params=["route", "gateway"]) -def rate_limit(kuadrant, openshift, blame, request, module_label): - """Rate limit""" +@pytest.fixture(scope="module") +def rate_limit(kuadrant, openshift, blame, request, module_label, route, gateway): + """ + Rate limit object. + Request is used for indirect parametrization, with two possible parameters: + 1. `route` (default) + 2. `gateway` + """ + target_ref = request.getfixturevalue(getattr(request, "param", "route")) + if kuadrant: - return RateLimitPolicy.create_instance( - openshift, blame("limit"), request.getfixturevalue(request.param), labels={"testRun": module_label} - ) + return RateLimitPolicy.create_instance(openshift, blame("limit"), target_ref, labels={"testRun": module_label}) return None diff --git a/testsuite/tests/kuadrant/limitador/test_basic_limit.py b/testsuite/tests/kuadrant/limitador/test_basic_limit.py index 7b8a9483..04f35c2c 100644 --- a/testsuite/tests/kuadrant/limitador/test_basic_limit.py +++ b/testsuite/tests/kuadrant/limitador/test_basic_limit.py @@ -27,6 +27,7 @@ def rate_limit(rate_limit, limit): return rate_limit +@pytest.mark.parametrize("rate_limit", ["route", "gateway"], indirect=True) def test_limit(client, limit): """Tests that simple limit is applied successfully""" responses = client.get_many("/get", limit.limit) diff --git a/testsuite/tests/kuadrant/limitador/test_multiple_iterations.py b/testsuite/tests/kuadrant/limitador/test_multiple_iterations.py index 2ac7259c..e7f6ba5c 100644 --- a/testsuite/tests/kuadrant/limitador/test_multiple_iterations.py +++ b/testsuite/tests/kuadrant/limitador/test_multiple_iterations.py @@ -15,6 +15,7 @@ def rate_limit(rate_limit): return rate_limit +@pytest.mark.parametrize("rate_limit", ["route", "gateway"], indirect=True) def test_multiple_iterations(client): """Tests that simple limit is applied successfully and works for multiple iterations""" for _ in range(10): diff --git a/testsuite/tests/kuadrant/limitador/test_route_rule.py b/testsuite/tests/kuadrant/limitador/test_route_rule.py new file mode 100644 index 00000000..0ca99515 --- /dev/null +++ b/testsuite/tests/kuadrant/limitador/test_route_rule.py @@ -0,0 +1,39 @@ +"""Tests that the RLP is correctly apply to the route rule""" +import pytest + +from testsuite.gateway import RouteMatch, PathMatch, MatchType +from testsuite.policy.rate_limit_policy import Limit, RouteSelector + + +@pytest.fixture(scope="module") +def route(route, backend): + """Add two new rules to the route""" + route.remove_all_rules() + route.add_rule( + backend, + RouteMatch(path=PathMatch(value="/get", type=MatchType.PATH_PREFIX)), + ) + route.add_rule( + backend, + RouteMatch(path=PathMatch(value="/anything", type=MatchType.PATH_PREFIX)), + ) + return route + + +@pytest.fixture(scope="module") +def rate_limit(rate_limit): + """Add limit to the policy""" + selector = RouteSelector(RouteMatch(path=PathMatch(value="/get", type=MatchType.PATH_PREFIX))) + rate_limit.add_limit("multiple", [Limit(5, 10)], route_selectors=[selector]) + return rate_limit + + +def test_rule(client): + """Tests that RLP correctly applies to the given HTTPRoute rule""" + responses = client.get_many("/get", 5) + assert all( + r.status_code == 200 for r in responses + ), f"Rate Limited resource unexpectedly rejected requests {responses}" + assert client.get("/get").status_code == 429 + response = client.get("/anything") + assert response.status_code == 200 diff --git a/testsuite/tests/kuadrant/test_rate_limit_authz.py b/testsuite/tests/kuadrant/test_rate_limit_authz.py index 0bc5fb2a..71dafcba 100644 --- a/testsuite/tests/kuadrant/test_rate_limit_authz.py +++ b/testsuite/tests/kuadrant/test_rate_limit_authz.py @@ -48,6 +48,7 @@ def auth2(rhsso, blame): return HttpxOidcClientAuth.from_user(rhsso.get_token, user=user) +@pytest.mark.parametrize("rate_limit", ["route", "gateway"], indirect=True) def test_authz_limit(client, auth, auth2): """Tests that rate limit is applied for two users independently""" responses = client.get_many("/get", 5, auth=auth)