add unknown commands handling without breaking client connection (#26)
- fix client unsubscribe when subscribe list in the event of the received unsubscribe list is in a different order than subscribed - add tests for subscribe and unsubscribe commands - add tests for unknown command handling
This commit is contained in:
@@ -98,6 +98,86 @@ async fn key_value_timeout() {
|
||||
assert_eq!(b"$-1\r\n", &response);
|
||||
}
|
||||
|
||||
// In this case we test that server responds acurately to
|
||||
// SUBSCRIBE and UNSUBSCRIBE commands
|
||||
#[tokio::test]
|
||||
async fn subscribe_unsubscribe() {
|
||||
let (addr, _handle) = start_server().await;
|
||||
|
||||
let mut stream = TcpStream::connect(addr).await.unwrap();
|
||||
|
||||
// send SUBSCRIBE command
|
||||
stream.write_all(b"*2\r\n$9\r\nsubscribe\r\n$5\r\nhello\r\n").await.unwrap();
|
||||
|
||||
// Read response
|
||||
let mut response = [0; 30];
|
||||
|
||||
stream.read_exact(&mut response).await.unwrap();
|
||||
|
||||
assert_eq!(b"*2\r\n$9\r\nsubscribe\r\n$5\r\nhello\r\n", &response);
|
||||
|
||||
// send UNSUBSCRIBE command
|
||||
stream.write_all(b"*2\r\n$11\r\nunsubscribe\r\n$5\r\nhello\r\n").await.unwrap();
|
||||
|
||||
let mut response = [0; 33];
|
||||
|
||||
stream.read_exact(&mut response).await.unwrap();
|
||||
|
||||
assert_eq!(b"*2\r\n$11\r\nunsubscribe\r\n", &response[0..22]);
|
||||
assert_eq!(b"$5\r\nhello\r\n", &response[22..33]);
|
||||
}
|
||||
|
||||
// In this case we test that server Responds with an Error message if a client
|
||||
// sends an unknown command
|
||||
#[tokio::test]
|
||||
async fn send_error_unknown_command() {
|
||||
let (addr, _handle) = start_server().await;
|
||||
|
||||
// Establish a connection to the server
|
||||
let mut stream = TcpStream::connect(addr).await.unwrap();
|
||||
|
||||
// Get a key, data is missing
|
||||
stream.write_all(b"*2\r\n$3\r\nFOO\r\n$5\r\nhello\r\n").await.unwrap();
|
||||
|
||||
let mut response = [0; 28];
|
||||
|
||||
stream.read_exact(&mut response).await.unwrap();
|
||||
|
||||
assert_eq!(b"-ERR unknown command \'foo\'\r\n", &response);
|
||||
}
|
||||
|
||||
// In this case we test that server Responds with an Error message if a client
|
||||
// sends an GET or SET command after a SUBSCRIBE
|
||||
#[tokio::test]
|
||||
async fn send_error_get_set_after_subscribe() {
|
||||
let (addr, _handle) = start_server().await;
|
||||
|
||||
let mut stream = TcpStream::connect(addr).await.unwrap();
|
||||
|
||||
// send SUBSCRIBE command
|
||||
stream.write_all(b"*2\r\n$9\r\nsubscribe\r\n$5\r\nhello\r\n").await.unwrap();
|
||||
|
||||
let mut response = [0; 30];
|
||||
|
||||
stream.read_exact(&mut response).await.unwrap();
|
||||
|
||||
assert_eq!(b"*2\r\n$9\r\nsubscribe\r\n$5\r\nhello\r\n", &response);
|
||||
|
||||
stream.write_all(b"*3\r\n$3\r\nSET\r\n$5\r\nhello\r\n$5\r\nworld\r\n").await.unwrap();
|
||||
|
||||
let mut response = [0; 28];
|
||||
|
||||
stream.read_exact(&mut response).await.unwrap();
|
||||
assert_eq!(b"-ERR unknown command \'set\'\r\n", &response);
|
||||
|
||||
stream.write_all(b"*2\r\n$3\r\nGET\r\n$5\r\nhello\r\n").await.unwrap();
|
||||
|
||||
let mut response = [0; 28];
|
||||
|
||||
stream.read_exact(&mut response).await.unwrap();
|
||||
assert_eq!(b"-ERR unknown command \'get\'\r\n", &response);
|
||||
}
|
||||
|
||||
async fn start_server() -> (SocketAddr, JoinHandle<mini_redis::Result<()>>) {
|
||||
let listener = TcpListener::bind("127.0.0.1:0").await.unwrap();
|
||||
let addr = listener.local_addr().unwrap();
|
||||
|
||||
Reference in New Issue
Block a user