Skip to content

Commit 1d533ad

Browse files
committed
testing dynamic port allocation
1 parent 1fcf4fb commit 1d533ad

File tree

3 files changed

+48
-3
lines changed

3 files changed

+48
-3
lines changed

test/conftest.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22
from __future__ import annotations
33

44
import os
5+
import socket
56
from contextlib import contextmanager
67
from logging import getLogger
78
from pathlib import Path
8-
from typing import Generator
9+
from typing import Generator, Optional
910

1011
import pytest
1112

@@ -148,3 +149,23 @@ def pytest_runtest_setup(item) -> None:
148149
if "auth" in test_tags:
149150
if os.getenv("RUN_AUTH_TESTS") != "true":
150151
pytest.skip("Skipping auth test in current environment")
152+
153+
154+
def find_free_port() -> int:
155+
"""Find a free port to avoid conflicts in parallel test environments."""
156+
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
157+
s.bind(("", 0))
158+
s.listen(1)
159+
port = s.getsockname()[1]
160+
return port
161+
162+
163+
def get_server_parameter_value(connection, parameter_name: str) -> Optional[str]:
164+
"""Get server parameter value, returns None if parameter doesn't exist."""
165+
try:
166+
with connection.cursor() as cur:
167+
cur.execute(f"show parameters like '{parameter_name}'")
168+
ret = cur.fetchone()
169+
return ret[1] if ret else None
170+
except Exception:
171+
return None

test/integ/test_connection.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@ def test_connection_without_database2(db_parameters):
111111

112112
def test_with_config(db_parameters):
113113
"""Creates a connection with the config parameter."""
114+
from ..conftest import get_server_parameter_value
115+
114116
config = {
115117
"user": db_parameters["user"],
116118
"password": db_parameters["password"],
@@ -125,7 +127,22 @@ def test_with_config(db_parameters):
125127
cnx = snowflake.connector.connect(**config)
126128
try:
127129
assert cnx, "invalid cnx"
128-
assert not cnx.client_session_keep_alive # default is False
130+
131+
# Check what the server default is to make test environment-aware
132+
server_default_str = get_server_parameter_value(
133+
cnx, "CLIENT_SESSION_KEEP_ALIVE"
134+
)
135+
if server_default_str:
136+
server_default = server_default_str.lower() == "true"
137+
# Test that connection respects server default when not explicitly set
138+
assert (
139+
cnx.client_session_keep_alive == server_default
140+
), f"Expected client_session_keep_alive={server_default} (server default), got {cnx.client_session_keep_alive}"
141+
else:
142+
# Fallback: if we can't determine server default, expect False
143+
assert (
144+
not cnx.client_session_keep_alive
145+
), "Expected client_session_keep_alive=False when server default unknown"
129146
finally:
130147
cnx.close()
131148

test/unit/test_oauth_token.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,8 @@ def test_oauth_code_local_application_custom_urls_successful_flow(
376376
monkeypatch,
377377
omit_oauth_urls_check,
378378
) -> None:
379+
from ..conftest import find_free_port
380+
379381
monkeypatch.setenv("SNOWFLAKE_AUTH_SOCKET_REUSE_PORT", "true")
380382

381383
wiremock_client.import_mapping(
@@ -389,6 +391,10 @@ def test_oauth_code_local_application_custom_urls_successful_flow(
389391
wiremock_generic_mappings_dir / "snowflake_disconnect_successful.json"
390392
)
391393

394+
# Use dynamic port to avoid conflicts and higher timeout for all environments
395+
free_port = find_free_port()
396+
oauth_redirect_uri = f"http://localhost:{free_port}/snowflake/oauth-redirect"
397+
392398
with mock.patch("webbrowser.open", new=webbrowser_mock.open):
393399
with mock.patch("secrets.token_urlsafe", return_value="abc123"):
394400
cnx = snowflake.connector.connect(
@@ -401,9 +407,10 @@ def test_oauth_code_local_application_custom_urls_successful_flow(
401407
role="ANALYST",
402408
oauth_token_request_url=f"http://{wiremock_client.wiremock_host}:{wiremock_client.wiremock_http_port}/tokenrequest",
403409
oauth_authorization_url=f"http://{wiremock_client.wiremock_host}:{wiremock_client.wiremock_http_port}/authorization",
404-
oauth_redirect_uri="http://localhost:8009/snowflake/oauth-redirect",
410+
oauth_redirect_uri=oauth_redirect_uri,
405411
host=wiremock_client.wiremock_host,
406412
port=wiremock_client.wiremock_http_port,
413+
external_browser_timeout=120, # Higher timeout for all environments
407414
)
408415

409416
assert cnx, "invalid cnx"

0 commit comments

Comments
 (0)