mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-06-27 15:57:09 +00:00
agent: add test test_pipestream_shutdown
Make sure PipeStream::shutdown() do not close the inner fd. Signed-off-by: Tim Zhang <tim@hyper.sh>
This commit is contained in:
parent
4a2d437043
commit
ee6a590db1
@ -167,3 +167,37 @@ impl AsyncWrite for PipeStream {
|
|||||||
Poll::Ready(Ok(()))
|
Poll::Ready(Ok(()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
use nix::fcntl::OFlag;
|
||||||
|
use tokio::io::{AsyncReadExt, AsyncWriteExt};
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
// Shutdown should never close the inner fd.
|
||||||
|
async fn test_pipestream_shutdown() {
|
||||||
|
let (_, wfd1) = unistd::pipe2(OFlag::O_CLOEXEC).unwrap();
|
||||||
|
let mut writer1 = PipeStream::new(wfd1).unwrap();
|
||||||
|
|
||||||
|
// if close fd in shutdown, the fd will be reused
|
||||||
|
// and the test will failed
|
||||||
|
let _ = writer1.shutdown().await.unwrap();
|
||||||
|
|
||||||
|
// let _ = unistd::close(wfd1);
|
||||||
|
|
||||||
|
let (rfd2, wfd2) = unistd::pipe2(OFlag::O_CLOEXEC).unwrap(); // reuse fd number, rfd2 == wfd1
|
||||||
|
|
||||||
|
let mut reader2 = PipeStream::new(rfd2).unwrap();
|
||||||
|
let mut writer2 = PipeStream::new(wfd2).unwrap();
|
||||||
|
|
||||||
|
// deregister writer1, then reader2 which has the same fd will be deregistered from epoll
|
||||||
|
drop(writer1);
|
||||||
|
|
||||||
|
let _ = writer2.write(b"1").await;
|
||||||
|
|
||||||
|
let mut content = vec![0u8; 1];
|
||||||
|
// Will Block here if shutdown close the fd.
|
||||||
|
let _ = reader2.read(&mut content).await;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user