blob: a2dc05c1efba82d3e174746b02bca92689c115ac [file] [log] [blame]
// Copyright 2021 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.
#include <lib/fdio/unsafe.h>
#include <poll.h>
#include <unistd.h>
#include <thread>
#include <fbl/unique_fd.h>
#include <zxtest/zxtest.h>
#include "predicates.h"
TEST(Pipe, WaitBegin) {
int fds[2];
ASSERT_SUCCESS(pipe(fds));
fdio_t* io = fdio_unsafe_fd_to_io(fds[0]);
ASSERT_NE(io, nullptr);
constexpr zx_signals_t kExpectedPollInSignals =
ZX_SOCKET_READABLE | // Data is available to read
ZX_SOCKET_PEER_CLOSED | // Peer is closed, either data is readable or we've hit EOF
ZX_SOCKET_PEER_WRITE_DISABLED; // Peer can't write any more, either data is readable or
// we've hit EOF
// TODO(https://fxbug.dev/42123845): Understand why this does not include ZX_SOCKET_PEER_CLOSED.
constexpr zx_signals_t kExpectedPollOutSignals = ZX_SOCKET_WRITABLE | // Data can be written
ZX_SOCKET_WRITE_DISABLED; // Write is disabled
{
uint32_t events = 0;
zx_handle_t handle = ZX_HANDLE_INVALID;
zx_signals_t signals = 0;
fdio_unsafe_wait_begin(io, events, &handle, &signals);
EXPECT_EQ(signals, 0, "Actual signals 0x%x", signals);
}
{
uint32_t events = POLLIN;
zx_handle_t handle = ZX_HANDLE_INVALID;
zx_signals_t signals = 0;
fdio_unsafe_wait_begin(io, events, &handle, &signals);
EXPECT_EQ(signals, kExpectedPollInSignals, "Actual signals 0x%x", signals);
}
{
uint32_t events = POLLOUT;
zx_handle_t handle = ZX_HANDLE_INVALID;
zx_signals_t signals = 0;
fdio_unsafe_wait_begin(io, events, &handle, &signals);
EXPECT_EQ(signals, kExpectedPollOutSignals, "Actual signals 0x%x", signals);
}
{
uint32_t events = POLLIN | POLLOUT;
zx_handle_t handle = ZX_HANDLE_INVALID;
zx_signals_t signals = 0;
fdio_unsafe_wait_begin(io, events, &handle, &signals);
EXPECT_EQ(signals, kExpectedPollInSignals | kExpectedPollOutSignals, "Actual signals 0x%x",
signals);
}
{
uint32_t events = POLLPRI;
zx_handle_t handle = ZX_HANDLE_INVALID;
zx_signals_t signals = 0;
fdio_unsafe_wait_begin(io, events, &handle, &signals);
// POLLPRI is not supported for pipes.
EXPECT_EQ(signals, 0, "Actual signals 0x%x", signals);
}
fdio_unsafe_release(io);
}