1mod service;
4
5#[cfg(feature = "util")]
6mod util;
7
8pub use service::RedisService;
9
10#[cfg(test)]
11mod test {
12 use crate::RedisService;
13 use redis::{aio::ConnectionManager, Client, Cmd, Value};
14 use tower::{Service, ServiceExt};
15
16 const URL: &str = "redis://127.0.0.1:6379";
17
18 macro_rules! call {
19 ($service:expr, $cmd:expr) => {
20 $service.ready().await.unwrap().call($cmd).await
21 };
22 }
23
24 #[tokio::test]
25 async fn test_redis_service() {
26 let client = Client::open(URL).unwrap();
27 let connection = ConnectionManager::new(client).await.unwrap();
28 let service = RedisService::new(connection);
29 let mut join_handles = Vec::new();
30
31 for i in 0..100 {
32 let mut service = service.clone();
33 let key = format!("foo-{}", i);
34 let value = format!("bar-{}", i);
35
36 join_handles.push(tokio::spawn(async move {
37 let res = call!(service, Cmd::set(key, value)).unwrap();
38
39 assert_eq!(res, Value::Okay);
40 }));
41 }
42
43 for i in 0..100 {
44 let mut service = service.clone();
45 let mut service_clone = service.clone();
46 let key = format!("foo-{}", i);
47 let key_clone = key.clone();
48 let value = format!("bar-{}", i);
49
50 tokio::spawn(async move {
51 let res = call!(service, Cmd::get(key)).unwrap();
52 assert_eq!(res, Value::BulkString(value.into()));
53
54 let res = call!(service_clone, Cmd::del(key_clone)).unwrap();
55 assert_eq!(res, Value::Int(1));
56 });
57 }
58 }
59}