Release: dev → main (first public release) #258
+20
-6
@@ -362,19 +362,33 @@ def test_the_agent_heartbeats_whether_or_not_it_holds_a_lease():
|
|||||||
|
|
||||||
Read from the source rather than by running the loop: it is a `while True`
|
Read from the source rather than by running the loop: it is a `while True`
|
||||||
with a sleep, so exercising it means threads and timing, and the property
|
with a sleep, so exercising it means threads and timing, and the property
|
||||||
is simply that the call is not behind a `if ids:`.
|
is simply that the call is not behind a guard on `ids`.
|
||||||
|
|
||||||
|
Parsed rather than grepped, and that is not fussiness — the first cut
|
||||||
|
searched the raw function text and failed on its own explanation. The
|
||||||
|
docstring of the fix quotes the construct the fix removed, because that is
|
||||||
|
what a docstring explaining a fix DOES. A source-text assertion cannot
|
||||||
|
tell the code from the prose about the code; the AST can, so the body is
|
||||||
|
unparsed with its docstring dropped.
|
||||||
"""
|
"""
|
||||||
|
import ast
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
src = (
|
src = (
|
||||||
Path(__file__).resolve().parents[1] / "agent" / "fc_agent" / "worker.py"
|
Path(__file__).resolve().parents[1] / "agent" / "fc_agent" / "worker.py"
|
||||||
).read_text()
|
).read_text()
|
||||||
loop = src[src.index("def _heartbeat_loop"):]
|
fn = next(
|
||||||
loop = loop[:loop.index("\n def ")]
|
n for n in ast.walk(ast.parse(src))
|
||||||
|
if isinstance(n, ast.FunctionDef) and n.name == "_heartbeat_loop"
|
||||||
|
)
|
||||||
|
code = "\n".join(
|
||||||
|
ast.unparse(n) for n in fn.body
|
||||||
|
if not (isinstance(n, ast.Expr) and isinstance(n.value, ast.Constant))
|
||||||
|
)
|
||||||
|
|
||||||
assert "self.client.heartbeat(ids)" in loop
|
assert "self.client.heartbeat(ids)" in code
|
||||||
assert "if ids:" not in loop, (
|
assert "if ids" not in code, (
|
||||||
"the heartbeat is gated on holding leases again; an idle agent then "
|
"the heartbeat is gated on holding leases again; an idle agent then "
|
||||||
"reads as stopped after 300s while sleep mode backs its lease poll "
|
"reads as stopped after 300s while sleep mode backs its lease poll "
|
||||||
"off to 900s"
|
f"off to 900s\n\n{code}"
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user