Skip to content

Commit cce0aae

Browse files
Zhang Yanpodrmingdrmer
authored andcommitted
test: add tests for kvapi data structures
Cover the four previously-untested kvapi data structure modules: pair.rs, key_codec.rs, message.rs, and item.rs. Changes: - `pair.rs`: test BasicPair, Pair, SeqPair construction, accessors, unpack, into_pair, and From<SeqPair> conversion - `key_codec.rs`: test encode/decode round-trips for String (including special chars), u64, unit, and composite FooKey - `message.rs`: test GetKVReq, MGetKVReq, ListKVReq construction, Display, and Clone+Eq - `item.rs`: test Item with/without value and NonEmptyItem construction
1 parent 4985635 commit cce0aae

File tree

4 files changed

+247
-0
lines changed

4 files changed

+247
-0
lines changed

crates/client/kvapi/src/item.rs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,50 @@ impl<K: Key> NonEmptyItem<K> {
4141
NonEmptyItem { key, seqv }
4242
}
4343
}
44+
45+
#[cfg(test)]
46+
mod tests {
47+
use databend_meta_types::SeqV;
48+
49+
use super::*;
50+
use crate::testing::FooKey;
51+
use crate::testing::FooValue;
52+
53+
fn foo_key(a: u64, b: &str, c: u64) -> FooKey {
54+
FooKey {
55+
a,
56+
b: b.to_string(),
57+
c,
58+
}
59+
}
60+
61+
#[test]
62+
fn test_item_with_value() {
63+
let k = foo_key(1, "x", 2);
64+
let sv = SeqV::new(5, FooValue);
65+
let item = Item::new(k.clone(), Some(sv));
66+
67+
assert_eq!(item.key, k);
68+
assert!(item.seqv.is_some());
69+
assert_eq!(item.seqv.as_ref().unwrap().seq, 5);
70+
}
71+
72+
#[test]
73+
fn test_item_without_value() {
74+
let k = foo_key(1, "x", 2);
75+
let item = Item::<FooKey>::new(k.clone(), None);
76+
77+
assert_eq!(item.key, k);
78+
assert!(item.seqv.is_none());
79+
}
80+
81+
#[test]
82+
fn test_non_empty_item() {
83+
let k = foo_key(1, "x", 2);
84+
let sv = SeqV::new(10, FooValue);
85+
let item = NonEmptyItem::new(k.clone(), sv);
86+
87+
assert_eq!(item.key, k);
88+
assert_eq!(item.seqv.seq, 10);
89+
}
90+
}

crates/client/kvapi/src/key_codec.rs

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,62 @@ mod impls {
6666
}
6767
}
6868
}
69+
70+
#[cfg(test)]
71+
mod tests {
72+
use crate::KeyBuilder;
73+
use crate::KeyCodec;
74+
use crate::KeyParser;
75+
use crate::testing::FooKey;
76+
77+
#[test]
78+
fn test_string_round_trip() {
79+
let s = "hello world".to_string();
80+
let encoded = s.encode_key(KeyBuilder::new()).done();
81+
let mut p = KeyParser::new(&encoded);
82+
let decoded = String::decode_key(&mut p).unwrap();
83+
assert_eq!(s, decoded);
84+
}
85+
86+
#[test]
87+
fn test_string_with_special_chars() {
88+
let s = "a/b%c".to_string();
89+
let encoded = s.encode_key(KeyBuilder::new()).done();
90+
let mut p = KeyParser::new(&encoded);
91+
let decoded = String::decode_key(&mut p).unwrap();
92+
assert_eq!(s, decoded);
93+
}
94+
95+
#[test]
96+
fn test_u64_round_trip() {
97+
for v in [0u64, 1, 42, u64::MAX] {
98+
let encoded = v.encode_key(KeyBuilder::new()).done();
99+
let mut p = KeyParser::new(&encoded);
100+
let decoded = u64::decode_key(&mut p).unwrap();
101+
assert_eq!(v, decoded);
102+
}
103+
}
104+
105+
#[test]
106+
fn test_unit_round_trip() {
107+
let encoded = ().encode_key(KeyBuilder::new()).done();
108+
assert_eq!(encoded, "");
109+
let mut p = KeyParser::new(&encoded);
110+
<()>::decode_key(&mut p).unwrap();
111+
}
112+
113+
#[test]
114+
fn test_foo_key_round_trip() {
115+
let k = FooKey {
116+
a: 1,
117+
b: "hello world".to_string(),
118+
c: 42,
119+
};
120+
let encoded = k.encode_key(KeyBuilder::new_prefixed("pref")).done();
121+
assert_eq!(encoded, "pref/1/hello%20world/42");
122+
123+
let mut p = KeyParser::new_prefixed(&encoded, "pref").unwrap();
124+
let decoded = FooKey::decode_key(&mut p).unwrap();
125+
assert_eq!(k, decoded);
126+
}
127+
}

crates/client/kvapi/src/message.rs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,58 @@ pub type UpsertKVReply = Change<Vec<u8>>;
6868
pub type GetKVReply = Option<SeqV<Vec<u8>>>;
6969
pub type MGetKVReply = Vec<Option<SeqV<Vec<u8>>>>;
7070
pub type ListKVReply = Vec<(String, SeqV<Vec<u8>>)>;
71+
72+
#[cfg(test)]
73+
mod tests {
74+
use super::*;
75+
76+
#[test]
77+
fn test_get_kv_req() {
78+
let r = GetKVReq::new("foo");
79+
assert_eq!(r.key, "foo");
80+
81+
let r2 = GetKVReq::new(format!("bar/{}", 42));
82+
assert_eq!(r2.key, "bar/42");
83+
}
84+
85+
#[test]
86+
fn test_mget_kv_req() {
87+
let r = MGetKVReq::new(["a", "b", "c"]);
88+
assert_eq!(r.keys, vec!["a", "b", "c"]);
89+
}
90+
91+
#[test]
92+
fn test_mget_kv_req_display() {
93+
let r = MGetKVReq::new(["x", "y"]);
94+
let s = r.to_string();
95+
assert!(s.contains("x"), "{}", s);
96+
assert!(s.contains("y"), "{}", s);
97+
}
98+
99+
#[test]
100+
fn test_list_kv_req() {
101+
let r = ListKVReq::new("prefix/");
102+
assert_eq!(r.prefix, "prefix/");
103+
}
104+
105+
#[test]
106+
fn test_get_kv_req_clone_eq() {
107+
let r = GetKVReq::new("foo");
108+
let r2 = r.clone();
109+
assert_eq!(r, r2);
110+
}
111+
112+
#[test]
113+
fn test_mget_kv_req_clone_eq() {
114+
let r = MGetKVReq::new(["a", "b"]);
115+
let r2 = r.clone();
116+
assert_eq!(r, r2);
117+
}
118+
119+
#[test]
120+
fn test_list_kv_req_clone_eq() {
121+
let r = ListKVReq::new("prefix/");
122+
let r2 = r.clone();
123+
assert_eq!(r, r2);
124+
}
125+
}

crates/client/kvapi/src/pair.rs

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,89 @@ where K: kvapi::Key
111111
sp.into_pair()
112112
}
113113
}
114+
115+
#[cfg(test)]
116+
mod tests {
117+
use databend_meta_types::SeqV;
118+
119+
use super::*;
120+
use crate::testing::FooKey;
121+
use crate::testing::FooValue;
122+
123+
fn foo_key(a: u64, b: &str, c: u64) -> FooKey {
124+
FooKey {
125+
a,
126+
b: b.to_string(),
127+
c,
128+
}
129+
}
130+
131+
#[test]
132+
fn test_basic_pair() {
133+
let k = foo_key(1, "x", 2);
134+
let p = BasicPair::new(k.clone(), FooValue);
135+
136+
assert_eq!(p.key(), &k);
137+
138+
let (uk, _uv) = p.unpack();
139+
assert_eq!(uk, k);
140+
}
141+
142+
#[test]
143+
fn test_pair() {
144+
let k = foo_key(1, "x", 2);
145+
let sv = SeqV::new(5, FooValue);
146+
let p = Pair::new(k.clone(), sv);
147+
148+
assert_eq!(p.key(), &k);
149+
assert_eq!(p.seq_value().seq, 5);
150+
}
151+
152+
#[test]
153+
fn test_seq_pair() {
154+
let k = foo_key(1, "x", 2);
155+
let sk = SeqV::new(10, k.clone());
156+
let sv = SeqV::new(20, FooValue);
157+
let sp = SeqPair::new(sk.clone(), sv);
158+
159+
assert_eq!(sp.seq_key().seq, 10);
160+
assert_eq!(sp.seq_value().seq, 20);
161+
}
162+
163+
#[test]
164+
fn test_seq_pair_unpack() {
165+
let k = foo_key(1, "x", 2);
166+
let sk = SeqV::new(10, k.clone());
167+
let sv = SeqV::new(20, FooValue);
168+
let sp = SeqPair::new(sk, sv);
169+
170+
let (uk, uv) = sp.unpack();
171+
assert_eq!(uk.seq, 10);
172+
assert_eq!(uk.data, k);
173+
assert_eq!(uv.seq, 20);
174+
}
175+
176+
#[test]
177+
fn test_seq_pair_into_pair() {
178+
let k = foo_key(1, "x", 2);
179+
let sk = SeqV::new(10, k.clone());
180+
let sv = SeqV::new(20, FooValue);
181+
let sp = SeqPair::new(sk, sv);
182+
183+
let p: Pair<FooKey> = sp.into_pair();
184+
assert_eq!(p.key(), &k);
185+
assert_eq!(p.seq_value().seq, 20);
186+
}
187+
188+
#[test]
189+
fn test_seq_pair_from_into() {
190+
let k = foo_key(1, "x", 2);
191+
let sk = SeqV::new(10, k.clone());
192+
let sv = SeqV::new(20, FooValue);
193+
let sp = SeqPair::new(sk, sv);
194+
195+
let p: Pair<FooKey> = sp.into();
196+
assert_eq!(p.key(), &k);
197+
assert_eq!(p.seq_value().seq, 20);
198+
}
199+
}

0 commit comments

Comments
 (0)