Skip to content

Commit

Permalink
Introduce setup and teardown fixture
Browse files Browse the repository at this point in the history
With this change, multiple test modules triggered from testcases/mount
can be run as individual tests complying to pytest standards.
Also any number of new tests can be added efficiently on the mount.

Old approach:
-  All the different tests are called from test_mount.py:
   https://github.com/samba-in-kubernetes/sit-test-cases/blob/main/testcases/mount/test_mount.py
-  Test_mount.py creates a mount, the required tests are called and then test_mount.py cleans the mount.

New approach :
-  This PR complies with the proposal to use fixtures in order to remove all the load on one single
   module:
   samba-in-kubernetes#25 (comment)
   samba-in-kubernetes#25 (comment)
-  The tests are no more called from test_mount.py.
-  Setting up of mount and tearing down of mount is taken care by setup and teardown fixture
   which is defined in testcases/mount/conftest.py

   More information about fixtures:
   https://docs.pytest.org/en/6.2.x/fixture.html
-  With this change, test files remain the same, but the initiator function starts with keyword test
   and the each test module starts with keyword 'test'

   That way the tests are called by pytest.
   Usage of setup and teardown fixture becomes easily possible.
   We no more need to to call the test function explictly.

   This also helps with easy debugging and better understanding of the code, as the tests will be
   failed at individual mount/IO test.

   In this case, pytest clearly points which test among test_mount_io.py, test_mount_dbm.py
   and test_mount_stress.py are failing.
   Can be very useful
   - when more and more tests are added
   - when we want to parse test results in sit-environment project

Fixes: samba-in-kubernetes#30
Signed-off-by: Shwetha K Acharya <Shwetha.K.Acharya@ibm.com>
  • Loading branch information
Shwetha-Acharya committed Dec 7, 2023
1 parent 7ddd860 commit 70a9c0d
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 81 deletions.
55 changes: 55 additions & 0 deletions testcases/mount/conftest.py
Original file line number Diff line number Diff line change
@@ -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
70 changes: 0 additions & 70 deletions testcases/mount/test_mount.py

This file was deleted.

7 changes: 5 additions & 2 deletions testcases/mount/mount_dbm.py → testcases/mount/test_mount_dbm.py
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
#!/usr/bin/env python3
# Test various database operations via SMB mount-point.

import pytest
import dbm
import hashlib
import pickle
import shutil
import typing
import random
from pathlib import Path
from .conftest import generate_mount_check


class Record:
Expand Down Expand Up @@ -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)
Expand Down
11 changes: 7 additions & 4 deletions testcases/mount/mount_io.py → testcases/mount/test_mount_io.py
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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))
Expand All @@ -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)
15 changes: 10 additions & 5 deletions testcases/mount/mount_stress.py → testcases/mount/test_mount_stress.py
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import pytest
import threading
import testhelper
from pathlib import Path
from .conftest import generate_mount_check


def _perform_file_operations(
Expand Down Expand Up @@ -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
)

0 comments on commit 70a9c0d

Please sign in to comment.