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