mirror of https://github.com/tikv/client-rust.git
mock tikv: distinguish between empty value and non-exsit keys; same behavior with TiKV
Signed-off-by: ekexium <ekexium@gmail.com>
This commit is contained in:
parent
ee999c50a6
commit
1bf9374939
|
@ -178,7 +178,11 @@ impl Tikv for MockTikv {
|
||||||
sink: grpcio::UnarySink<kvproto::kvrpcpb::RawGetResponse>,
|
sink: grpcio::UnarySink<kvproto::kvrpcpb::RawGetResponse>,
|
||||||
) {
|
) {
|
||||||
let mut resp = RawGetResponse::default();
|
let mut resp = RawGetResponse::default();
|
||||||
resp.set_value(self.inner.raw_get(req.get_key()));
|
if let Some(v) = self.inner.raw_get(req.get_key()) {
|
||||||
|
resp.set_value(v);
|
||||||
|
} else {
|
||||||
|
resp.set_not_found(true);
|
||||||
|
}
|
||||||
spawn_unary_success!(ctx, req, resp, sink);
|
spawn_unary_success!(ctx, req, resp, sink);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,19 +24,23 @@ impl KvStore {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn raw_get(&self, key: &[u8]) -> Vec<u8> {
|
pub fn raw_get(&self, key: &[u8]) -> Option<Vec<u8>> {
|
||||||
let data = self.data.read().unwrap();
|
let data = self.data.read().unwrap();
|
||||||
data.get(key).map(|v| v.to_vec()).unwrap_or_else(Vec::new)
|
data.get(key).map(|v| v.to_vec())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn raw_batch_get(&self, keys: &[Vec<u8>]) -> Vec<KvPair> {
|
pub fn raw_batch_get(&self, keys: &[Vec<u8>]) -> Vec<KvPair> {
|
||||||
let data = self.data.read().unwrap();
|
let data = self.data.read().unwrap();
|
||||||
keys.iter()
|
keys.iter()
|
||||||
.map(|key| {
|
.filter_map(|key| {
|
||||||
let mut pair = KvPair::default();
|
if data.contains_key(key) {
|
||||||
pair.set_value(data.get(key).map(|v| v.to_vec()).unwrap_or_else(Vec::new));
|
let mut pair = KvPair::default();
|
||||||
pair.set_key(key.to_vec());
|
pair.set_value(data.get(key).map(|v| v.to_vec()).unwrap_or_else(Vec::new));
|
||||||
pair
|
pair.set_key(key.to_vec());
|
||||||
|
Some(pair)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@ mod test {
|
||||||
|
|
||||||
// empty; get non-existent key
|
// empty; get non-existent key
|
||||||
let res = client.get("k1".to_owned()).await;
|
let res = client.get("k1".to_owned()).await;
|
||||||
assert_eq!(res.unwrap().unwrap(), vec![]);
|
assert_eq!(res.unwrap(), None);
|
||||||
|
|
||||||
// empty; put then batch_get
|
// empty; put then batch_get
|
||||||
let _ = client.put("k1".to_owned(), "v1".to_owned()).await.unwrap();
|
let _ = client.put("k1".to_owned(), "v1".to_owned()).await.unwrap();
|
||||||
|
@ -30,9 +30,9 @@ mod test {
|
||||||
.batch_get(vec!["k1".to_owned(), "k2".to_owned(), "k3".to_owned()])
|
.batch_get(vec!["k1".to_owned(), "k2".to_owned(), "k3".to_owned()])
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
assert_eq!(res.len(), 2);
|
||||||
assert_eq!(res[0].1, "v1".as_bytes());
|
assert_eq!(res[0].1, "v1".as_bytes());
|
||||||
assert_eq!(res[1].1, "v2".as_bytes());
|
assert_eq!(res[1].1, "v2".as_bytes());
|
||||||
assert_eq!(res[2].1, "".as_bytes());
|
|
||||||
|
|
||||||
// k1,k2; batch_put then batch_get
|
// k1,k2; batch_put then batch_get
|
||||||
let _ = client
|
let _ = client
|
||||||
|
@ -58,7 +58,7 @@ mod test {
|
||||||
assert!(res.is_err());
|
assert!(res.is_err());
|
||||||
|
|
||||||
let res = client.get("k3".to_owned()).await;
|
let res = client.get("k3".to_owned()).await;
|
||||||
assert_eq!(res.unwrap().unwrap(), "".as_bytes());
|
assert_eq!(res.unwrap(), None);
|
||||||
|
|
||||||
// k1,k2,k4; batch_delete then batch_get
|
// k1,k2,k4; batch_delete then batch_get
|
||||||
let res = client
|
let res = client
|
||||||
|
@ -75,9 +75,7 @@ mod test {
|
||||||
])
|
])
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
for i in 0..3 {
|
assert_eq!(res.len(), 0);
|
||||||
assert_eq!(res[i].1, "".as_bytes());
|
|
||||||
}
|
|
||||||
|
|
||||||
debug!("Pass all tests");
|
debug!("Pass all tests");
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue