v0.2.7-pre.009-fix.002

This commit is contained in:
2026-08-22 23:26:09 +02:00
parent f0f444bc86
commit 98bf88e431
3 changed files with 123 additions and 8 deletions

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-onchain-transport-lib/unit_tests/rpc_transactions.rs
// version: 9
// version: 10
#[test]
fn transaction_encoding_strings_match_current_and_legacy_wire_labels() {
@@ -325,15 +325,36 @@ fn serve_transaction_once(body: &'static str) -> (std::string::String, std::thre
let listener = std::net::TcpListener::bind("127.0.0.1:0").expect("fixture listener must bind");
let address = listener.local_addr().expect("fixture listener address must resolve");
let handle = std::thread::spawn(move || {
let (mut stream, _) = listener.accept().expect("fixture server must accept one request");
let request = read_transaction_request(&mut stream);
let response = format!("HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nContent-Length: {}\r\nConnection: close\r\n\r\n{}", body.len(), body,);
std::io::Write::write_all(&mut stream, response.as_bytes()).expect("fixture response must write");
return request;
loop {
let (mut stream, _) = listener.accept().expect("fixture server must accept one request");
let request = read_transaction_request(&mut stream);
if !transaction_request_complete(request.as_bytes()) {
continue;
}
let response = format!("HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nContent-Length: {}\r\nConnection: close\r\n\r\n{}", body.len(), body,);
std::io::Write::write_all(&mut stream, response.as_bytes()).expect("fixture response must write");
return request;
}
});
return (format!("http://{address}"), handle);
}
#[tokio::test(flavor = "current_thread")]
async fn transaction_fixture_ignores_abandoned_connection_before_complete_request() {
let (url, handle) = serve_transaction_once(include_str!("../fixtures/http/get_transaction.null.json"));
let address = url.strip_prefix("http://").expect("fixture URL must use HTTP");
let abandoned = std::net::TcpStream::connect(address).expect("abandoned fixture connection must connect");
drop(abandoned);
let pool = transaction_pool_for_url(url.as_str());
let result = pool
.get_transaction(&crate::HttpRoleName::new("default"), "fixture-signature", std::option::Option::None)
.await
.expect("fixture must remain available after abandoned pre-request connection");
assert!(result.is_none());
let request = handle.join().expect("fixture server must join");
assert_eq!(transaction_request_body(request.as_str())["method"], serde_json::json!("getTransaction"));
}
fn serve_transaction_status_and_count(status_line: &'static str) -> (std::string::String, std::thread::JoinHandle<(usize, std::string::String)>) {
let listener = std::net::TcpListener::bind("127.0.0.1:0").expect("fixture listener must bind");
let address = listener.local_addr().expect("fixture listener address must resolve");