// Copyright 2018 The Chromium OS 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 DIAGNOSTICS_DIAGNOSTICSD_FAKE_BROWSER_H_
#define DIAGNOSTICS_DIAGNOSTICSD_FAKE_BROWSER_H_

#include <string>

#include <base/callback.h>
#include <base/macros.h>
#include <dbus/mock_exported_object.h>
#include <mojo/public/cpp/bindings/binding.h>

#include "diagnostics/diagnosticsd/mock_mojom_diagnosticsd_client.h"
#include "diagnostics/diagnosticsd/mojo_test_utils.h"
#include "mojo/diagnosticsd.mojom.h"

namespace diagnostics {

// Helper class that allows to test communication between the browser and the
// tested code of the diagnosticsd daemon.
class FakeBrowser final {
 public:
  using DBusMethodCallCallback = dbus::ExportedObject::MethodCallCallback;

  using MojomDiagnosticsdClient =
      chromeos::diagnosticsd::mojom::DiagnosticsdClient;
  using MojomDiagnosticsdClientPtr =
      chromeos::diagnosticsd::mojom::DiagnosticsdClientPtr;
  using MojomDiagnosticsdServicePtr =
      chromeos::diagnosticsd::mojom::DiagnosticsdServicePtr;
  using MojomDiagnosticsdServiceFactoryPtr =
      chromeos::diagnosticsd::mojom::DiagnosticsdServiceFactoryPtr;

  // |diagnosticsd_service_factory_ptr| is a pointer to the tested
  // DiagnosticsdServiceFactory instance.
  // |bootstrap_mojo_connection_dbus_method| is a fake substitute for the
  // BootstrapMojoConnection() D-Bus method.
  FakeBrowser(
      MojomDiagnosticsdServiceFactoryPtr* diagnosticsd_service_factory_ptr,
      DBusMethodCallCallback bootstrap_mojo_connection_dbus_method);
  ~FakeBrowser();

  // Returns a mock DiagnosticsdClient instance, whose methods are invoked when
  // FakeBrowser receives incoming Mojo calls from the tested code.
  MockMojomDiagnosticsdClient* diagnosticsd_client() {
    return &diagnosticsd_client_;
  }

  // Call the BootstrapMojoConnection D-Bus method. Returns whether the D-Bus
  // call returned success.
  // |mojo_fd| is the fake file descriptor.
  // |bootstrap_mojo_connection_dbus_method| is the callback that the tested
  // code exposed as the BootstrapMojoConnection D-Bus method.
  //
  // It's not allowed to call this method again after a successful completion.
  bool BootstrapMojoConnection(FakeMojoFdGenerator* fake_mojo_fd_generator);

  // Call the |SendUiMessageToDiagnosticsProcessor| Mojo method
  // on diagnosticsd daemon, which will call the |HandleMessageFromUi| gRPC
  // method on diagnostic processor.
  //
  // It simulates message sent from diagnostics UI extension to diagnostics
  // processor.
  //
  // Returns false when we were not able to copy |json_message| into shared
  // buffer.
  //
  // Must be called only after a successful invocation of
  // BootstrapMojoConnection().
  bool SendUiMessageToDiagnosticsProcessor(
      const std::string& json_message,
      const base::Callback<void(mojo::ScopedHandle)>& callback);

 private:
  // Calls |bootstrap_mojo_connection_dbus_method_| with a fake file descriptor.
  // Returns whether the method call succeeded (it's expected to happen
  // synchronously).
  bool CallBootstrapMojoConnectionDBusMethod(
      FakeMojoFdGenerator* fake_mojo_fd_generator);
  // Calls GetService() Mojo method on |diagnosticsd_service_factory_ptr_|,
  // initializes |diagnosticsd_service_ptr_| so that it points to the tested
  // service, registers |diagnosticsd_client_| to handle incoming Mojo requests.
  void CallGetServiceMojoMethod();

  // Unowned. Points to the tested DiagnosticsdServiceFactory instance.
  MojomDiagnosticsdServiceFactoryPtr* const diagnosticsd_service_factory_ptr_;
  // Fake substitute for the BootstrapMojoConnection() D-Bus method.
  DBusMethodCallCallback bootstrap_mojo_connection_dbus_method_;

  // Mock DiagnosticsdClient instance. After an invocation of
  // CallGetServiceMojoMethod() it becomes registered to receive incoming Mojo
  // requests from the tested code.
  MockMojomDiagnosticsdClient diagnosticsd_client_;
  // Mojo binding that is associated with |diagnosticsd_client_|.
  mojo::Binding<MojomDiagnosticsdClient> diagnosticsd_client_binding_;

  // Mojo interface pointer to the DiagnosticsdService service exposed by the
  // tested code. Gets initialized after a call to CallGetServiceMojoMethod().
  MojomDiagnosticsdServicePtr diagnosticsd_service_ptr_;

  DISALLOW_COPY_AND_ASSIGN(FakeBrowser);
};

}  // namespace diagnostics

#endif  // DIAGNOSTICS_DIAGNOSTICSD_FAKE_BROWSER_H_
