use redis_rs::{server::Server, options::DBOption}; use std::time::Duration; use tokio::io::{AsyncReadExt, AsyncWriteExt}; use tokio::net::TcpStream; use tokio::time::sleep; // Helper function to send command and get response async fn send_command(stream: &mut TcpStream, command: &str) -> String { stream.write_all(command.as_bytes()).await.unwrap(); let mut buffer = [0; 1024]; let n = stream.read(&mut buffer).await.unwrap(); String::from_utf8_lossy(&buffer[..n]).to_string() } #[tokio::test] async fn debug_hset_simple() { // Clean up any existing test database let test_dir = "/tmp/herodb_debug_hset"; let _ = std::fs::remove_dir_all(test_dir); std::fs::create_dir_all(test_dir).unwrap(); let port = 16500; let option = DBOption { dir: test_dir.to_string(), port, }; let mut server = Server::new(option).await; // Start server in background tokio::spawn(async move { let listener = tokio::net::TcpListener::bind(format!("127.0.0.1:{}", port)) .await .unwrap(); loop { if let Ok((stream, _)) = listener.accept().await { let _ = server.handle(stream).await; } } }); sleep(Duration::from_millis(200)).await; let mut stream = TcpStream::connect(format!("127.0.0.1:{}", port)).await.unwrap(); // Test simple HSET println!("Testing HSET..."); let response = send_command(&mut stream, "*4\r\n$4\r\nHSET\r\n$4\r\nhash\r\n$6\r\nfield1\r\n$6\r\nvalue1\r\n").await; println!("HSET response: {}", response); assert!(response.contains("1"), "Expected '1' but got: {}", response); // Test HGET println!("Testing HGET..."); let response = send_command(&mut stream, "*3\r\n$4\r\nHGET\r\n$4\r\nhash\r\n$6\r\nfield1\r\n").await; println!("HGET response: {}", response); assert!(response.contains("value1"), "Expected 'value1' but got: {}", response); }