@@ -139,9 +139,10 @@ mod tests {
139139 use crate :: pkcs11;
140140 use crate :: proxy:: frame:: Frame ;
141141 use crate :: service:: * ;
142- use std:: io:: Read ;
143142 use std:: os:: unix:: net:: UnixStream ;
144143 use std:: time:: Duration ;
144+ use tokio:: io:: AsyncReadExt as _;
145+ use tokio:: io:: AsyncWriteExt as _;
145146
146147 const SCHEME : pkcs11:: SigScheme = pkcs11:: SigScheme :: EcdsaNistp256Sha256 ;
147148 const SIGNATURE : [ u8 ; 2 ] = [ 0x21 , 0x37 ] ;
@@ -180,15 +181,7 @@ mod tests {
180181 /// connection, framing, serialization, but not PKCS#11 layer itself.
181182 #[ tokio:: test]
182183 async fn server_works_with_client ( ) {
183- let service = TestSigningService ;
184- let server = TedgeP11Server :: new ( service) . unwrap ( ) ;
185- let tmpdir = tempfile:: tempdir ( ) . unwrap ( ) ;
186- let socket_path = tmpdir. path ( ) . join ( "test_socket.sock" ) ;
187- let listener = UnixListener :: bind ( & socket_path) . unwrap ( ) ;
188-
189- tokio:: spawn ( async move { server. serve ( listener) . await } ) ;
190- // wait until the server calls accept()
191- tokio:: time:: sleep ( Duration :: from_millis ( 2 ) ) . await ;
184+ let ( socket_path, _s) = setup_server ( ) . await ;
192185
193186 tokio:: task:: spawn_blocking ( move || {
194187 let client = TedgeP11Client :: with_ready_check ( socket_path. into ( ) ) ;
@@ -204,53 +197,29 @@ mod tests {
204197
205198 #[ tokio:: test]
206199 async fn server_responds_with_error_to_invalid_request ( ) {
207- let service = TestSigningService ;
208- let server = TedgeP11Server :: new ( service) . unwrap ( ) ;
209- let tmpdir = tempfile:: tempdir ( ) . unwrap ( ) ;
210- let socket_path = tmpdir. path ( ) . join ( "test_socket.sock" ) ;
211- let listener = UnixListener :: bind ( & socket_path) . unwrap ( ) ;
212-
213- tokio:: spawn ( async move { server. serve ( listener) . await } ) ;
214- // wait until the server calls accept()
215- tokio:: time:: sleep ( Duration :: from_millis ( 2 ) ) . await ;
200+ let ( socket_path, _s) = setup_server ( ) . await ;
216201
217202 let response = tokio:: task:: spawn_blocking ( move || {
218- let mut client_connection = Connection :: new ( UnixStream :: connect ( socket_path) . unwrap ( ) ) ;
219- client_connection
203+ let mut client = Connection :: new ( UnixStream :: connect ( socket_path) . unwrap ( ) ) ;
204+ client
220205 . write_frame ( & Frame1 :: SignResponse ( SignResponse ( vec ! [ ] ) ) )
221206 . unwrap ( ) ;
222- client_connection . read_frame ( ) . unwrap ( )
207+ client . read_frame ( ) . unwrap ( )
223208 } )
224209 . await
225210 . unwrap ( ) ;
226- assert ! ( matches!( response, Frame1 :: Error ( _) ) ) ;
211+ let Frame1 :: Error ( ProtocolError ( err_msg) ) = response else {
212+ panic ! ( "should be error" ) ;
213+ } ;
214+ assert_eq ! ( err_msg. as_str( ) , "invalid request" ) ;
227215 }
228216
229217 #[ tokio:: test]
230218 async fn server_responds_with_error_to_garbage ( ) {
231- use std:: io:: Write as _;
232-
233- let service = TestSigningService ;
234- let server = TedgeP11Server :: new ( service) . unwrap ( ) ;
235- let tmpdir = tempfile:: tempdir ( ) . unwrap ( ) ;
236- let socket_path = tmpdir. path ( ) . join ( "test_socket.sock" ) ;
237- let listener = UnixListener :: bind ( & socket_path) . unwrap ( ) ;
238-
239- tokio:: spawn ( async move { server. serve ( listener) . await } ) ;
240- // wait until the server calls accept()
241- tokio:: time:: sleep ( Duration :: from_millis ( 2 ) ) . await ;
219+ let ( mut client, _s) = setup_test ( ) . await ;
242220
243- // the reader should exit
244- let response = tokio:: task:: spawn_blocking ( move || {
245- let mut stream = UnixStream :: connect ( socket_path) . unwrap ( ) ;
246- write ! ( stream, "garbage" ) . unwrap ( ) ;
247- stream. shutdown ( std:: net:: Shutdown :: Write ) . unwrap ( ) ;
248- let mut response = Vec :: new ( ) ;
249- stream. read_to_end ( & mut response) . unwrap ( ) ;
250- response
251- } )
252- . await
253- . unwrap ( ) ;
221+ client. write_and_close ( "garbage" . as_bytes ( ) ) . await ;
222+ let response = client. read ( ) . await ;
254223
255224 let response: Frame = postcard:: from_bytes ( & response) . unwrap ( ) ;
256225 let Frame :: Version1 ( Frame1 :: Error ( ProtocolError ( err_msg) ) ) = response else {
@@ -262,4 +231,48 @@ mod tests {
262231 "read: Failed to parse the received frame: Serde Deserialization Error"
263232 ) ;
264233 }
234+
235+ async fn setup_test ( ) -> ( TestClient , tokio:: task:: JoinHandle < anyhow:: Result < ( ) > > ) {
236+ let ( socket_path, server) = setup_server ( ) . await ;
237+
238+ let client_socket = TestClient ( tokio:: net:: UnixStream :: connect ( socket_path) . await . unwrap ( ) ) ;
239+ ( client_socket, server)
240+ }
241+
242+ async fn setup_server ( ) -> (
243+ std:: path:: PathBuf ,
244+ tokio:: task:: JoinHandle < Result < ( ) , anyhow:: Error > > ,
245+ ) {
246+ let tmpdir = tempfile:: tempdir ( ) . unwrap ( ) ;
247+ let server = TedgeP11Server :: new ( TestSigningService ) . unwrap ( ) ;
248+ let socket_path = tmpdir. path ( ) . join ( "test_socket.sock" ) ;
249+ let listener = UnixListener :: bind ( & socket_path) . unwrap ( ) ;
250+
251+ let server = tokio:: spawn ( async move {
252+ let _tmpdir = tmpdir; // keep tmpdir alive until the server is done
253+ server. serve ( listener) . await . unwrap ( ) ;
254+ Ok ( ( ) )
255+ } ) ;
256+
257+ // wait until the server calls accept()
258+ tokio:: time:: sleep ( Duration :: from_millis ( 100 ) ) . await ;
259+
260+ ( socket_path, server)
261+ }
262+
263+ struct TestClient ( tokio:: net:: UnixStream ) ;
264+
265+ impl TestClient {
266+ async fn write_and_close ( & mut self , bytes : & [ u8 ] ) {
267+ self . 0 . write_all ( bytes) . await . unwrap ( ) ;
268+ self . 0 . flush ( ) . await . unwrap ( ) ;
269+ self . 0 . shutdown ( ) . await . unwrap ( ) ;
270+ }
271+
272+ async fn read ( & mut self ) -> Vec < u8 > {
273+ let mut bytes = Vec :: new ( ) ;
274+ self . 0 . read_to_end ( & mut bytes) . await . unwrap ( ) ;
275+ bytes
276+ }
277+ }
265278}
0 commit comments