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

#include "src/lib/fxl/macros.h"

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;

 private:
  FXL_DISALLOW_COPY_AND_ASSIGN(SocketInterface);
};

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;

 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_
