tower_redis/
lib.rs

1//! Redis Tower Service
2
3mod 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}