net: add `UdpSocket::peek_sender()`
closes #5491

Update: amended to add `try_peek_from()` as discussed on Discord.

~The prerequesite addition to `socket2` has landed on their `v0.4.x` branch but, as of writing, has not been released yet. This will remain a draft until that is released, but the API and documentation is ready for review.~

Running Clippy as instructed by `CONTRIBUTING.md` gives the following error:  
```
> cargo +1.49.0 clippy --all --tests --all-features
warning: /home/abonander/rust/tokio/tokio-test/Cargo.toml: unused manifest key: package.rust-version
warning: /home/abonander/rust/tokio/tokio-macros/Cargo.toml: unused manifest key: package.rust-version
warning: /home/abonander/rust/tokio/tokio/Cargo.toml: unused manifest key: package.rust-version
warning: /home/abonander/rust/tokio/tokio-util/Cargo.toml: unused manifest key: package.rust-version
warning: /home/abonander/rust/tokio/tokio-stream/Cargo.toml: unused manifest key: package.rust-version
    Updating crates.io index
error: failed to select a version for the requirement `predicates = "=2.1.5"`
candidate versions found which didn't match: 2.1.1, 2.1.0, 2.0.3, ...
location searched: crates.io index
required by package `mockall v0.11.3`
    ... which is depended on by `tokio v1.25.0 (/home/abonander/rust/tokio/tokio)`
```

This is baffling because `predicates 2.1.5` definitely exists: https://crates.io/crates/predicates/2.1.5

<!--
Thank you for your Pull Request. Please provide a description above and review
the requirements below.

Bug fixes and new features should include tests.

Contributors guide: https://github.com/tokio-rs/tokio/blob/master/CONTRIBUTING.md

The contributors guide includes instructions for running rustfmt and building the
documentation, which requires special commands beyond `cargo fmt` and `cargo doc`.
-->

## Motivation

Discussed in #5491.

## Solution

Discussed in #5491.

**Is your feature request related to a problem? Please describe.**
For implementing a UDP-based gossip protocol, I would prefer not to require a separate connected socket per peer connection. While `recv_from()` and `send_to()` get me most of the way there, there's a piece of the puzzle missing.

When handling a datagram on a bound socket, it can be important to know the sender of the next datagram in the queue without consuming it, e.g. to know if we even want to read the datagram into application memory or not, or to call up application state for that particular peer such as a DTLS session. 

For DTLS specifically, the OpenSSL implementation provides its own read buffer per session, so we want to get the peer address of the datagram, call up the session, and then read the datagram into the DTLS read buffer, preferably without any redundant copies.

[`UdpSocket::peek_from()`](https://docs.rs/tokio/latest/tokio/net/struct.UdpSocket.html#method.peek_from) is _almost_ what we need, but the Windows-specific behavior is problematic: we're forced to provide a buffer large enough to read the whole datagram whether we actually want to yet or not, or else the sender information will be discarded due to the `WSAEMSGSIZE` error.

**Describe the solution you'd like**
[I experimented with directly calling `recvfrom()` on Windows](https://gist.github.com/abonander/f1a35cd91a8675a65546e051a0743e62) and found that it _does_ populate the `sockaddr` out-pointer even when it returns `WSAEMSGSIZE`, so I'd propose that `UdpSocket` gain a new method:

```rust
impl UdpSocket {
    /// This could/should also have a `poll_peek_sender()` and `try_peek_sender()` counterpart.
    pub async fn peek_sender(&self) -> std::io::Result<SocketAddr> {
        // ...
    }
}
```

For non-Windows platforms this can trivially be implemented in terms of `peek_from()`, but on Windows this should make a direct `recvfrom()` call, passing a zero-size buffer, setting the `MSG_PEEK` flag, and suppressing the `WSAEMSGSIZE` error.

Part of the purpose of opening this issue is to get feedback on _where_ this should live, since I understand that most of the I/O methods in Tokio invoke methods in Mio which in turn invoke their `std` counterparts. I would _prefer_ not to have to go through the process of championing an RFC because I simply don't have the time or energy to endure that process these days.

**Describe alternatives you've considered**
Ideally `peek_from()` could just suppress the `WSAEMSGSIZE` error in the name of consistency as that's a Windows-specific idiosyncrasy, but that would be up to `std::net::UdpSocket::peek_from()`, and it would be a behavior change.

I can just use `recv_from()`, read the datagram and get the sender every time, then copy the data into the DTLS read buffer if applicable, but that's a redundant copy which could be up to 64KiB in size _every datagram_. That's a potential vector for a denial-of-service attack; in practice our application limits datagrams to a more reasonable size just under the Ethernet MTU, but still a redundant copy of every datagram can add up if they're all 1+ KiB.

I _can_ just make the `recvfrom` call directly in my application, however that's suboptimal as it requires upholding a number of `unsafe` invariants. Anyone else implementing this themselves would be at risk of making any number of mistakes that could result in undefined or just wrong behavior. As noted on the Gist I actually forgot to convert the `port` value from big-endian, so even my first attempt had a pretty significant bug.

`socket2` is probably the most appropriate non-`std` place for this to live, but for convenience I would like to see it available in Tokio as well, as shuttling back and forth between `socket2::Socket` and `tokio::net::UdpSocket` is still potentially quite error-prone.

**Additional context**
I had previously spoken to @Noah-Kennedy on the Tokio Discord about this so I'd like his input here.

Proposal: `UdpSocket::peek_sender()`
diff --git a/tokio/Cargo.toml b/tokio/Cargo.toml
index ae64fd5cff7..0b4e011eff0 100644
--- a/tokio/Cargo.toml
+++ b/tokio/Cargo.toml
@@ -109,7 +109,7 @@ num_cpus = { version = "1.8.0", optional = true }
 parking_lot = { version = "0.12.0", optional = true }
 
 [target.'cfg(not(any(target_arch = "wasm32", target_arch = "wasm64")))'.dependencies]
-socket2 = { version = "0.4.4", optional = true, features = [ "all" ] }
+socket2 = { version = "0.4.9", optional = true, features = [ "all" ] }
 
 # Currently unstable. The API exposed by these features may be broken at any time.
 # Requires `--cfg tokio_unstable` to enable.
@@ -146,7 +146,7 @@ mockall = "0.11.1"
 async-stream = "0.3"
 
 [target.'cfg(not(any(target_arch = "wasm32", target_arch = "wasm64")))'.dev-dependencies]
-socket2 = "0.4"
+socket2 = "0.4.9"
 tempfile = "3.1.0"
 
 [target.'cfg(not(all(any(target_arch = "wasm32", target_arch = "wasm64"), target_os = "unknown")))'.dev-dependencies]
diff --git a/tokio/src/net/udp.rs b/tokio/src/net/udp.rs
index 213d9149dad..c2da3cac082 100644
--- a/tokio/src/net/udp.rs
+++ b/tokio/src/net/udp.rs
@@ -954,6 +954,15 @@ impl UdpSocket {
         /// When there is no pending data, `Err(io::ErrorKind::WouldBlock)` is
         /// returned. This function is usually paired with `readable()`.
         ///
+        /// # Notes
+        /// Note that the socket address **cannot** be implicitly trusted, because it is relatively
+        /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack].
+        /// Because UDP is stateless and does not validate the origin of a packet,
+        /// the attacker does not need to be able to intercept traffic in order to interfere.
+        /// It is important to be aware of this when designing your application-level protocol.
+        ///
+        /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection
+        ///
         /// # Examples
         ///
         /// ```no_run
@@ -1177,6 +1186,15 @@ impl UdpSocket {
     ///     Ok(())
     /// }
     /// ```
+    ///
+    /// # Notes
+    /// Note that the socket address **cannot** be implicitly trusted, because it is relatively
+    /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack].
+    /// Because UDP is stateless and does not validate the origin of a packet,
+    /// the attacker does not need to be able to intercept traffic in order to interfere.
+    /// It is important to be aware of this when designing your application-level protocol.
+    ///
+    /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection
     pub async fn recv_from(&self, buf: &mut [u8]) -> io::Result<(usize, SocketAddr)> {
         self.io
             .registration()
@@ -1201,6 +1219,15 @@ impl UdpSocket {
     /// # Errors
     ///
     /// This function may encounter any standard I/O error except `WouldBlock`.
+    ///
+    /// # Notes
+    /// Note that the socket address **cannot** be implicitly trusted, because it is relatively
+    /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack].
+    /// Because UDP is stateless and does not validate the origin of a packet,
+    /// the attacker does not need to be able to intercept traffic in order to interfere.
+    /// It is important to be aware of this when designing your application-level protocol.
+    ///
+    /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection
     pub fn poll_recv_from(
         &self,
         cx: &mut Context<'_>,
@@ -1233,6 +1260,16 @@ impl UdpSocket {
     /// When there is no pending data, `Err(io::ErrorKind::WouldBlock)` is
     /// returned. This function is usually paired with `readable()`.
     ///
+    /// # Notes
+    ///
+    /// Note that the socket address **cannot** be implicitly trusted, because it is relatively
+    /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack].
+    /// Because UDP is stateless and does not validate the origin of a packet,
+    /// the attacker does not need to be able to intercept traffic in order to interfere.
+    /// It is important to be aware of this when designing your application-level protocol.
+    ///
+    /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection
+    ///
     /// # Examples
     ///
     /// ```no_run
@@ -1331,6 +1368,17 @@ impl UdpSocket {
     /// Make sure to always use a sufficiently large buffer to hold the
     /// maximum UDP packet size, which can be up to 65536 bytes in size.
     ///
+    /// MacOS will return an error if you pass a zero-sized buffer.
+    ///
+    /// If you're merely interested in learning the sender of the data at the head of the queue,
+    /// try [`peek_sender`].
+    ///
+    /// Note that the socket address **cannot** be implicitly trusted, because it is relatively
+    /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack].
+    /// Because UDP is stateless and does not validate the origin of a packet,
+    /// the attacker does not need to be able to intercept traffic in order to interfere.
+    /// It is important to be aware of this when designing your application-level protocol.
+    ///
     /// # Examples
     ///
     /// ```no_run
@@ -1349,6 +1397,9 @@ impl UdpSocket {
     ///     Ok(())
     /// }
     /// ```
+    ///
+    /// [`peek_sender`]: method@Self::peek_sender
+    /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection
     pub async fn peek_from(&self, buf: &mut [u8]) -> io::Result<(usize, SocketAddr)> {
         self.io
             .registration()
@@ -1357,7 +1408,7 @@ impl UdpSocket {
     }
 
     /// Receives data from the socket, without removing it from the input queue.
-    /// On success, returns the number of bytes read.
+    /// On success, returns the sending address of the datagram.
     ///
     /// # Notes
     ///
@@ -1371,6 +1422,17 @@ impl UdpSocket {
     /// Make sure to always use a sufficiently large buffer to hold the
     /// maximum UDP packet size, which can be up to 65536 bytes in size.
     ///
+    /// MacOS will return an error if you pass a zero-sized buffer.
+    ///
+    /// If you're merely interested in learning the sender of the data at the head of the queue,
+    /// try [`poll_peek_sender`].
+    ///
+    /// Note that the socket address **cannot** be implicitly trusted, because it is relatively
+    /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack].
+    /// Because UDP is stateless and does not validate the origin of a packet,
+    /// the attacker does not need to be able to intercept traffic in order to interfere.
+    /// It is important to be aware of this when designing your application-level protocol.
+    ///
     /// # Return value
     ///
     /// The function returns:
@@ -1382,6 +1444,9 @@ impl UdpSocket {
     /// # Errors
     ///
     /// This function may encounter any standard I/O error except `WouldBlock`.
+    ///
+    /// [`poll_peek_sender`]: method@Self::poll_peek_sender
+    /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection
     pub fn poll_peek_from(
         &self,
         cx: &mut Context<'_>,
@@ -1404,6 +1469,117 @@ impl UdpSocket {
         Poll::Ready(Ok(addr))
     }
 
+    /// Tries to receive data on the socket without removing it from the input queue.
+    /// On success, returns the number of bytes read and the sending address of the
+    /// datagram.
+    ///
+    /// When there is no pending data, `Err(io::ErrorKind::WouldBlock)` is
+    /// returned. This function is usually paired with `readable()`.
+    ///
+    /// # Notes
+    ///
+    /// On Windows, if the data is larger than the buffer specified, the buffer
+    /// is filled with the first part of the data, and peek returns the error
+    /// WSAEMSGSIZE(10040). The excess data is lost.
+    /// Make sure to always use a sufficiently large buffer to hold the
+    /// maximum UDP packet size, which can be up to 65536 bytes in size.
+    ///
+    /// MacOS will return an error if you pass a zero-sized buffer.
+    ///
+    /// If you're merely interested in learning the sender of the data at the head of the queue,
+    /// try [`try_peek_sender`].
+    ///
+    /// Note that the socket address **cannot** be implicitly trusted, because it is relatively
+    /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack].
+    /// Because UDP is stateless and does not validate the origin of a packet,
+    /// the attacker does not need to be able to intercept traffic in order to interfere.
+    /// It is important to be aware of this when designing your application-level protocol.
+    ///
+    /// [`try_peek_sender`]: method@Self::try_peek_sender
+    /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection
+    pub fn try_peek_from(&self, buf: &mut [u8]) -> io::Result<(usize, SocketAddr)> {
+        self.io
+            .registration()
+            .try_io(Interest::READABLE, || self.io.peek_from(buf))
+    }
+
+    /// Retrieve the sender of the data at the head of the input queue, waiting if empty.
+    ///
+    /// This is equivalent to calling [`peek_from`] with a zero-sized buffer,
+    /// but suppresses the `WSAEMSGSIZE` error on Windows and the "invalid argument" error on macOS.
+    ///
+    /// Note that the socket address **cannot** be implicitly trusted, because it is relatively
+    /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack].
+    /// Because UDP is stateless and does not validate the origin of a packet,
+    /// the attacker does not need to be able to intercept traffic in order to interfere.
+    /// It is important to be aware of this when designing your application-level protocol.
+    ///
+    /// [`peek_from`]: method@Self::peek_from
+    /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection
+    pub async fn peek_sender(&self) -> io::Result<SocketAddr> {
+        self.io
+            .registration()
+            .async_io(Interest::READABLE, || self.peek_sender_inner())
+            .await
+    }
+
+    /// Retrieve the sender of the data at the head of the input queue,
+    /// scheduling a wakeup if empty.
+    ///
+    /// This is equivalent to calling [`poll_peek_from`] with a zero-sized buffer,
+    /// but suppresses the `WSAEMSGSIZE` error on Windows and the "invalid argument" error on macOS.
+    ///
+    /// # Notes
+    ///
+    /// Note that on multiple calls to a `poll_*` method in the recv direction, only the
+    /// `Waker` from the `Context` passed to the most recent call will be scheduled to
+    /// receive a wakeup.
+    ///
+    /// Note that the socket address **cannot** be implicitly trusted, because it is relatively
+    /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack].
+    /// Because UDP is stateless and does not validate the origin of a packet,
+    /// the attacker does not need to be able to intercept traffic in order to interfere.
+    /// It is important to be aware of this when designing your application-level protocol.
+    ///
+    /// [`poll_peek_from`]: method@Self::poll_peek_from
+    /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection
+    pub fn poll_peek_sender(&self, cx: &mut Context<'_>) -> Poll<io::Result<SocketAddr>> {
+        self.io
+            .registration()
+            .poll_read_io(cx, || self.peek_sender_inner())
+    }
+
+    /// Try to retrieve the sender of the data at the head of the input queue.
+    ///
+    /// When there is no pending data, `Err(io::ErrorKind::WouldBlock)` is
+    /// returned. This function is usually paired with `readable()`.
+    ///
+    /// Note that the socket address **cannot** be implicitly trusted, because it is relatively
+    /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack].
+    /// Because UDP is stateless and does not validate the origin of a packet,
+    /// the attacker does not need to be able to intercept traffic in order to interfere.
+    /// It is important to be aware of this when designing your application-level protocol.
+    ///
+    /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection
+    pub fn try_peek_sender(&self) -> io::Result<SocketAddr> {
+        self.io
+            .registration()
+            .try_io(Interest::READABLE, || self.peek_sender_inner())
+    }
+
+    #[inline]
+    fn peek_sender_inner(&self) -> io::Result<SocketAddr> {
+        self.io.try_io(|| {
+            self.as_socket()
+                .peek_sender()?
+                // May be `None` if the platform doesn't populate the sender for some reason.
+                // In testing, that only occurred on macOS if you pass a zero-sized buffer,
+                // but the implementation of `Socket::peek_sender()` covers that.
+                .as_socket()
+                .ok_or_else(|| io::Error::new(io::ErrorKind::Other, "sender not available"))
+        })
+    }
+
     /// Gets the value of the `SO_BROADCAST` option for this socket.
     ///
     /// For more information about this option, see [`set_broadcast`].

diff --git a/tokio/tests/udp.rs b/tokio/tests/udp.rs
index 2b6ab4d2ad2..6825ab8810d 100644
--- a/tokio/tests/udp.rs
+++ b/tokio/tests/udp.rs
@@ -106,6 +106,45 @@ async fn send_to_peek_from() -> std::io::Result<()> {
     Ok(())
 }
 
+#[tokio::test]
+async fn send_to_try_peek_from() -> std::io::Result<()> {
+    let sender = UdpSocket::bind("127.0.0.1:0").await?;
+    let receiver = UdpSocket::bind("127.0.0.1:0").await?;
+
+    let receiver_addr = receiver.local_addr()?;
+    poll_fn(|cx| sender.poll_send_to(cx, MSG, receiver_addr)).await?;
+
+    // peek
+    let mut recv_buf = [0u8; 32];
+
+    loop {
+        match receiver.try_peek_from(&mut recv_buf) {
+            Ok((n, addr)) => {
+                assert_eq!(&recv_buf[..n], MSG);
+                assert_eq!(addr, sender.local_addr()?);
+                break;
+            }
+            Err(e) if e.kind() == io::ErrorKind::WouldBlock => {
+                receiver.readable().await?;
+            }
+            Err(e) => return Err(e),
+        }
+    }
+
+    // peek
+    let mut recv_buf = [0u8; 32];
+    let (n, addr) = receiver.peek_from(&mut recv_buf).await?;
+    assert_eq!(&recv_buf[..n], MSG);
+    assert_eq!(addr, sender.local_addr()?);
+
+    let mut recv_buf = [0u8; 32];
+    let (n, addr) = receiver.recv_from(&mut recv_buf).await?;
+    assert_eq!(&recv_buf[..n], MSG);
+    assert_eq!(addr, sender.local_addr()?);
+
+    Ok(())
+}
+
 #[tokio::test]
 async fn send_to_peek_from_poll() -> std::io::Result<()> {
     let sender = UdpSocket::bind("127.0.0.1:0").await?;
@@ -134,6 +173,92 @@ async fn send_to_peek_from_poll() -> std::io::Result<()> {
     Ok(())
 }
 
+#[tokio::test]
+async fn peek_sender() -> std::io::Result<()> {
+    let sender = UdpSocket::bind("127.0.0.1:0").await?;
+    let receiver = UdpSocket::bind("127.0.0.1:0").await?;
+
+    let sender_addr = sender.local_addr()?;
+    let receiver_addr = receiver.local_addr()?;
+
+    let msg = b"Hello, world!";
+    sender.send_to(msg, receiver_addr).await?;
+
+    let peeked_sender = receiver.peek_sender().await?;
+    assert_eq!(peeked_sender, sender_addr);
+
+    // Assert that `peek_sender()` returns the right sender but
+    // doesn't remove from the receive queue.
+    let mut recv_buf = [0u8; 32];
+    let (read, received_sender) = receiver.recv_from(&mut recv_buf).await?;
+
+    assert_eq!(&recv_buf[..read], msg);
+    assert_eq!(received_sender, peeked_sender);
+
+    Ok(())
+}
+
+#[tokio::test]
+async fn poll_peek_sender() -> std::io::Result<()> {
+    let sender = UdpSocket::bind("127.0.0.1:0").await?;
+    let receiver = UdpSocket::bind("127.0.0.1:0").await?;
+
+    let sender_addr = sender.local_addr()?;
+    let receiver_addr = receiver.local_addr()?;
+
+    let msg = b"Hello, world!";
+    poll_fn(|cx| sender.poll_send_to(cx, msg, receiver_addr)).await?;
+
+    let peeked_sender = poll_fn(|cx| receiver.poll_peek_sender(cx)).await?;
+    assert_eq!(peeked_sender, sender_addr);
+
+    // Assert that `poll_peek_sender()` returns the right sender but
+    // doesn't remove from the receive queue.
+    let mut recv_buf = [0u8; 32];
+    let mut read = ReadBuf::new(&mut recv_buf);
+    let received_sender = poll_fn(|cx| receiver.poll_recv_from(cx, &mut read)).await?;
+
+    assert_eq!(read.filled(), msg);
+    assert_eq!(received_sender, peeked_sender);
+
+    Ok(())
+}
+
+#[tokio::test]
+async fn try_peek_sender() -> std::io::Result<()> {
+    let sender = UdpSocket::bind("127.0.0.1:0").await?;
+    let receiver = UdpSocket::bind("127.0.0.1:0").await?;
+
+    let sender_addr = sender.local_addr()?;
+    let receiver_addr = receiver.local_addr()?;
+
+    let msg = b"Hello, world!";
+    sender.send_to(msg, receiver_addr).await?;
+
+    let peeked_sender = loop {
+        match receiver.try_peek_sender() {
+            Ok(peeked_sender) => break peeked_sender,
+            Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => {
+                receiver.readable().await?;
+            }
+            Err(e) => return Err(e),
+        }
+    };
+
+    assert_eq!(peeked_sender, sender_addr);
+
+    // Assert that `try_peek_sender()` returns the right sender but
+    // didn't remove from the receive queue.
+    let mut recv_buf = [0u8; 32];
+    // We already peeked the sender so there must be data in the receive queue.
+    let (read, received_sender) = receiver.try_recv_from(&mut recv_buf).unwrap();
+
+    assert_eq!(&recv_buf[..read], msg);
+    assert_eq!(received_sender, peeked_sender);
+
+    Ok(())
+}
+
 #[tokio::test]
 async fn split() -> std::io::Result<()> {
     let socket = UdpSocket::bind("127.0.0.1:0").await?;

{"signal::unix::tests::into_c_int": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::rwlock::bounds": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "open_options_write": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "signal::reusable_box::test::test_different_futures": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "path_read_write": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "io::util::lines::tests::assert_unpin": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::semaphore_batch::cancel_acquire_releases_permits": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "open_options_custom_flags_linux": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "basic_write": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::semaphore_batch::try_acquire_one_available": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "signal::registry::tests::broadcast_returns_if_at_least_one_event_fired": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "pin": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::semaphore_batch::poll_acquire_many_unavailable": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::semaphore_batch::release_permits_at_drop": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "basic_read": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::time::wheel::level::test::test_slot_for": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::read_err_then_read_success": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "file_debug_fmt": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::incomplete_read_followed_by_flush": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "task::local::tests::local_current_thread_scheduler": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "process::test::no_kill_if_already_killed": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "remove": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::mpsc::block::assert_no_stack_overflow": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "read_file_from_unix_fd": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "process::imp::orphan::test::no_reap_if_no_signal_received": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::open_set_len_ok": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::semaphore_batch::close_semaphore_notifies_permit2": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::incomplete_partial_read_followed_by_write": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::open_set_len_err": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::read_with_smaller_buf": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::sync_all_ordered_after_write": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "util::slab::test::issue_3014": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::incomplete_read_followed_by_write": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "io::util::buf_reader::tests::assert_unpin": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::time::tests::poll_process_levels_targeted": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "open_options_create": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "unix_fd_is_valid": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::sync_data_ordered_after_write": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "util::linked_list::tests::push_pop_push_pop": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::time::tests::single_timer": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "process::imp::orphan::test::does_nothing_if_signal_could_not_be_registered": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "io::stdio_common::tests::test_pseudo_text": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "signal::unix::tests::signal_enable_error_on_forbidden_input": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::scheduler::multi_thread::queue::test_local_queue_capacity": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::notify::notify_clones_waker_before_lock": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::write_seek_flush_err": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "io::util::sink::tests::assert_unpin": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::semaphore_batch::poll_acquire_many_available": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "open_options_create_new": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::read_with_bigger_buf": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "open_options_truncate": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "signal::reusable_box::test::test_different_sizes": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "util::linked_list::tests::const_new": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::semaphore_batch::try_acquire_one_unavailable": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::flush_while_idle": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::scheduler::multi_thread::idle::test_state": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::semaphore_batch::try_acquire_many_available": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::tests::queue::steal_batch": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "process::imp::reap::test::drop_reaps_if_possible": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "canonicalize_root_dir_unix": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "write_into_std_immediate": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "io::util::buf_stream::tests::assert_unpin": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "process::test::kills_on_drop_if_specified": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "build_dir_mode_read_only": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::open_write": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::semaphore_batch::poll_acquire_one_zero_permits": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::tests::queue::fits_256": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "io::util::split::tests::assert_unpin": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "signal::unix::tests::from_c_int": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::read_twice_before_dispatch": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::task::core::header_lte_cache_line": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::coop::test::budgeting": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "basic_write_and_shutdown": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "copy": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "create_dir": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "io::util::repeat::tests::assert_unpin": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::write_seek_write_err": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::open_read": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "util::slab::test::insert_many": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "io::util::take::tests::assert_unpin": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "util::linked_list::tests::remove_by_address": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "util::slab::test::insert_remove": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "coop": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "process::imp::reap::test::drop_enqueues_orphan_if_wait_fails": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::tests::queue::stress1": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::semaphore_batch::poll_acquire_one_available": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::atomic_waker::basic_usage": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "test_symlink": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "io::util::buf_writer::tests::assert_unpin": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "open_options_append": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "process::test::no_kill_if_reaped": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "io::stdio_common::tests::test_splitter": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::write_read_flush_err": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::task::list::tests::test_id_not_broken": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "util::linked_list::tests::push_and_drain": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::notify::notify_waiters_handles_panicking_waker": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::time::wheel::test::test_level_for": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::write_write_err": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "signal::registry::tests::record_invalid_event_does_nothing": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::time::tests::reset_future": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "echo_server": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::semaphore_batch::close_semaphore_prevents_acquire": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "read_dir_entry_info": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "create_all": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "io::util::chain::tests::assert_unpin": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "process::imp::reap::test::kill": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::atomic_waker::wake_without_register": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "test_hard_link": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::write_read_write_err": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::mutex::bounds": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::incomplete_flush_followed_by_write": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "write_into_std": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::time::tests::change_waker": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "process::imp::reap::test::reaper": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::tests::queue::stress2": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "signal::registry::tests::smoke": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "io::util::empty::tests::assert_unpin": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "util::slab::test::insert_drop_reverse": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "util::slab::test::no_compaction_if_page_still_in_use": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "util::slab::test::compact_all": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::time::tests::poll_process_levels": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::notify::notify_simple": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::sync_data_err_ordered_after_write": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::atomic_waker::atomic_waker_panic_safe": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::notify::watch_test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "signal::reusable_box::test::test_zero_sized": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "write_to_clone": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::semaphore::bounds": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "compile_fail_full": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::busy_file_seek_error": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::semaphore_batch::poll_acquire_one_unavailable": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "process::test::no_kill_on_drop_by_default": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "signal::unix::tests::signal_enable_error_on_invalid_input": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "io::util::copy_buf::tests::assert_unpin": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "copy_permissions": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "process::imp::orphan::test::does_not_register_signal_if_queue_empty": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "process::imp::orphan::test::no_reap_if_signal_lock_held": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::write_twice_before_dispatch": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::io::scheduled_io::test_generations_assert_same": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::read_err": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::partial_read_set_len_ok": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "build_dir": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "read_inherent": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "read_file_from_std": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::write_with_buffer_larger_than_max": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::time::tests::drop_timer": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::sync_all_err_ordered_after_write": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::semaphore_batch::try_acquire_many_unavailable": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::read_with_buffer_larger_than_max": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::tests::task_combinations::test_combinations": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "process::imp::orphan::test::drain_attempts_a_single_reap_of_all_queued_orphans": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "rewind_seek_position": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::semaphore_batch::close_semaphore_notifies_permit1": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "task::local::tests::wakes_to_local_queue": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::tests::queue::overflow": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "open_with_open_options_and_read": {"run": "PASS", "test": "NONE", "fix": "PASS"}}
{"signal::unix::tests::into_c_int": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::rwlock::bounds": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "open_options_write": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "signal::reusable_box::test::test_different_futures": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "path_read_write": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "io::util::lines::tests::assert_unpin": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::semaphore_batch::cancel_acquire_releases_permits": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "open_options_custom_flags_linux": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "basic_write": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::semaphore_batch::try_acquire_one_available": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "signal::registry::tests::broadcast_returns_if_at_least_one_event_fired": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "pin": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::semaphore_batch::poll_acquire_many_unavailable": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::semaphore_batch::release_permits_at_drop": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "basic_read": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::time::wheel::level::test::test_slot_for": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::read_err_then_read_success": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "file_debug_fmt": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::incomplete_read_followed_by_flush": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "task::local::tests::local_current_thread_scheduler": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "process::test::no_kill_if_already_killed": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "remove": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::mpsc::block::assert_no_stack_overflow": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "read_file_from_unix_fd": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "process::imp::orphan::test::no_reap_if_no_signal_received": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::open_set_len_ok": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::semaphore_batch::close_semaphore_notifies_permit2": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::incomplete_partial_read_followed_by_write": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::open_set_len_err": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::read_with_smaller_buf": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::sync_all_ordered_after_write": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "util::slab::test::issue_3014": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::incomplete_read_followed_by_write": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "io::util::buf_reader::tests::assert_unpin": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::time::tests::poll_process_levels_targeted": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "open_options_create": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "unix_fd_is_valid": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::sync_data_ordered_after_write": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "util::linked_list::tests::push_pop_push_pop": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::time::tests::single_timer": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "process::imp::orphan::test::does_nothing_if_signal_could_not_be_registered": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "io::stdio_common::tests::test_pseudo_text": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "signal::unix::tests::signal_enable_error_on_forbidden_input": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::scheduler::multi_thread::queue::test_local_queue_capacity": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::notify::notify_clones_waker_before_lock": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::write_seek_flush_err": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "io::util::sink::tests::assert_unpin": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::semaphore_batch::poll_acquire_many_available": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "open_options_create_new": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::read_with_bigger_buf": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "open_options_truncate": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "signal::reusable_box::test::test_different_sizes": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "util::linked_list::tests::const_new": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::semaphore_batch::try_acquire_one_unavailable": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::flush_while_idle": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::scheduler::multi_thread::idle::test_state": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::semaphore_batch::try_acquire_many_available": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::tests::queue::steal_batch": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "process::imp::reap::test::drop_reaps_if_possible": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "canonicalize_root_dir_unix": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "write_into_std_immediate": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "io::util::buf_stream::tests::assert_unpin": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "process::test::kills_on_drop_if_specified": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "build_dir_mode_read_only": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::open_write": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::semaphore_batch::poll_acquire_one_zero_permits": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::tests::queue::fits_256": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "io::util::split::tests::assert_unpin": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "signal::unix::tests::from_c_int": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::read_twice_before_dispatch": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::task::core::header_lte_cache_line": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::coop::test::budgeting": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "basic_write_and_shutdown": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "copy": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "create_dir": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "io::util::repeat::tests::assert_unpin": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::write_seek_write_err": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::open_read": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "util::slab::test::insert_many": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "io::util::take::tests::assert_unpin": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "util::linked_list::tests::remove_by_address": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "util::slab::test::insert_remove": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "coop": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "process::imp::reap::test::drop_enqueues_orphan_if_wait_fails": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::tests::queue::stress1": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::semaphore_batch::poll_acquire_one_available": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::atomic_waker::basic_usage": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "test_symlink": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "io::util::buf_writer::tests::assert_unpin": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "open_options_append": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "process::test::no_kill_if_reaped": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "io::stdio_common::tests::test_splitter": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::write_read_flush_err": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::task::list::tests::test_id_not_broken": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "util::linked_list::tests::push_and_drain": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::notify::notify_waiters_handles_panicking_waker": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::time::wheel::test::test_level_for": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::write_write_err": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "signal::registry::tests::record_invalid_event_does_nothing": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::time::tests::reset_future": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "echo_server": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::semaphore_batch::close_semaphore_prevents_acquire": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "read_dir_entry_info": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "create_all": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "io::util::chain::tests::assert_unpin": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "process::imp::reap::test::kill": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::atomic_waker::wake_without_register": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "test_hard_link": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::write_read_write_err": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::mutex::bounds": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::incomplete_flush_followed_by_write": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "write_into_std": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::time::tests::change_waker": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "process::imp::reap::test::reaper": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::tests::queue::stress2": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "signal::registry::tests::smoke": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "io::util::empty::tests::assert_unpin": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "util::slab::test::insert_drop_reverse": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "util::slab::test::no_compaction_if_page_still_in_use": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "util::slab::test::compact_all": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::time::tests::poll_process_levels": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::notify::notify_simple": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::sync_data_err_ordered_after_write": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::atomic_waker::atomic_waker_panic_safe": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::notify::watch_test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "signal::reusable_box::test::test_zero_sized": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "write_to_clone": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::semaphore::bounds": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "compile_fail_full": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::busy_file_seek_error": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::semaphore_batch::poll_acquire_one_unavailable": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "process::test::no_kill_on_drop_by_default": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "signal::unix::tests::signal_enable_error_on_invalid_input": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "io::util::copy_buf::tests::assert_unpin": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "copy_permissions": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "process::imp::orphan::test::does_not_register_signal_if_queue_empty": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "process::imp::orphan::test::no_reap_if_signal_lock_held": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::write_twice_before_dispatch": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::io::scheduled_io::test_generations_assert_same": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::read_err": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::partial_read_set_len_ok": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "build_dir": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "read_inherent": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "read_file_from_std": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::write_with_buffer_larger_than_max": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::time::tests::drop_timer": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::sync_all_err_ordered_after_write": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::semaphore_batch::try_acquire_many_unavailable": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "fs::file::tests::read_with_buffer_larger_than_max": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::tests::task_combinations::test_combinations": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "process::imp::orphan::test::drain_attempts_a_single_reap_of_all_queued_orphans": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "rewind_seek_position": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "sync::tests::semaphore_batch::close_semaphore_notifies_permit1": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "task::local::tests::wakes_to_local_queue": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "runtime::tests::queue::overflow": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "open_with_open_options_and_read": {"run": "PASS", "test": "NONE", "fix": "PASS"}}
{"passed_count": 156, "failed_count": 1, "skipped_count": 0, "passed_tests": ["signal::unix::tests::into_c_int", "sync::rwlock::bounds", "open_options_write", "signal::reusable_box::test::test_different_futures", "path_read_write", "io::util::lines::tests::assert_unpin", "sync::tests::semaphore_batch::cancel_acquire_releases_permits", "open_options_custom_flags_linux", "basic_write", "sync::tests::semaphore_batch::try_acquire_one_available", "signal::registry::tests::broadcast_returns_if_at_least_one_event_fired", "pin", "sync::tests::semaphore_batch::poll_acquire_many_unavailable", "sync::tests::semaphore_batch::release_permits_at_drop", "basic_read", "runtime::time::wheel::level::test::test_slot_for", "fs::file::tests::read_err_then_read_success", "file_debug_fmt", "fs::file::tests::incomplete_read_followed_by_flush", "task::local::tests::local_current_thread_scheduler", "process::test::no_kill_if_already_killed", "remove", "sync::mpsc::block::assert_no_stack_overflow", "read_file_from_unix_fd", "process::imp::orphan::test::no_reap_if_no_signal_received", "fs::file::tests::open_set_len_ok", "sync::tests::semaphore_batch::close_semaphore_notifies_permit2", "fs::file::tests::incomplete_partial_read_followed_by_write", "fs::file::tests::open_set_len_err", "fs::file::tests::read_with_smaller_buf", "fs::file::tests::sync_all_ordered_after_write", "util::slab::test::issue_3014", "fs::file::tests::incomplete_read_followed_by_write", "io::util::buf_reader::tests::assert_unpin", "runtime::time::tests::poll_process_levels_targeted", "open_options_create", "unix_fd_is_valid", "fs::file::tests::sync_data_ordered_after_write", "util::linked_list::tests::push_pop_push_pop", "runtime::time::tests::single_timer", "process::imp::orphan::test::does_nothing_if_signal_could_not_be_registered", "io::stdio_common::tests::test_pseudo_text", "signal::unix::tests::signal_enable_error_on_forbidden_input", "runtime::scheduler::multi_thread::queue::test_local_queue_capacity", "sync::tests::notify::notify_clones_waker_before_lock", "fs::file::tests::write_seek_flush_err", "io::util::sink::tests::assert_unpin", "sync::tests::semaphore_batch::poll_acquire_many_available", "open_options_create_new", "fs::file::tests::read_with_bigger_buf", "open_options_truncate", "signal::reusable_box::test::test_different_sizes", "util::linked_list::tests::const_new", "sync::tests::semaphore_batch::try_acquire_one_unavailable", "fs::file::tests::flush_while_idle", "runtime::scheduler::multi_thread::idle::test_state", "sync::tests::semaphore_batch::try_acquire_many_available", "runtime::tests::queue::steal_batch", "process::imp::reap::test::drop_reaps_if_possible", "canonicalize_root_dir_unix", "write_into_std_immediate", "open_with_open_options_and_read", "io::util::buf_stream::tests::assert_unpin", "process::test::kills_on_drop_if_specified", "build_dir_mode_read_only", "fs::file::tests::open_write", "sync::tests::semaphore_batch::poll_acquire_one_zero_permits", "runtime::tests::queue::fits_256", "io::util::split::tests::assert_unpin", "signal::unix::tests::from_c_int", "fs::file::tests::read_twice_before_dispatch", "runtime::task::core::header_lte_cache_line", "runtime::coop::test::budgeting", "basic_write_and_shutdown", "copy", "create_dir", "io::util::repeat::tests::assert_unpin", "fs::file::tests::write_seek_write_err", "fs::file::tests::open_read", "util::slab::test::insert_many", "io::util::take::tests::assert_unpin", "util::linked_list::tests::remove_by_address", "util::slab::test::insert_remove", "coop", "process::imp::reap::test::drop_enqueues_orphan_if_wait_fails", "runtime::tests::queue::stress1", "sync::tests::semaphore_batch::poll_acquire_one_available", "sync::tests::atomic_waker::basic_usage", "test_symlink", "io::util::buf_writer::tests::assert_unpin", "open_options_append", "process::test::no_kill_if_reaped", "io::stdio_common::tests::test_splitter", "fs::file::tests::write_read_flush_err", "runtime::task::list::tests::test_id_not_broken", "util::linked_list::tests::push_and_drain", "sync::tests::notify::notify_waiters_handles_panicking_waker", "runtime::time::wheel::test::test_level_for", "fs::file::tests::write_write_err", "signal::registry::tests::record_invalid_event_does_nothing", "runtime::time::tests::reset_future", "echo_server", "sync::tests::semaphore_batch::close_semaphore_prevents_acquire", "read_dir_entry_info", "io::util::chain::tests::assert_unpin", "process::imp::reap::test::kill", "sync::tests::atomic_waker::wake_without_register", "test_hard_link", "fs::file::tests::write_read_write_err", "sync::mutex::bounds", "fs::file::tests::incomplete_flush_followed_by_write", "write_into_std", "runtime::time::tests::change_waker", "process::imp::reap::test::reaper", "runtime::tests::queue::stress2", "signal::registry::tests::smoke", "io::util::empty::tests::assert_unpin", "util::slab::test::insert_drop_reverse", "util::slab::test::no_compaction_if_page_still_in_use", "util::slab::test::compact_all", "runtime::time::tests::poll_process_levels", "sync::tests::notify::notify_simple", "fs::file::tests::sync_data_err_ordered_after_write", "sync::tests::atomic_waker::atomic_waker_panic_safe", "sync::tests::notify::watch_test", "signal::reusable_box::test::test_zero_sized", "write_to_clone", "sync::semaphore::bounds", "compile_fail_full", "fs::file::tests::busy_file_seek_error", "sync::tests::semaphore_batch::poll_acquire_one_unavailable", "process::test::no_kill_on_drop_by_default", "signal::unix::tests::signal_enable_error_on_invalid_input", "io::util::copy_buf::tests::assert_unpin", "copy_permissions", "process::imp::orphan::test::does_not_register_signal_if_queue_empty", "process::imp::orphan::test::no_reap_if_signal_lock_held", "fs::file::tests::write_twice_before_dispatch", "runtime::io::scheduled_io::test_generations_assert_same", "fs::file::tests::read_err", "fs::file::tests::partial_read_set_len_ok", "build_dir", "read_inherent", "read_file_from_std", "fs::file::tests::write_with_buffer_larger_than_max", "runtime::time::tests::drop_timer", "fs::file::tests::sync_all_err_ordered_after_write", "sync::tests::semaphore_batch::try_acquire_many_unavailable", "fs::file::tests::read_with_buffer_larger_than_max", "runtime::tests::task_combinations::test_combinations", "process::imp::orphan::test::drain_attempts_a_single_reap_of_all_queued_orphans", "rewind_seek_position", "sync::tests::semaphore_batch::close_semaphore_notifies_permit1", "task::local::tests::wakes_to_local_queue", "runtime::tests::queue::overflow", "create_all"], "failed_tests": ["open_options_mode"], "skipped_tests": []}
{"passed_count": 0, "failed_count": 0, "skipped_count": 0, "passed_tests": [], "failed_tests": [], "skipped_tests": []}
{"passed_count": 156, "failed_count": 1, "skipped_count": 0, "passed_tests": ["signal::unix::tests::into_c_int", "sync::rwlock::bounds", "open_options_write", "signal::reusable_box::test::test_different_futures", "path_read_write", "io::util::lines::tests::assert_unpin", "sync::tests::semaphore_batch::cancel_acquire_releases_permits", "open_options_custom_flags_linux", "basic_write", "sync::tests::semaphore_batch::try_acquire_one_available", "signal::registry::tests::broadcast_returns_if_at_least_one_event_fired", "pin", "sync::tests::semaphore_batch::poll_acquire_many_unavailable", "sync::tests::semaphore_batch::release_permits_at_drop", "basic_read", "runtime::time::wheel::level::test::test_slot_for", "fs::file::tests::read_err_then_read_success", "file_debug_fmt", "fs::file::tests::incomplete_read_followed_by_flush", "task::local::tests::local_current_thread_scheduler", "process::test::no_kill_if_already_killed", "remove", "sync::mpsc::block::assert_no_stack_overflow", "read_file_from_unix_fd", "process::imp::orphan::test::no_reap_if_no_signal_received", "fs::file::tests::open_set_len_ok", "sync::tests::semaphore_batch::close_semaphore_notifies_permit2", "fs::file::tests::incomplete_partial_read_followed_by_write", "fs::file::tests::open_set_len_err", "fs::file::tests::read_with_smaller_buf", "fs::file::tests::sync_all_ordered_after_write", "util::slab::test::issue_3014", "fs::file::tests::incomplete_read_followed_by_write", "io::util::buf_reader::tests::assert_unpin", "runtime::time::tests::poll_process_levels_targeted", "open_options_create", "unix_fd_is_valid", "fs::file::tests::sync_data_ordered_after_write", "util::linked_list::tests::push_pop_push_pop", "runtime::time::tests::single_timer", "process::imp::orphan::test::does_nothing_if_signal_could_not_be_registered", "io::stdio_common::tests::test_pseudo_text", "signal::unix::tests::signal_enable_error_on_forbidden_input", "runtime::scheduler::multi_thread::queue::test_local_queue_capacity", "fs::file::tests::write_seek_flush_err", "io::util::sink::tests::assert_unpin", "sync::tests::notify::notify_clones_waker_before_lock", "sync::tests::semaphore_batch::poll_acquire_many_available", "open_options_create_new", "fs::file::tests::read_with_bigger_buf", "open_options_truncate", "signal::reusable_box::test::test_different_sizes", "util::linked_list::tests::const_new", "sync::tests::semaphore_batch::try_acquire_one_unavailable", "fs::file::tests::flush_while_idle", "runtime::scheduler::multi_thread::idle::test_state", "sync::tests::semaphore_batch::try_acquire_many_available", "runtime::tests::queue::steal_batch", "process::imp::reap::test::drop_reaps_if_possible", "canonicalize_root_dir_unix", "write_into_std_immediate", "open_with_open_options_and_read", "io::util::buf_stream::tests::assert_unpin", "process::test::kills_on_drop_if_specified", "build_dir_mode_read_only", "fs::file::tests::open_write", "sync::tests::semaphore_batch::poll_acquire_one_zero_permits", "runtime::tests::queue::fits_256", "io::util::split::tests::assert_unpin", "signal::unix::tests::from_c_int", "fs::file::tests::read_twice_before_dispatch", "runtime::task::core::header_lte_cache_line", "runtime::coop::test::budgeting", "basic_write_and_shutdown", "copy", "create_dir", "io::util::repeat::tests::assert_unpin", "fs::file::tests::write_seek_write_err", "fs::file::tests::open_read", "util::slab::test::insert_many", "io::util::take::tests::assert_unpin", "util::linked_list::tests::remove_by_address", "util::slab::test::insert_remove", "coop", "process::imp::reap::test::drop_enqueues_orphan_if_wait_fails", "runtime::tests::queue::stress1", "sync::tests::semaphore_batch::poll_acquire_one_available", "sync::tests::atomic_waker::basic_usage", "test_symlink", "io::util::buf_writer::tests::assert_unpin", "open_options_append", "process::test::no_kill_if_reaped", "io::stdio_common::tests::test_splitter", "fs::file::tests::write_read_flush_err", "runtime::task::list::tests::test_id_not_broken", "util::linked_list::tests::push_and_drain", "sync::tests::notify::notify_waiters_handles_panicking_waker", "runtime::time::wheel::test::test_level_for", "fs::file::tests::write_write_err", "signal::registry::tests::record_invalid_event_does_nothing", "runtime::time::tests::reset_future", "echo_server", "sync::tests::semaphore_batch::close_semaphore_prevents_acquire", "read_dir_entry_info", "io::util::chain::tests::assert_unpin", "process::imp::reap::test::kill", "sync::tests::atomic_waker::wake_without_register", "test_hard_link", "fs::file::tests::write_read_write_err", "sync::mutex::bounds", "fs::file::tests::incomplete_flush_followed_by_write", "write_into_std", "runtime::time::tests::change_waker", "process::imp::reap::test::reaper", "runtime::tests::queue::stress2", "signal::registry::tests::smoke", "io::util::empty::tests::assert_unpin", "util::slab::test::insert_drop_reverse", "util::slab::test::no_compaction_if_page_still_in_use", "util::slab::test::compact_all", "runtime::time::tests::poll_process_levels", "sync::tests::notify::notify_simple", "fs::file::tests::sync_data_err_ordered_after_write", "sync::tests::atomic_waker::atomic_waker_panic_safe", "sync::tests::notify::watch_test", "signal::reusable_box::test::test_zero_sized", "write_to_clone", "sync::semaphore::bounds", "compile_fail_full", "fs::file::tests::busy_file_seek_error", "sync::tests::semaphore_batch::poll_acquire_one_unavailable", "process::test::no_kill_on_drop_by_default", "signal::unix::tests::signal_enable_error_on_invalid_input", "io::util::copy_buf::tests::assert_unpin", "copy_permissions", "process::imp::orphan::test::does_not_register_signal_if_queue_empty", "process::imp::orphan::test::no_reap_if_signal_lock_held", "fs::file::tests::write_twice_before_dispatch", "runtime::io::scheduled_io::test_generations_assert_same", "fs::file::tests::read_err", "fs::file::tests::partial_read_set_len_ok", "build_dir", "read_inherent", "read_file_from_std", "fs::file::tests::write_with_buffer_larger_than_max", "runtime::time::tests::drop_timer", "fs::file::tests::sync_all_err_ordered_after_write", "sync::tests::semaphore_batch::try_acquire_many_unavailable", "fs::file::tests::read_with_buffer_larger_than_max", "runtime::tests::task_combinations::test_combinations", "process::imp::orphan::test::drain_attempts_a_single_reap_of_all_queued_orphans", "rewind_seek_position", "sync::tests::semaphore_batch::close_semaphore_notifies_permit1", "task::local::tests::wakes_to_local_queue", "runtime::tests::queue::overflow", "create_all"], "failed_tests": ["open_options_mode"], "skipped_tests": []}