70 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
use herodb::{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,
 | 
						|
        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);
 | 
						|
} |