// Copyright 2016 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 "peridot/lib/socket/socket_writer.h"

#include <utility>

#include <lib/fit/function.h>
#include <lib/gtest/test_loop_fixture.h>
#include <src/lib/fxl/macros.h>

#include "peridot/lib/socket/socket_drainer_client.h"
#include "peridot/lib/socket/socket_pair.h"

namespace socket {
namespace {

using SocketWriterTest = gtest::TestLoopFixture;

class StringClient : public SocketWriter::Client {
 public:
  explicit StringClient(std::string value) : value_(std::move(value)) {}

  void GetNext(size_t offset, size_t max_size,
               fit::function<void(fxl::StringView)> callback) override {
    fxl::StringView data = value_;
    callback(data.substr(offset, max_size));
  }

  void OnDataComplete() override { completed_ = true; }

  bool completed() { return completed_; }

 private:
  std::string value_;
  bool completed_ = false;
};

TEST_F(SocketWriterTest, WriteAndRead) {
  SocketPair socket;
  StringClient client("bazinga\n");
  SocketWriter writer(&client);
  writer.Start(std::move(socket.socket1));

  std::string value;
  auto drainer = std::make_unique<SocketDrainerClient>();
  drainer->Start(std::move(socket.socket2), [&value](const std::string& v) { value = v; });
  RunLoopUntilIdle();

  EXPECT_EQ("bazinga\n", value);
  EXPECT_TRUE(client.completed());
}

TEST_F(SocketWriterTest, ClientClosedTheirEnd) {
  SocketPair socket;
  StringClient client("bazinga\n");
  SocketWriter writer(&client);
  socket.socket2.reset();
  writer.Start(std::move(socket.socket1));
  EXPECT_TRUE(client.completed());
}

TEST_F(SocketWriterTest, StringSocketWriter) {
  SocketPair socket;
  StringSocketWriter* writer = new StringSocketWriter();
  writer->Start("bazinga\n", std::move(socket.socket1));

  std::string value;
  auto drainer = std::make_unique<SocketDrainerClient>();
  drainer->Start(std::move(socket.socket2), [&value](const std::string& v) { value = v; });
  RunLoopUntilIdle();

  EXPECT_EQ("bazinga\n", value);
}

}  // namespace
}  // namespace socket
