Skip to content

Commit a5a57a4

Browse files
committed
test(tedge-p11-server): simplify unit tests
Signed-off-by: Marcel Guzik <marcel.guzik@cumulocity.com>
1 parent bf9cb22 commit a5a57a4

File tree

2 files changed

+59
-45
lines changed

2 files changed

+59
-45
lines changed

crates/extensions/tedge-p11-server/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ tokio = { workspace = true, features = [
2929
"rt-multi-thread",
3030
"signal",
3131
"net",
32+
"io-util",
3233
] }
3334
toml.workspace = true
3435
tracing.workspace = true

crates/extensions/tedge-p11-server/src/proxy/server.rs

Lines changed: 58 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)