Skip to content

Commit 1f6a53f

Browse files
YichiZhang0613yukibtc
authored andcommitted
pool: add more tests
Closes #898 Pull-Request: #898 Signed-off-by: Yuki Kishimoto <yukikishimoto@protonmail.com>
1 parent c125038 commit 1f6a53f

File tree

7 files changed

+321
-0
lines changed

7 files changed

+321
-0
lines changed

crates/nostr-relay-pool/src/monitor.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,20 @@ impl Monitor {
5555
self.notify(MonitorNotification::StatusChanged { relay_url, status });
5656
}
5757
}
58+
59+
#[cfg(test)]
60+
mod tests {
61+
use super::*;
62+
63+
#[test]
64+
#[should_panic]
65+
fn test_monitor_capacity_is_zero() {
66+
Monitor::new(0);
67+
}
68+
69+
#[test]
70+
#[should_panic]
71+
fn test_monitor_capacity_overflows() {
72+
let _ = Monitor::new(usize::MAX / 2);
73+
}
74+
}

crates/nostr-relay-pool/src/policy.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,3 +96,25 @@ pub trait AdmitPolicy: fmt::Debug + Send + Sync {
9696
Box::pin(async move { Ok(AdmitStatus::Success) })
9797
}
9898
}
99+
100+
#[cfg(test)]
101+
mod tests {
102+
use super::*;
103+
104+
#[test]
105+
fn test_admit_status_success() {
106+
let status = AdmitStatus::success();
107+
assert_eq!(status, AdmitStatus::Success);
108+
}
109+
110+
#[test]
111+
fn test_admit_status_rejcted() {
112+
let status = AdmitStatus::rejected("not admitted");
113+
assert_eq!(
114+
status,
115+
AdmitStatus::Rejected {
116+
reason: Some(String::from("not admitted"))
117+
}
118+
);
119+
}
120+
}

crates/nostr-relay-pool/src/relay/flags.rs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,4 +315,58 @@ mod tests {
315315
let f = AtomicRelayServiceFlags::new(RelayServiceFlags::DISCOVERY);
316316
assert!(!f.can_write());
317317
}
318+
319+
#[test]
320+
fn test_has_any_service_flags() {
321+
let f = AtomicRelayServiceFlags::new(RelayServiceFlags::DISCOVERY);
322+
assert!(f.has_any(RelayServiceFlags::READ | RelayServiceFlags::DISCOVERY));
323+
assert!(!f.has_any(RelayServiceFlags::READ | RelayServiceFlags::WRITE));
324+
}
325+
326+
#[test]
327+
fn test_has_all_service_flags() {
328+
let f = AtomicRelayServiceFlags::new(RelayServiceFlags::READ | RelayServiceFlags::GOSSIP);
329+
assert!(f.has_all(RelayServiceFlags::READ | RelayServiceFlags::GOSSIP));
330+
assert!(!f.has_all(RelayServiceFlags::READ | RelayServiceFlags::WRITE));
331+
}
332+
333+
#[test]
334+
fn test_has_read_service_flags() {
335+
let f1 = AtomicRelayServiceFlags::new(RelayServiceFlags::READ);
336+
assert!(f1.has_read());
337+
let f2 = AtomicRelayServiceFlags::new(RelayServiceFlags::WRITE);
338+
assert!(!f2.has_read());
339+
}
340+
341+
#[test]
342+
fn test_has_write_service_flags() {
343+
let f1 = AtomicRelayServiceFlags::new(RelayServiceFlags::WRITE);
344+
assert!(f1.has_write());
345+
let f2 = AtomicRelayServiceFlags::new(RelayServiceFlags::READ);
346+
assert!(!f2.has_write());
347+
}
348+
349+
#[test]
350+
fn test_has_ping_service_flags() {
351+
let f1 = AtomicRelayServiceFlags::new(RelayServiceFlags::PING);
352+
assert!(f1.has_ping());
353+
let f2 = AtomicRelayServiceFlags::new(RelayServiceFlags::default());
354+
assert!(f2.has_ping());
355+
}
356+
357+
#[test]
358+
fn test_has_gossip_flags() {
359+
let f1 = AtomicRelayServiceFlags::new(RelayServiceFlags::GOSSIP);
360+
assert!(f1.has_gossip());
361+
let f2 = AtomicRelayServiceFlags::new(RelayServiceFlags::default());
362+
assert!(!f2.has_gossip());
363+
}
364+
365+
#[test]
366+
fn test_has_discovery_flags() {
367+
let f1 = AtomicRelayServiceFlags::new(RelayServiceFlags::DISCOVERY);
368+
assert!(f1.has_discovery());
369+
let f2 = AtomicRelayServiceFlags::new(RelayServiceFlags::default());
370+
assert!(!f2.has_discovery());
371+
}
318372
}

crates/nostr-relay-pool/src/relay/options.rs

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,3 +303,70 @@ impl SyncOptions {
303303
!self.dry_run && matches!(self.direction, SyncDirection::Down | SyncDirection::Both)
304304
}
305305
}
306+
307+
#[cfg(test)]
308+
mod tests {
309+
use super::*;
310+
311+
#[test]
312+
fn test_exit_policy() {
313+
let policy = ReqExitPolicy::default();
314+
let opts = SubscribeAutoCloseOptions::default().exit_policy(policy);
315+
assert_eq!(
316+
std::mem::discriminant(&opts.exit_policy),
317+
std::mem::discriminant(&policy)
318+
);
319+
}
320+
321+
#[test]
322+
fn test_timeout() {
323+
let duration = Some(Duration::from_secs(10));
324+
let opts = SubscribeAutoCloseOptions::default().timeout(duration);
325+
assert_eq!(opts.timeout, duration);
326+
let duration = Some(Duration::from_millis(500));
327+
let opts = SubscribeAutoCloseOptions::default().idle_timeout(duration);
328+
assert_eq!(opts.idle_timeout, duration);
329+
let opt = SyncOptions::default().initial_timeout(Duration::from_secs(5));
330+
assert_eq!(opt.initial_timeout, Duration::from_secs(5));
331+
}
332+
333+
#[test]
334+
fn test_close() {
335+
let opts = SubscribeOptions::default();
336+
assert_eq!(opts.is_auto_closing(), false);
337+
let opts = SubscribeOptions::default().close_on(Some(SubscribeAutoCloseOptions::default()));
338+
assert_eq!(opts.is_auto_closing(), true);
339+
}
340+
341+
#[test]
342+
fn test_sync_progress_percentage() {
343+
let mut sp = SyncProgress::default();
344+
sp.total = 5;
345+
sp.current = 2;
346+
assert_eq!(sp.percentage(), 2f64 / 5f64);
347+
let sp_zero = SyncProgress::default();
348+
assert_eq!(sp_zero.percentage(), 0.0);
349+
}
350+
351+
#[test]
352+
fn test_do_up() {
353+
let opt = SyncOptions::default();
354+
assert!(!opt.do_up());
355+
let opt2 = SyncOptions::default().dry_run();
356+
assert!(!opt2.do_up());
357+
let opt3 = SyncOptions::default().direction(SyncDirection::Up);
358+
assert!(opt3.do_up());
359+
}
360+
361+
#[test]
362+
fn test_do_down() {
363+
let opt = SyncOptions::default();
364+
assert!(opt.do_down());
365+
let opt2 = SyncOptions::default().direction(SyncDirection::Down);
366+
assert!(opt2.do_down());
367+
let opt3 = SyncOptions::default()
368+
.dry_run()
369+
.direction(SyncDirection::Down);
370+
assert!(!opt3.do_down());
371+
}
372+
}

crates/nostr-relay-pool/src/relay/ping.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,31 @@ impl PingTracker {
6868
self.replied.store(replied, Ordering::SeqCst);
6969
}
7070
}
71+
72+
#[cfg(test)]
73+
mod tests {
74+
use super::*;
75+
76+
#[tokio::test]
77+
async fn test_ping_tracker_sent() {
78+
let tracker = PingTracker::default();
79+
let before = tracker.sent_at().await;
80+
tracker.just_sent().await;
81+
let after = tracker.sent_at().await;
82+
assert!(after >= before);
83+
}
84+
85+
#[test]
86+
fn test_ping_tracker_last_nonce() {
87+
let tracker = PingTracker::default();
88+
tracker.set_last_nonce(42);
89+
assert_eq!(tracker.last_nonce(), 42);
90+
}
91+
92+
#[test]
93+
fn test_ping_tracker_replied() {
94+
let tracker = PingTracker::default();
95+
tracker.set_replied(true);
96+
assert!(tracker.replied());
97+
}
98+
}

crates/nostr-relay-pool/src/relay/stats.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,3 +147,33 @@ impl RelayConnectionStats {
147147
}
148148
}
149149
}
150+
151+
#[cfg(test)]
152+
mod tests {
153+
use super::*;
154+
155+
#[test]
156+
fn test_attempt_success() {
157+
let stats = RelayConnectionStats::default();
158+
stats.new_attempt();
159+
stats.new_success();
160+
assert_eq!(stats.attempts(), 1);
161+
assert_eq!(stats.success(), 1);
162+
assert_eq!(stats.success_rate(), 1.0);
163+
assert!(stats.connected_at().as_u64() > 0);
164+
assert!(stats.first_connection_timestamp().as_u64() > 0);
165+
}
166+
167+
#[test]
168+
fn test_add_bytes() {
169+
let stats = RelayConnectionStats::default();
170+
stats.add_bytes_sent(0);
171+
assert_eq!(stats.bytes_sent(), 0);
172+
stats.add_bytes_sent(50);
173+
assert_eq!(stats.bytes_sent(), 50);
174+
stats.add_bytes_received(0);
175+
assert_eq!(stats.bytes_received(), 0);
176+
stats.add_bytes_received(30);
177+
assert_eq!(stats.bytes_received(), 30);
178+
}
179+
}

crates/nostr-relay-pool/src/relay/status.rs

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,3 +112,106 @@ impl RelayStatus {
112112
matches!(self, Self::Initialized | Self::Terminated)
113113
}
114114
}
115+
116+
#[cfg(test)]
117+
mod tests {
118+
use super::*;
119+
120+
#[test]
121+
fn test_status_set() {
122+
let relay = AtomicRelayStatus::default();
123+
relay.set(RelayStatus::Connected);
124+
assert_eq!(relay.load(), RelayStatus::Connected);
125+
}
126+
127+
#[test]
128+
fn test_status_initialized() {
129+
let status = RelayStatus::Initialized;
130+
assert!(status.is_initialized());
131+
assert!(!status.is_connected());
132+
assert!(!status.is_disconnected());
133+
assert!(!status.is_terminated());
134+
assert!(!status.is_banned());
135+
assert!(status.can_connect());
136+
let relay = AtomicRelayStatus::new(status);
137+
assert_eq!(relay.load(), RelayStatus::Initialized);
138+
}
139+
140+
#[test]
141+
fn test_status_pending() {
142+
let status = RelayStatus::Pending;
143+
assert!(!status.is_initialized());
144+
assert!(!status.is_connected());
145+
assert!(!status.is_disconnected());
146+
assert!(!status.is_terminated());
147+
assert!(!status.is_banned());
148+
assert!(!status.can_connect());
149+
let relay = AtomicRelayStatus::new(status);
150+
assert_eq!(relay.load(), RelayStatus::Pending);
151+
}
152+
153+
#[test]
154+
fn test_status_connecting() {
155+
let status = RelayStatus::Connecting;
156+
assert!(!status.is_initialized());
157+
assert!(!status.is_connected());
158+
assert!(!status.is_disconnected());
159+
assert!(!status.is_terminated());
160+
assert!(!status.is_banned());
161+
assert!(!status.can_connect());
162+
let relay = AtomicRelayStatus::new(status);
163+
assert_eq!(relay.load(), RelayStatus::Connecting);
164+
}
165+
166+
#[test]
167+
fn test_status_connected() {
168+
let status = RelayStatus::Connected;
169+
assert!(!status.is_initialized());
170+
assert!(status.is_connected());
171+
assert!(!status.is_disconnected());
172+
assert!(!status.is_terminated());
173+
assert!(!status.is_banned());
174+
assert!(!status.can_connect());
175+
let relay = AtomicRelayStatus::new(status);
176+
assert_eq!(relay.load(), RelayStatus::Connected);
177+
}
178+
179+
#[test]
180+
fn test_status_disconnected() {
181+
let status = RelayStatus::Disconnected;
182+
assert!(!status.is_initialized());
183+
assert!(!status.is_connected());
184+
assert!(status.is_disconnected());
185+
assert!(!status.is_terminated());
186+
assert!(!status.is_banned());
187+
assert!(!status.can_connect());
188+
let relay = AtomicRelayStatus::new(status);
189+
assert_eq!(relay.load(), RelayStatus::Disconnected);
190+
}
191+
192+
#[test]
193+
fn test_status_terminated() {
194+
let status = RelayStatus::Terminated;
195+
assert!(!status.is_initialized());
196+
assert!(!status.is_connected());
197+
assert!(status.is_disconnected());
198+
assert!(status.is_terminated());
199+
assert!(!status.is_banned());
200+
assert!(status.can_connect());
201+
let relay = AtomicRelayStatus::new(status);
202+
assert_eq!(relay.load(), RelayStatus::Terminated);
203+
}
204+
205+
#[test]
206+
fn test_status_banned() {
207+
let status = RelayStatus::Banned;
208+
assert!(!status.is_initialized());
209+
assert!(!status.is_connected());
210+
assert!(status.is_disconnected());
211+
assert!(!status.is_terminated());
212+
assert!(status.is_banned());
213+
assert!(!status.can_connect());
214+
let relay = AtomicRelayStatus::new(status);
215+
assert_eq!(relay.load(), RelayStatus::Banned);
216+
}
217+
}

0 commit comments

Comments
 (0)