mirror of https://github.com/jackwener/wx-cli.git
test: Added TCP vs local transport data comparison test that queries se…
- src/cli/transport.rs GSD context: - Milestone: M001 - TCP Transport - Slice: S04 - Task: T02 - Added TCP vs local transport data comparison test that queries sessions via both transports and asserts deep equality GSD-Task: S04/T02pull/43/head
parent
7b50d6abd4
commit
a8ac86452e
|
|
@ -505,4 +505,67 @@ mod tcp_integration_tests {
|
|||
addr
|
||||
);
|
||||
}
|
||||
|
||||
/// Compare TCP and local transport responses for the same query.
|
||||
/// Marked `#[ignore]` because it requires WeChat data to be present on the machine.
|
||||
/// Run manually: `cargo test -- --ignored test_tcp_matches_local_sessions`
|
||||
#[test]
|
||||
#[ignore]
|
||||
fn test_tcp_matches_local_sessions() {
|
||||
let binary = ensure_binary();
|
||||
|
||||
// Pick a free ephemeral port for TCP daemon
|
||||
let port = {
|
||||
let listener = std::net::TcpListener::bind("127.0.0.1:0")
|
||||
.expect("failed to bind ephemeral port");
|
||||
listener.local_addr().unwrap().port()
|
||||
};
|
||||
let tcp_addr = format!("127.0.0.1:{}", port);
|
||||
|
||||
// --- Phase 1: Query via TCP ---
|
||||
let mut tcp_child = Command::new(&binary)
|
||||
.env("WX_DAEMON_MODE", "1")
|
||||
.env("WX_DAEMON_TCP_ADDR", &tcp_addr)
|
||||
.stdin(std::process::Stdio::null())
|
||||
.stdout(std::process::Stdio::piped())
|
||||
.stderr(std::process::Stdio::piped())
|
||||
.spawn()
|
||||
.expect("failed to spawn wx daemon (TCP)");
|
||||
let tcp_pid = tcp_child.id();
|
||||
eprintln!("[test] TCP daemon PID {}", tcp_pid);
|
||||
|
||||
if !wait_for_tcp_ready(&tcp_addr) {
|
||||
let _ = tcp_child.kill();
|
||||
let _ = tcp_child.wait();
|
||||
panic!("TCP daemon did not become ready within {}s", STARTUP_TIMEOUT_SECS);
|
||||
}
|
||||
eprintln!("[test] TCP daemon ready on {}", tcp_addr);
|
||||
|
||||
let tcp_resp = send_tcp(Request::Sessions { limit: 20 }, &tcp_addr)
|
||||
.expect("send_tcp(Sessions) should succeed");
|
||||
|
||||
// Terminate TCP daemon
|
||||
unsafe { libc::kill(tcp_pid as libc::pid_t, libc::SIGTERM) };
|
||||
let _ = tcp_child.wait();
|
||||
eprintln!("[test] TCP daemon terminated");
|
||||
|
||||
// --- Phase 2: Query via local transport ---
|
||||
// send() with tcp_addr=None will auto-start a daemon on the Unix socket
|
||||
let local_resp = send(Request::Sessions { limit: 20 }, None)
|
||||
.expect("send(Sessions) via local transport should succeed");
|
||||
|
||||
// --- Phase 3: Deep-compare responses ---
|
||||
let tcp_data = serde_json::to_value(&tcp_resp.data)
|
||||
.expect("tcp_resp.data should be serializable");
|
||||
let local_data = serde_json::to_value(&local_resp.data)
|
||||
.expect("local_resp.data should be serializable");
|
||||
|
||||
assert_eq!(
|
||||
tcp_data, local_data,
|
||||
"TCP and local transport responses differ!\nTCP: {}\nLocal: {}",
|
||||
serde_json::to_string_pretty(&tcp_data).unwrap(),
|
||||
serde_json::to_string_pretty(&local_data).unwrap(),
|
||||
);
|
||||
eprintln!("[test] TCP and local responses match ✓");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue