diff --git a/test-info.yml.example b/test-info.yml.example index e84c89c..3d119fe 100644 --- a/test-info.yml.example +++ b/test-info.yml.example @@ -17,4 +17,4 @@ test_backend: glusterfs premounted_shares: - "/testdir1" - - "/testdir2" \ No newline at end of file + - "/testdir2" diff --git a/testcases/mount/conftest.py b/testcases/mount/conftest.py new file mode 100644 index 0000000..3148404 --- /dev/null +++ b/testcases/mount/conftest.py @@ -0,0 +1,57 @@ +#!/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( + 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(test_info, share_name) + mount_params["host"] = 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]]: + ipaddr = test_info["public_interfaces"][0] + exported_sharenames = test_info.get("exported_sharenames", []) + arr = [] + for share_name in exported_sharenames: + arr.append((ipaddr, share_name)) + return arr + + +def generate_mount_check_premounted() -> typing.List[Path]: + return testhelper.get_premounted_shares(test_info) 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 75% rename from testcases/mount/mount_dbm.py rename to testcases/mount/test_mount_dbm.py index f61fb72..ed56891 --- 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, generate_mount_check_premounted class Record: @@ -89,12 +91,23 @@ def _check_dbm_consistency(base: Path, nrecs: int) -> None: db.destroy() -def check_dbm_consistency(rootdir: Path) -> None: - base = rootdir / "dbm-consistency" - base.mkdir(parents=True, exist_ok=True) +def _run_dbm_consistency_checks(base_path: Path) -> None: + base_path.mkdir(parents=True, exist_ok=True) try: - _check_dbm_consistency(base, 10) - _check_dbm_consistency(base, 100) - _check_dbm_consistency(base, 10000) + _check_dbm_consistency(base_path, 10) + _check_dbm_consistency(base_path, 100) + _check_dbm_consistency(base_path, 10000) finally: - shutil.rmtree(base, ignore_errors=True) + shutil.rmtree(base_path, ignore_errors=True) + + +@pytest.mark.parametrize("ipaddr,share_name", generate_mount_check()) +def test_dbm_consistency(setup_mount: Path) -> None: + base = setup_mount / "dbm-consistency" + _run_dbm_consistency_checks(base) + + +@pytest.mark.parametrize("test_dir", generate_mount_check_premounted()) +def test_dbm_consistency_premounted(test_dir: Path) -> None: + base = test_dir / "dbm-consistency" + _run_dbm_consistency_checks(base) diff --git a/testcases/mount/mount_io.py b/testcases/mount/test_mount_io.py old mode 100644 new mode 100755 similarity index 83% rename from testcases/mount/mount_io.py rename to testcases/mount/test_mount_io.py index f9789bf..17ea9cb --- 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, generate_mount_check_premounted 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,16 @@ def _reset_random_seed() -> None: random.seed(seed) -def check_io_consistency(rootdir: Path) -> None: +def _perform_io_consistency_check(directory: Path) -> None: _reset_random_seed() - _check_io_consistency(rootdir) + _check_io_consistency(directory) + + +@pytest.mark.parametrize("ipaddr,share_name", generate_mount_check()) +def test_check_io_consistency(setup_mount: Path) -> None: + _perform_io_consistency_check(setup_mount) + + +@pytest.mark.parametrize("test_dir", generate_mount_check_premounted()) +def test_check_io_consistency_premounted(test_dir: Path) -> None: + _perform_io_consistency_check(test_dir) diff --git a/testcases/mount/mount_stress.py b/testcases/mount/test_mount_stress.py old mode 100644 new mode 100755 similarity index 57% rename from testcases/mount/mount_stress.py rename to testcases/mount/test_mount_stress.py index fb4acf5..e5e936d --- 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, generate_mount_check_premounted def _perform_file_operations( @@ -43,14 +45,30 @@ 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) +def _run_stress_tests(directory: Path) -> None: _stress_test( - root_dir, num_clients=10, num_operations=30, file_size=2**23 + directory, num_clients=5, num_operations=20, file_size=2**22 ) _stress_test( - root_dir, num_clients=20, num_operations=40, file_size=2**24 + directory, num_clients=10, num_operations=30, file_size=2**23 ) _stress_test( - root_dir, num_clients=15, num_operations=25, file_size=2**25 + directory, num_clients=20, num_operations=40, file_size=2**24 ) + _stress_test( + directory, num_clients=15, num_operations=25, file_size=2**25 + ) + + +@pytest.mark.parametrize("ipaddr,share_name", generate_mount_check()) +def test_check_mnt_stress(setup_mount: Path) -> None: + _run_stress_tests(setup_mount) + + +@pytest.mark.parametrize("test_dir", generate_mount_check_premounted()) +def test_dbm_consistency_premounted( + test_dir: Path, pre_mounted_shares_available: bool +) -> None: + if not pre_mounted_shares_available: + pytest.skip("No pre-mounted shares found for testing") + _run_stress_tests(test_dir)