Show More
@@ -26,7 +26,7 b' from rhodecode.tests import TEST_USER_AD' | |||||
26 | from rhodecode.api.tests.utils import ( |
|
26 | from rhodecode.api.tests.utils import ( | |
27 | build_data, api_call, assert_error, assert_ok, crash, jsonify) |
|
27 | build_data, api_call, assert_error, assert_ok, crash, jsonify) | |
28 | from rhodecode.tests.fixture import Fixture |
|
28 | from rhodecode.tests.fixture import Fixture | |
29 |
from rhodecode.tests.plugin import |
|
29 | from rhodecode.tests.plugin import plain_http_host_only_stub | |
30 |
|
30 | |||
31 | fixture = Fixture() |
|
31 | fixture = Fixture() | |
32 |
|
32 | |||
@@ -80,7 +80,7 b' class TestApiUpdateRepo(object):' | |||||
80 | ({'repo_name': 'new_repo_name'}, |
|
80 | ({'repo_name': 'new_repo_name'}, | |
81 | { |
|
81 | { | |
82 | 'repo_name': 'new_repo_name', |
|
82 | 'repo_name': 'new_repo_name', | |
83 | 'url': 'http://{}/new_repo_name'.format(http_host_only_stub()) |
|
83 | 'url': 'http://{}/new_repo_name'.format(plain_http_host_only_stub()) | |
84 | }), |
|
84 | }), | |
85 |
|
85 | |||
86 | ({'repo_name': 'test_group_for_update/{}'.format(UPDATE_REPO_NAME), |
|
86 | ({'repo_name': 'test_group_for_update/{}'.format(UPDATE_REPO_NAME), | |
@@ -88,7 +88,7 b' class TestApiUpdateRepo(object):' | |||||
88 | { |
|
88 | { | |
89 | 'repo_name': 'test_group_for_update/{}'.format(UPDATE_REPO_NAME), |
|
89 | 'repo_name': 'test_group_for_update/{}'.format(UPDATE_REPO_NAME), | |
90 | 'url': 'http://{}/test_group_for_update/{}'.format( |
|
90 | 'url': 'http://{}/test_group_for_update/{}'.format( | |
91 | http_host_only_stub(), UPDATE_REPO_NAME) |
|
91 | plain_http_host_only_stub(), UPDATE_REPO_NAME) | |
92 | }), |
|
92 | }), | |
93 | ]) |
|
93 | ]) | |
94 | def test_api_update_repo(self, updates, expected, backend): |
|
94 | def test_api_update_repo(self, updates, expected, backend): |
@@ -41,8 +41,7 b' def dummy_conf_file(tmpdir):' | |||||
41 | return os.path.join(f_path) |
|
41 | return os.path.join(f_path) | |
42 |
|
42 | |||
43 |
|
43 | |||
44 | @pytest.fixture |
|
44 | def plain_dummy_env(): | |
45 | def dummy_env(): |
|
|||
46 | return { |
|
45 | return { | |
47 | 'request': |
|
46 | 'request': | |
48 | AttributeDict(host_url='http://localhost', script_name='/') |
|
47 | AttributeDict(host_url='http://localhost', script_name='/') | |
@@ -50,8 +49,17 b' def dummy_env():' | |||||
50 |
|
49 | |||
51 |
|
50 | |||
52 | @pytest.fixture |
|
51 | @pytest.fixture | |
|
52 | def dummy_env(): | |||
|
53 | return plain_dummy_env() | |||
|
54 | ||||
|
55 | ||||
|
56 | def plain_dummy_user(): | |||
|
57 | return AttributeDict(username='test_user') | |||
|
58 | ||||
|
59 | ||||
|
60 | @pytest.fixture | |||
53 | def dummy_user(): |
|
61 | def dummy_user(): | |
54 | return AttributeDict(username='test_user') |
|
62 | return plain_dummy_user() | |
55 |
|
63 | |||
56 |
|
64 | |||
57 | @pytest.fixture |
|
65 | @pytest.fixture |
@@ -23,7 +23,7 b' import mock' | |||||
23 | import pytest |
|
23 | import pytest | |
24 |
|
24 | |||
25 | from rhodecode.apps.ssh_support.lib.backends.git import GitServer |
|
25 | from rhodecode.apps.ssh_support.lib.backends.git import GitServer | |
26 | from rhodecode.apps.ssh_support.tests.conftest import dummy_env, dummy_user |
|
26 | from rhodecode.apps.ssh_support.tests.conftest import plain_dummy_env, plain_dummy_user | |
27 |
|
27 | |||
28 |
|
28 | |||
29 | class GitServerCreator(object): |
|
29 | class GitServerCreator(object): | |
@@ -37,7 +37,7 b' class GitServerCreator(object):' | |||||
37 | } |
|
37 | } | |
38 | repo_name = 'test_git' |
|
38 | repo_name = 'test_git' | |
39 | repo_mode = 'receive-pack' |
|
39 | repo_mode = 'receive-pack' | |
40 | user = dummy_user() |
|
40 | user = plain_dummy_user() | |
41 |
|
41 | |||
42 | def __init__(self): |
|
42 | def __init__(self): | |
43 | def config_get(part, key): |
|
43 | def config_get(part, key): | |
@@ -56,7 +56,7 b' class GitServerCreator(object):' | |||||
56 | self.repo_name: 'repository.admin' |
|
56 | self.repo_name: 'repository.admin' | |
57 | }, |
|
57 | }, | |
58 | 'config': self.config_mock, |
|
58 | 'config': self.config_mock, | |
59 | 'env': dummy_env() |
|
59 | 'env': plain_dummy_env() | |
60 | } |
|
60 | } | |
61 | parameters.update(kwargs) |
|
61 | parameters.update(kwargs) | |
62 | server = GitServer(**parameters) |
|
62 | server = GitServer(**parameters) |
@@ -22,7 +22,7 b' import mock' | |||||
22 | import pytest |
|
22 | import pytest | |
23 |
|
23 | |||
24 | from rhodecode.apps.ssh_support.lib.backends.hg import MercurialServer |
|
24 | from rhodecode.apps.ssh_support.lib.backends.hg import MercurialServer | |
25 | from rhodecode.apps.ssh_support.tests.conftest import dummy_env, dummy_user |
|
25 | from rhodecode.apps.ssh_support.tests.conftest import plain_dummy_env, plain_dummy_user | |
26 |
|
26 | |||
27 |
|
27 | |||
28 | class MercurialServerCreator(object): |
|
28 | class MercurialServerCreator(object): | |
@@ -36,7 +36,7 b' class MercurialServerCreator(object):' | |||||
36 | } |
|
36 | } | |
37 | } |
|
37 | } | |
38 | repo_name = 'test_hg' |
|
38 | repo_name = 'test_hg' | |
39 | user = dummy_user() |
|
39 | user = plain_dummy_user() | |
40 |
|
40 | |||
41 | def __init__(self): |
|
41 | def __init__(self): | |
42 | def config_get(part, key): |
|
42 | def config_get(part, key): | |
@@ -54,7 +54,7 b' class MercurialServerCreator(object):' | |||||
54 | 'test_hg': 'repository.admin' |
|
54 | 'test_hg': 'repository.admin' | |
55 | }, |
|
55 | }, | |
56 | 'config': self.config_mock, |
|
56 | 'config': self.config_mock, | |
57 | 'env': dummy_env() |
|
57 | 'env': plain_dummy_env() | |
58 | } |
|
58 | } | |
59 | parameters.update(kwargs) |
|
59 | parameters.update(kwargs) | |
60 | server = MercurialServer(**parameters) |
|
60 | server = MercurialServer(**parameters) |
@@ -22,7 +22,7 b' import mock' | |||||
22 | import pytest |
|
22 | import pytest | |
23 |
|
23 | |||
24 | from rhodecode.apps.ssh_support.lib.backends.svn import SubversionServer |
|
24 | from rhodecode.apps.ssh_support.lib.backends.svn import SubversionServer | |
25 | from rhodecode.apps.ssh_support.tests.conftest import dummy_env, dummy_user |
|
25 | from rhodecode.apps.ssh_support.tests.conftest import plain_dummy_env, plain_dummy_user | |
26 |
|
26 | |||
27 |
|
27 | |||
28 | class SubversionServerCreator(object): |
|
28 | class SubversionServerCreator(object): | |
@@ -35,7 +35,7 b' class SubversionServerCreator(object):' | |||||
35 | } |
|
35 | } | |
36 | } |
|
36 | } | |
37 | repo_name = 'test-svn' |
|
37 | repo_name = 'test-svn' | |
38 | user = dummy_user() |
|
38 | user = plain_dummy_user() | |
39 |
|
39 | |||
40 | def __init__(self): |
|
40 | def __init__(self): | |
41 | def config_get(part, key): |
|
41 | def config_get(part, key): | |
@@ -53,7 +53,7 b' class SubversionServerCreator(object):' | |||||
53 | self.repo_name: 'repository.admin' |
|
53 | self.repo_name: 'repository.admin' | |
54 | }, |
|
54 | }, | |
55 | 'config': self.config_mock, |
|
55 | 'config': self.config_mock, | |
56 | 'env': dummy_env() |
|
56 | 'env': plain_dummy_env() | |
57 | } |
|
57 | } | |
58 |
|
58 | |||
59 | parameters.update(kwargs) |
|
59 | parameters.update(kwargs) |
@@ -236,7 +236,7 b' def no_newline_id_generator(test_name):' | |||||
236 | nicer output of progress of test |
|
236 | nicer output of progress of test | |
237 | """ |
|
237 | """ | |
238 | org_name = test_name |
|
238 | org_name = test_name | |
239 | test_name = str(test_name)\ |
|
239 | test_name = safe_str(test_name)\ | |
240 | .replace('\n', '_N') \ |
|
240 | .replace('\n', '_N') \ | |
241 | .replace('\r', '_N') \ |
|
241 | .replace('\r', '_N') \ | |
242 | .replace('\t', '_T') \ |
|
242 | .replace('\t', '_T') \ |
@@ -34,7 +34,7 b' def _get_dbs_from_metafunc(metafunc):' | |||||
34 | if hasattr(metafunc.function, 'dbs'): |
|
34 | if hasattr(metafunc.function, 'dbs'): | |
35 | # Supported backends by this test function, created from |
|
35 | # Supported backends by this test function, created from | |
36 | # pytest.mark.dbs |
|
36 | # pytest.mark.dbs | |
37 |
backends = metafunc. |
|
37 | backends = metafunc.definition.get_closest_marker('dbs').args | |
38 | else: |
|
38 | else: | |
39 | backends = metafunc.config.getoption('--dbs') |
|
39 | backends = metafunc.config.getoption('--dbs') | |
40 | return backends |
|
40 | return backends |
@@ -139,7 +139,7 b' def get_backends_from_metafunc(metafunc)' | |||||
139 | if hasattr(metafunc.function, 'backends'): |
|
139 | if hasattr(metafunc.function, 'backends'): | |
140 | # Supported backends by this test function, created from |
|
140 | # Supported backends by this test function, created from | |
141 | # pytest.mark.backends |
|
141 | # pytest.mark.backends | |
142 |
backends = metafunc. |
|
142 | backends = metafunc.definition.get_closest_marker('backends').args | |
143 | elif hasattr(metafunc.cls, 'backend_alias'): |
|
143 | elif hasattr(metafunc.cls, 'backend_alias'): | |
144 | # Support class attribute "backend_alias", this is mainly |
|
144 | # Support class attribute "backend_alias", this is mainly | |
145 | # for legacy reasons for tests not yet using pytest.mark.backends |
|
145 | # for legacy reasons for tests not yet using pytest.mark.backends | |
@@ -182,8 +182,14 b' def http_environ_session():' | |||||
182 | """ |
|
182 | """ | |
183 | Allow to use "http_environ" in session scope. |
|
183 | Allow to use "http_environ" in session scope. | |
184 | """ |
|
184 | """ | |
185 | return http_environ( |
|
185 | return plain_http_environ() | |
186 | http_host_stub=http_host_stub()) |
|
186 | ||
|
187 | ||||
|
188 | def plain_http_host_stub(): | |||
|
189 | """ | |||
|
190 | Value of HTTP_HOST in the test run. | |||
|
191 | """ | |||
|
192 | return 'example.com:80' | |||
187 |
|
193 | |||
188 |
|
194 | |||
189 | @pytest.fixture |
|
195 | @pytest.fixture | |
@@ -191,7 +197,14 b' def http_host_stub():' | |||||
191 | """ |
|
197 | """ | |
192 | Value of HTTP_HOST in the test run. |
|
198 | Value of HTTP_HOST in the test run. | |
193 | """ |
|
199 | """ | |
194 | return 'example.com:80' |
|
200 | return plain_http_host_stub() | |
|
201 | ||||
|
202 | ||||
|
203 | def plain_http_host_only_stub(): | |||
|
204 | """ | |||
|
205 | Value of HTTP_HOST in the test run. | |||
|
206 | """ | |||
|
207 | return plain_http_host_stub().split(':')[0] | |||
195 |
|
208 | |||
196 |
|
209 | |||
197 | @pytest.fixture |
|
210 | @pytest.fixture | |
@@ -199,11 +212,10 b' def http_host_only_stub():' | |||||
199 | """ |
|
212 | """ | |
200 | Value of HTTP_HOST in the test run. |
|
213 | Value of HTTP_HOST in the test run. | |
201 | """ |
|
214 | """ | |
202 |
return http_host_stub() |
|
215 | return plain_http_host_only_stub() | |
203 |
|
216 | |||
204 |
|
217 | |||
205 | @pytest.fixture |
|
218 | def plain_http_environ(): | |
206 | def http_environ(http_host_stub): |
|
|||
207 | """ |
|
219 | """ | |
208 | HTTP extra environ keys. |
|
220 | HTTP extra environ keys. | |
209 |
|
221 | |||
@@ -212,14 +224,26 b' def http_environ(http_host_stub):' | |||||
212 | to override this for a specific test case. |
|
224 | to override this for a specific test case. | |
213 | """ |
|
225 | """ | |
214 | return { |
|
226 | return { | |
215 | 'SERVER_NAME': http_host_only_stub(), |
|
227 | 'SERVER_NAME': plain_http_host_only_stub(), | |
216 | 'SERVER_PORT': http_host_stub.split(':')[1], |
|
228 | 'SERVER_PORT': plain_http_host_stub().split(':')[1], | |
217 | 'HTTP_HOST': http_host_stub, |
|
229 | 'HTTP_HOST': plain_http_host_stub(), | |
218 | 'HTTP_USER_AGENT': 'rc-test-agent', |
|
230 | 'HTTP_USER_AGENT': 'rc-test-agent', | |
219 | 'REQUEST_METHOD': 'GET' |
|
231 | 'REQUEST_METHOD': 'GET' | |
220 | } |
|
232 | } | |
221 |
|
233 | |||
222 |
|
234 | |||
|
235 | @pytest.fixture | |||
|
236 | def http_environ(): | |||
|
237 | """ | |||
|
238 | HTTP extra environ keys. | |||
|
239 | ||||
|
240 | User by the test application and as well for setting up the pylons | |||
|
241 | environment. In the case of the fixture "app" it should be possible | |||
|
242 | to override this for a specific test case. | |||
|
243 | """ | |||
|
244 | return plain_http_environ() | |||
|
245 | ||||
|
246 | ||||
223 | @pytest.fixture(scope='session') |
|
247 | @pytest.fixture(scope='session') | |
224 | def baseapp(ini_config, vcsserver, http_environ_session): |
|
248 | def baseapp(ini_config, vcsserver, http_environ_session): | |
225 | from rhodecode.lib.pyramid_utils import get_app_config |
|
249 | from rhodecode.lib.pyramid_utils import get_app_config | |
@@ -423,18 +447,7 b' class TestRepoContainer(object):' | |||||
423 | self._fixture.destroy_repo(repo_name) |
|
447 | self._fixture.destroy_repo(repo_name) | |
424 |
|
448 | |||
425 |
|
449 | |||
426 | @pytest.fixture |
|
450 | def backend_base(request, backend_alias, baseapp, test_repo): | |
427 | def backend(request, backend_alias, baseapp, test_repo): |
|
|||
428 | """ |
|
|||
429 | Parametrized fixture which represents a single backend implementation. |
|
|||
430 |
|
||||
431 | It respects the option `--backends` to focus the test run on specific |
|
|||
432 | backend implementations. |
|
|||
433 |
|
||||
434 | It also supports `pytest.mark.xfail_backends` to mark tests as failing |
|
|||
435 | for specific backends. This is intended as a utility for incremental |
|
|||
436 | development of a new backend implementation. |
|
|||
437 | """ |
|
|||
438 | if backend_alias not in request.config.getoption('--backends'): |
|
451 | if backend_alias not in request.config.getoption('--backends'): | |
439 | pytest.skip("Backend %s not selected." % (backend_alias, )) |
|
452 | pytest.skip("Backend %s not selected." % (backend_alias, )) | |
440 |
|
453 | |||
@@ -452,18 +465,33 b' def backend(request, backend_alias, base' | |||||
452 |
|
465 | |||
453 |
|
466 | |||
454 | @pytest.fixture |
|
467 | @pytest.fixture | |
|
468 | def backend(request, backend_alias, baseapp, test_repo): | |||
|
469 | """ | |||
|
470 | Parametrized fixture which represents a single backend implementation. | |||
|
471 | ||||
|
472 | It respects the option `--backends` to focus the test run on specific | |||
|
473 | backend implementations. | |||
|
474 | ||||
|
475 | It also supports `pytest.mark.xfail_backends` to mark tests as failing | |||
|
476 | for specific backends. This is intended as a utility for incremental | |||
|
477 | development of a new backend implementation. | |||
|
478 | """ | |||
|
479 | return backend_base(request, backend_alias, baseapp, test_repo) | |||
|
480 | ||||
|
481 | ||||
|
482 | @pytest.fixture | |||
455 | def backend_git(request, baseapp, test_repo): |
|
483 | def backend_git(request, baseapp, test_repo): | |
456 | return backend(request, 'git', baseapp, test_repo) |
|
484 | return backend_base(request, 'git', baseapp, test_repo) | |
457 |
|
485 | |||
458 |
|
486 | |||
459 | @pytest.fixture |
|
487 | @pytest.fixture | |
460 | def backend_hg(request, baseapp, test_repo): |
|
488 | def backend_hg(request, baseapp, test_repo): | |
461 | return backend(request, 'hg', baseapp, test_repo) |
|
489 | return backend_base(request, 'hg', baseapp, test_repo) | |
462 |
|
490 | |||
463 |
|
491 | |||
464 | @pytest.fixture |
|
492 | @pytest.fixture | |
465 | def backend_svn(request, baseapp, test_repo): |
|
493 | def backend_svn(request, baseapp, test_repo): | |
466 | return backend(request, 'svn', baseapp, test_repo) |
|
494 | return backend_base(request, 'svn', baseapp, test_repo) | |
467 |
|
495 | |||
468 |
|
496 | |||
469 | @pytest.fixture |
|
497 | @pytest.fixture | |
@@ -675,17 +703,7 b' class Backend(object):' | |||||
675 | repo.set_refs(ref_name, refs[ref_name]) |
|
703 | repo.set_refs(ref_name, refs[ref_name]) | |
676 |
|
704 | |||
677 |
|
705 | |||
678 | @pytest.fixture |
|
706 | def vcsbackend_base(request, backend_alias, tests_tmp_path, baseapp, test_repo): | |
679 | def vcsbackend(request, backend_alias, tests_tmp_path, baseapp, test_repo): |
|
|||
680 | """ |
|
|||
681 | Parametrized fixture which represents a single vcs backend implementation. |
|
|||
682 |
|
||||
683 | See the fixture `backend` for more details. This one implements the same |
|
|||
684 | concept, but on vcs level. So it does not provide model instances etc. |
|
|||
685 |
|
||||
686 | Parameters are generated dynamically, see :func:`pytest_generate_tests` |
|
|||
687 | for how this works. |
|
|||
688 | """ |
|
|||
689 | if backend_alias not in request.config.getoption('--backends'): |
|
707 | if backend_alias not in request.config.getoption('--backends'): | |
690 | pytest.skip("Backend %s not selected." % (backend_alias, )) |
|
708 | pytest.skip("Backend %s not selected." % (backend_alias, )) | |
691 |
|
709 | |||
@@ -704,31 +722,32 b' def vcsbackend(request, backend_alias, t' | |||||
704 |
|
722 | |||
705 |
|
723 | |||
706 | @pytest.fixture |
|
724 | @pytest.fixture | |
|
725 | def vcsbackend(request, backend_alias, tests_tmp_path, baseapp, test_repo): | |||
|
726 | """ | |||
|
727 | Parametrized fixture which represents a single vcs backend implementation. | |||
|
728 | ||||
|
729 | See the fixture `backend` for more details. This one implements the same | |||
|
730 | concept, but on vcs level. So it does not provide model instances etc. | |||
|
731 | ||||
|
732 | Parameters are generated dynamically, see :func:`pytest_generate_tests` | |||
|
733 | for how this works. | |||
|
734 | """ | |||
|
735 | return vcsbackend_base(request, backend_alias, tests_tmp_path, baseapp, test_repo) | |||
|
736 | ||||
|
737 | ||||
|
738 | @pytest.fixture | |||
707 | def vcsbackend_git(request, tests_tmp_path, baseapp, test_repo): |
|
739 | def vcsbackend_git(request, tests_tmp_path, baseapp, test_repo): | |
708 | return vcsbackend(request, 'git', tests_tmp_path, baseapp, test_repo) |
|
740 | return vcsbackend_base(request, 'git', tests_tmp_path, baseapp, test_repo) | |
709 |
|
741 | |||
710 |
|
742 | |||
711 | @pytest.fixture |
|
743 | @pytest.fixture | |
712 | def vcsbackend_hg(request, tests_tmp_path, baseapp, test_repo): |
|
744 | def vcsbackend_hg(request, tests_tmp_path, baseapp, test_repo): | |
713 | return vcsbackend(request, 'hg', tests_tmp_path, baseapp, test_repo) |
|
745 | return vcsbackend_base(request, 'hg', tests_tmp_path, baseapp, test_repo) | |
714 |
|
746 | |||
715 |
|
747 | |||
716 | @pytest.fixture |
|
748 | @pytest.fixture | |
717 | def vcsbackend_svn(request, tests_tmp_path, baseapp, test_repo): |
|
749 | def vcsbackend_svn(request, tests_tmp_path, baseapp, test_repo): | |
718 | return vcsbackend(request, 'svn', tests_tmp_path, baseapp, test_repo) |
|
750 | return vcsbackend_base(request, 'svn', tests_tmp_path, baseapp, test_repo) | |
719 |
|
||||
720 |
|
||||
721 | @pytest.fixture |
|
|||
722 | def vcsbackend_random(vcsbackend_git): |
|
|||
723 | """ |
|
|||
724 | Use this to express that your tests need "a vcsbackend". |
|
|||
725 |
|
||||
726 | The fixture `vcsbackend` would run the test multiple times for each |
|
|||
727 | available vcs backend which is a pure waste of time if the test is |
|
|||
728 | independent of the vcs backend type. |
|
|||
729 | """ |
|
|||
730 | # TODO: johbo: Change this to pick a random backend |
|
|||
731 | return vcsbackend_git |
|
|||
732 |
|
751 | |||
733 |
|
752 | |||
734 | @pytest.fixture |
|
753 | @pytest.fixture |
@@ -156,7 +156,7 b' def set_anonymous_access(enabled):' | |||||
156 | def check_xfail_backends(node, backend_alias): |
|
156 | def check_xfail_backends(node, backend_alias): | |
157 | # Using "xfail_backends" here intentionally, since this marks work |
|
157 | # Using "xfail_backends" here intentionally, since this marks work | |
158 | # which is "to be done" soon. |
|
158 | # which is "to be done" soon. | |
159 | skip_marker = node.get_marker('xfail_backends') |
|
159 | skip_marker = node.get_closest_marker('xfail_backends') | |
160 | if skip_marker and backend_alias in skip_marker.args: |
|
160 | if skip_marker and backend_alias in skip_marker.args: | |
161 | msg = "Support for backend %s to be developed." % (backend_alias, ) |
|
161 | msg = "Support for backend %s to be developed." % (backend_alias, ) | |
162 | msg = skip_marker.kwargs.get('reason', msg) |
|
162 | msg = skip_marker.kwargs.get('reason', msg) | |
@@ -166,7 +166,7 b' def check_xfail_backends(node, backend_a' | |||||
166 | def check_skip_backends(node, backend_alias): |
|
166 | def check_skip_backends(node, backend_alias): | |
167 | # Using "skip_backends" here intentionally, since this marks work which is |
|
167 | # Using "skip_backends" here intentionally, since this marks work which is | |
168 | # not supported. |
|
168 | # not supported. | |
169 | skip_marker = node.get_marker('skip_backends') |
|
169 | skip_marker = node.get_closest_marker('skip_backends') | |
170 | if skip_marker and backend_alias in skip_marker.args: |
|
170 | if skip_marker and backend_alias in skip_marker.args: | |
171 | msg = "Feature not supported for backend %s." % (backend_alias, ) |
|
171 | msg = "Feature not supported for backend %s." % (backend_alias, ) | |
172 | msg = skip_marker.kwargs.get('reason', msg) |
|
172 | msg = skip_marker.kwargs.get('reason', msg) |
General Comments 0
You need to be logged in to leave comments.
Login now