chromium/chromeos/components/sensors/fake_sensor_service.h

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

#ifndef CHROMEOS_COMPONENTS_SENSORS_FAKE_SENSOR_SERVICE_H_
#define CHROMEOS_COMPONENTS_SENSORS_FAKE_SENSOR_SERVICE_H_

#include <map>
#include <set>
#include <vector>

#include "base/sequence_checker.h"
#include "chromeos/components/sensors/fake_sensor_device.h"
#include "chromeos/components/sensors/mojom/sensor.mojom.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "mojo/public/cpp/bindings/remote_set.h"

namespace chromeos {
namespace sensors {

class FakeSensorService final : public mojom::SensorService {
 public:
  FakeSensorService();
  FakeSensorService(const FakeSensorService&) = delete;
  FakeSensorService& operator=(const FakeSensorService&) = delete;
  ~FakeSensorService() override;

  void AddReceiver(
      mojo::PendingReceiver<mojom::SensorService> pending_receiver);
  void ClearReceivers();
  bool HasReceivers() const;

  void SetDevice(int32_t iio_device_id,
                 std::set<mojom::DeviceType> types,
                 std::unique_ptr<FakeSensorDevice> sensor_device);

  // Implementation of mojom::SensorService.
  void GetDeviceIds(mojom::DeviceType type,
                    GetDeviceIdsCallback callback) override;
  void GetAllDeviceIds(GetAllDeviceIdsCallback callback) override;
  void GetDevice(
      int32_t iio_device_id,
      mojo::PendingReceiver<mojom::SensorDevice> device_request) override;
  void RegisterNewDevicesObserver(
      mojo::PendingRemote<mojom::SensorServiceNewDevicesObserver> observer)
      override;

 private:
  struct DeviceData {
    DeviceData();
    DeviceData(DeviceData&&);
    DeviceData& operator=(DeviceData&&);
    ~DeviceData();

    std::set<mojom::DeviceType> types;
    std::unique_ptr<FakeSensorDevice> sensor_device;
  };

  // First is the iio_device_id, second is the device's data.
  std::map<int32_t, DeviceData> devices_;

  mojo::ReceiverSet<mojom::SensorService> receiver_set_;
  mojo::RemoteSet<mojom::SensorServiceNewDevicesObserver> observers_;

  SEQUENCE_CHECKER(sequence_checker_);
};

}  // namespace sensors
}  // namespace chromeos

#endif  // CHROMEOS_COMPONENTS_SENSORS_FAKE_SENSOR_SERVICE_H_