1+ from __future__ import annotations
2+
13import functools
4+ import logging
25import os
36from collections import defaultdict
47from dataclasses import asdict
@@ -31,10 +34,10 @@ def is_memcache_responsive(hostname, port):
3134
3235def pytest_addoption (parser ):
3336 parser .addoption (
34- "--do-not-start-memcache " ,
37+ "--memcached-service " ,
3538 action = "store_true" ,
36- help = "When this flag is used, memcache won't be started by a fixture"
37- " and is instead expected to be already running " ,
39+ default = "localhost:11211" ,
40+ help = "Address of memcached server to use for tests. " ,
3841 )
3942 group = parser .getgroup ("tolerate" )
4043 group .addoption (
@@ -82,64 +85,17 @@ def pytorch_seed(seed):
8285
8386
8487@pytest .fixture (scope = "session" )
85- def do_not_start_memcache (request ):
86- return request .config .getoption ("--do-not-start-memcache" )
87-
88-
89- @pytest .fixture (scope = "session" )
90- def docker_services (
91- docker_compose_command ,
92- docker_compose_file ,
93- docker_compose_project_name ,
94- docker_setup ,
95- docker_cleanup ,
96- do_not_start_memcache ,
97- ):
98- """Start all services from a docker compose file (`docker-compose up`).
99- After test are finished, shutdown all services (`docker-compose down`)."""
100- from pytest_docker .plugin import get_docker_services
101-
102- if do_not_start_memcache :
103- yield
104- else :
105- with get_docker_services (
106- docker_compose_command ,
107- docker_compose_file ,
108- docker_compose_project_name ,
109- docker_setup ,
110- docker_cleanup ,
111- ) as docker_service :
112- yield docker_service
113-
114-
115- @pytest .fixture (scope = "session" )
116- def memcached_service (docker_ip , docker_services , do_not_start_memcache ):
117- """Ensure that memcached service is up and responsive.
118-
119- If `do_not_start_memcache` is True then we just return the default values
120- 'localhost', 11211
121- """
122- if do_not_start_memcache :
123- return "localhost" , 11211
124- else :
125- # `port_for` takes a container port and returns the corresponding host port
126- port = docker_services .port_for ("memcached" , 11211 )
127- hostname , port = docker_ip , port
128- docker_services .wait_until_responsive (
129- timeout = 30.0 ,
130- pause = 0.5 ,
131- check = lambda : is_memcache_responsive (hostname , port ),
132- )
133- return hostname , port
88+ def memcached_service (request ) -> tuple [str , int ]:
89+ opt = request .config .getoption ("--memcached-service" , default = "localhost:11211" )
90+ host , port = opt .split (":" )
91+ return host , int (port )
13492
13593
13694@pytest .fixture (scope = "function" )
13795def memcache_client_config (memcached_service ) -> MemcachedClientConfig :
138- client_config = MemcachedClientConfig (
96+ return MemcachedClientConfig (
13997 server = memcached_service , connect_timeout = 1.0 , timeout = 1 , no_delay = True
14098 )
141- Client (** asdict (client_config )).flush_all ()
142- return client_config
14399
144100
145101@pytest .fixture (scope = "function" )
@@ -151,11 +107,9 @@ def memcached_client(memcache_client_config) -> Tuple[Client, MemcachedClientCon
151107 c .flush_all ()
152108 return c , memcache_client_config
153109 except Exception as e :
154- print (
155- f"Could not connect to memcached server "
156- f'{ memcache_client_config ["server" ]} : { e } '
157- )
158- raise e
110+ raise ConnectionError (
111+ f"Could not connect to memcached at { memcache_client_config .server } "
112+ ) from e
159113
160114
161115@pytest .fixture (scope = "function" )
@@ -400,6 +354,14 @@ def pytest_configure(config):
400354 )
401355 config ._tolerate_session = TolerateErrorsSession (config )
402356
357+ worker_id = os .environ .get ("PYTEST_XDIST_WORKER" )
358+ if worker_id is not None :
359+ logging .basicConfig (
360+ format = "%(asctime)s %(levelname)s %(message)s" ,
361+ filename = f"tests_{ worker_id } .log" ,
362+ level = logging .DEBUG ,
363+ )
364+
403365
404366def pytest_runtest_setup (item : pytest .Item ):
405367 marker = item .get_closest_marker ("tolerate" )
0 commit comments