blob: d0e011e9c40f0735a459a29eebd11814336979dd [file] [log] [blame]
// Copyright 2019 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.
#ifndef SRC_VIRTUALIZATION_TESTS_SOCKET_H_
#define SRC_VIRTUALIZATION_TESTS_SOCKET_H_
#include <lib/zx/socket.h>
#include <string>
class SocketInterface {
public:
SocketInterface() = default;
virtual ~SocketInterface() = default;
// Sends a message to the socket
//
// Blocks until the entire message is written to the socket, or the given
// timeout has occurred. A non-blocking send can be performed by setting
// deadline to ZX_TIME_INFINITE_PAST.
//
// If an error or timeout occurs, it is unspecified how much of "message"
// has been tranmitted to the socket.
virtual zx_status_t Send(zx::time deadline, const std::string& message) = 0;
// Read one or more bytes from the socket, putting the result in
// |result|.
//
// A non-blocking receive can be performed by setting deadline to
// ZX_TIME_INFINITE_PAST. |result| must always be non-null.
//
// Returns when one or more bytes has been received, or the given timeout has
// passed.
virtual zx_status_t Receive(zx::time deadline, std::string* result) = 0;
// Waits for the socket interface to be closed, or a |deadline| is reached.
virtual zx_status_t WaitForClosed(zx::time deadline) = 0;
};
class ZxSocket : public SocketInterface {
public:
explicit ZxSocket(zx::socket socket);
// |SocketInterface::Send|
zx_status_t Send(zx::time deadline, const std::string& message) override;
// |SocketInterface::Receive|
zx_status_t Receive(zx::time deadline, std::string* result) override;
// |SocketInterface::WaitForClosed|
zx_status_t WaitForClosed(zx::time deadline) override;
private:
zx::socket socket_;
};
// Receive all data currently waiting on the socket.
//
// This call is non-blocking: it will only receive data already waiting.
//
// If |result| is non-null, the data read from the socket is stored.
// Otherwise, it is discarded.
//
// Returns ZX_OK if at least one byte was received, otherwise the error
// returned from the socket.
zx_status_t DrainSocket(SocketInterface* socket, std::string* result);
#endif // SRC_VIRTUALIZATION_TESTS_SOCKET_H_