| // 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_ |