|
|
@ -22,10 +22,7 @@
|
|
|
|
//! This module contains automated tests for queries
|
|
|
|
//! This module contains automated tests for queries
|
|
|
|
|
|
|
|
|
|
|
|
use crate::dbnet;
|
|
|
|
use crate::dbnet;
|
|
|
|
use std::io::ErrorKind;
|
|
|
|
|
|
|
|
use std::net::{Shutdown, SocketAddr};
|
|
|
|
use std::net::{Shutdown, SocketAddr};
|
|
|
|
use std::thread;
|
|
|
|
|
|
|
|
use std::time::Duration;
|
|
|
|
|
|
|
|
use tokio::net::{TcpListener, TcpStream};
|
|
|
|
use tokio::net::{TcpListener, TcpStream};
|
|
|
|
use tokio::prelude::*;
|
|
|
|
use tokio::prelude::*;
|
|
|
|
|
|
|
|
|
|
|
@ -36,13 +33,7 @@ async fn start_server() -> Option<SocketAddr> {
|
|
|
|
// HACK(@ohsayan): Since we want to start the server if it is not already
|
|
|
|
// HACK(@ohsayan): Since we want to start the server if it is not already
|
|
|
|
// running, or use it if it is already running, we just return none if we failed
|
|
|
|
// running, or use it if it is already running, we just return none if we failed
|
|
|
|
// to bind to the port, since this will _almost_ never happen on our CI
|
|
|
|
// to bind to the port, since this will _almost_ never happen on our CI
|
|
|
|
let listener = match TcpListener::bind(ADDR).await {
|
|
|
|
let listener = TcpListener::bind(ADDR).await.unwrap();
|
|
|
|
Ok(l) => l,
|
|
|
|
|
|
|
|
Err(e) => match e.kind() {
|
|
|
|
|
|
|
|
ErrorKind::AddrInUse => return None,
|
|
|
|
|
|
|
|
x @ _ => panic!("Failed to start bg async server: '{:?}'", x),
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
let addr = if let Ok(addr) = listener.local_addr() {
|
|
|
|
let addr = if let Ok(addr) = listener.local_addr() {
|
|
|
|
Some(addr)
|
|
|
|
Some(addr)
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
@ -52,29 +43,10 @@ async fn start_server() -> Option<SocketAddr> {
|
|
|
|
addr
|
|
|
|
addr
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
async fn try_get_stream() -> TcpStream {
|
|
|
|
|
|
|
|
const SLEEP_DURATION: u64 = 4;
|
|
|
|
|
|
|
|
let mut server = start_server().await;
|
|
|
|
|
|
|
|
thread::sleep(Duration::from_secs(SLEEP_DURATION)); // Sleep for four seconds
|
|
|
|
|
|
|
|
if let Ok(stream) = TcpStream::connect(ADDR).await {
|
|
|
|
|
|
|
|
return stream;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
loop {
|
|
|
|
|
|
|
|
// try starting the server again
|
|
|
|
|
|
|
|
server = start_server().await;
|
|
|
|
|
|
|
|
thread::sleep(Duration::from_secs(SLEEP_DURATION)); // Sleep for four seconds
|
|
|
|
|
|
|
|
if let Ok(stream) = TcpStream::connect(ADDR).await {
|
|
|
|
|
|
|
|
return stream;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#[tokio::test]
|
|
|
|
#[tokio::test]
|
|
|
|
async fn test_heya() {
|
|
|
|
async fn test_queries() {
|
|
|
|
let server = start_server().await;
|
|
|
|
let server = start_server().await;
|
|
|
|
let mut stream = try_get_stream().await;
|
|
|
|
let mut stream = TcpStream::connect(ADDR).await.unwrap();
|
|
|
|
stream
|
|
|
|
stream
|
|
|
|
.write_all(b"#2\n*1\n#2\n&1\n#4\nHEYA\n")
|
|
|
|
.write_all(b"#2\n*1\n#2\n&1\n#4\nHEYA\n")
|
|
|
|
.await
|
|
|
|
.await
|
|
|
@ -82,15 +54,9 @@ async fn test_heya() {
|
|
|
|
let res_should_be = "#2\n*1\n#2\n&1\n+4\nHEY!\n".as_bytes().to_owned();
|
|
|
|
let res_should_be = "#2\n*1\n#2\n&1\n+4\nHEY!\n".as_bytes().to_owned();
|
|
|
|
let mut response = vec![0; res_should_be.len()];
|
|
|
|
let mut response = vec![0; res_should_be.len()];
|
|
|
|
stream.read_exact(&mut response).await.unwrap();
|
|
|
|
stream.read_exact(&mut response).await.unwrap();
|
|
|
|
stream.shutdown(Shutdown::Write).unwrap();
|
|
|
|
|
|
|
|
assert_eq!(response.to_vec(), res_should_be);
|
|
|
|
assert_eq!(response.to_vec(), res_should_be);
|
|
|
|
}
|
|
|
|
println!("HEYA complete");
|
|
|
|
|
|
|
|
// Test single nil value
|
|
|
|
#[tokio::test]
|
|
|
|
|
|
|
|
#[ignore]
|
|
|
|
|
|
|
|
async fn test_set_single_nil() {
|
|
|
|
|
|
|
|
let server = start_server().await;
|
|
|
|
|
|
|
|
let mut stream = try_get_stream().await;
|
|
|
|
|
|
|
|
stream
|
|
|
|
stream
|
|
|
|
.write_all(b"#2\n*1\n#2\n&2\n#3\nGET\n#1\nx\n")
|
|
|
|
.write_all(b"#2\n*1\n#2\n&2\n#3\nGET\n#1\nx\n")
|
|
|
|
.await
|
|
|
|
.await
|
|
|
@ -98,22 +64,19 @@ async fn test_set_single_nil() {
|
|
|
|
let res_should_be = "#2\n*1\n#2\n&1\n!1\n1\n".as_bytes().to_owned();
|
|
|
|
let res_should_be = "#2\n*1\n#2\n&1\n!1\n1\n".as_bytes().to_owned();
|
|
|
|
let mut response = vec![0; res_should_be.len()];
|
|
|
|
let mut response = vec![0; res_should_be.len()];
|
|
|
|
stream.read_exact(&mut response).await.unwrap();
|
|
|
|
stream.read_exact(&mut response).await.unwrap();
|
|
|
|
stream.shutdown(Shutdown::Write).unwrap();
|
|
|
|
|
|
|
|
assert_eq!(response, res_should_be);
|
|
|
|
assert_eq!(response, res_should_be);
|
|
|
|
}
|
|
|
|
println!("Single NIL complete");
|
|
|
|
|
|
|
|
|
|
|
|
#[tokio::test]
|
|
|
|
// Test multiple nil
|
|
|
|
#[ignore]
|
|
|
|
|
|
|
|
async fn test_set_multiple_nil() {
|
|
|
|
|
|
|
|
let server = start_server().await;
|
|
|
|
|
|
|
|
let mut stream = try_get_stream().await;
|
|
|
|
|
|
|
|
stream
|
|
|
|
stream
|
|
|
|
.write_all(b"#2\n*1\n#2\n&3\n#3\nGET\n#1\nx\n#2\nex\n")
|
|
|
|
.write_all(b"#2\n*1\n#2\n&3\n#4\nMGET\n#1\nx\n#2\nex\n")
|
|
|
|
.await
|
|
|
|
.await
|
|
|
|
.unwrap();
|
|
|
|
.unwrap();
|
|
|
|
let res_should_be = b"#2\n*1\n#2\n&2\n!1\n1\n!1\n1";
|
|
|
|
let res_should_be = b"#2\n*1\n#2\n&2\n!1\n1\n!1\n1";
|
|
|
|
let mut response = vec![0; res_should_be.len()];
|
|
|
|
let mut response = vec![0; res_should_be.len()];
|
|
|
|
stream.read_exact(&mut response).await.unwrap();
|
|
|
|
stream.read_exact(&mut response).await.unwrap();
|
|
|
|
stream.shutdown(Shutdown::Write).unwrap();
|
|
|
|
|
|
|
|
assert_eq!(response, res_should_be.to_vec());
|
|
|
|
assert_eq!(response, res_should_be.to_vec());
|
|
|
|
|
|
|
|
println!("Multiple NIL complete");
|
|
|
|
|
|
|
|
// Stop the server
|
|
|
|
|
|
|
|
stream.shutdown(Shutdown::Write).unwrap();
|
|
|
|
}
|
|
|
|
}
|
|
|
|