From 34c075e6f331d146a617417e646170e8847c39e4 Mon Sep 17 00:00:00 2001 From: Paul Kehrer Date: Mon, 13 Jan 2014 21:52:08 -0500 Subject: support --backend as a pytest flag to limit to one backend for testing --- tests/conftest.py | 14 +++++++++++++- tests/test_utils.py | 23 ++++++++++++++++++++++- tests/utils.py | 10 ++++++++++ 3 files changed, 45 insertions(+), 2 deletions(-) (limited to 'tests') diff --git a/tests/conftest.py b/tests/conftest.py index 1d9f96ed..5cc30428 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -5,7 +5,12 @@ from cryptography.hazmat.backends.interfaces import ( HMACBackend, CipherBackend, HashBackend ) -from .utils import check_for_iface, check_backend_support +from .utils import check_for_iface, check_backend_support, modify_backend_list + + +def pytest_generate_tests(metafunc): + name = metafunc.config.getoption("--backend") + modify_backend_list(name, _ALL_BACKENDS) @pytest.fixture(params=_ALL_BACKENDS) @@ -19,3 +24,10 @@ def pytest_runtest_setup(item): check_for_iface("cipher", CipherBackend, item) check_for_iface("hash", HashBackend, item) check_backend_support(item) + + +def pytest_addoption(parser): + parser.addoption( + "--backend", action="store", metavar="NAME", + help="Only run tests matching the backend NAME." + ) diff --git a/tests/test_utils.py b/tests/test_utils.py index e3e53d63..e8037c1d 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -21,7 +21,7 @@ import pytest from .utils import ( load_nist_vectors, load_vectors_from_file, load_cryptrec_vectors, load_openssl_vectors, load_hash_vectors, check_for_iface, - check_backend_support + check_backend_support, modify_backend_list ) @@ -29,6 +29,27 @@ class FakeInterface(object): pass +def test_modify_backend_list_leave_one(): + b1 = pretend.stub(name="b1") + b2 = pretend.stub(name="b2") + b3 = pretend.stub(name="b3") + backends = [b1, b2, b3] + name = "b2" + modify_backend_list(name, backends) + assert len(backends) == 1 + assert backends[0] == b2 + + +def test_modify_backend_list_error_none(): + b1 = pretend.stub(name="b1") + b2 = pretend.stub(name="b2") + b3 = pretend.stub(name="b3") + backends = [b1, b2, b3] + name = "back!" + with pytest.raises(ValueError): + modify_backend_list(name, backends) + + def test_check_for_iface(): item = pretend.stub(keywords=["fake_name"], funcargs={"backend": True}) with pytest.raises(pytest.skip.Exception) as exc_info: diff --git a/tests/utils.py b/tests/utils.py index 693a0c8f..343f3efe 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -16,6 +16,16 @@ import os import pytest +def modify_backend_list(name, all_backends): + if name is not None: + backends = list(all_backends) + for backend in backends: + if backend.name != name: + all_backends.remove(backend) + if len(all_backends) == 0: + raise ValueError("No backends selected for testing") + + def check_for_iface(name, iface, item): if name in item.keywords and "backend" in item.funcargs: if not isinstance(item.funcargs["backend"], iface): -- cgit v1.2.3 From 098579e27f380ce95f620b34984f20342db2395f Mon Sep 17 00:00:00 2001 From: Paul Kehrer Date: Tue, 14 Jan 2014 10:26:44 -0500 Subject: don't mutate _ALL_BACKENDS --- tests/conftest.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'tests') diff --git a/tests/conftest.py b/tests/conftest.py index 5cc30428..86debe7c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -8,12 +8,19 @@ from cryptography.hazmat.backends.interfaces import ( from .utils import check_for_iface, check_backend_support, modify_backend_list +# copy all backends so we can mutate it.This variable is used in generate +# tests to allow us to target a single backend without changing _ALL_BACKENDS + +_UPDATED_BACKENDS = list(_ALL_BACKENDS) + + def pytest_generate_tests(metafunc): + global _UPDATED_BACKENDS name = metafunc.config.getoption("--backend") - modify_backend_list(name, _ALL_BACKENDS) + modify_backend_list(name, _UPDATED_BACKENDS) -@pytest.fixture(params=_ALL_BACKENDS) +@pytest.fixture(params=_UPDATED_BACKENDS) def backend(request): return request.param -- cgit v1.2.3 From 681e7a5587e78918fd15af5255204216d0ea7237 Mon Sep 17 00:00:00 2001 From: Paul Kehrer Date: Tue, 14 Jan 2014 10:48:56 -0500 Subject: better name for the variable --- tests/conftest.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'tests') diff --git a/tests/conftest.py b/tests/conftest.py index 86debe7c..49e178bc 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -10,17 +10,16 @@ from .utils import check_for_iface, check_backend_support, modify_backend_list # copy all backends so we can mutate it.This variable is used in generate # tests to allow us to target a single backend without changing _ALL_BACKENDS - -_UPDATED_BACKENDS = list(_ALL_BACKENDS) +_DESIRED_BACKENDS = list(_ALL_BACKENDS) def pytest_generate_tests(metafunc): - global _UPDATED_BACKENDS + global _DESIRED_BACKENDS name = metafunc.config.getoption("--backend") - modify_backend_list(name, _UPDATED_BACKENDS) + modify_backend_list(name, _DESIRED_BACKENDS) -@pytest.fixture(params=_UPDATED_BACKENDS) +@pytest.fixture(params=_DESIRED_BACKENDS) def backend(request): return request.param -- cgit v1.2.3 From c421e636b15768e1adaf8bf681ecdd12b96c8669 Mon Sep 17 00:00:00 2001 From: Paul Kehrer Date: Sat, 18 Jan 2014 09:22:21 -0600 Subject: modify backend selection to allow multiple backends via comma delimiter --- tests/conftest.py | 12 ++++++------ tests/test_utils.py | 31 ++++++++++++++++++++++++++----- tests/utils.py | 25 +++++++++++++++++-------- 3 files changed, 49 insertions(+), 19 deletions(-) (limited to 'tests') diff --git a/tests/conftest.py b/tests/conftest.py index 49e178bc..b9879f86 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -5,21 +5,21 @@ from cryptography.hazmat.backends.interfaces import ( HMACBackend, CipherBackend, HashBackend ) -from .utils import check_for_iface, check_backend_support, modify_backend_list +from .utils import check_for_iface, check_backend_support, select_backends # copy all backends so we can mutate it.This variable is used in generate # tests to allow us to target a single backend without changing _ALL_BACKENDS -_DESIRED_BACKENDS = list(_ALL_BACKENDS) +_SELECTED_BACKENDS = list(_ALL_BACKENDS) def pytest_generate_tests(metafunc): - global _DESIRED_BACKENDS - name = metafunc.config.getoption("--backend") - modify_backend_list(name, _DESIRED_BACKENDS) + global _SELECTED_BACKENDS + names = metafunc.config.getoption("--backend") + _SELECTED_BACKENDS = select_backends(names, _SELECTED_BACKENDS) -@pytest.fixture(params=_DESIRED_BACKENDS) +@pytest.fixture(params=_SELECTED_BACKENDS) def backend(request): return request.param diff --git a/tests/test_utils.py b/tests/test_utils.py index e8037c1d..a7da4906 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -21,7 +21,7 @@ import pytest from .utils import ( load_nist_vectors, load_vectors_from_file, load_cryptrec_vectors, load_openssl_vectors, load_hash_vectors, check_for_iface, - check_backend_support, modify_backend_list + check_backend_support, select_backends ) @@ -29,25 +29,46 @@ class FakeInterface(object): pass -def test_modify_backend_list_leave_one(): +def test_select_one_backend(): b1 = pretend.stub(name="b1") b2 = pretend.stub(name="b2") b3 = pretend.stub(name="b3") backends = [b1, b2, b3] name = "b2" - modify_backend_list(name, backends) + select_backends(name, backends) assert len(backends) == 1 assert backends[0] == b2 -def test_modify_backend_list_error_none(): +def test_select_no_backend(): b1 = pretend.stub(name="b1") b2 = pretend.stub(name="b2") b3 = pretend.stub(name="b3") backends = [b1, b2, b3] name = "back!" with pytest.raises(ValueError): - modify_backend_list(name, backends) + select_backends(name, backends) + + +def test_select_backends_none(): + b1 = pretend.stub(name="b1") + b2 = pretend.stub(name="b2") + b3 = pretend.stub(name="b3") + backends = [b1, b2, b3] + name = None + select_backends(name, backends) + assert len(backends) == 3 + + +def test_select_two_backends(): + b1 = pretend.stub(name="b1") + b2 = pretend.stub(name="b2") + b3 = pretend.stub(name="b3") + backends = [b1, b2, b3] + name = "b2 ,b1 " + select_backends(name, backends) + assert len(backends) == 2 + assert backends == [b1, b2] def test_check_for_iface(): diff --git a/tests/utils.py b/tests/utils.py index 343f3efe..ee1675e8 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -16,14 +16,23 @@ import os import pytest -def modify_backend_list(name, all_backends): - if name is not None: - backends = list(all_backends) - for backend in backends: - if backend.name != name: - all_backends.remove(backend) - if len(all_backends) == 0: - raise ValueError("No backends selected for testing") +def select_backends(names, backend_list): + if names is None: + return backend_list + split_names = [x.strip() for x in names.split(',')] + # this must be duplicated and then removed to preserve the metadata + # pytest associates. Appending backends to a new list doesn't seem to work + backends = list(backend_list) + for backend in backends: + if backend.name not in split_names: + backend_list.remove(backend) + + if len(backend_list) > 0: + return backend_list + else: + raise ValueError( + "No backend selected. Tried to select: {0}".format(split_names) + ) def check_for_iface(name, iface, item): -- cgit v1.2.3 From aed9e17b6080d540ba5b5aab5e3096581a4bbd13 Mon Sep 17 00:00:00 2001 From: Paul Kehrer Date: Sun, 19 Jan 2014 12:09:27 -0600 Subject: revert fixture decorator for now, switch to append. no more globals --- tests/conftest.py | 14 +++----------- tests/test_utils.py | 16 ++++++++-------- tests/utils.py | 12 ++++++------ 3 files changed, 17 insertions(+), 25 deletions(-) (limited to 'tests') diff --git a/tests/conftest.py b/tests/conftest.py index b9879f86..a9acb54a 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -8,20 +8,12 @@ from cryptography.hazmat.backends.interfaces import ( from .utils import check_for_iface, check_backend_support, select_backends -# copy all backends so we can mutate it.This variable is used in generate -# tests to allow us to target a single backend without changing _ALL_BACKENDS -_SELECTED_BACKENDS = list(_ALL_BACKENDS) - - def pytest_generate_tests(metafunc): - global _SELECTED_BACKENDS names = metafunc.config.getoption("--backend") - _SELECTED_BACKENDS = select_backends(names, _SELECTED_BACKENDS) - + selected_backends = select_backends(names, _ALL_BACKENDS) -@pytest.fixture(params=_SELECTED_BACKENDS) -def backend(request): - return request.param + if "backend" in metafunc.fixturenames: + metafunc.parametrize("backend", selected_backends) @pytest.mark.trylast diff --git a/tests/test_utils.py b/tests/test_utils.py index a7da4906..f852f3ab 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -35,9 +35,9 @@ def test_select_one_backend(): b3 = pretend.stub(name="b3") backends = [b1, b2, b3] name = "b2" - select_backends(name, backends) - assert len(backends) == 1 - assert backends[0] == b2 + selected_backends = select_backends(name, backends) + assert len(selected_backends) == 1 + assert selected_backends[0] == b2 def test_select_no_backend(): @@ -56,8 +56,8 @@ def test_select_backends_none(): b3 = pretend.stub(name="b3") backends = [b1, b2, b3] name = None - select_backends(name, backends) - assert len(backends) == 3 + selected_backends = select_backends(name, backends) + assert len(selected_backends) == 3 def test_select_two_backends(): @@ -66,9 +66,9 @@ def test_select_two_backends(): b3 = pretend.stub(name="b3") backends = [b1, b2, b3] name = "b2 ,b1 " - select_backends(name, backends) - assert len(backends) == 2 - assert backends == [b1, b2] + selected_backends = select_backends(name, backends) + assert len(selected_backends) == 2 + assert selected_backends == [b1, b2] def test_check_for_iface(): diff --git a/tests/utils.py b/tests/utils.py index ee1675e8..a2432256 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -22,13 +22,13 @@ def select_backends(names, backend_list): split_names = [x.strip() for x in names.split(',')] # this must be duplicated and then removed to preserve the metadata # pytest associates. Appending backends to a new list doesn't seem to work - backends = list(backend_list) - for backend in backends: - if backend.name not in split_names: - backend_list.remove(backend) + selected_backends = [] + for backend in backend_list: + if backend.name in split_names: + selected_backends.append(backend) - if len(backend_list) > 0: - return backend_list + if len(selected_backends) > 0: + return selected_backends else: raise ValueError( "No backend selected. Tried to select: {0}".format(split_names) -- cgit v1.2.3