Loading system/gd/storage/config_cache.cc +13 −4 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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)); Loading system/gd/storage/config_cache_test.cc +82 −6 Original line number Diff line number Diff line Loading @@ -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"); Loading Loading
system/gd/storage/config_cache.cc +13 −4 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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)); Loading
system/gd/storage/config_cache_test.cc +82 −6 Original line number Diff line number Diff line Loading @@ -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"); Loading