From 81fdafcdfb31be5dba1fce14a077e12190670428 Mon Sep 17 00:00:00 2001 From: Miroslav Zoricak <1315417+mirosval@users.noreply.github.com> Date: Tue, 15 Apr 2025 09:07:19 +0200 Subject: [PATCH 1/2] Make MockServer send With custom test runners, it's necessary to be able to use MockServer in a threaded setting, which is not possible as it is not `Send`. It's not `Send`, because it's using `OnceCell` which is not `Send` and it's using the `ThreadRng` which is also not `Send`. This PR replaces these with their equivalent versions that are `Send`. Additionally it adds a small test ensuring that `MockServer` remains `Send` in the future. Signed-off-by: Miroslav Zoricak <1315417+mirosval@users.noreply.github.com> --- mocktail/src/server.rs | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/mocktail/src/server.rs b/mocktail/src/server.rs index d76ed91..139168c 100644 --- a/mocktail/src/server.rs +++ b/mocktail/src/server.rs @@ -1,8 +1,7 @@ //! Mock server use std::{ - cell::OnceCell, net::{IpAddr, Ipv4Addr, SocketAddr, TcpStream}, - sync::{Arc, RwLock, RwLockReadGuard, RwLockWriteGuard}, + sync::{Arc, RwLock, OnceLock, RwLockReadGuard, RwLockWriteGuard}, time::Duration, }; @@ -12,7 +11,8 @@ use hyper_util::{ rt::{TokioExecutor, TokioIo}, server::conn, }; -use rand::Rng; +use rand::{Rng, SeedableRng}; +use rand::rngs::SmallRng; use tokio::net::TcpListener; use tracing::{debug, error, info}; use url::Url; @@ -29,8 +29,8 @@ use crate::{ pub struct MockServer { name: &'static str, kind: ServerKind, - addr: OnceCell, - base_url: OnceCell, + addr: OnceLock, + base_url: OnceLock, state: Arc, config: MockServerConfig, } @@ -41,8 +41,8 @@ impl MockServer { Self { name, kind: ServerKind::Http, - addr: OnceCell::new(), - base_url: OnceCell::new(), + addr: OnceLock::new(), + base_url: OnceLock::new(), state: Arc::new(MockServerState::default()), config: MockServerConfig::default(), } @@ -72,7 +72,7 @@ impl MockServer { } let mut counter = 0; - let mut rng = rand::rng(); + let mut rng = SmallRng::from_os_rng(); let listener = loop { let port: u16 = @@ -285,3 +285,14 @@ impl Default for MockServerConfig { } } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_mock_server_send() { + fn is_send() {} + is_send::(); + } +} From bb91c4ffec3e4cdc00fd7f014ca19ab8b53e3a3b Mon Sep 17 00:00:00 2001 From: Miroslav Zoricak <1315417+mirosval@users.noreply.github.com> Date: Wed, 16 Apr 2025 19:37:30 +0200 Subject: [PATCH 2/2] fmt Signed-off-by: Miroslav Zoricak <1315417+mirosval@users.noreply.github.com> --- mocktail/src/server.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mocktail/src/server.rs b/mocktail/src/server.rs index 139168c..3db0c19 100644 --- a/mocktail/src/server.rs +++ b/mocktail/src/server.rs @@ -1,7 +1,7 @@ //! Mock server use std::{ net::{IpAddr, Ipv4Addr, SocketAddr, TcpStream}, - sync::{Arc, RwLock, OnceLock, RwLockReadGuard, RwLockWriteGuard}, + sync::{Arc, OnceLock, RwLock, RwLockReadGuard, RwLockWriteGuard}, time::Duration, }; @@ -11,8 +11,8 @@ use hyper_util::{ rt::{TokioExecutor, TokioIo}, server::conn, }; -use rand::{Rng, SeedableRng}; use rand::rngs::SmallRng; +use rand::{Rng, SeedableRng}; use tokio::net::TcpListener; use tracing::{debug, error, info}; use url::Url;