"""Actual process termination, NOT a machine/power-loss test. Run from repo root.""" import json, pathlib, subprocess, tempfile, time, sys root = pathlib.Path(sys.argv[1] if len(sys.argv)>1 else "target/release") cli = root / "ratdb" worker = root / "examples/crash_worker" def read(path): return json.loads(subprocess.check_output([str(cli), "get", str(path), "crash", "1"])) with tempfile.TemporaryDirectory(prefix="ratdb-crash-") as tmp: path=pathlib.Path(tmp)/"db" for mode in ("ack", "interrupt"): for i in range(10): p=subprocess.Popen([str(worker),str(path)],stdin=subprocess.PIPE,stdout=subprocess.PIPE,text=True) assert p.stdout.readline().strip()=="READY" p.stdin.write("old\n");p.stdin.flush();assert p.stdout.readline().strip()=="ACK" p.stdin.write("new\n");p.stdin.flush() if mode=="ack": assert p.stdout.readline().strip()=="ACK" else: time.sleep(i*0.0001) p.kill();p.wait() value=read(path)["value"] assert value in (["new"] if mode=="ack" else ["old","new"]),value subprocess.check_call([str(cli),"check",str(path)],stdout=subprocess.DEVNULL) print("20 process termination/reopen cases passed")