chromium/device/bluetooth/test/bluetooth_test_win.h

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

#ifndef DEVICE_BLUETOOTH_TEST_BLUETOOTH_TEST_WIN_H_
#define DEVICE_BLUETOOTH_TEST_BLUETOOTH_TEST_WIN_H_

#include <Windows.Devices.Enumeration.h>

#include <optional>
#include <string>
#include <string_view>
#include <vector>

#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/test_pending_task.h"
#include "base/test/test_simple_task_runner.h"
#include "base/win/scoped_winrt_initializer.h"
#include "device/bluetooth/bluetooth_classic_win_fake.h"
#include "device/bluetooth/bluetooth_task_manager_win.h"
#include "device/bluetooth/test/bluetooth_test.h"

namespace device {

// Windows implementation of BluetoothTestBase.
class BluetoothTestWin : public BluetoothTestBase {
 public:
  BluetoothTestWin();
  ~BluetoothTestWin() override;

  // BluetoothTestBase overrides
  bool PlatformSupportsLowEnergy() override;
  void InitWithDefaultAdapter() override;
  void InitWithoutDefaultAdapter() override;
  void InitWithFakeAdapter() override;
  bool DenyPermission() override;
  void StartLowEnergyDiscoverySession() override;
  BluetoothDevice* SimulateLowEnergyDevice(int device_ordinal) override;
  std::optional<BluetoothUUID> GetTargetGattService(
      BluetoothDevice* device) override;
  void SimulateGattConnection(BluetoothDevice* device) override;
  void SimulateStatusChangeToDisconnect(BluetoothDevice* device) override;
  void SimulateGattServicesDiscovered(
      BluetoothDevice* device,
      const std::vector<std::string>& uuids,
      const std::vector<std::string>& blocked_uuids = {}) override;
  void SimulateGattServiceRemoved(BluetoothRemoteGattService* service) override;
  void SimulateGattCharacteristic(BluetoothRemoteGattService* service,
                                  const std::string& uuid,
                                  int properties) override;
  void SimulateGattCharacteristicRemoved(
      BluetoothRemoteGattService* service,
      BluetoothRemoteGattCharacteristic* characteristic) override;
  void SimulateGattCharacteristicRead(
      BluetoothRemoteGattCharacteristic* characteristic,
      const std::vector<uint8_t>& value) override;
  void SimulateGattCharacteristicReadError(
      BluetoothRemoteGattCharacteristic* characteristic,
      BluetoothGattService::GattErrorCode error_code) override;
  void SimulateGattCharacteristicWrite(
      BluetoothRemoteGattCharacteristic* characteristic) override;
  void SimulateGattCharacteristicWriteError(
      BluetoothRemoteGattCharacteristic* characteristic,
      BluetoothGattService::GattErrorCode error_code) override;
  void DeleteDevice(BluetoothDevice* device) override;
  void SimulateGattDescriptor(BluetoothRemoteGattCharacteristic* characteristic,
                              const std::string& uuid) override;
  void SimulateGattNotifySessionStarted(
      BluetoothRemoteGattCharacteristic* characteristic) override;
  void SimulateGattNotifySessionStartError(
      BluetoothRemoteGattCharacteristic* characteristic,
      BluetoothGattService::GattErrorCode error_code) override;
  void SimulateGattCharacteristicChanged(
      BluetoothRemoteGattCharacteristic* characteristic,
      const std::vector<uint8_t>& value) override;

 private:
  scoped_refptr<base::TestSimpleTaskRunner> ui_task_runner_;
  scoped_refptr<base::TestSimpleTaskRunner> bluetooth_task_runner_;

  void AdapterInitCallback();

  void FinishPendingTasks();
};

// Defines common test fixture name. Use TEST_F(BluetoothTest, YourTestName).
typedef BluetoothTestWin BluetoothTest;

struct BluetoothTestWinrtParam {
  // The feature state of |kNewBLEGattSessionHandling|.
  bool new_gatt_session_handling_enabled;

  friend std::ostream& operator<<(std::ostream& os,
                                  const BluetoothTestWinrtParam& p) {
    return os << "{new_gatt_session_handling_enabled="
              << p.new_gatt_session_handling_enabled << "}";
  }
};

constexpr BluetoothTestWinrtParam kBluetoothTestWinrtParam[] = {
    {true},
    {false},
};

// This test suite represents tests that are parameterized on Windows. This
// requires declaring tests in the following way:
//
// TEST_P(BluetoothTestWinrt, YourTestName).
//
// Test suites inheriting from this class should be instantiated as
//
// INSTANTIATE_TEST_SUITE_P(
//     All, FooTestSuiteWinrt,
//     ::testing::ValuesIn(kBluetoothTestWinrtParam>));
class BluetoothTestWinrt
    : public BluetoothTestWin,
      public ::testing::WithParamInterface<BluetoothTestWinrtParam> {
 public:
  BluetoothTestWinrt();

  BluetoothTestWinrt(const BluetoothTestWinrt&) = delete;
  BluetoothTestWinrt& operator=(const BluetoothTestWinrt&) = delete;

  ~BluetoothTestWinrt() override;

  bool UsesNewGattSessionHandling() const;

  // Simulate a fake adapter whose power status cannot be
  // controlled because of a Windows Privacy setting.
  void InitFakeAdapterWithRadioAccessDenied();
  void SimulateSpuriousRadioStateChangedEvent();

  // BluetoothTestBase:
  bool PlatformSupportsLowEnergy() override;
  void InitWithDefaultAdapter() override;
  void InitWithoutDefaultAdapter() override;
  void InitWithFakeAdapter() override;
  void InitFakeAdapterWithoutRadio() override;
  void SimulateAdapterPowerFailure() override;
  void SimulateAdapterPoweredOn() override;
  void SimulateAdapterPoweredOff() override;
  BluetoothDevice* SimulateLowEnergyDevice(int device_ordinal) override;
  void SimulateLowEnergyDiscoveryFailure() override;
  void SimulateDevicePaired(BluetoothDevice* device, bool is_paired) override;
  void SimulatePairingPinCode(BluetoothDevice* device,
                              std::string pin_code) override;
  // Currently only Win derived class has this function for create ConfirmOnly /
  // DisplayPin tests.  If in future we find that other platform need to test
  // for pairing_kind we should promote this function as virtual
  void SimulateConfirmOnly(BluetoothDevice* device);
  void SimulateDisplayPin(BluetoothDevice* device,
                          std::string_view display_pin);
  void SimulateAdvertisementStarted(
      BluetoothAdvertisement* advertisement) override;
  void SimulateAdvertisementStopped(
      BluetoothAdvertisement* advertisement) override;
  void SimulateAdvertisementError(
      BluetoothAdvertisement* advertisement,
      BluetoothAdvertisement::ErrorCode error_code) override;
  void SimulateGattConnection(BluetoothDevice* device) override;
  void SimulateGattConnectionError(
      BluetoothDevice* device,
      BluetoothDevice::ConnectErrorCode error_code) override;
  void SimulateGattDisconnection(BluetoothDevice* device) override;
  void SimulateDeviceBreaksConnection(BluetoothDevice* device) override;
  void SimulateGattNameChange(BluetoothDevice* device,
                              const std::string& new_name) override;
  void SimulateStatusChangeToDisconnect(BluetoothDevice* device) override;
  void SimulateGattServicesDiscovered(
      BluetoothDevice* device,
      const std::vector<std::string>& uuids,
      const std::vector<std::string>& blocked_uuids = {}) override;
  void SimulateGattServicesChanged(BluetoothDevice* device) override;
  void SimulateGattServiceRemoved(BluetoothRemoteGattService* service) override;
  void SimulateGattServicesDiscoveryError(BluetoothDevice* device) override;
  void SimulateGattCharacteristic(BluetoothRemoteGattService* service,
                                  const std::string& uuid,
                                  int properties) override;
  void SimulateGattNotifySessionStarted(
      BluetoothRemoteGattCharacteristic* characteristic) override;
  void SimulateGattNotifySessionStartError(
      BluetoothRemoteGattCharacteristic* characteristic,
      BluetoothGattService::GattErrorCode error_code) override;
  void SimulateGattNotifySessionStopped(
      BluetoothRemoteGattCharacteristic* characteristic) override;
  void SimulateGattNotifySessionStopError(
      BluetoothRemoteGattCharacteristic* characteristic,
      BluetoothGattService::GattErrorCode error_code) override;
  void SimulateGattCharacteristicChanged(
      BluetoothRemoteGattCharacteristic* characteristic,
      const std::vector<uint8_t>& value) override;
  void SimulateGattCharacteristicRead(
      BluetoothRemoteGattCharacteristic* characteristic,
      const std::vector<uint8_t>& value) override;
  void SimulateGattCharacteristicReadError(
      BluetoothRemoteGattCharacteristic* characteristic,
      BluetoothGattService::GattErrorCode error_code) override;
  void SimulateGattCharacteristicWrite(
      BluetoothRemoteGattCharacteristic* characteristic) override;
  void SimulateGattCharacteristicWriteError(
      BluetoothRemoteGattCharacteristic* characteristic,
      BluetoothGattService::GattErrorCode error_code) override;
  void SimulateGattDescriptor(BluetoothRemoteGattCharacteristic* characteristic,
                              const std::string& uuid) override;
  void SimulateGattDescriptorRead(BluetoothRemoteGattDescriptor* descriptor,
                                  const std::vector<uint8_t>& value) override;
  void SimulateGattDescriptorReadError(
      BluetoothRemoteGattDescriptor* descriptor,
      BluetoothGattService::GattErrorCode error_code) override;
  void SimulateGattDescriptorWrite(
      BluetoothRemoteGattDescriptor* descriptor) override;
  void SimulateGattDescriptorWriteError(
      BluetoothRemoteGattDescriptor* descriptor,
      BluetoothGattService::GattErrorCode error_code) override;
  void DeleteDevice(BluetoothDevice* device) override;

  void OnFakeBluetoothDeviceConnectGattAttempt();
  void OnFakeBluetoothDeviceGattServiceDiscoveryAttempt();
  void OnFakeBluetoothGattDisconnect();
  void OnFakeBluetoothCharacteristicReadValue();
  void OnFakeBluetoothCharacteristicWriteValue(std::vector<uint8_t> value);
  void OnFakeBluetoothGattSetCharacteristicNotification(NotifyValueState state);
  void OnFakeBluetoothDescriptorReadValue();
  void OnFakeBluetoothDescriptorWriteValue(std::vector<uint8_t> value);

 private:
  base::test::ScopedFeatureList scoped_feature_list_;
  base::win::ScopedWinrtInitializer scoped_winrt_initializer_;
};

}  // namespace device

#endif  // DEVICE_BLUETOOTH_TEST_BLUETOOTH_TEST_WIN_H_