CI / test (3.11) (push) Canceled after 0s
CI / test (3.12) (push) Canceled after 0s
CI / test (3.13) (push) Canceled after 0s
CI / test (3.14) (push) Canceled after 0s
CI / package (push) Canceled after 0s
CI / precommit-and-security (push) Canceled after 11s
CI / typecheck (push) Canceled after 11s
82 lines
2.6 KiB
Python
82 lines
2.6 KiB
Python
from __future__ import annotations
|
|
|
|
import os
|
|
|
|
import pytest
|
|
|
|
from schedls.backends.systemd import SystemdBackend
|
|
from schedls.models import Backend, Command, JobSpec, Scope
|
|
from schedls.runner import CommandRunner
|
|
|
|
pytestmark = pytest.mark.integration
|
|
|
|
NAME = "schedls-it"
|
|
|
|
|
|
def _backend_or_skip() -> SystemdBackend:
|
|
backend = SystemdBackend(CommandRunner())
|
|
if not backend.has_systemctl():
|
|
pytest.skip("systemctl not available")
|
|
if not backend.manager_ok(Scope.USER):
|
|
pytest.skip("user systemd manager not reachable")
|
|
if not backend.has_analyze():
|
|
pytest.skip("systemd-analyze not available")
|
|
return backend
|
|
|
|
|
|
def _spec(calendar: str) -> JobSpec:
|
|
return JobSpec(
|
|
name=NAME,
|
|
backend=Backend.SYSTEMD,
|
|
scope=Scope.USER,
|
|
command=Command(argv=("/bin/true",)),
|
|
calendar=(calendar,),
|
|
persistent=True,
|
|
)
|
|
|
|
|
|
def test_systemd_timer_lifecycle() -> None:
|
|
backend = _backend_or_skip()
|
|
directory = backend._unit_dir(Scope.USER)
|
|
timer_path = os.path.join(directory, f"schedls-{NAME}.timer")
|
|
service_path = os.path.join(directory, f"schedls-{NAME}.service")
|
|
# Clean any leftover from a previous run.
|
|
if os.path.exists(timer_path):
|
|
existing = backend.find(NAME)
|
|
if existing is not None:
|
|
backend.apply(backend.plan_remove(existing))
|
|
try:
|
|
plan = backend.plan_create(_spec("*-*-* 03:30:00"))
|
|
result = backend.apply(plan)
|
|
assert result.changed
|
|
assert os.path.exists(timer_path)
|
|
assert os.path.exists(service_path)
|
|
|
|
job = backend.find(NAME)
|
|
assert job is not None
|
|
assert job.managed is True
|
|
assert job.schedule.expression == "*-*-* 03:30:00"
|
|
assert job.command.argv == ("/bin/true",)
|
|
|
|
backend.apply(backend.plan_set_enabled(job, False))
|
|
job = backend.find(NAME)
|
|
assert job is not None and job.enabled is False
|
|
|
|
backend.apply(backend.plan_set_enabled(job, True))
|
|
job = backend.find(NAME)
|
|
assert job is not None and job.enabled is True
|
|
|
|
backend.apply(backend.plan_update(job, _spec("*-*-* 05:15:00")))
|
|
job = backend.find(NAME)
|
|
assert job is not None
|
|
assert job.schedule.expression == "*-*-* 05:15:00"
|
|
|
|
backend.apply(backend.plan_remove(job))
|
|
assert not os.path.exists(timer_path)
|
|
assert not os.path.exists(service_path)
|
|
assert backend.find(NAME) is None
|
|
finally:
|
|
leftover = backend.find(NAME)
|
|
if leftover is not None:
|
|
backend.apply(backend.plan_remove(leftover))
|