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

#ifndef GARNET_EXAMPLES_TESTING_TEST_WITH_ENVIRONMENT_FAKE_ECHO_H_
#define GARNET_EXAMPLES_TESTING_TEST_WITH_ENVIRONMENT_FAKE_ECHO_H_

#include <fidl/examples/echo/cpp/fidl.h>

#include "lib/fidl/cpp/binding_set.h"

namespace echo2 {
namespace testing {

using fidl::examples::echo::Echo;

// Fake server, which the client under test will be used against
class FakeEcho : public Echo {
 public:
  fidl::InterfaceRequestHandler<Echo> GetHandler() {
    return bindings_.GetHandler(this);
  }

  // Fake implementation of server-side logic
  void EchoString(fidl::StringPtr value, EchoStringCallback callback) {
    callback(answer_);
  }

  void SetAnswer(fidl::StringPtr answer) { answer_ = answer; }

 private:
  fidl::BindingSet<Echo> bindings_;
  fidl::StringPtr answer_;
};

}  // namespace testing
}  // namespace echo2

#endif  // GARNET_EXAMPLES_TESTING_TEST_WITH_ENVIRONMENT_FAKE_ECHO_H_
