Skip to content

Commit

Permalink
natlab: Add upnp lease duration test
Browse files Browse the repository at this point in the history
  • Loading branch information
lcruz99 committed Oct 18, 2024
1 parent ba1bebc commit a47c919
Showing 1 changed file with 96 additions and 0 deletions.
96 changes: 96 additions & 0 deletions nat-lab/tests/test_upnp_connection.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import asyncio
import pytest
import re
from contextlib import AsyncExitStack
from helpers import SetupParameters, setup_mesh_nodes, setup_environment
from utils.asyncio_util import run_async_context
Expand Down Expand Up @@ -189,3 +190,98 @@ async def test_upnp_without_support(

await ping(beta_conn_mgr.connection, alpha_node.ip_addresses[0])
await ping(alpha_conn_mgr.connection, beta_node.ip_addresses[0])


@pytest.mark.asyncio
@pytest.mark.parametrize(
"alpha_setup_params",
[
SetupParameters(
connection_tag=ConnectionTag.DOCKER_UPNP_CLIENT_1,
adapter_type_override=TelioAdapterType.BORING_TUN,
features=features_with_endpoint_providers([EndpointProvider.UPNP]),
),
],
)
@pytest.mark.parametrize(
"beta_setup_params",
[
SetupParameters(
connection_tag=ConnectionTag.DOCKER_SYMMETRIC_CLIENT_1,
adapter_type_override=TelioAdapterType.BORING_TUN,
features=features_with_endpoint_providers([EndpointProvider.LOCAL]),
),
],
)
async def test_upnp_port_lease_duration(
alpha_setup_params: SetupParameters, beta_setup_params: SetupParameters
) -> None:
async with AsyncExitStack() as exit_stack:
# once the endpoint interval expires, the endpoint is validated and if
# the lease duration left is less than 25% the port mappings are renewed.
lease_duration_s = 40

assert alpha_setup_params.features.direct
assert alpha_setup_params.features.direct.upnp_features
alpha_setup_params.features.direct.upnp_features.lease_duration_s = (
lease_duration_s
)

assert alpha_setup_params.features.direct.endpoint_interval_secs
alpha_setup_params.features.direct.endpoint_interval_secs = 5
assert alpha_setup_params.features.direct.endpoint_providers_optimization
alpha_setup_params.features.direct.endpoint_providers_optimization.optimize_direct_upgrade_upnp = (
False
)

env = await exit_stack.enter_async_context(
setup_environment(exit_stack, [alpha_setup_params, beta_setup_params])
)
(alpha_node, beta_node) = env.nodes
(alpha_client, beta_client) = env.clients
(alpha_conn_mgr, _) = env.connections
alpha_conn = alpha_conn_mgr.connection

assert alpha_conn_mgr.gw_connection
alpha_gw_router = new_router(alpha_conn_mgr.gw_connection, IPStack.IPv4v6)

# Clean upnp mappings
async with AsyncExitStack() as temp_exit_stack:
await temp_exit_stack.enter_async_context(alpha_gw_router.reset_upnpd())

# this check should be done before endpoint interval triggers a new mapping (optimal > 5s)
upnpc_cmd = await alpha_conn.create_process(["upnpc", "-i", "-l"]).execute()
assert re.search("^ [0-9]+ UDP", upnpc_cmd.get_stdout(), re.MULTILINE) is None

await asyncio.gather(
alpha_client.wait_for_state_on_any_derp([RelayState.CONNECTED]),
beta_client.wait_for_state_on_any_derp([RelayState.CONNECTED]),
alpha_client.wait_for_event_peer(
beta_node.public_key, [NodeState.CONNECTED], [PathType.DIRECT]
),
beta_client.wait_for_event_peer(
alpha_node.public_key, [NodeState.CONNECTED], [PathType.DIRECT]
),
)

upnpc_cmd = await alpha_conn.create_process(["upnpc", "-i", "-l"]).execute()
mappings_search = re.findall(
"^ [0-9]+ UDP", upnpc_cmd.get_stdout(), re.MULTILINE
)
assert len(mappings_search) == 2

await asyncio.sleep(lease_duration_s)

# telio-traversal shouldn't let port mappings expire
upnpc_cmd = await alpha_conn.create_process(["upnpc", "-i", "-l"]).execute()
mappings_search = re.findall(
"^ [0-9]+ UDP", upnpc_cmd.get_stdout(), re.MULTILINE
)
assert len(mappings_search) == 2

await alpha_client.stop_device()
await asyncio.sleep(lease_duration_s)

# upnpn mappings should have expired
upnpc_cmd = await alpha_conn.create_process(["upnpc", "-i", "-l"]).execute()
assert re.search("^ [0-9]+ UDP", upnpc_cmd.get_stdout(), re.MULTILINE) is None

0 comments on commit a47c919

Please sign in to comment.