|
3 | 3 | import os
|
4 | 4 | import re
|
5 | 5 | import threading
|
| 6 | +import types |
6 | 7 |
|
7 | 8 | import py
|
8 | 9 | import pytest
|
@@ -205,8 +206,8 @@ class WorkerController(object):
|
205 | 206 |
|
206 | 207 | class RemoteHook:
|
207 | 208 | @pytest.mark.trylast
|
208 |
| - def pytest_xdist_getremotemodule(self): |
209 |
| - return xdist.remote |
| 209 | + def pytest_xdist_getremotetarget(self): |
| 210 | + return RemoteTarget(xdist.remote) |
210 | 211 |
|
211 | 212 | def __init__(self, nodemanager, gateway, config, putevent):
|
212 | 213 | config.pluginmanager.register(self.RemoteHook())
|
@@ -248,8 +249,8 @@ def setup(self):
|
248 | 249 | basetemp = self.config._tmpdirhandler.getbasetemp()
|
249 | 250 | option_dict["basetemp"] = str(basetemp.join(name))
|
250 | 251 | self.config.hook.pytest_configure_node(node=self)
|
251 |
| - remote_module = self.config.hook.pytest_xdist_getremotemodule() |
252 |
| - self.channel = self.gateway.remote_exec(remote_module) |
| 252 | + target, _, target_kwargs = self.config.hook.pytest_xdist_getremotetarget().pack() |
| 253 | + self.channel = self.gateway.remote_exec(target, **target_kwargs) |
253 | 254 | self.channel.send((self.workerinput, args, option_dict))
|
254 | 255 | if self.putevent:
|
255 | 256 | self.channel.setcallback(self.process_from_remote, endmarker=self.ENDMARK)
|
@@ -359,6 +360,23 @@ def process_from_remote(self, eventcall): # noqa too complex
|
359 | 360 | self.notify_inproc("errordown", node=self, error=excinfo)
|
360 | 361 |
|
361 | 362 |
|
| 363 | +class RemoteTarget: |
| 364 | + def __init__(self, target, *args, **kwargs): |
| 365 | + self._target = target |
| 366 | + self._args = args |
| 367 | + self._kwargs = kwargs |
| 368 | + self.validate() |
| 369 | + |
| 370 | + def validate(self): |
| 371 | + # this is based on execnet criteria |
| 372 | + assert not self._args, "Positional arguments are not yet supported" |
| 373 | + if isinstance(self._target, types.ModuleType): |
| 374 | + assert not (self._args or self._kwargs), "Arguments are not used with module targets" |
| 375 | + |
| 376 | + def pack(self): |
| 377 | + return self._target, self._args, self._kwargs |
| 378 | + |
| 379 | + |
362 | 380 | def unserialize_report(name, reportdict):
|
363 | 381 | def assembled_report(reportdict):
|
364 | 382 | from _pytest._code.code import (
|
|
0 commit comments