Skip to content

Commit 8c0c2c3

Browse files
committed
add unit test for ClientManager.
1 parent 5baec4d commit 8c0c2c3

File tree

2 files changed

+52
-1
lines changed

2 files changed

+52
-1
lines changed

core/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ reqwest = { version = "0.12", default-features = false, features = ["json", "mul
3131
semver = "1.0.14"
3232
serde = { version = "1.0", default-features = false, features = ["derive"] }
3333
serde_json = { version = "1.0", default-features = false, features = ["std"] }
34-
tokio = { version = "1.44", features = ["macros"] }
34+
tokio = { version = "1.44", features = ["macros", "rt-multi-thread"] }
3535
tokio-retry = "0.3"
3636
tokio-util = { version = "0.7", features = ["io-util"] }
3737
url = { version = "2.5", default-features = false }

core/src/client_mgr.rs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,3 +98,54 @@ impl ClientManager {
9898
self.clients.lock().remove(id);
9999
}
100100
}
101+
102+
#[cfg(test)]
103+
mod tests {
104+
use super::*;
105+
106+
#[test]
107+
fn register_client_tracks_active_session() {
108+
let mgr = Arc::new(ClientManager::new());
109+
let mut client = APIClient::default();
110+
client.session_id = "session-1".to_string();
111+
let client = Arc::new(client);
112+
113+
let mgr_clone = Arc::clone(&mgr);
114+
let client_clone = Arc::clone(&client);
115+
GLOBAL_RUNTIME.block_on(async move {
116+
mgr_clone.register_client(client_clone).await;
117+
});
118+
119+
{
120+
let guard = mgr.clients.lock();
121+
let stored = guard.get("session-1").expect("client not stored");
122+
assert!(stored.upgrade().is_some(), "stored weak reference is dangling");
123+
assert_eq!(guard.len(), 1);
124+
}
125+
126+
drop(client);
127+
let guard = mgr.clients.lock();
128+
let stored = guard.get("session-1").expect("client missing after drop");
129+
assert!(stored.upgrade().is_none(), "weak reference should be cleared after client drop");
130+
}
131+
132+
#[test]
133+
fn unregister_client_removes_session() {
134+
let mgr = Arc::new(ClientManager::new());
135+
let mut client = APIClient::default();
136+
client.session_id = "session-2".to_string();
137+
let client = Arc::new(client);
138+
139+
let mgr_clone = Arc::clone(&mgr);
140+
let client_clone = Arc::clone(&client);
141+
GLOBAL_RUNTIME.block_on(async move {
142+
mgr_clone.register_client(client_clone).await;
143+
});
144+
145+
mgr.unregister_client("session-2");
146+
assert!(
147+
!mgr.clients.lock().contains_key("session-2"),
148+
"client entry should be removed after unregister"
149+
);
150+
}
151+
}

0 commit comments

Comments
 (0)