diff --git a/.github/workflows/nosetests.yml b/.github/workflows/nosetests.yml index e4ace9d6..342c4ff9 100644 --- a/.github/workflows/nosetests.yml +++ b/.github/workflows/nosetests.yml @@ -1,4 +1,4 @@ -name: ClusterShell nosetests +name: ClusterShell tests on: [push, pull_request, merge_group] @@ -21,27 +21,36 @@ jobs: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | + set -euxo pipefail python -m pip install --upgrade pip - pip install coverage nose-py3 . + pip install coverage . - name: Allow us to SSH passwordless to localhost run: | + set -euxo pipefail chmod og-rw ~ ssh-keygen -f ~/.ssh/id_rsa -N "" cp ~/.ssh/{id_rsa.pub,authorized_keys} - name: Avoid ssh "known hosts" warnings run: | + set -euxo pipefail printf '%s\n %s\n %s\n' 'Host *' 'StrictHostKeyChecking no' 'LogLevel ERROR' >> ~/.ssh/config - name: Set Python paths when sshing for gateway tests run: | + set -euxo pipefail + PYTHON_SITE_PACKAGES=$(python -c "import site; print(site.getsitepackages()[0])") sed -i "1iexport CLUSTERSHELL_GW_PYTHON_EXECUTABLE=$(which python)" ~/.bashrc - sed -i "2iexport PYTHONPATH=\$PYTHONPATH:$(realpath $pythonLocation/lib/python*/site-packages)" ~/.bashrc - head -2 ~/.bashrc + sed -i "2iexport PYTHONPATH=\$PYTHONPATH:$PYTHON_SITE_PACKAGES" ~/.bashrc + head -3 ~/.bashrc + ssh 127.0.0.2 'python -c "import ClusterShell; print(ClusterShell.__file__)"' - name: Install pdsh to test WorkerPdsh run: | + set -euxo pipefail + sudo apt-get update sudo apt-get -y install pdsh sudo sh -c 'echo ssh > /etc/pdsh/rcmd_default' - name: Add tests/bin to remote PATH run: | + set -euxo pipefail sed -i "1iexport PATH=$PWD/tests/bin:\$PATH" ~/.bashrc head -1 ~/.bashrc ssh 127.0.0.2 which hostname @@ -78,9 +87,11 @@ jobs: - name: Run tests id: tests run: | + set -euxo pipefail python --version export CLUSTERSHELL_GW_PYTHON_EXECUTABLE=$(which python) - nosetests -v --all-modules --with-coverage --cover-tests --cover-erase --cover-package=ClusterShell tests + coverage run --branch --source=ClusterShell -m unittest discover -v -s tests -p '*Test.py' -t . + coverage report -m - name: Post to Slack (end) if: always() continue-on-error: true diff --git a/tests/CLIClubakTest.py b/tests/CLIClubakTest.py index 7767f4a2..ca30b113 100644 --- a/tests/CLIClubakTest.py +++ b/tests/CLIClubakTest.py @@ -7,7 +7,7 @@ from textwrap import dedent import unittest -from TLib import * +from .TLib import * from ClusterShell.CLI.Clubak import main from ClusterShell.NodeSet import set_std_group_resolver, \ diff --git a/tests/CLIClushTest.py b/tests/CLIClushTest.py index 87d40c70..6840a1c4 100644 --- a/tests/CLIClushTest.py +++ b/tests/CLIClushTest.py @@ -20,7 +20,7 @@ from subprocess import Popen, PIPE -from TLib import * +from .TLib import * import ClusterShell.CLI.Clush from ClusterShell.CLI.Clush import main from ClusterShell.NodeSet import NodeSet @@ -443,10 +443,11 @@ def test_027_warn_shell_globbing_nodes(self): curdir = os.getcwd() try: os.chdir(tdir.name) - s = "Warning: using '-w %s' and local path '%s' exists, was it " \ - "expanded by the shell?\n" % (HOSTNAME, HOSTNAME) + s = b"Warning: using '-w %s' and local path '%s' exists, was it " \ + b"expanded by the shell?\n" % (HOSTNAME.encode(), HOSTNAME.encode()) + # Use regex to match start of stderr, allowing for additional warnings self._clush_t(["-w", HOSTNAME, "echo", "ok"], None, - self.output_ok, 0, s.encode()) + self.output_ok, 0, re.compile(re.escape(s))) finally: os.chdir(curdir) tfile.close() diff --git a/tests/CLIConfigTest.py b/tests/CLIConfigTest.py index 05c47fdd..40b7dab7 100644 --- a/tests/CLIConfigTest.py +++ b/tests/CLIConfigTest.py @@ -10,7 +10,7 @@ from textwrap import dedent import unittest -from TLib import * +from .TLib import * from ClusterShell.CLI.Clush import set_fdlimit from ClusterShell.CLI.Config import ClushConfig, ClushConfigError diff --git a/tests/CLINodesetTest.py b/tests/CLINodesetTest.py index 4d2bb872..06fb4069 100644 --- a/tests/CLINodesetTest.py +++ b/tests/CLINodesetTest.py @@ -8,7 +8,7 @@ from textwrap import dedent import unittest -from TLib import * +from .TLib import * from ClusterShell.CLI.Nodeset import main from ClusterShell.NodeUtils import GroupResolverConfig diff --git a/tests/DefaultsTest.py b/tests/DefaultsTest.py index f364e9fb..2890787a 100644 --- a/tests/DefaultsTest.py +++ b/tests/DefaultsTest.py @@ -10,7 +10,7 @@ from textwrap import dedent import unittest -from TLib import make_temp_file, make_temp_dir +from .TLib import make_temp_file, make_temp_dir from ClusterShell.Defaults import Defaults, _task_print_debug diff --git a/tests/MisusageTest.py b/tests/MisusageTest.py index e8cf9764..671a1b91 100644 --- a/tests/MisusageTest.py +++ b/tests/MisusageTest.py @@ -5,7 +5,7 @@ import unittest -from TLib import HOSTNAME +from .TLib import HOSTNAME from ClusterShell.Event import EventHandler from ClusterShell.Worker.Popen import WorkerPopen from ClusterShell.Worker.Ssh import WorkerSsh diff --git a/tests/NodeSetGroupTest.py b/tests/NodeSetGroupTest.py index 53a83ddc..85fa3136 100644 --- a/tests/NodeSetGroupTest.py +++ b/tests/NodeSetGroupTest.py @@ -8,7 +8,7 @@ from textwrap import dedent import unittest -from TLib import * +from .TLib import * # Wildcard import for testing purpose from ClusterShell.NodeSet import * diff --git a/tests/TaskDistantMixin.py b/tests/TaskDistantMixin.py index 5b19e408..3d86f944 100644 --- a/tests/TaskDistantMixin.py +++ b/tests/TaskDistantMixin.py @@ -7,7 +7,7 @@ import unittest import warnings -from TLib import HOSTNAME, make_temp_filename, make_temp_dir +from .TLib import HOSTNAME, make_temp_filename, make_temp_dir from ClusterShell.Event import EventHandler from ClusterShell.Task import * from ClusterShell.Worker.Ssh import WorkerSsh diff --git a/tests/TaskDistantPdshMixin.py b/tests/TaskDistantPdshMixin.py index 8cd837e0..f0897fa7 100644 --- a/tests/TaskDistantPdshMixin.py +++ b/tests/TaskDistantPdshMixin.py @@ -3,7 +3,7 @@ """Unit test for ClusterShell Task (distant, pdsh worker)""" -from TLib import HOSTNAME, make_temp_filename, make_temp_dir +from .TLib import HOSTNAME, make_temp_filename, make_temp_dir from ClusterShell.Event import EventHandler from ClusterShell.Task import * from ClusterShell.Worker.Worker import WorkerBadArgumentError diff --git a/tests/TaskDistantPdshTest.py b/tests/TaskDistantPdshTest.py index 85f55684..1b5d57b6 100644 --- a/tests/TaskDistantPdshTest.py +++ b/tests/TaskDistantPdshTest.py @@ -11,7 +11,7 @@ from ClusterShell.Engine.EPoll import EngineEPoll from ClusterShell.Task import * -from TaskDistantPdshMixin import TaskDistantPdshMixin +from .TaskDistantPdshMixin import TaskDistantPdshMixin ENGINE_SELECT_ID = EngineSelect.identifier ENGINE_POLL_ID = EnginePoll.identifier diff --git a/tests/TaskDistantTest.py b/tests/TaskDistantTest.py index 3eef8679..254c037a 100644 --- a/tests/TaskDistantTest.py +++ b/tests/TaskDistantTest.py @@ -11,7 +11,7 @@ from ClusterShell.Engine.EPoll import EngineEPoll from ClusterShell.Task import * -from TaskDistantMixin import TaskDistantMixin +from .TaskDistantMixin import TaskDistantMixin ENGINE_SELECT_ID = EngineSelect.identifier ENGINE_POLL_ID = EnginePoll.identifier diff --git a/tests/TaskLocalTest.py b/tests/TaskLocalTest.py index ddbe79e2..549b1a79 100644 --- a/tests/TaskLocalTest.py +++ b/tests/TaskLocalTest.py @@ -11,7 +11,7 @@ from ClusterShell.Engine.EPoll import EngineEPoll from ClusterShell.Task import * -from TaskLocalMixin import TaskLocalMixin +from .TaskLocalMixin import TaskLocalMixin ENGINE_SELECT_ID = EngineSelect.identifier ENGINE_POLL_ID = EnginePoll.identifier diff --git a/tests/TaskRLimitsTest.py b/tests/TaskRLimitsTest.py index 45b377bf..ddfcea58 100644 --- a/tests/TaskRLimitsTest.py +++ b/tests/TaskRLimitsTest.py @@ -6,7 +6,7 @@ import resource import unittest -from TLib import HOSTNAME +from .TLib import HOSTNAME from ClusterShell.Task import * from ClusterShell.Worker.Pdsh import WorkerPdsh diff --git a/tests/TaskTimerTest.py b/tests/TaskTimerTest.py index c35b9bfc..84c8e1ed 100644 --- a/tests/TaskTimerTest.py +++ b/tests/TaskTimerTest.py @@ -8,7 +8,7 @@ from time import sleep, time import unittest -from TLib import HOSTNAME +from .TLib import HOSTNAME from ClusterShell.Engine.Engine import EngineTimer, EngineIllegalOperationError from ClusterShell.Event import EventHandler from ClusterShell.Task import * diff --git a/tests/TreeGatewayTest.py b/tests/TreeGatewayTest.py index ef97846b..626524ac 100644 --- a/tests/TreeGatewayTest.py +++ b/tests/TreeGatewayTest.py @@ -19,7 +19,7 @@ from ClusterShell.Worker.Tree import TreeWorker from ClusterShell.Worker.Worker import StreamWorker -from TLib import HOSTNAME +from .TLib import HOSTNAME # live logging with nosetests --nologcapture logging.basicConfig(level=logging.DEBUG) diff --git a/tests/TreeTaskTest.py b/tests/TreeTaskTest.py index f224ad4a..d36ad01b 100644 --- a/tests/TreeTaskTest.py +++ b/tests/TreeTaskTest.py @@ -11,7 +11,7 @@ from ClusterShell.Task import task_self from ClusterShell.Topology import TopologyError -from TLib import HOSTNAME, make_temp_file +from .TLib import HOSTNAME, make_temp_file # live logging with nosetests --nologcapture logging.basicConfig(level=logging.DEBUG) diff --git a/tests/TreeTopologyTest.py b/tests/TreeTopologyTest.py index 94a334bb..cd2aaae6 100644 --- a/tests/TreeTopologyTest.py +++ b/tests/TreeTopologyTest.py @@ -16,7 +16,7 @@ from ClusterShell.NodeSet import NodeSet, set_std_group_resolver from ClusterShell.NodeSet import set_std_group_resolver_config from ClusterShell.NodeUtils import GroupResolverConfig -from TLib import make_temp_file +from .TLib import make_temp_file class TopologyTest(unittest.TestCase): diff --git a/tests/TreeWorkerTest.py b/tests/TreeWorkerTest.py index cb10ab56..9cd30966 100644 --- a/tests/TreeWorkerTest.py +++ b/tests/TreeWorkerTest.py @@ -28,7 +28,7 @@ from ClusterShell.Topology import TopologyGraph from ClusterShell.Worker.Tree import TreeWorker, WorkerTree -from TLib import HOSTNAME, make_temp_dir, make_temp_file, make_temp_filename +from .TLib import HOSTNAME, make_temp_dir, make_temp_file, make_temp_filename NODE_HEAD = HOSTNAME diff --git a/tests/WorkerExecTest.py b/tests/WorkerExecTest.py index d1bd0b8b..fe20bc2c 100644 --- a/tests/WorkerExecTest.py +++ b/tests/WorkerExecTest.py @@ -6,7 +6,7 @@ import os import unittest -from TLib import HOSTNAME, make_temp_file, make_temp_filename, make_temp_dir +from .TLib import HOSTNAME, make_temp_file, make_temp_filename, make_temp_dir from ClusterShell.Event import EventHandler from ClusterShell.Worker.Exec import ExecWorker, WorkerError diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 00000000..e69de29b