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

#include "src/bringup/bin/netsvc/payload-streamer.h"

#include <lib/async-loop/cpp/loop.h>
#include <lib/async-loop/default.h>
#include <zircon/errors.h>

#include <optional>

#include <zxtest/zxtest.h>

class PayloadStreamerTest : public zxtest::Test {
 protected:
  PayloadStreamerTest() : loop_(&kAsyncLoopConfigAttachToCurrentThread) {}

  static zx_status_t DefaultCallback(void* buf, size_t offset, size_t size, size_t* actual) {
    *actual = size;
    return ZX_OK;
  }

  void StartStreamer(netsvc::ReadCallback callback = DefaultCallback) {
    auto endpoints = fidl::CreateEndpoints<fuchsia_paver::PayloadStream>();
    ASSERT_OK(endpoints.status_value());

    client_.emplace(std::move(endpoints->client));
    payload_streamer_.emplace(std::move(endpoints->server), std::move(callback));
    loop_.StartThread("payload-streamer-test-loop");
  }

  async::Loop loop_;
  std::optional<fidl::WireSyncClient<fuchsia_paver::PayloadStream>> client_;
  std::optional<netsvc::PayloadStreamer> payload_streamer_;
};

TEST_F(PayloadStreamerTest, RegisterVmo) {
  StartStreamer();

  zx::vmo vmo;
  ASSERT_OK(zx::vmo::create(zx_system_get_page_size(), 0, &vmo));

  auto result = client_->RegisterVmo(std::move(vmo));
  ASSERT_OK(result.status());
  ASSERT_OK(result.value().status);
}

TEST_F(PayloadStreamerTest, RegisterVmoTwice) {
  StartStreamer();

  zx::vmo vmo;
  ASSERT_OK(zx::vmo::create(zx_system_get_page_size(), 0, &vmo));

  auto result = client_->RegisterVmo(std::move(vmo));
  ASSERT_OK(result.status());
  ASSERT_OK(result.value().status);

  ASSERT_OK(zx::vmo::create(zx_system_get_page_size(), 0, &vmo));

  auto result2 = client_->RegisterVmo(std::move(vmo));
  ASSERT_OK(result2.status());
  ASSERT_EQ(result2.value().status, ZX_ERR_ALREADY_BOUND);
}

TEST_F(PayloadStreamerTest, ReadData) {
  StartStreamer();

  zx::vmo vmo;
  ASSERT_OK(zx::vmo::create(zx_system_get_page_size(), 0, &vmo));

  auto result = client_->RegisterVmo(std::move(vmo));
  ASSERT_OK(result.status());
  ASSERT_OK(result.value().status);

  auto result2 = client_->ReadData();
  ASSERT_OK(result2.status());
  ASSERT_TRUE(result2.value().result.is_info());
  ASSERT_EQ(result2.value().result.info().offset, 0);
  ASSERT_EQ(result2.value().result.info().size, zx_system_get_page_size());
}

TEST_F(PayloadStreamerTest, ReadDataWithoutRegisterVmo) {
  StartStreamer();

  auto result = client_->ReadData();
  ASSERT_OK(result.status());
  ASSERT_TRUE(result.value().result.is_err());
  ASSERT_NE(result.value().result.err(), ZX_OK);
}

TEST_F(PayloadStreamerTest, ReadDataHalfFull) {
  StartStreamer([](void* buf, size_t offset, size_t size, size_t* actual) {
    *actual = size / 2;
    return ZX_OK;
  });

  zx::vmo vmo;
  ASSERT_OK(zx::vmo::create(zx_system_get_page_size(), 0, &vmo));

  auto result = client_->RegisterVmo(std::move(vmo));
  ASSERT_OK(result.status());

  auto result2 = client_->ReadData();
  ASSERT_OK(result2.status());
  ASSERT_TRUE(result2.value().result.is_info());
  ASSERT_EQ(result2.value().result.info().offset, 0);
  ASSERT_EQ(result2.value().result.info().size, zx_system_get_page_size() / 2);
}

TEST_F(PayloadStreamerTest, ReadEof) {
  StartStreamer([](void* buf, size_t offset, size_t size, size_t* actual) {
    *actual = 0;
    return ZX_OK;
  });

  zx::vmo vmo;
  ASSERT_OK(zx::vmo::create(zx_system_get_page_size(), 0, &vmo));

  auto result = client_->RegisterVmo(std::move(vmo));
  ASSERT_OK(result.status());
  ASSERT_OK(result.value().status);

  auto result2 = client_->ReadData();
  ASSERT_OK(result2.status());
  ASSERT_TRUE(result2.value().result.is_eof());
}

TEST_F(PayloadStreamerTest, ReadFailure) {
  StartStreamer(
      [](void* buf, size_t offset, size_t size, size_t* actual) { return ZX_ERR_INTERNAL; });

  zx::vmo vmo;
  ASSERT_OK(zx::vmo::create(zx_system_get_page_size(), 0, &vmo));

  auto result = client_->RegisterVmo(std::move(vmo));
  ASSERT_OK(result.status());
  ASSERT_OK(result.value().status);

  auto result2 = client_->ReadData();
  ASSERT_OK(result2.status());
  ASSERT_TRUE(result2.value().result.is_err());
  ASSERT_NE(result2.value().result.err(), ZX_OK);
}
