@@ -16,7 +16,7 @@ use crate::{Server, ServerBuilder, ServerHandle, ServerServiceFactory};
1616///
1717/// #[actix_rt::main]
1818/// async fn main() {
19- /// let srv = TestServer::with (|| fn_service(
19+ /// let srv = TestServer::start (|| fn_service(
2020/// |sock| async move {
2121/// println!("New connection: {:?}", sock);
2222/// Ok::<_, ()>(())
@@ -28,8 +28,8 @@ use crate::{Server, ServerBuilder, ServerHandle, ServerServiceFactory};
2828/// ```
2929pub struct TestServer ;
3030
31- /// Test server runtime
32- pub struct TestServerRuntime {
31+ /// Test server handle.
32+ pub struct TestServerHandle {
3333 addr : net:: SocketAddr ,
3434 host : String ,
3535 port : u16 ,
@@ -38,46 +38,26 @@ pub struct TestServerRuntime {
3838}
3939
4040impl TestServer {
41- /// Start new server with server builder.
42- pub fn start < F > ( mut factory : F ) -> TestServerRuntime
43- where
44- F : FnMut ( ServerBuilder ) -> ServerBuilder + Send + ' static ,
45- {
46- let ( tx, rx) = mpsc:: channel ( ) ;
47-
48- // run server in separate thread
49- let thread_handle = thread:: spawn ( move || {
50- System :: new ( ) . block_on ( async {
51- let server = factory ( Server :: build ( ) ) . workers ( 1 ) . disable_signals ( ) . run ( ) ;
52- tx. send ( server. handle ( ) ) . unwrap ( ) ;
53- server. await
54- } )
55- } ) ;
56-
57- let server_handle = rx. recv ( ) . unwrap ( ) ;
58-
59- TestServerRuntime {
60- addr : "127.0.0.1:0" . parse ( ) . unwrap ( ) ,
61- host : "127.0.0.1" . to_string ( ) ,
62- port : 0 ,
63- server_handle,
64- thread_handle : Some ( thread_handle) ,
65- }
41+ /// Start new `TestServer` using application factory and default server config.
42+ pub fn start ( factory : impl ServerServiceFactory < TcpStream > ) -> TestServerHandle {
43+ Self :: start_with_builder ( Server :: build ( ) , factory)
6644 }
6745
68- /// Start new test server with application factory.
69- pub fn with < F : ServerServiceFactory < TcpStream > > ( factory : F ) -> TestServerRuntime {
46+ /// Start new `TestServer` using application factory and server builder.
47+ pub fn start_with_builder (
48+ server_builder : ServerBuilder ,
49+ factory : impl ServerServiceFactory < TcpStream > ,
50+ ) -> TestServerHandle {
7051 let ( tx, rx) = mpsc:: channel ( ) ;
7152
7253 // run server in separate thread
7354 let thread_handle = thread:: spawn ( move || {
74- let sys = System :: new ( ) ;
75- let tcp = net:: TcpListener :: bind ( "127.0.0.1:0" ) . unwrap ( ) ;
76- let local_addr = tcp. local_addr ( ) . unwrap ( ) ;
55+ let lst = net:: TcpListener :: bind ( "127.0.0.1:0" ) . unwrap ( ) ;
56+ let local_addr = lst. local_addr ( ) . unwrap ( ) ;
7757
78- sys . block_on ( async {
79- let server = Server :: build ( )
80- . listen ( "test" , tcp , factory)
58+ System :: new ( ) . block_on ( async {
59+ let server = server_builder
60+ . listen ( "test" , lst , factory)
8161 . unwrap ( )
8262 . workers ( 1 )
8363 . disable_signals ( )
@@ -93,7 +73,7 @@ impl TestServer {
9373 let host = format ! ( "{}" , addr. ip( ) ) ;
9474 let port = addr. port ( ) ;
9575
96- TestServerRuntime {
76+ TestServerHandle {
9777 addr,
9878 host,
9979 port,
@@ -107,17 +87,19 @@ impl TestServer {
10787 use socket2:: { Domain , Protocol , Socket , Type } ;
10888
10989 let addr: net:: SocketAddr = "127.0.0.1:0" . parse ( ) . unwrap ( ) ;
110- let socket =
111- Socket :: new ( Domain :: for_address ( addr) , Type :: STREAM , Some ( Protocol :: TCP ) ) . unwrap ( ) ;
90+ let domain = Domain :: for_address ( addr) ;
91+ let socket = Socket :: new ( domain, Type :: STREAM , Some ( Protocol :: TCP ) ) . unwrap ( ) ;
92+
11293 socket. set_reuse_address ( true ) . unwrap ( ) ;
11394 socket. set_nonblocking ( true ) . unwrap ( ) ;
11495 socket. bind ( & addr. into ( ) ) . unwrap ( ) ;
11596 socket. listen ( 1024 ) . unwrap ( ) ;
97+
11698 net:: TcpListener :: from ( socket) . local_addr ( ) . unwrap ( )
11799 }
118100}
119101
120- impl TestServerRuntime {
102+ impl TestServerHandle {
121103 /// Test server host.
122104 pub fn host ( & self ) -> & str {
123105 & self . host
@@ -140,12 +122,12 @@ impl TestServerRuntime {
140122 }
141123
142124 /// Connect to server, returning a Tokio `TcpStream`.
143- pub fn connect ( & self ) -> std :: io:: Result < TcpStream > {
125+ pub fn connect ( & self ) -> io:: Result < TcpStream > {
144126 TcpStream :: from_std ( net:: TcpStream :: connect ( self . addr ) ?)
145127 }
146128}
147129
148- impl Drop for TestServerRuntime {
130+ impl Drop for TestServerHandle {
149131 fn drop ( & mut self ) {
150132 self . stop ( )
151133 }
@@ -158,8 +140,14 @@ mod tests {
158140 use super :: * ;
159141
160142 #[ tokio:: test]
161- async fn plain_tokio_runtime ( ) {
162- let srv = TestServer :: with ( || fn_service ( |_sock| async move { Ok :: < _ , ( ) > ( ( ) ) } ) ) ;
143+ async fn connect_in_tokio_runtime ( ) {
144+ let srv = TestServer :: start ( || fn_service ( |_sock| async move { Ok :: < _ , ( ) > ( ( ) ) } ) ) ;
145+ assert ! ( srv. connect( ) . is_ok( ) ) ;
146+ }
147+
148+ #[ actix_rt:: test]
149+ async fn connect_in_actix_runtime ( ) {
150+ let srv = TestServer :: start ( || fn_service ( |_sock| async move { Ok :: < _ , ( ) > ( ( ) ) } ) ) ;
163151 assert ! ( srv. connect( ) . is_ok( ) ) ;
164152 }
165153}
0 commit comments