Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f3cb4383 authored by Rahul Arya's avatar Rahul Arya
Browse files

Do not change DevType of DUAL devices

If it is dual, even if we only have keys from one protocol, we shouldn't change the DevType as it is a dual device!

Change-Id: Ia3c8419c0d330de184417e7820fbf9b36cb8e004
Test: atest ConfigCacheTest
Bug: 225314856
Tag: #stability
parent 6ad0bdfe
Loading
Loading
Loading
Loading
+13 −4
Original line number Diff line number Diff line
@@ -420,6 +420,16 @@ bool FixDeviceTypeInconsistencyInSection(
  if (!hci::Address::IsValidAddress(section_name)) {
    return false;
  }
  auto device_type_iter = device_section_entries.find("DevType");
  if (device_type_iter != device_section_entries.end() &&
      device_type_iter->second == std::to_string(hci::DeviceType::DUAL)) {
    // We might only have one of classic/LE keys for a dual device, but it is still a dual device,
    // so we should not change the DevType.
    return false;
  }

  // we will ignore the existing DevType, since it is not known to be a DUAL device so
  // the keys we have should be sufficient to infer the correct DevType
  bool is_le = false;
  bool is_classic = false;
  // default
@@ -441,11 +451,10 @@ bool FixDeviceTypeInconsistencyInSection(
  }
  bool inconsistent = true;
  std::string device_type_str = std::to_string(device_type);
  auto it = device_section_entries.find("DevType");
  if (it != device_section_entries.end()) {
    inconsistent = device_type_str != it->second;
  if (device_type_iter != device_section_entries.end()) {
    inconsistent = device_type_str != device_type_iter->second;
    if (inconsistent) {
      it->second = std::move(device_type_str);
      device_type_iter->second = std::move(device_type_str);
    }
  } else {
    device_section_entries.insert_or_assign("DevType", std::move(device_type_str));
+82 −6
Original line number Diff line number Diff line
@@ -275,34 +275,110 @@ TEST(ConfigCacheTest, persistent_config_changed_callback_test) {
  ASSERT_EQ(num_change, 4);
}

TEST(ConfigCacheTest, fix_device_type_inconsistency_test) {
TEST(ConfigCacheTest, fix_device_type_inconsistency_missing_devtype_no_keys_test) {
  ConfigCache config(100, Device::kLinkKeyProperties);
  config.SetProperty("A", "B", "C");
  config.SetProperty("AA:BB:CC:DD:EE:FF", "B", "C");
  config.SetProperty("AA:BB:CC:DD:EE:FF", "C", "D");
  ASSERT_TRUE(config.FixDeviceTypeInconsistencies());

  auto hadInconsistencies = config.FixDeviceTypeInconsistencies();

  ASSERT_TRUE(hadInconsistencies);
  ASSERT_THAT(
      config.GetProperty("AA:BB:CC:DD:EE:FF", "DevType"),
      Optional(StrEq(std::to_string(bluetooth::hci::DeviceType::BR_EDR))));
}

TEST(ConfigCacheTest, fix_device_type_inconsistency_consistent_devtype_test) {
  // arrange
  ConfigCache config(100, Device::kLinkKeyProperties);
  config.SetProperty("A", "B", "C");
  config.SetProperty("AA:BB:CC:DD:EE:FF", "B", "C");
  config.SetProperty("AA:BB:CC:DD:EE:FF", "C", "D");
  config.SetProperty("AA:BB:CC:DD:EE:FF", "DevType", std::to_string(bluetooth::hci::DeviceType::BR_EDR));

  config.SetProperty("CC:DD:EE:FF:00:11", "B", "AABBAABBCCDDEE");
  config.SetProperty("CC:DD:EE:FF:00:11", "DevType", std::to_string(bluetooth::hci::DeviceType::BR_EDR));
  config.SetProperty("CC:DD:EE:FF:00:11", "LinkKey", "AABBAABBCCDDEE");
  ASSERT_FALSE(config.FixDeviceTypeInconsistencies());

  // act
  auto hadInconsistencies = config.FixDeviceTypeInconsistencies();

  // assert
  ASSERT_FALSE(hadInconsistencies);
  ASSERT_THAT(
      config.GetProperty("CC:DD:EE:FF:00:11", "DevType"),
      Optional(StrEq(std::to_string(bluetooth::hci::DeviceType::BR_EDR))));
}

TEST(ConfigCacheTest, fix_device_type_inconsistency_devtype_should_be_dual_test) {
  // arrange
  ConfigCache config(100, Device::kLinkKeyProperties);
  config.SetProperty("A", "B", "C");
  config.SetProperty("AA:BB:CC:DD:EE:FF", "B", "C");
  config.SetProperty("AA:BB:CC:DD:EE:FF", "C", "D");
  config.SetProperty("AA:BB:CC:DD:EE:FF", "DevType", std::to_string(bluetooth::hci::DeviceType::BR_EDR));

  config.SetProperty("CC:DD:EE:FF:00:11", "B", "AABBAABBCCDDEE");
  config.SetProperty("CC:DD:EE:FF:00:11", "DevType", std::to_string(bluetooth::hci::DeviceType::BR_EDR));
  config.SetProperty("CC:DD:EE:FF:00:11", "LinkKey", "AABBAABBCCDDEE");
  config.SetProperty("CC:DD:EE:FF:00:11", "LE_KEY_PENC", "AABBAABBCCDDEE");
  ASSERT_TRUE(config.FixDeviceTypeInconsistencies());

  // act
  auto hadInconsistencies = config.FixDeviceTypeInconsistencies();

  // assert
  ASSERT_TRUE(hadInconsistencies);
  ASSERT_THAT(
      config.GetProperty("CC:DD:EE:FF:00:11", "DevType"),
      Optional(StrEq(std::to_string(bluetooth::hci::DeviceType::DUAL))));
  config.RemoveProperty("CC:DD:EE:FF:00:11", "LinkKey");
  ASSERT_TRUE(config.FixDeviceTypeInconsistencies());
}

TEST(ConfigCacheTest, fix_device_type_inconsistency_devtype_should_be_le_not_classic_test) {
  // arrange
  ConfigCache config(100, Device::kLinkKeyProperties);
  config.SetProperty("A", "B", "C");
  config.SetProperty("AA:BB:CC:DD:EE:FF", "B", "C");
  config.SetProperty("AA:BB:CC:DD:EE:FF", "C", "D");
  config.SetProperty("AA:BB:CC:DD:EE:FF", "DevType", std::to_string(bluetooth::hci::DeviceType::BR_EDR));

  config.SetProperty("CC:DD:EE:FF:00:11", "B", "AABBAABBCCDDEE");
  config.SetProperty("CC:DD:EE:FF:00:11", "DevType", std::to_string(bluetooth::hci::DeviceType::BR_EDR));
  config.SetProperty("CC:DD:EE:FF:00:11", "LE_KEY_PENC", "AABBAABBCCDDEE");

  // act
  auto hadInconsistencies = config.FixDeviceTypeInconsistencies();

  // assert
  ASSERT_TRUE(hadInconsistencies);
  ASSERT_THAT(
      config.GetProperty("CC:DD:EE:FF:00:11", "DevType"),
      Optional(StrEq(std::to_string(bluetooth::hci::DeviceType::LE))));
}

TEST(ConfigCacheTest, fix_device_type_inconsistency_devtype_dont_override_dual_test) {
  // arrange
  ConfigCache config(100, Device::kLinkKeyProperties);
  config.SetProperty("A", "B", "C");
  config.SetProperty("AA:BB:CC:DD:EE:FF", "B", "C");
  config.SetProperty("AA:BB:CC:DD:EE:FF", "C", "D");
  config.SetProperty("AA:BB:CC:DD:EE:FF", "DevType", std::to_string(bluetooth::hci::DeviceType::BR_EDR));

  config.SetProperty("CC:DD:EE:FF:00:11", "B", "AABBAABBCCDDEE");
  config.SetProperty("CC:DD:EE:FF:00:11", "DevType", std::to_string(bluetooth::hci::DeviceType::DUAL));
  config.SetProperty("CC:DD:EE:FF:00:11", "LinkKey", "AABBAABBCCDDEE");
  config.SetProperty("CC:DD:EE:FF:00:11", "LE_KEY_PENC", "AABBAABBCCDDEE");

  // act
  auto hadInconsistencies = config.FixDeviceTypeInconsistencies();

  // assert
  ASSERT_FALSE(hadInconsistencies);
  ASSERT_THAT(
      config.GetProperty("CC:DD:EE:FF:00:11", "DevType"),
      Optional(StrEq(std::to_string(bluetooth::hci::DeviceType::DUAL))));
}

TEST(ConfigCacheTest, test_get_section_with_property) {
  ConfigCache config(100, Device::kLinkKeyProperties);
  config.SetProperty("A", "B", "C");