// Copyright 2018 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 "echo_server_app.h"

#include <lib/gtest/test_loop_fixture.h>
#include <lib/sys/cpp/testing/component_context_provider.h>

namespace echo {
namespace testing {

using namespace fidl::examples::echo;

class EchoServerAppForTest : public EchoServerApp {
 public:
  // Expose injecting constructor so we can pass an instrumented Context
  EchoServerAppForTest(std::unique_ptr<sys::ComponentContext> context)
      : EchoServerApp(std::move(context), false) {}
};

class EchoServerAppTest : public gtest::TestLoopFixture {
 public:
  void SetUp() override {
    TestLoopFixture::SetUp();
    echoServerApp_.reset(new EchoServerAppForTest(provider_.TakeContext()));
  }

  void TearDown() override {
    echoServerApp_.reset();
    TestLoopFixture::TearDown();
  }

 protected:
  EchoPtr echo() {
    EchoPtr echo;
    provider_.ConnectToPublicService(echo.NewRequest());
    return echo;
  }

 private:
  std::unique_ptr<EchoServerAppForTest> echoServerApp_;
  sys::testing::ComponentContextProvider provider_;
};

// Answer "Hello World" with "Hello World"
TEST_F(EchoServerAppTest, EchoString_HelloWorld) {
  EchoPtr echo_ = echo();
  ::fidl::StringPtr message = "bogus";
  echo_->EchoString("Hello World!", [&](::fidl::StringPtr retval) { message = retval; });
  RunLoopUntilIdle();
  EXPECT_EQ("Hello World!", message);
}

// Answer "" with ""
TEST_F(EchoServerAppTest, EchoString_Empty) {
  EchoPtr echo_ = echo();
  fidl::StringPtr message = "bogus";
  echo_->EchoString("", [&](::fidl::StringPtr retval) { message = retval; });
  RunLoopUntilIdle();
  EXPECT_EQ("", message);
}

}  // namespace testing
}  // namespace echo
