From c066843f9b75283a14ac6de818cab0bb72d984b7 Mon Sep 17 00:00:00 2001 From: Julian Stirling Date: Tue, 12 Aug 2025 16:42:15 +0100 Subject: [PATCH] Test cancelling preview --- tests/mock_stitching/mock-stitch.py | 3 +++ tests/test_stitching.py | 35 ++++++++++++++++++++++++++--- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/tests/mock_stitching/mock-stitch.py b/tests/mock_stitching/mock-stitch.py index b4c9d16a..341ed61c 100644 --- a/tests/mock_stitching/mock-stitch.py +++ b/tests/mock_stitching/mock-stitch.py @@ -11,6 +11,9 @@ def main(): # This is used to check we catch errors correctly. if arg == "ERROR": raise RuntimeError("I was told to do this.") + if arg == "HANG": + # Rather than hang, just sleep for 10s: + time.sleep(10) print(arg, flush=True) time.sleep(0.2) diff --git a/tests/test_stitching.py b/tests/test_stitching.py index d4908340..95ebd355 100644 --- a/tests/test_stitching.py +++ b/tests/test_stitching.py @@ -9,7 +9,7 @@ import os from copy import copy import uuid import threading -from time import sleep +import time import pytest @@ -200,6 +200,7 @@ def test_preview_stitching_command(caplog, mocker): mocker.patch("openflexure_microscope_server.stitching.STITCHING_CMD", mock_cmd) with caplog.at_level(logging.INFO): + cancel_hook = lt.deps.CancelHook(id=uuid.uuid4()) stitcher = PreviewStitcher(FAKE_DIR, overlap=0.1, correlation_resize=0.5) stitcher.start() # Should take a second or so to run so will still be running @@ -208,12 +209,40 @@ def test_preview_stitching_command(caplog, mocker): with pytest.raises(RuntimeError): stitcher.start() # Wait for it to complete - stitcher.wait() + stitcher.wait(cancel_hook) # It is now not running assert not stitcher.running assert len(caplog.records) == 0 +def test_preview_stitching_cancelled(caplog, mocker): + """Check that preview stitch can be cancelled.""" + mock_cmd = f"python {MOCK_STITCHER}" + + mocker.patch("openflexure_microscope_server.stitching.STITCHING_CMD", mock_cmd) + + with caplog.at_level(logging.INFO): + stitcher = PreviewStitcher(FAKE_DIR, overlap=0.1, correlation_resize=0.5) + # Send in the argument HANG to mock-stitch and it just hang for 10s + stitcher._extra_args = ["HANG"] + cancel_hook = lt.deps.CancelHook(id=uuid.uuid4()) + t_start = time.time() + # Start stitching + stitcher.start() + # Run wait() in a thread. + thread = threading.Thread(target=stitcher.wait, kwargs={"cancel": cancel_hook}) + thread.start() + # Sleep long enough for at least 1 log. + time.sleep(0.5) + # use set() to cancel! + cancel_hook.set() + thread.join() + # If it wasn't cancelled it would hang for 10 s. Here we check the cancel killed + # it within 2s. + assert t_start - time.time() < 2 + assert len(caplog.records) == 0 + + def test_final_stitching_command(caplog, mocker): """Check the final stitch runs until completion, and print statements are logged.""" mock_cmd = f"python {MOCK_STITCHER}" @@ -252,7 +281,7 @@ def test_final_stitching_command_cancelled(caplog, mocker): thread = threading.Thread(target=stitcher.run, kwargs={"cancel": cancel_hook}) thread.start() # Sleep long enough for at least 1 log. - sleep(0.5) + time.sleep(0.5) # use set() to cancel! cancel_hook.set() thread.join()