diff --git a/configure.ac b/configure.ac index d7e7a1134..ae950a4d6 100644 --- a/configure.ac +++ b/configure.ac @@ -1345,6 +1345,7 @@ if test x$python_eggs = xtrue; then else AC_SUBST(PYTHONEGGINSTALLDIR, "--install-dir $pythoneggdir") fi + AC_PATH_PROG([TOX], [tox], [], [$PATH:/bin:/usr/bin:/usr/local/bin]) AC_PATH_PROG([PY_TEST], [py.test], [], [$PATH:/bin:/usr/bin:/usr/local/bin]) fi AM_CONDITIONAL(PYTHON_EGGS_INSTALL, [test "x$python_eggs_install" = xtrue]) @@ -1764,7 +1765,8 @@ AM_CONDITIONAL(USE_LEGACY_SYSTEMD, test -n "$systemdsystemunitdir" -a "x$systemd AM_CONDITIONAL(USE_RUBY_GEMS, test x$ruby_gems = xtrue) AM_CONDITIONAL(USE_PYTHON_EGGS, test x$python_eggs = xtrue) AM_CONDITIONAL(USE_PERL_CPAN, test x$perl_cpan = xtrue) -AM_CONDITIONAL(USE_PY_TEST, test "x$PY_TEST" != x) +AM_CONDITIONAL(USE_TOX, test "x$TOX" != x) +AM_CONDITIONAL(USE_PY_TEST, test "x$PY_TEST" != x -a "x$TOX" = x) # ======================== # set global definitions diff --git a/scripts/test.sh b/scripts/test.sh index b343056d9..b56bebec5 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -157,7 +157,7 @@ all|coverage|sonarcloud) libmysqlclient-dev libsqlite3-dev clearsilver-dev libfcgi-dev libpcsclite-dev libpam0g-dev binutils-dev libunwind8-dev libnm-dev libjson-c-dev iptables-dev python-pip libtspi-dev libsystemd-dev" - PYDEPS="pytest" + PYDEPS="tox" if test "$1" = "deps"; then build_botan build_wolfssl diff --git a/src/libcharon/plugins/vici/python/.gitignore b/src/libcharon/plugins/vici/python/.gitignore index 5c4589841..d4813d691 100644 --- a/src/libcharon/plugins/vici/python/.gitignore +++ b/src/libcharon/plugins/vici/python/.gitignore @@ -1,3 +1,4 @@ +.tox *.pyc build dist diff --git a/src/libcharon/plugins/vici/python/MANIFEST.in b/src/libcharon/plugins/vici/python/MANIFEST.in index 9d5d250d0..883ea5d52 100644 --- a/src/libcharon/plugins/vici/python/MANIFEST.in +++ b/src/libcharon/plugins/vici/python/MANIFEST.in @@ -1,2 +1,4 @@ include LICENSE include README.rst +include tox.ini +recursive-include test *.py diff --git a/src/libcharon/plugins/vici/python/Makefile.am b/src/libcharon/plugins/vici/python/Makefile.am index 14b5eb29c..a2e7596e4 100644 --- a/src/libcharon/plugins/vici/python/Makefile.am +++ b/src/libcharon/plugins/vici/python/Makefile.am @@ -1,7 +1,9 @@ EXTRA_DIST = LICENSE README.rst MANIFEST.in \ setup.py.in \ - vici/test/__init__.py \ - vici/test/test_protocol.py \ + tox.ini \ + tox.sh \ + test/__init__.py \ + test/test_protocol.py \ vici/__init__.py \ vici/command_wrappers.py \ vici/compat.py \ @@ -37,6 +39,12 @@ install-exec-local: dist/vici-$(PYTHON_PACKAGE_VERSION)-py$(PYTHON_VERSION).egg dist/vici-$(PYTHON_PACKAGE_VERSION)-py$(PYTHON_VERSION).egg endif +if USE_TOX + TESTS_ENVIRONMENT = export TOX=$(TOX); + AM_TESTS_FD_REDIRECT = 1>&2 + TESTS = tox.sh +endif + if USE_PY_TEST TESTS = $(PY_TEST) endif diff --git a/src/libcharon/plugins/vici/python/setup.py.in b/src/libcharon/plugins/vici/python/setup.py.in index 62b0c5899..9ef0011d8 100644 --- a/src/libcharon/plugins/vici/python/setup.py.in +++ b/src/libcharon/plugins/vici/python/setup.py.in @@ -24,6 +24,10 @@ setup( "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", + "Programming Language :: Python :: 3.5", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", "Topic :: Security", "Topic :: Software Development :: Libraries", ) diff --git a/src/libcharon/plugins/vici/python/vici/test/__init__.py b/src/libcharon/plugins/vici/python/test/__init__.py similarity index 100% rename from src/libcharon/plugins/vici/python/vici/test/__init__.py rename to src/libcharon/plugins/vici/python/test/__init__.py diff --git a/src/libcharon/plugins/vici/python/vici/test/test_protocol.py b/src/libcharon/plugins/vici/python/test/test_protocol.py similarity index 91% rename from src/libcharon/plugins/vici/python/vici/test/test_protocol.py rename to src/libcharon/plugins/vici/python/test/test_protocol.py index a1f202d79..1924884a1 100644 --- a/src/libcharon/plugins/vici/python/vici/test/test_protocol.py +++ b/src/libcharon/plugins/vici/python/test/test_protocol.py @@ -1,7 +1,7 @@ import pytest -from ..protocol import Packet, Message, FiniteStream -from ..exception import DeserializationException +from vici.protocol import Packet, Message, FiniteStream +from vici.exception import DeserializationException class TestPacket(object): @@ -70,17 +70,17 @@ class TestMessage(object): ser_kv_zero = b"\x03\x0azerolength\x00\x00" # deserialized messages holding a section - des_sec_single = { "section": {} } - des_sec_nested = { "outer": { "subsection": {} } } + des_sec_single = {"section": {}} + des_sec_nested = {"outer": {"subsection": {}}} # deserialized messages holding a list - des_list_0_item = { "empty": [] } - des_list_1_item = { "l": [ b"e1" ] } - des_list_2_item = { "l": [ b"e1", b"e2" ] } + des_list_0_item = {"empty": []} + des_list_1_item = {"l": [b"e1"]} + des_list_2_item = {"l": [b"e1", b"e2"]} # deserialized messages with key value pairs - des_kv_pair = { "key": b"value" } - des_kv_zero = { "zerolength": b"" } + des_kv_pair = {"key": b"value"} + des_kv_zero = {"zerolength": b""} def test_section_serialization(self): assert Message.serialize(self.des_sec_single) == self.ser_sec_single @@ -131,7 +131,7 @@ class TestMessage(object): "sub-section": { "key2": b"value2", }, - "list1": [ "item1", "item2" ], + "list1": ["item1", "item2"], }, } serialized_message = FiniteStream(Message.serialize(message)) @@ -141,4 +141,4 @@ class TestMessage(object): deserialized_section = deserialized_message["section1"] assert deserialized_message["key1"] == b"value1" assert deserialized_section["sub-section"]["key2"] == b"value2" - assert deserialized_section["list1"] == [ b"item1", b"item2" ] + assert deserialized_section["list1"] == [b"item1", b"item2"] diff --git a/src/libcharon/plugins/vici/python/tox.ini b/src/libcharon/plugins/vici/python/tox.ini new file mode 100644 index 000000000..8a57cfd64 --- /dev/null +++ b/src/libcharon/plugins/vici/python/tox.ini @@ -0,0 +1,16 @@ +[tox] +envlist = py27, py35, py36, py37, py38 + +[testenv] +deps = + pytest + pytest-pycodestyle +commands = pytest --pycodestyle + +[testenv:py27] +deps = pytest +commands = pytest + +[pycodestyle] +max-line-length = 80 +show-source = True diff --git a/src/libcharon/plugins/vici/python/tox.sh b/src/libcharon/plugins/vici/python/tox.sh new file mode 100755 index 000000000..1a4f786ea --- /dev/null +++ b/src/libcharon/plugins/vici/python/tox.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +${TOX} -c ${srcdir} --skip-missing-interpreters diff --git a/src/libcharon/plugins/vici/python/vici/command_wrappers.py b/src/libcharon/plugins/vici/python/vici/command_wrappers.py index 8a0aa25c5..a2e8fa932 100644 --- a/src/libcharon/plugins/vici/python/vici/command_wrappers.py +++ b/src/libcharon/plugins/vici/python/vici/command_wrappers.py @@ -232,7 +232,6 @@ class CommandWrappers(object): """ self.request("load-shared", secret) - def unload_shared(self, identifier): """Unload a previously loaded shared secret by its unique identifier.