Skip to content

Commit dab06f6

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

File tree

2 files changed

+58
-1
lines changed

2 files changed

+58
-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: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,3 +98,60 @@ 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!(
123+
stored.upgrade().is_some(),
124+
"stored weak reference is dangling"
125+
);
126+
assert_eq!(guard.len(), 1);
127+
}
128+
129+
drop(client);
130+
let guard = mgr.clients.lock();
131+
let stored = guard.get("session-1").expect("client missing after drop");
132+
assert!(
133+
stored.upgrade().is_none(),
134+
"weak reference should be cleared after client drop"
135+
);
136+
}
137+
138+
#[test]
139+
fn unregister_client_removes_session() {
140+
let mgr = Arc::new(ClientManager::new());
141+
let mut client = APIClient::default();
142+
client.session_id = "session-2".to_string();
143+
let client = Arc::new(client);
144+
145+
let mgr_clone = Arc::clone(&mgr);
146+
let client_clone = Arc::clone(&client);
147+
GLOBAL_RUNTIME.block_on(async move {
148+
mgr_clone.register_client(client_clone).await;
149+
});
150+
151+
mgr.unregister_client("session-2");
152+
assert!(
153+
!mgr.clients.lock().contains_key("session-2"),
154+
"client entry should be removed after unregister"
155+
);
156+
}
157+
}

0 commit comments

Comments
 (0)