// Copyright 2017 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 LIB_TEST_RUNNER_CPP_TEST_RUNNER_H_
#define LIB_TEST_RUNNER_CPP_TEST_RUNNER_H_

#include <memory>

#include <fuchsia/testing/runner/cpp/fidl.h>
#include <lib/async/cpp/task.h>

#include "lib/component/cpp/startup_context.h"
#include "lib/test_runner/cpp/scope.h"
#include "lib/test_runner/cpp/test_runner_store_impl.h"

using fuchsia::testing::runner::TestResult;
using fuchsia::testing::runner::TestRunner;

namespace test_runner {

class TestRunObserver {
 public:
  virtual void SendMessage(const std::string& test_id,
                           const std::string& operation,
                           const std::string& msg) = 0;
  virtual void Teardown(const std::string& test_id, bool success) = 0;
  virtual ~TestRunObserver();
};

class TestRunContext;

// Implements the TestRunner service which is available in the
// Environment of the test processes. Calls made to this service are
// forwarded to and handled by TestRunContext.
class TestRunnerImpl : public TestRunner {
 public:
  TestRunnerImpl(fidl::InterfaceRequest<TestRunner> request,
                 TestRunContext* test_run_context);

  const std::string& program_name() const;

  bool waiting_for_termination() const;

  // Will be called if this |TestRunner| is waiting for termination while
  // another one calls |Teardown|. If this is called then when this does
  // terminate it will call |Teardown|.
  void TeardownAfterTermination();

  // Indicates if there are test points that haven't been passed yet.
  bool TestPointsRemaining() { return remaining_test_points_ > 0; }

 private:
  // |TestRunner|
  void Identify(std::string program_name,
                IdentifyCallback callback) override;
  // |TestRunner|
  void ReportResult(TestResult result) override;
  // |TestRunner|
  void Fail(std::string log_message) override;
  // |TestRunner|
  void Done(DoneCallback callback) override;
  // |TestRunner|
  void Teardown(TeardownCallback callback) override;
  // |TestRunner|
  void WillTerminate(double withinSeconds) override;
  // |TestRunner|
  void SetTestPointCount(int64_t count) override;
  // |TestRunner|
  void PassTestPoint() override;

  fidl::Binding<TestRunner> binding_;
  TestRunContext* const test_run_context_;
  std::string program_name_ = "UNKNOWN";
  async::Task termination_task_;
  bool teardown_after_termination_ = false;
  int64_t remaining_test_points_ = -1;

  FXL_DISALLOW_COPY_AND_ASSIGN(TestRunnerImpl);
};

// TestRunContext represents a single run of a test program. Given a test
// program to run, it runs it in a new Environment and provides the
// environment a TestRunner service to report completion. When tests are done,
// their completion is reported back to TestRunObserver (which is responsible
// for deleting TestRunContext). If the child application stops without
// reporting anything, we declare the test a failure.
class TestRunContext {
 public:
  TestRunContext(std::shared_ptr<component::StartupContext> app_context,
                 TestRunObserver* connection, const std::string& test_id,
                 const std::string& url, const std::vector<std::string>& args);

  // Called from TestRunnerImpl, the actual implemention of |TestRunner|.
  void StopTrackingClient(TestRunnerImpl* client, bool crashed);
  void ReportResult(TestResult result);
  void Fail(const fidl::StringPtr& log_message);
  void Teardown(TestRunnerImpl* teardown_client);

 private:
  fuchsia::sys::ComponentControllerPtr child_controller_;
  std::unique_ptr<Scope> child_env_scope_;

  TestRunObserver* const test_runner_connection_;
  std::vector<std::unique_ptr<TestRunnerImpl>> test_runner_clients_;
  TestRunnerStoreImpl test_runner_store_;

  // This is a tag that we use to identify the test that was run. For now, it
  // helps distinguish between multiple test outputs to the device log.
  const std::string test_id_;
  bool success_;

  FXL_DISALLOW_COPY_AND_ASSIGN(TestRunContext);
};

}  // namespace test_runner

#endif  // LIB_TEST_RUNNER_CPP_TEST_RUNNER_H_
