Clean up dropped SDK calls and make drain assertions order-independent
This commit is contained in:
committed by
SAU-431 implementer
parent
a95b5287cf
commit
5be5b3b397
+35
-1
@@ -117,6 +117,25 @@ fn protocol() {
|
||||
p.send(json!({"jsonrpc":"2.0","method":"core.notify","params":{"call":watch["id"],"name":"armed","params":{}}}));
|
||||
assert_eq!(p.read()["result"], Value::Null);
|
||||
p.finishes();
|
||||
// Keep the process alive after dropping a call: late traffic is ignored,
|
||||
// while the kept watch continues to deliver every notification.
|
||||
let mut p = start(&wasm, &dir);
|
||||
p.request("drop_watch", json!({}));
|
||||
let dropped = p.read();
|
||||
let kept = p.read();
|
||||
let barrier = p.read();
|
||||
assert_eq!(dropped["params"]["path"], "/dropped");
|
||||
assert_eq!(kept["params"]["path"], "/kept");
|
||||
assert_eq!(barrier["method"], "other.barrier");
|
||||
for watch in [&dropped, &kept] {
|
||||
for name in ["armed", "changed", "changed"] {
|
||||
p.send(json!({"jsonrpc":"2.0","method":"core.notify","params":{"call":watch["id"],"name":name,"params":{}}}));
|
||||
}
|
||||
}
|
||||
p.answer(&dropped, Value::Null);
|
||||
p.answer(&barrier, json!({}));
|
||||
assert_eq!(p.read()["result"], json!(["armed", "changed", "changed"]));
|
||||
p.finishes();
|
||||
let mut p = start(&wasm, &dir);
|
||||
p.request("rpc.discover", json!({}));
|
||||
let d = p.read();
|
||||
@@ -276,7 +295,21 @@ fn protocol() {
|
||||
assert_eq!(provider.read()["params"]["name"], "draining");
|
||||
line.clear();
|
||||
assert_eq!(idle.read_line(&mut line).unwrap(), 0);
|
||||
assert!(std::net::TcpStream::connect(&address).is_err());
|
||||
// drain() wakes independent accept/read cancellations. Idle EOF does not
|
||||
// order listener destruction: TCP may still complete a handshake, but that
|
||||
// connection must close without serving work. Do not retry the connect.
|
||||
if let Ok(mut late) = std::net::TcpStream::connect(&address) {
|
||||
eprintln!("TCP handshake raced listener cancellation; waiting for close");
|
||||
// Reuse the four-second socket bound used by idle/active above.
|
||||
late.set_read_timeout(Some(std::time::Duration::from_secs(4)))
|
||||
.unwrap();
|
||||
let closed = std::io::Read::read(&mut late, &mut [0]);
|
||||
assert!(
|
||||
matches!(closed, Ok(0))
|
||||
|| matches!(&closed, Err(e) if e.kind() == std::io::ErrorKind::ConnectionReset),
|
||||
"late connection survived drain: {closed:?}"
|
||||
);
|
||||
}
|
||||
assert!(provider.child.try_wait().unwrap().is_none());
|
||||
provider.answer(&inflight, json!({}));
|
||||
line.clear();
|
||||
@@ -288,6 +321,7 @@ fn protocol() {
|
||||
assert!(provider.child.try_wait().unwrap().is_none());
|
||||
provider.answer(&background, json!({}));
|
||||
provider.finishes();
|
||||
assert!(std::net::TcpStream::connect(&address).is_err());
|
||||
assert!(
|
||||
!dir.join("stopped").exists(),
|
||||
"drain is not the EOF stop hook"
|
||||
|
||||
Reference in New Issue
Block a user