diff --git a/testcases/mount/conftest.py b/testcases/mount/conftest.py new file mode 100644 index 0000000..9afc069 --- /dev/null +++ b/testcases/mount/conftest.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 + +import pytest +import os +import shutil +import testhelper +import typing +from pathlib import Path + +test_info_file = os.getenv("TEST_INFO_FILE") +test_info = testhelper.read_yaml(test_info_file) + + +@pytest.fixture +def setup_mount( + first_ipaddr: str, share_name: str +) -> typing.Generator[Path, None, None]: + flag_mounted: bool = False + tmp_root = testhelper.get_tmp_root() + mount_point = testhelper.get_tmp_mount_point(tmp_root) + try: + mount_params = testhelper.get_mount_parameters( + testhelper.read_yaml(test_info_file), share_name + ) + mount_params["host"] = first_ipaddr + + # mount cifs share + testhelper.cifs_mount(mount_params, mount_point) + flag_mounted = True + test_dir = mount_point / "mount_test" + test_dir.mkdir() + except Exception as e: + raise Exception(f"Setup failed: {str(e)}") + + # Yield the setup result + yield test_dir + + # Perform teardown after the test has run + try: + if flag_mounted and test_dir: + shutil.rmtree(test_dir, ignore_errors=True) + testhelper.cifs_umount(mount_point) + mount_point.rmdir() + tmp_root.rmdir() + except Exception as e: + raise Exception(f"Teardown failed: {str(e)}") + + +def generate_mount_check() -> typing.List[typing.Tuple[str, str]]: + first_ipaddr = test_info["public_interfaces"][0] + exported_sharenames = test_info.get("exported_sharenames", []) + arr = [] + for share_name in exported_sharenames: + arr.append((first_ipaddr, share_name)) + return arr diff --git a/testcases/mount/test_mount.py b/testcases/mount/test_mount.py deleted file mode 100755 index 6be7a9d..0000000 --- a/testcases/mount/test_mount.py +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env python3 - -# Test mounts a cifs share, creates a new file on it, writes to it, -# deletes the file and unmounts - -import testhelper -import os -import pytest -import typing -import shutil -from pathlib import Path - -from .mount_io import check_io_consistency -from .mount_dbm import check_dbm_consistency -from .mount_stress import check_mnt_stress - -test_info_file = os.getenv("TEST_INFO_FILE") -test_info = testhelper.read_yaml(test_info_file) - - -def mount_check_mounted(mount_point: Path) -> None: - try: - test_dir = mount_point / "mount_test" - test_dir.mkdir() - check_io_consistency(test_dir) - check_dbm_consistency(test_dir) - check_mnt_stress(test_dir) - finally: - shutil.rmtree(test_dir, ignore_errors=True) - - -def mount_check(ipaddr: str, share_name: str) -> None: - mount_params = testhelper.get_mount_parameters(test_info, share_name) - mount_params["host"] = ipaddr - tmp_root = testhelper.get_tmp_root() - mount_point = testhelper.get_tmp_mount_point(tmp_root) - flag_mounted = False - try: - testhelper.cifs_mount(mount_params, mount_point) - flag_mounted = True - mount_check_mounted(Path(mount_point)) - finally: - if flag_mounted: - testhelper.cifs_umount(mount_point) - os.rmdir(mount_point) - os.rmdir(tmp_root) - - -def generate_mount_check() -> typing.List[typing.Tuple[str, str]]: - public_interfaces = test_info.get("public_interfaces", []) - exported_sharenames = test_info.get("exported_sharenames", []) - arr = [] - for ipaddr in public_interfaces: - for share_name in exported_sharenames: - arr.append((ipaddr, share_name)) - return arr - - -@pytest.mark.parametrize("ipaddr,share_name", generate_mount_check()) -def test_mount(ipaddr: str, share_name: str) -> None: - mount_check(ipaddr, share_name) - - -def generate_mount_check_premounted() -> typing.List[Path]: - return testhelper.get_premounted_shares(test_info) - - -@pytest.mark.parametrize("test_dir", generate_mount_check_premounted()) -def test_mount_premounted(test_dir: Path) -> None: - mount_check_mounted(test_dir) diff --git a/testcases/mount/mount_dbm.py b/testcases/mount/test_mount_dbm.py old mode 100644 new mode 100755 similarity index 92% rename from testcases/mount/mount_dbm.py rename to testcases/mount/test_mount_dbm.py index f61fb72..8e21e14 --- a/testcases/mount/mount_dbm.py +++ b/testcases/mount/test_mount_dbm.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 # Test various database operations via SMB mount-point. +import pytest import dbm import hashlib import pickle @@ -8,6 +9,7 @@ import typing import random from pathlib import Path +from .conftest import generate_mount_check class Record: @@ -89,8 +91,9 @@ def _check_dbm_consistency(base: Path, nrecs: int) -> None: db.destroy() -def check_dbm_consistency(rootdir: Path) -> None: - base = rootdir / "dbm-consistency" +@pytest.mark.parametrize("first_ipaddr,share_name", generate_mount_check()) +def test_dbm_consistency(setup_mount: Path) -> None: + base = setup_mount / "dbm-consistency" base.mkdir(parents=True, exist_ok=True) try: _check_dbm_consistency(base, 10) diff --git a/testcases/mount/mount_io.py b/testcases/mount/test_mount_io.py old mode 100644 new mode 100755 similarity index 91% rename from testcases/mount/mount_io.py rename to testcases/mount/test_mount_io.py index f9789bf..3bbab8e --- a/testcases/mount/mount_io.py +++ b/testcases/mount/test_mount_io.py @@ -2,12 +2,14 @@ # Test various file-system I/O operations via local SMB mount-point. +import pytest import datetime import shutil import typing import testhelper import random from pathlib import Path +from .conftest import generate_mount_check class DataPath: @@ -99,11 +101,11 @@ def _run_checks(dsets: typing.List[DataPath]) -> None: dset.verify_noent() -def _check_io_consistency(rootdir: Path) -> None: +def _check_io_consistency(test_dir: Path) -> None: base = None try: print("\n") - base = rootdir / "test_io_consistency" + base = test_dir / "test_io_consistency" base.mkdir(parents=True) # Case-1: single 4K file _run_checks(_make_datasets(base, 4096, 1)) @@ -127,6 +129,7 @@ def _reset_random_seed() -> None: random.seed(seed) -def check_io_consistency(rootdir: Path) -> None: +@pytest.mark.parametrize("first_ipaddr,share_name", generate_mount_check()) +def test_check_io_consistency(setup_mount: Path) -> None: _reset_random_seed() - _check_io_consistency(rootdir) + _check_io_consistency(setup_mount) diff --git a/testcases/mount/mount_stress.py b/testcases/mount/test_mount_stress.py old mode 100644 new mode 100755 similarity index 71% rename from testcases/mount/mount_stress.py rename to testcases/mount/test_mount_stress.py index fb4acf5..cbc8c7c --- a/testcases/mount/mount_stress.py +++ b/testcases/mount/test_mount_stress.py @@ -1,6 +1,8 @@ +import pytest import threading import testhelper from pathlib import Path +from .conftest import generate_mount_check def _perform_file_operations( @@ -43,14 +45,17 @@ def _stress_test( print("Stress test complete.") -def check_mnt_stress(root_dir: Path) -> None: - _stress_test(root_dir, num_clients=5, num_operations=20, file_size=2**22) +@pytest.mark.parametrize("first_ipaddr,share_name", generate_mount_check()) +def test_check_mnt_stress(setup_mount: Path) -> None: _stress_test( - root_dir, num_clients=10, num_operations=30, file_size=2**23 + setup_mount, num_clients=5, num_operations=20, file_size=2**22 ) _stress_test( - root_dir, num_clients=20, num_operations=40, file_size=2**24 + setup_mount, num_clients=10, num_operations=30, file_size=2**23 ) _stress_test( - root_dir, num_clients=15, num_operations=25, file_size=2**25 + setup_mount, num_clients=20, num_operations=40, file_size=2**24 + ) + _stress_test( + setup_mount, num_clients=15, num_operations=25, file_size=2**25 )