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

#include "diagnostics/wilco_dtc_supportd/telemetry/bluetooth_event_service_impl.h"

#include <iostream>
#include <memory>
#include <string>
#include <vector>

#include <base/macros.h>
#include <dbus/object_path.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>

#include "diagnostics/common/system/bluetooth_client.h"
#include "diagnostics/common/system/fake_bluetooth_client.h"
#include "diagnostics/wilco_dtc_supportd/telemetry/bluetooth_event_service.h"

using ::testing::_;
using ::testing::ElementsAreArray;
using ::testing::Eq;
using ::testing::Invoke;
using ::testing::SaveArg;
using ::testing::StrictMock;

namespace diagnostics {

namespace {

using AdapterData = BluetoothEventService::AdapterData;

constexpr char kAdapterName1[] = "hci0";
constexpr char kAdapterName2[] = "hci1";
constexpr char kAdapterMac1[] = "aa:bb:cc:dd:ee:ff";
constexpr char kAdapterMac2[] = "00:11:22:33:44:55";

const dbus::ObjectPath kAdapterPath1("/org/bluez/hci0");
const dbus::ObjectPath kAdapterPath2("/org/bluez/hci1");
const dbus::ObjectPath kDevicePath1("/org/bluez/hci0/dev_70_88_6B_92_34_70");
const dbus::ObjectPath kDevicePath2("/org/bluez/hci0/dev_92_34_70_70_88_6B");
const dbus::ObjectPath kDevicePath3("/org/bluez/hci0/dev_70_70_88_6B_92_34");

void PropertyChanged(const std::string& property_name) {}

std::unique_ptr<BluetoothClient::AdapterProperties> CreateAdapterProperties(
    const std::string& name, const std::string& address, bool powered) {
  auto properties = std::make_unique<BluetoothClient::AdapterProperties>(
      nullptr, base::Bind(&PropertyChanged));
  properties->name.ReplaceValue(name);
  properties->address.ReplaceValue(address);
  properties->powered.ReplaceValue(powered);
  return properties;
}

std::unique_ptr<BluetoothClient::DeviceProperties> CreateDeviceProperties(
    bool connected, const dbus::ObjectPath& adapter_path) {
  auto properties = std::make_unique<BluetoothClient::DeviceProperties>(
      nullptr, base::Bind(&PropertyChanged));
  properties->name.ReplaceValue("keyboard");
  properties->address.ReplaceValue("70:88:6B:92:34:70");
  properties->connected.ReplaceValue(connected);
  properties->adapter.ReplaceValue(adapter_path);
  return properties;
}

AdapterData CreateAdapterData(const std::string& name,
                              const std::string& address,
                              bool powered,
                              uint32_t connected_devices_count) {
  AdapterData adapter;
  adapter.name = name;
  adapter.address = address;
  adapter.powered = powered;
  adapter.connected_devices_count = connected_devices_count;
  return adapter;
}

class MockBluetoothEventServiceObserver
    : public BluetoothEventService::Observer {
 public:
  MOCK_METHOD(void,
              BluetoothAdapterDataChanged,
              (const std::vector<AdapterData>&),
              (override));
};

}  // namespace

std::ostream& operator<<(std::ostream& out, const AdapterData& d) {
  out << "name: " << d.name << " address: " << d.address
      << " powered: " << d.powered
      << " connected_devices: " << d.connected_devices_count;
  return out;
}

class BluetoothEventServiceImplTest : public ::testing::Test {
 public:
  BluetoothEventServiceImplTest()
      : bluetooth_service_(
            new BluetoothEventServiceImpl(&fake_bluetooth_client_)) {
    bluetooth_service_->AddObserver(&observer_);
  }

  ~BluetoothEventServiceImplTest() override {
    bluetooth_service_->RemoveObserver(&observer_);

    BluetoothClient::Observer* bluetooth_client_observer =
        bluetooth_service_.get();
    bluetooth_service_.reset();
    EXPECT_FALSE(fake_bluetooth_client_.HasObserver(bluetooth_client_observer));
  }

  void SetUp() override {
    ASSERT_TRUE(fake_bluetooth_client_.HasObserver(bluetooth_service_.get()));
  }

  void ExpectBluetoothDataChanged(
      const std::vector<AdapterData>& adapters_data) {
    EXPECT_CALL(observer_,
                BluetoothAdapterDataChanged(ElementsAreArray(adapters_data)))
        .WillOnce(Invoke([&](const std::vector<AdapterData>& arg) {
          EXPECT_EQ(bluetooth_service_->GetLatestEvent(), arg);
        }));
  }

 protected:
  FakeBluetoothClient fake_bluetooth_client_;
  std::unique_ptr<BluetoothEventServiceImpl> bluetooth_service_;

  StrictMock<MockBluetoothEventServiceObserver> observer_;

 private:
  DISALLOW_COPY_AND_ASSIGN(BluetoothEventServiceImplTest);
};

TEST_F(BluetoothEventServiceImplTest, AdapterAdded) {
  ExpectBluetoothDataChanged(
      {CreateAdapterData(kAdapterName1, kAdapterMac1, true /* powered */,
                         0 /* connected_devices_count */)});
  fake_bluetooth_client_.EmitAdapterAdded(
      kAdapterPath1, *CreateAdapterProperties(kAdapterName1, kAdapterMac1,
                                              true /* powered */));
}

TEST_F(BluetoothEventServiceImplTest, MultipleAdaptersAdded) {
  ExpectBluetoothDataChanged(
      {CreateAdapterData(kAdapterName1, kAdapterMac1, true /* powered */,
                         0 /* connected_devices_count */)});
  fake_bluetooth_client_.EmitAdapterAdded(
      kAdapterPath1, *CreateAdapterProperties(kAdapterName1, kAdapterMac1,
                                              true /* powered */));

  // Should not invoke BluetoothAdapterDataChanged.
  fake_bluetooth_client_.EmitAdapterAdded(
      kAdapterPath1, *CreateAdapterProperties(kAdapterName1, kAdapterMac1,
                                              true /* powered */));

  ExpectBluetoothDataChanged(
      {CreateAdapterData(kAdapterName2, kAdapterMac2, false /* powered */,
                         0 /* connected_devices_count */)});
  fake_bluetooth_client_.EmitAdapterAdded(
      kAdapterPath1, *CreateAdapterProperties(kAdapterName2, kAdapterMac2,
                                              false /* powered */));
}

TEST_F(BluetoothEventServiceImplTest, AdapterRemoved) {
  ExpectBluetoothDataChanged(
      {CreateAdapterData(kAdapterName1, kAdapterMac1, true /* powered */,
                         0 /* connected_devices_count */)});
  fake_bluetooth_client_.EmitAdapterAdded(
      kAdapterPath1, *CreateAdapterProperties(kAdapterName1, kAdapterMac1,
                                              true /* powered */));

  ExpectBluetoothDataChanged({});
  fake_bluetooth_client_.EmitAdapterRemoved(kAdapterPath1);

  // Should not invoke BluetoothAdapterDataChanged.
  fake_bluetooth_client_.EmitAdapterRemoved(kAdapterPath1);
}

TEST_F(BluetoothEventServiceImplTest, AdapterRemovedBeforeAdded) {
  // Should not invoke BluetoothAdapterDataChanged.
  fake_bluetooth_client_.EmitAdapterRemoved(kAdapterPath1);
  fake_bluetooth_client_.EmitAdapterRemoved(kAdapterPath2);

  ExpectBluetoothDataChanged(
      {CreateAdapterData(kAdapterName1, kAdapterMac1, true /* powered */,
                         0 /* connected_devices_count */)});
  fake_bluetooth_client_.EmitAdapterAdded(
      kAdapterPath1, *CreateAdapterProperties(kAdapterName1, kAdapterMac1,
                                              true /* powered */));
}

TEST_F(BluetoothEventServiceImplTest, AdapterPropertyChanged) {
  ExpectBluetoothDataChanged(
      {CreateAdapterData(kAdapterName1, kAdapterMac1, true /* powered */,
                         0 /* connected_devices_count */)});
  fake_bluetooth_client_.EmitAdapterAdded(
      kAdapterPath1, *CreateAdapterProperties(kAdapterName1, kAdapterMac1,
                                              true /* powered */));

  ExpectBluetoothDataChanged(
      {CreateAdapterData(kAdapterName1, kAdapterMac1, false /* powered */,
                         0 /* connected_devices_count */)});
  fake_bluetooth_client_.EmitAdapterPropertyChanged(
      kAdapterPath1, *CreateAdapterProperties(kAdapterName1, kAdapterMac1,
                                              false /* powered */));

  // Should not invoke BluetoothAdapterDataChanged.
  fake_bluetooth_client_.EmitAdapterPropertyChanged(
      kAdapterPath1, *CreateAdapterProperties(kAdapterName1, kAdapterMac1,
                                              false /* powered */));
}

TEST_F(BluetoothEventServiceImplTest, AdapterPropertyChangedBeforeAdded) {
  ExpectBluetoothDataChanged(
      {CreateAdapterData(kAdapterName1, kAdapterMac1, true /* powered */,
                         0 /* connected_devices_count */)});
  fake_bluetooth_client_.EmitAdapterPropertyChanged(
      kAdapterPath1, *CreateAdapterProperties(kAdapterName1, kAdapterMac1,
                                              true /* powered */));

  ExpectBluetoothDataChanged(
      {CreateAdapterData(kAdapterName2, kAdapterMac2, false /* powered */,
                         0 /* connected_devices_count */)});
  fake_bluetooth_client_.EmitAdapterAdded(
      kAdapterPath1, *CreateAdapterProperties(kAdapterName2, kAdapterMac2,
                                              false /* powered */));
}

TEST_F(BluetoothEventServiceImplTest, DeviceAdded) {
  // Should not invoke BluetoothAdapterDataChanged.
  fake_bluetooth_client_.EmitDeviceAdded(
      kDevicePath1,
      *CreateDeviceProperties(true /* connected */, kAdapterPath1));

  ExpectBluetoothDataChanged(
      {CreateAdapterData(kAdapterName1, kAdapterMac1, true /* powered */,
                         1 /* connected_devices_count */)});
  fake_bluetooth_client_.EmitAdapterAdded(
      kAdapterPath1, *CreateAdapterProperties(kAdapterName1, kAdapterMac1,
                                              true /* powered */));

  // Should not invoke BluetoothAdapterDataChanged.
  fake_bluetooth_client_.EmitAdapterAdded(
      kAdapterPath1, *CreateAdapterProperties(kAdapterName1, kAdapterMac1,
                                              true /* powered */));
}

TEST_F(BluetoothEventServiceImplTest, NonConnectedDeviceAdded) {
  // Should not invoke BluetoothAdapterDataChanged.
  fake_bluetooth_client_.EmitDeviceAdded(
      kDevicePath1,
      *CreateDeviceProperties(false /* connected */, kAdapterPath1));

  ExpectBluetoothDataChanged(
      {CreateAdapterData(kAdapterName1, kAdapterMac1, true /* powered */,
                         0 /* connected_devices_count */)});
  fake_bluetooth_client_.EmitAdapterAdded(
      kAdapterPath1, *CreateAdapterProperties(kAdapterName1, kAdapterMac1,
                                              true /* powered */));
}

TEST_F(BluetoothEventServiceImplTest, DeviceRemoved) {
  // Should not invoke BluetoothAdapterDataChanged.
  fake_bluetooth_client_.EmitDeviceAdded(
      kDevicePath1,
      *CreateDeviceProperties(true /* connected */, kAdapterPath1));

  ExpectBluetoothDataChanged(
      {CreateAdapterData(kAdapterName1, kAdapterMac1, true /* powered */,
                         1 /* connected_devices_count */)});
  fake_bluetooth_client_.EmitAdapterAdded(
      kAdapterPath1, *CreateAdapterProperties(kAdapterName1, kAdapterMac1,
                                              true /* powered */));

  ExpectBluetoothDataChanged(
      {CreateAdapterData(kAdapterName1, kAdapterMac1, true /* powered */,
                         0 /* connected_devices_count */)});
  fake_bluetooth_client_.EmitDeviceRemoved(kDevicePath1);

  // Should not invoke BluetoothAdapterDataChanged.
  fake_bluetooth_client_.EmitDeviceRemoved(kDevicePath1);
}

TEST_F(BluetoothEventServiceImplTest, DeviceRemovedBeforeAdded) {
  // Should not invoke BluetoothAdapterDataChanged.
  fake_bluetooth_client_.EmitDeviceRemoved(kDevicePath1);
  fake_bluetooth_client_.EmitDeviceRemoved(kDevicePath2);

  fake_bluetooth_client_.EmitDeviceAdded(
      kDevicePath1,
      *CreateDeviceProperties(true /* connected */, kAdapterPath1));

  ExpectBluetoothDataChanged(
      {CreateAdapterData(kAdapterName1, kAdapterMac1, true /* powered */,
                         1 /* connected_devices_count */)});
  fake_bluetooth_client_.EmitAdapterAdded(
      kAdapterPath1, *CreateAdapterProperties(kAdapterName1, kAdapterMac1,
                                              true /* powered */));
}

TEST_F(BluetoothEventServiceImplTest, DeviceAddedAndRemovedBeingHomeless) {
  // Should not invoke BluetoothAdapterDataChanged.
  fake_bluetooth_client_.EmitDeviceAdded(
      kDevicePath1,
      *CreateDeviceProperties(true /* connected */, kAdapterPath1));
  fake_bluetooth_client_.EmitDeviceRemoved(kDevicePath1);

  ExpectBluetoothDataChanged(
      {CreateAdapterData(kAdapterName1, kAdapterMac1, true /* powered */,
                         0 /* connected_devices_count */)});
  fake_bluetooth_client_.EmitAdapterAdded(
      kAdapterPath1, *CreateAdapterProperties(kAdapterName1, kAdapterMac1,
                                              true /* powered */));
}

TEST_F(BluetoothEventServiceImplTest, DevicePropertyChanged) {
  // Should not invoke BluetoothAdapterDataChanged.
  fake_bluetooth_client_.EmitDeviceAdded(
      kDevicePath1,
      *CreateDeviceProperties(true /* connected */, kAdapterPath1));

  ExpectBluetoothDataChanged(
      {CreateAdapterData(kAdapterName1, kAdapterMac1, true /* powered */,
                         1 /* connected_devices_count */)});
  fake_bluetooth_client_.EmitAdapterAdded(
      kAdapterPath1, *CreateAdapterProperties(kAdapterName1, kAdapterMac1,
                                              true /* powered */));

  ExpectBluetoothDataChanged(
      {CreateAdapterData(kAdapterName1, kAdapterMac1, true /* powered */,
                         0 /* connected_devices_count */)});
  fake_bluetooth_client_.EmitDevicePropertyChanged(
      kDevicePath1,
      *CreateDeviceProperties(false /* connected */, kAdapterPath1));

  // Should not invoke BluetoothAdapterDataChanged.
  fake_bluetooth_client_.EmitDevicePropertyChanged(
      kDevicePath1,
      *CreateDeviceProperties(false /* connected */, kAdapterPath1));

  ExpectBluetoothDataChanged(
      {CreateAdapterData(kAdapterName1, kAdapterMac1, true /* powered */,
                         1 /* connected_devices_count */)});
  fake_bluetooth_client_.EmitDevicePropertyChanged(
      kDevicePath1,
      *CreateDeviceProperties(true /* connected */, kAdapterPath1));

  // Should not invoke BluetoothAdapterDataChanged.
  fake_bluetooth_client_.EmitDevicePropertyChanged(
      kDevicePath1,
      *CreateDeviceProperties(true /* connected */, kAdapterPath1));
}

TEST_F(BluetoothEventServiceImplTest, DevicePropertyChangedBeforeAdded) {
  // Should not invoke BluetoothAdapterDataChanged.
  fake_bluetooth_client_.EmitDevicePropertyChanged(
      kDevicePath1,
      *CreateDeviceProperties(true /* connected */, kAdapterPath1));

  ExpectBluetoothDataChanged(
      {CreateAdapterData(kAdapterName1, kAdapterMac1, true /* powered */,
                         1 /* connected_devices_count */)});
  fake_bluetooth_client_.EmitAdapterAdded(
      kAdapterPath1, *CreateAdapterProperties(kAdapterName1, kAdapterMac1,
                                              true /* powered */));

  ExpectBluetoothDataChanged(
      {CreateAdapterData(kAdapterName1, kAdapterMac1, true /* powered */,
                         0 /* connected_devices_count */)});
  fake_bluetooth_client_.EmitDevicePropertyChanged(
      kDevicePath1,
      *CreateDeviceProperties(false /* connected */, kAdapterPath1));

  ExpectBluetoothDataChanged(
      {CreateAdapterData(kAdapterName1, kAdapterMac1, true /* powered */,
                         1 /* connected_devices_count */)});
  fake_bluetooth_client_.EmitDeviceAdded(
      kDevicePath1,
      *CreateDeviceProperties(true /* connected */, kAdapterPath1));
}

TEST_F(BluetoothEventServiceImplTest, MultipleAdaptersAndDevices) {
  ExpectBluetoothDataChanged(
      {CreateAdapterData(kAdapterName1, kAdapterMac1, true /* powered */,
                         0 /* connected_devices_count */)});
  fake_bluetooth_client_.EmitAdapterAdded(
      kAdapterPath1, *CreateAdapterProperties(kAdapterName1, kAdapterMac1,
                                              true /* powered */));

  ExpectBluetoothDataChanged(
      {CreateAdapterData(kAdapterName1, kAdapterMac1, true /* powered */,
                         0 /* connected_devices_count */),
       CreateAdapterData(kAdapterName2, kAdapterMac2, true /* powered */,
                         0 /* connected_devices_count */)});
  fake_bluetooth_client_.EmitAdapterAdded(
      kAdapterPath2, *CreateAdapterProperties(kAdapterName2, kAdapterMac2,
                                              true /* powered */));

  ExpectBluetoothDataChanged(
      {CreateAdapterData(kAdapterName1, kAdapterMac1, true /* powered */,
                         1 /* connected_devices_count */),
       CreateAdapterData(kAdapterName2, kAdapterMac2, true /* powered */,
                         0 /* connected_devices_count */)});
  fake_bluetooth_client_.EmitDevicePropertyChanged(
      kDevicePath1,
      *CreateDeviceProperties(true /* connected */, kAdapterPath1));

  ExpectBluetoothDataChanged(
      {CreateAdapterData(kAdapterName1, kAdapterMac1, true /* powered */,
                         2 /* connected_devices_count */),
       CreateAdapterData(kAdapterName2, kAdapterMac2, true /* powered */,
                         0 /* connected_devices_count */)});
  fake_bluetooth_client_.EmitDevicePropertyChanged(
      kDevicePath2,
      *CreateDeviceProperties(true /* connected */, kAdapterPath1));

  ExpectBluetoothDataChanged(
      {CreateAdapterData(kAdapterName1, kAdapterMac1, true /* powered */,
                         2 /* connected_devices_count */),
       CreateAdapterData(kAdapterName2, kAdapterMac2, true /* powered */,
                         1 /* connected_devices_count */)});
  fake_bluetooth_client_.EmitDevicePropertyChanged(
      kDevicePath3,
      *CreateDeviceProperties(true /* connected */, kAdapterPath2));
}

TEST_F(BluetoothEventServiceImplTest, RemoveAdapterWithConnectedDevice) {
  // Should not invoke BluetoothAdapterDataChanged.
  fake_bluetooth_client_.EmitDeviceAdded(
      kDevicePath1,
      *CreateDeviceProperties(true /* connected */, kAdapterPath1));

  ExpectBluetoothDataChanged(
      {CreateAdapterData(kAdapterName1, kAdapterMac1, true /* powered */,
                         1 /* connected_devices_count */)});
  fake_bluetooth_client_.EmitAdapterAdded(
      kAdapterPath1, *CreateAdapterProperties(kAdapterName1, kAdapterMac1,
                                              true /* powered */));

  ExpectBluetoothDataChanged({});
  fake_bluetooth_client_.EmitAdapterRemoved(kAdapterPath1);

  ExpectBluetoothDataChanged(
      {CreateAdapterData(kAdapterName1, kAdapterMac1, true /* powered */,
                         0 /* connected_devices_count */)});
  fake_bluetooth_client_.EmitAdapterAdded(
      kAdapterPath1, *CreateAdapterProperties(kAdapterName1, kAdapterMac1,
                                              true /* powered */));
}

}  // namespace diagnostics
