Files
unshell/ush-payload/src/main.rs
T

126 lines
3.6 KiB
Rust
Raw Normal View History

2026-02-16 10:52:27 -07:00
//! TCP Chain CLI Test Harness
//!
//! Demonstrates multi-layer TCP connections for testing pivoting.
//! Creates a chain of endpoints connected via TCP.
2026-02-16 10:52:27 -07:00
use std::io::{Read, Write};
use std::net::TcpListener;
use std::sync::mpsc;
use std::thread;
2026-02-04 22:19:16 -07:00
2026-02-16 10:52:27 -07:00
use unshell::tree::{EndpointManager, TreeMessage};
2026-02-04 22:19:16 -07:00
2026-02-16 10:52:27 -07:00
fn main() {
println!("=== TCP Chain Test Harness ===\n");
2025-11-06 00:01:46 -07:00
2026-02-16 10:52:27 -07:00
// Test 1: Local TCP Server-Client loopback
test_tcp_loopback();
2025-11-24 13:13:06 -07:00
2026-02-16 10:52:27 -07:00
// Test 2: Tree message routing
test_tree_message();
2025-11-24 13:13:06 -07:00
2026-02-16 10:52:27 -07:00
// Test 3: TreeMessage serialization
test_message_serialization();
2025-11-24 13:13:06 -07:00
2026-02-16 10:52:27 -07:00
println!("\n=== All tests complete ===");
}
2026-02-16 10:52:27 -07:00
/// Test basic TCP server/client communication
fn test_tcp_loopback() {
println!("[Test 1] TCP Loopback Test");
// Start a TCP server in a thread
let (tx, rx) = mpsc::channel();
let server_thread = thread::spawn(move || {
let listener = TcpListener::bind("127.0.0.1:0").expect("Failed to bind");
let addr = listener.local_addr().unwrap();
tx.send(addr.port()).unwrap();
for stream in listener.incoming() {
if let Ok(mut stream) = stream {
let mut buf = [0u8; 1024];
if let Ok(n) = stream.read(&mut buf) {
let response = b"Echo: ";
let _ = stream.write(response);
let _ = stream.write(&buf[..n]);
let _ = stream.flush();
}
}
}
});
let port = rx.recv().unwrap();
// Connect client
let mut stream =
std::net::TcpStream::connect(format!("127.0.0.1:{}", port)).expect("Failed to connect");
let msg = b"Hello from client!";
stream.write(msg).expect("Failed to write");
let mut buf = [0u8; 1024];
let n = stream.read(&mut buf).expect("Failed to read");
let response = String::from_utf8_lossy(&buf[..n]);
println!(" Client sent: {:?}", msg);
println!(" Server responded: {:?}", response);
server_thread.join().unwrap();
println!(" ✓ Loopback test passed\n");
}
2026-02-16 10:52:27 -07:00
/// Test the tree message routing
fn test_tree_message() {
println!("[Test 2] Tree Message Routing");
2026-02-16 10:52:27 -07:00
let mut endpoint = EndpointManager::new("endpoint-1");
2025-11-05 22:59:01 -07:00
2026-02-16 10:52:27 -07:00
// Test GetChildren
let response = endpoint
.branch_mut()
.send_message(serde_json::Value::Null, serde_json::json!("GetChildren"));
2026-02-16 10:52:27 -07:00
let children = response.as_object().unwrap();
println!(" Children: {:?}", children.keys().collect::<Vec<_>>());
2026-02-16 10:52:27 -07:00
// Test ID access
let response = endpoint
.branch_mut()
.send_message(serde_json::json!("id"), serde_json::Value::Null);
println!(" Endpoint ID: {:?}", response);
2026-02-16 10:52:27 -07:00
// Test logs queue
let sender = endpoint.logs_sender().clone();
sender.send(serde_json::json!("Test log entry")).unwrap();
2026-01-30 14:05:07 -07:00
2026-02-16 10:52:27 -07:00
let response = endpoint
.branch_mut()
.send_message(serde_json::json!("logs"), serde_json::json!("GetLength"));
println!(" Log queue length: {:?}", response);
2026-01-30 14:05:07 -07:00
2026-02-16 10:52:27 -07:00
println!(" ✓ Tree message test passed\n");
}
2026-01-30 14:05:07 -07:00
2026-02-16 10:52:27 -07:00
/// Test TreeMessage serialization
fn test_message_serialization() {
println!("[Test 3] TreeMessage Serialization");
2026-01-30 14:05:07 -07:00
2026-02-16 10:52:27 -07:00
let msg = TreeMessage::new_req(
"msg-1",
vec!["endpoint1".to_string(), "shell".to_string()],
"Get",
);
2026-01-30 14:05:07 -07:00
2026-02-16 10:52:27 -07:00
let json = serde_json::to_string_pretty(&msg).unwrap();
println!(" Message: {}", json);
2026-01-30 14:05:07 -07:00
2026-02-16 10:52:27 -07:00
// Test response message
let resp = TreeMessage::new_resp("resp-1", "msg-1", serde_json::json!("result data"));
2026-01-30 14:05:07 -07:00
2026-02-16 10:52:27 -07:00
let json = serde_json::to_string_pretty(&resp).unwrap();
println!(" Response: {}", json);
2026-01-30 14:05:07 -07:00
2026-02-16 10:52:27 -07:00
println!(" ✓ Message serialization test passed\n");
}