// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CONTENT_BROWSER_HID_HID_TEST_UTILS_H_
#define CONTENT_BROWSER_HID_HID_TEST_UTILS_H_

#include <memory>
#include <vector>

#include "content/public/browser/content_browser_client.h"
#include "content/public/browser/hid_delegate.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h"
#include "services/device/public/mojom/hid.mojom.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "third_party/blink/public/mojom/hid/hid.mojom-forward.h"
#include "url/origin.h"

namespace content {

// Mock HidDelegate implementation for tests that need to simulate permissions
// management for HID device access.
class MockHidDelegate : public HidDelegate {
 public:
  MockHidDelegate();
  MockHidDelegate(MockHidDelegate&) = delete;
  MockHidDelegate& operator=(MockHidDelegate&) = delete;
  ~MockHidDelegate() override;

  // Simulates opening the HID device chooser dialog and selecting an item. The
  // chooser automatically selects the item returned by RunChooserInternal,
  // which may be mocked. Returns nullptr. Device filters and exclusion_filters
  // are ignored.
  std::unique_ptr<HidChooser> RunChooser(
      RenderFrameHost* frame,
      std::vector<blink::mojom::HidDeviceFilterPtr> filters,
      std::vector<blink::mojom::HidDeviceFilterPtr> exclusion_filters,
      HidChooser::Callback callback) override;

  void AddObserver(BrowserContext* browser_context,
                   Observer* observer) override;
  void RemoveObserver(BrowserContext* browser_context,
                      Observer* observer) override;

  // MockHidDelegate does not register to receive device connection events. Use
  // these methods to broadcast device connections to all delegate observers.
  void OnDeviceAdded(const device::mojom::HidDeviceInfo& device);
  void OnDeviceRemoved(const device::mojom::HidDeviceInfo& device);
  void OnDeviceChanged(const device::mojom::HidDeviceInfo& device);
  void OnPermissionRevoked(const url::Origin& origin);
  void OnHidManagerConnectionError();

  MOCK_METHOD(std::vector<device::mojom::HidDeviceInfoPtr>,
              RunChooserInternal,
              ());
  MOCK_METHOD(bool,
              CanRequestDevicePermission,
              (BrowserContext*, const url::Origin&));
  MOCK_METHOD(bool,
              HasDevicePermission,
              (BrowserContext*,
               RenderFrameHost*,
               const url::Origin&,
               const device::mojom::HidDeviceInfo&));
  MOCK_METHOD(void,
              RevokeDevicePermission,
              (BrowserContext*,
               RenderFrameHost*,
               const url::Origin&,
               const device::mojom::HidDeviceInfo&));
  MOCK_METHOD(device::mojom::HidManager*, GetHidManager, (BrowserContext*));
  MOCK_METHOD(const device::mojom::HidDeviceInfo*,
              GetDeviceInfo,
              (BrowserContext*, const std::string& guid));
  MOCK_METHOD(bool,
              IsFidoAllowedForOrigin,
              (BrowserContext*, const url::Origin& origin));
  MOCK_METHOD(bool,
              IsKnownSecurityKey,
              (BrowserContext*, const device::mojom::HidDeviceInfo&));
  MOCK_METHOD(bool,
              IsServiceWorkerAllowedForOrigin,
              (const url::Origin& origin));
  MOCK_METHOD(void,
              IncrementConnectionCount,
              (BrowserContext*, const url::Origin& origin));
  MOCK_METHOD(void,
              DecrementConnectionCount,
              (BrowserContext*, const url::Origin& origin));

  const base::ObserverList<Observer>& observer_list() { return observer_list_; }

  void SetAssertBrowserContext(bool assert_browser_context);

 private:
  base::ObserverList<Observer> observer_list_;
  bool assert_browser_context_ = false;
};

// Test implementation of ContentBrowserClient for HID tests. The test client
// also provides direct access to the MockHidDelegate.
class HidTestContentBrowserClient : public ContentBrowserClient {
 public:
  HidTestContentBrowserClient();
  HidTestContentBrowserClient(HidTestContentBrowserClient&) = delete;
  HidTestContentBrowserClient& operator=(HidTestContentBrowserClient&) = delete;
  ~HidTestContentBrowserClient() override;

  MockHidDelegate& delegate() { return delegate_; }

  // ContentBrowserClient:
  HidDelegate* GetHidDelegate() override;

 private:
  MockHidDelegate delegate_;
};

}  // namespace content

#endif  // CONTENT_BROWSER_HID_HID_TEST_UTILS_H_
