1e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// found in the LICENSE file.
4e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
5e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#ifndef CHROMEOS_DBUS_FAKE_BLUETOOTH_GATT_MANAGER_CLIENT_H_
6e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#define CHROMEOS_DBUS_FAKE_BLUETOOTH_GATT_MANAGER_CLIENT_H_
7e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
8e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include <map>
9e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include <string>
10e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include <utility>
11e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
12e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "base/callback.h"
13e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chromeos/chromeos_export.h"
14e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chromeos/dbus/bluetooth_gatt_manager_client.h"
15e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "dbus/object_path.h"
16e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
17e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochnamespace chromeos {
18e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
19e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochclass FakeBluetoothGattCharacteristicServiceProvider;
20e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochclass FakeBluetoothGattDescriptorServiceProvider;
21e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochclass FakeBluetoothGattServiceServiceProvider;
22e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
23e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// FakeBluetoothGattManagerClient simulates the behavior of the Bluetooth
24e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// daemon's GATT manager object and is used both in test cases in place of a
25e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// mock and on the Linux desktop.
26e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochclass CHROMEOS_EXPORT FakeBluetoothGattManagerClient
27e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    : public BluetoothGattManagerClient {
28e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch public:
29e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  FakeBluetoothGattManagerClient();
30e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  virtual ~FakeBluetoothGattManagerClient();
31e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
32e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // DBusClient override.
33e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  virtual void Init(dbus::Bus* bus) OVERRIDE;
34e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
35e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // BluetoothGattManagerClient overrides.
36e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  virtual void RegisterService(const dbus::ObjectPath& service_path,
37e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                               const Options& options,
38e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                               const base::Closure& callback,
39e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                               const ErrorCallback& error_callback) OVERRIDE;
40e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  virtual void UnregisterService(const dbus::ObjectPath& service_path,
41e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                 const base::Closure& callback,
42e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                 const ErrorCallback& error_callback) OVERRIDE;
43e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
44e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Register, unregister, and retrieve pointers to service, characteristic, and
45e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // descriptor service providers. Automatically called from the service
46e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // provider constructor and destructors.
47e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  void RegisterServiceServiceProvider(
48e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      FakeBluetoothGattServiceServiceProvider* provider);
49e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  void RegisterCharacteristicServiceProvider(
50e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      FakeBluetoothGattCharacteristicServiceProvider* provider);
51e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  void RegisterDescriptorServiceProvider(
52e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      FakeBluetoothGattDescriptorServiceProvider* provider);
53e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
54e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  void UnregisterServiceServiceProvider(
55e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      FakeBluetoothGattServiceServiceProvider* provider);
56e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  void UnregisterCharacteristicServiceProvider(
57e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      FakeBluetoothGattCharacteristicServiceProvider* provider);
58e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  void UnregisterDescriptorServiceProvider(
59e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      FakeBluetoothGattDescriptorServiceProvider* provider);
60e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
61e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Return a pointer to the service provider that corresponds to the object
62e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // path |object_path| if it exists.
63e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  FakeBluetoothGattServiceServiceProvider*
64e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      GetServiceServiceProvider(const dbus::ObjectPath& object_path) const;
65e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  FakeBluetoothGattCharacteristicServiceProvider*
66e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      GetCharacteristicServiceProvider(
67e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          const dbus::ObjectPath& object_path) const;
68e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  FakeBluetoothGattDescriptorServiceProvider*
69e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      GetDescriptorServiceProvider(const dbus::ObjectPath& object_path) const;
70e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
71e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Returns true, if a GATT service with object path |object_path| was
72e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // registered with the GATT manager using RegisterService.
73e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  bool IsServiceRegistered(const dbus::ObjectPath& object_path) const;
74e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
75e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch private:
76e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Mappings for GATT service, characteristic, and descriptor service
77e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // providers. The fake GATT manager stores references to all instances
78e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // created so that they can be obtained by tests.
79e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  typedef std::map<
80e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      dbus::ObjectPath, FakeBluetoothGattCharacteristicServiceProvider*>
81e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      CharacteristicMap;
82e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  typedef std::map<
83e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      dbus::ObjectPath, FakeBluetoothGattDescriptorServiceProvider*>
84e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      DescriptorMap;
85e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
86e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // The mapping for services is from object paths to pairs of boolean and
87e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // service provider pointer, where the boolean denotes whether or not the
88e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // service is already registered.
89e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  typedef std::pair<bool, FakeBluetoothGattServiceServiceProvider*>
90e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      ServiceProvider;
91e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  typedef std::map<dbus::ObjectPath, ServiceProvider> ServiceMap;
92e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
93e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ServiceMap service_map_;
94e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  CharacteristicMap characteristic_map_;
95e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DescriptorMap descriptor_map_;
96e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
97e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DISALLOW_COPY_AND_ASSIGN(FakeBluetoothGattManagerClient);
98e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch};
99e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
100e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}  // namespace chromeos
101e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
102e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#endif  // CHROMEOS_DBUS_FAKE_BLUETOOTH_GATT_MANAGER_CLIENT_H_
103