71 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| use herodb::{server::Server, options::DBOption};
 | |
| use std::path::PathBuf;
 | |
| 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: PathBuf::from(test_dir),
 | |
|         port,
 | |
|         debug: false,
 | |
|         encrypt: false,
 | |
|         encryption_key: None,
 | |
|         backend: herodb::options::BackendType::Redb,
 | |
|         admin_secret: "test-admin".to_string(),
 | |
|     };
 | |
|     
 | |
|     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();
 | |
|     // Acquire ReadWrite permissions on this connection
 | |
|     let resp = send_command(
 | |
|         &mut stream,
 | |
|         "*4\r\n$6\r\nSELECT\r\n$1\r\n0\r\n$3\r\nKEY\r\n$10\r\ntest-admin\r\n",
 | |
|     ).await;
 | |
|     assert!(resp.contains("OK"), "Failed SELECT handshake: {}", resp);
 | |
|     
 | |
|     // 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);
 | |
| } |