Skip to content

Commit bfe8cb1

Browse files
committed
system-tests: Prevent out of order prints to stderr
If we get a new tokio::io::stderr() every time the output can be scrambled because multiple threads try to output it at the same time. Therefore, only use one stderr instance to keep the output in order.
1 parent f50d6e8 commit bfe8cb1

File tree

1 file changed

+7
-3
lines changed

1 file changed

+7
-3
lines changed

system-tests/src/infra/read_asserter.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,18 @@ const DEFAULT_BUFFER_SIZE: usize = 1024;
77
pub struct ReadAsserter<Reader: AsyncRead + Unpin> {
88
reader: Reader,
99
buffer: SearchableBuffer,
10+
// It is important to only keep one stderr instance
11+
// Otherwise the output could be interlaved, especially with
12+
// write_all
13+
stderr: tokio::io::Stderr,
1014
}
1115

1216
impl<Reader: AsyncRead + Unpin> ReadAsserter<Reader> {
1317
pub fn new(reader: Reader) -> Self {
1418
Self {
1519
reader,
1620
buffer: SearchableBuffer::new(Vec::with_capacity(DEFAULT_BUFFER_SIZE)),
21+
stderr: tokio::io::stderr(),
1722
}
1823
}
1924

@@ -34,9 +39,8 @@ impl<Reader: AsyncRead + Unpin> ReadAsserter<Reader> {
3439
}
3540
}
3641

37-
async fn print_to_stderr(&self, data: &[u8]) {
38-
let mut stderr = tokio::io::stderr();
39-
stderr
42+
async fn print_to_stderr(&mut self, data: &[u8]) {
43+
self.stderr
4044
.write_all(data)
4145
.await
4246
.expect("Write to stderr must succeed.");

0 commit comments

Comments
 (0)