blob: 34a86399e3ae079d6e5cf23d2f7507fa596e2c83 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#![cfg(test)]
use {
fidl::endpoints::{ControlHandle as _, Responder as _},
fidl_fuchsia_posix_socket as fposix_socket, fuchsia_async as fasync,
fuchsia_zircon::{self as zx, HandleBased as _},
futures::stream::StreamExt as _,
tcp_stream_ext::TcpStreamExt as _,
};
const TCP_USER_TIMEOUT_OPTION_VALUE: i32 = -13;
fn with_tcp_stream(f: impl FnOnce(std::net::TcpStream) -> ()) {
let (client, server) = fidl::endpoints::create_endpoints::<fposix_socket::StreamSocketMarker>();
// fdio::create_fd isn't async, so we need a dedicated thread for FIDL dispatch.
let handle = std::thread::spawn(|| {
fasync::LocalExecutor::new().run_singlethreaded(
server.into_stream().expect("endpoint into stream").for_each(move |request| {
futures::future::ready(match request.expect("stream socket request stream") {
fposix_socket::StreamSocketRequest::Close { responder } => {
let () = responder.control_handle().shutdown();
let () = responder.send(Ok(())).expect("send Close response");
}
fposix_socket::StreamSocketRequest::Query { responder } => {
let () = responder
.send(fposix_socket::STREAM_SOCKET_PROTOCOL_NAME.as_bytes())
.expect("send Query response");
}
fposix_socket::StreamSocketRequest::Describe { responder } => {
let (s0, _s1) = zx::Socket::create_stream();
let () = responder
.send(fposix_socket::StreamSocketDescribeResponse {
socket: Some(s0),
..Default::default()
})
.expect("send Describe response");
}
fposix_socket::StreamSocketRequest::GetTcpUserTimeout { responder } => {
let () = responder
.send(Ok(TCP_USER_TIMEOUT_OPTION_VALUE as u32))
.expect("send TcpUserTimeout response");
}
request => panic!("unhandled StreamSocketRequest: {:?}", request),
})
}),
)
});
let () = f(fdio::create_fd(client.into_handle()).expect("endpoint into handle"));
handle.join().expect("thread join")
}
#[test]
fn user_timeout_errors_on_negative_duration() {
with_tcp_stream(|stream| {
assert_matches::assert_matches!(
stream.user_timeout(),
Err(tcp_stream_ext::Error::NegativeDuration(TCP_USER_TIMEOUT_OPTION_VALUE))
)
})
}