Skip to content

Commit f87f801

Browse files
committed
update
1 parent 603a27a commit f87f801

4 files changed

Lines changed: 42 additions & 21 deletions

File tree

tests/integration/framework/__init__.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@
1111
# limitations under the License.
1212

1313
from .instance import FunctionStreamInstance
14-
from .kafka_manager import KafkaDockerManager
1514

1615
__all__ = ["FunctionStreamInstance", "KafkaDockerManager"]
16+
17+
18+
def __getattr__(name: str):
19+
if name == "KafkaDockerManager":
20+
from .kafka_manager import KafkaDockerManager
21+
return KafkaDockerManager
22+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")

tests/integration/framework/instance.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,12 +115,14 @@ def start(self, timeout: float = 30.0) -> "FunctionStreamInstance":
115115
return self
116116

117117
def stop(self, timeout: float = 10.0) -> None:
118-
"""Graceful SIGTERM shutdown."""
118+
"""Graceful SIGTERM shutdown, then remove everything except logs."""
119119
self.process.stop(timeout=timeout)
120+
self.workspace.cleanup()
120121

121122
def kill(self) -> None:
122-
"""Immediate SIGKILL."""
123+
"""Immediate SIGKILL, then remove everything except logs."""
123124
self.process.kill()
125+
self.workspace.cleanup()
124126

125127
def restart(self, timeout: float = 10.0) -> "FunctionStreamInstance":
126128
"""Stop then start (same port, same workspace)."""

tests/integration/framework/workspace.py

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@
1414
InstanceWorkspace: manages the directory tree for a single
1515
FunctionStream test instance.
1616
17-
Layout:
18-
tests/integration/target/<test_name>/<timestamp>/FunctionStream-<port>/
17+
Layout (during test run):
18+
tests/integration/target/<test_name>/<timestamp>/
1919
conf/config.yaml
2020
data/
2121
logs/stdout.log, stderr.log, app.log
22+
23+
After cleanup only ``logs/`` is retained.
2224
"""
2325

2426
import shutil
@@ -36,10 +38,7 @@ def __init__(self, target_dir: Path, test_name: str, port: int):
3638
self.timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
3739

3840
self.root_dir = (
39-
self.target_dir
40-
/ self.test_name
41-
/ self.timestamp
42-
/ f"FunctionStream-{self.port}"
41+
self.target_dir / self.test_name / self.timestamp
4342
)
4443
self.conf_dir = self.root_dir / "conf"
4544
self.data_dir = self.root_dir / "data"
@@ -54,8 +53,8 @@ def setup(self) -> None:
5453
for d in (self.conf_dir, self.data_dir, self.log_dir):
5554
d.mkdir(parents=True, exist_ok=True)
5655

57-
def cleanup_data(self) -> None:
58-
"""Remove the data directory but preserve logs for debugging."""
59-
if self.data_dir.exists():
60-
shutil.rmtree(self.data_dir)
61-
self.data_dir.mkdir(parents=True, exist_ok=True)
56+
def cleanup(self) -> None:
57+
"""Remove everything except logs/ so only diagnostic output remains."""
58+
for d in (self.conf_dir, self.data_dir):
59+
if d.exists():
60+
shutil.rmtree(d)

tests/integration/test/wasm/python_sdk/conftest.py

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
# Make the ``processors`` package importable from this directory
2828
sys.path.insert(0, str(Path(__file__).resolve().parent))
2929

30-
from framework import FunctionStreamInstance, KafkaDockerManager # noqa: E402
30+
from framework import FunctionStreamInstance # noqa: E402
3131
from fs_client.client import FsClient # noqa: E402
3232

3333
PROJECT_ROOT = Path(__file__).resolve().parents[5]
@@ -38,7 +38,7 @@
3838
# ======================================================================
3939

4040
@pytest.fixture(scope="session")
41-
def kafka() -> Generator[KafkaDockerManager, None, None]:
41+
def kafka():
4242
"""
4343
Session-scoped fixture: start a Docker-managed Kafka broker once
4444
for the entire test session.
@@ -47,6 +47,8 @@ def kafka() -> Generator[KafkaDockerManager, None, None]:
4747
as a parameter. Tests that only register functions (without
4848
producing / consuming data) do NOT need this fixture.
4949
"""
50+
from framework import KafkaDockerManager
51+
5052
mgr = KafkaDockerManager()
5153
mgr.setup_kafka()
5254
yield mgr
@@ -55,15 +57,27 @@ def kafka() -> Generator[KafkaDockerManager, None, None]:
5557

5658

5759
# ======================================================================
58-
# FunctionStream server
60+
# FunctionStream server (per-test instance with isolated logs)
5961
# ======================================================================
6062

61-
@pytest.fixture(scope="session")
62-
def fs_server() -> Generator[FunctionStreamInstance, None, None]:
63+
def _derive_test_name(request: pytest.FixtureRequest) -> str:
64+
"""Build a human-readable path from the pytest node: wasm/python_sdk/<Class>/<method>."""
65+
cls = request.node.cls
66+
parts = ["wasm", "python_sdk"]
67+
if cls is not None:
68+
parts.append(cls.__name__)
69+
parts.append(request.node.name)
70+
return "/".join(parts)
71+
72+
73+
@pytest.fixture
74+
def fs_server(request: pytest.FixtureRequest) -> Generator[FunctionStreamInstance, None, None]:
6375
"""
64-
Session-scoped fixture: start the FunctionStream server once for all tests.
76+
Function-scoped fixture: each test gets its own FunctionStream server
77+
with isolated log directory named after the test class and method.
6578
"""
66-
instance = FunctionStreamInstance(test_name="wasm_python_sdk_integration")
79+
test_name = _derive_test_name(request)
80+
instance = FunctionStreamInstance(test_name=test_name)
6781
instance.start()
6882
yield instance
6983
instance.kill()

0 commit comments

Comments
 (0)