Skip to content

Commit

Permalink
Panic on no keys in multi-operations (#19)
Browse files Browse the repository at this point in the history
  • Loading branch information
grcooper authored Aug 29, 2023
1 parent 02d3faf commit 2aa149a
Showing 1 changed file with 81 additions and 1 deletion.
82 changes: 81 additions & 1 deletion src/client/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -430,11 +430,13 @@ impl CasOperation for Client {

impl MultiOperation for Client {
fn set_multi(&mut self, kv: BTreeMap<&[u8], (&[u8], u32, u32)>) -> MemCachedResult<()> {
assert!(kv.keys().len() > 1);
assert_eq!(self.servers.len(), 1);
let server = self.find_server_by_key(kv.keys().next().unwrap());
server.borrow_mut().proto.set_multi(kv)
}
fn delete_multi(&mut self, keys: &[&[u8]]) -> MemCachedResult<()> {
assert!(keys.len() > 1);
assert_eq!(self.servers.len(), 1);
let server = self.find_server_by_key(keys[0]);
server.borrow_mut().proto.delete_multi(keys)
Expand All @@ -443,19 +445,21 @@ impl MultiOperation for Client {
&mut self,
kv: HashMap<&'a [u8], (u64, u64, u32)>,
) -> MemCachedResult<HashMap<&'a [u8], u64>> {
assert!(kv.keys().len() > 1);
assert_eq!(self.servers.len(), 1);
let server = self.find_server_by_key(kv.keys().next().unwrap());
server.borrow_mut().proto.increment_multi(kv)
}
fn get_multi(&mut self, keys: &[&[u8]]) -> MemCachedResult<HashMap<Vec<u8>, (Vec<u8>, u32)>> {
assert!(keys.len() > 1);
assert_eq!(self.servers.len(), 1);
let server = self.find_server_by_key(keys[0]);
server.borrow_mut().proto.get_multi(keys)
}
}

#[cfg(all(test, feature = "nightly"))]
mod test {
mod bench_test {
use super::Client;
use crate::proto::{NoReplyOperation, Operation, ProtoType};
use test::Bencher;
Expand Down Expand Up @@ -564,3 +568,79 @@ mod test {
b.iter(|| client.set_noreply(key, &val[..], 0, 2));
}
}

#[cfg(test)]
mod test {
use super::Client;
use crate::proto::{ProtoType, MultiOperation};
use std::collections::{BTreeMap, HashMap};

#[test]
fn test_set_multi() {
let mut client = Client::connect(&[("tcp://127.0.0.1:11211", 1)], ProtoType::Binary).unwrap();

let mut data = BTreeMap::new();
data.insert(&b"test:set_multi_hello1"[..], (&b"world1"[..], 0xdead_beef, 120));
data.insert(&b"test:set_multi_hello2"[..], (&b"world2"[..], 0xdead_beef, 120));

client.set_multi(data).unwrap();
}

#[test]
#[should_panic]
fn test_set_multi_panic_with_no_keys() {
let mut client = Client::connect(&[("tcp://127.0.0.1:11211", 1)], ProtoType::Binary).unwrap();
let data = BTreeMap::new();

client.set_multi(data).unwrap();
}

#[test]
fn test_delete_multi() {
let mut client = Client::connect(&[("tcp://127.0.0.1:11211", 1)], ProtoType::Binary).unwrap();

client.delete_multi(&[b"test:delete_multi_hello1", b"test:delete_multi_hello2"]).unwrap();
}

#[test]
#[should_panic]
fn test_delete_multi_panic_with_no_keys() {
let mut client = Client::connect(&[("tcp://127.0.0.1:11211", 1)], ProtoType::Binary).unwrap();

client.delete_multi(&[]).unwrap();
}

#[test]
fn test_increment_multi() {
let mut client = Client::connect(&[("tcp://127.0.0.1:11211", 1)], ProtoType::Binary).unwrap();

let mut data = HashMap::new();
data.insert(&b"test:increment_multi_num1"[..], (10, 50, 120));
data.insert(&b"test:increment_multi_num2"[..], (20, 50, 120));

client.increment_multi(data).unwrap();
}

#[test]
#[should_panic]
fn test_increment_multi_panic_with_no_keys() {
let mut client = Client::connect(&[("tcp://127.0.0.1:11211", 1)], ProtoType::Binary).unwrap();

client.increment_multi(HashMap::new()).unwrap();
}

#[test]
fn test_get_multi() {
let mut client = Client::connect(&[("tcp://127.0.0.1:11211", 1)], ProtoType::Binary).unwrap();

client.get_multi(&[b"test:get_multi_hello1", b"test:get_multi_hello2"]).unwrap();
}

#[test]
#[should_panic]
fn test_get_multi_panic_with_no_keys() {
let mut client = Client::connect(&[("tcp://127.0.0.1:11211", 1)], ProtoType::Binary).unwrap();

client.get_multi(&[]).unwrap();
}
}

0 comments on commit 2aa149a

Please sign in to comment.