from __future__ import annotations

import os
from pathlib import Path
from unittest.mock import patch

from gateway.platforms.nutrition_weekly_reminder_resources import ResourceRegistrar


def fds() -> frozenset[int]:
    return frozenset(int(entry.name) for entry in Path('/proc/self/fd').iterdir())

cases = 0
for interruption in (KeyboardInterrupt, SystemExit):
    for _ in range(12):
        registrar = ResourceRegistrar()
        before = fds()
        def interrupt_after_open(_self: ResourceRegistrar, _guard: object) -> None:
            raise interruption()
        with patch.object(ResourceRegistrar, '_register_guard', interrupt_after_open):
            try:
                registrar.open_fd(lambda: os.open('/dev/null', os.O_RDONLY | os.O_CLOEXEC))
            except interruption:
                pass
            else:
                raise AssertionError('injection did not interrupt')
        if fds() != before:
            raise AssertionError(f'FD leak for {interruption.__name__}: {before} -> {fds()}')
        registrar.close()
        cases += 1
print(f'TODO5_RESOURCE_ACQUISITION_REGISTRATION_ATOMIC cases={cases} leaks=0')
