| #include "redfish_to_uhm_trie.hpp" |
| |
| #include <memory> |
| #include <string> |
| |
| #include <gtest/gtest.h> |
| #include "redfish_to_uhm_mapping.pb.h" |
| #include "redfish_to_uhm_mapping_value.hpp" |
| |
| namespace devpath_plugin { |
| namespace { |
| |
| TEST(RedfishToUhmTrieTest, BasicInsertAndGetMappingFromUrl) { |
| RedfishToUhmTrie trie; |
| |
| auto val1 = std::make_shared<RedfishToUhmMappingValue>(); |
| val1->uhm_monitored_component_key.set_barepath("/phys/DC_SCM:device:hoth"); |
| val1->redfish_expose_config.set_expose_oem_google_devpath(true); |
| val1->redfish_expose_config.set_set_plc_as_placeholder(false); |
| val1->redfish_expose_config.set_embedded_location_context("hoth_context"); |
| |
| Key insert_key1; |
| insert_key1.set_redfish_url_pattern("/redfish/v1/RootOfTrustCollection/Hoth"); |
| trie.Insert(insert_key1, val1); |
| |
| Key lookup_key; |
| lookup_key.set_redfish_url_pattern("/redfish/v1/RootOfTrustCollection/Hoth"); |
| |
| std::shared_ptr<const RedfishToUhmMappingValue> found = |
| trie.GetMappingFromUrl(lookup_key); |
| ASSERT_NE(found, nullptr); |
| EXPECT_EQ(found->uhm_monitored_component_key.barepath(), |
| "/phys/DC_SCM:device:hoth"); |
| EXPECT_TRUE(found->redfish_expose_config.expose_oem_google_devpath()); |
| EXPECT_FALSE(found->redfish_expose_config.set_plc_as_placeholder()); |
| EXPECT_EQ(found->redfish_expose_config.embedded_location_context(), |
| "hoth_context"); |
| } |
| |
| TEST(RedfishToUhmTrieTest, SegmentSeparation) { |
| RedfishToUhmTrie trie; |
| |
| auto val1 = std::make_shared<RedfishToUhmMappingValue>(); |
| val1->uhm_monitored_component_key.set_barepath("/phys/diorite1"); |
| |
| auto val2 = std::make_shared<RedfishToUhmMappingValue>(); |
| val2->uhm_monitored_component_key.set_barepath("/phys/diorite2"); |
| |
| Key insert_key1; |
| insert_key1.set_redfish_url_pattern("/redfish/v1/Chassis/Diorite_1"); |
| trie.Insert(insert_key1, val1); |
| |
| Key insert_key2; |
| insert_key2.set_redfish_url_pattern("/redfish/v1/Chassis/Diorite_2"); |
| trie.Insert(insert_key2, val2); |
| |
| // Exact lookups |
| Key lookup_key_1; |
| lookup_key_1.set_redfish_url_pattern("/redfish/v1/Chassis/Diorite_1"); |
| std::shared_ptr<const RedfishToUhmMappingValue> found1 = |
| trie.GetMappingFromUrl(lookup_key_1); |
| ASSERT_NE(found1, nullptr); |
| EXPECT_EQ(found1->uhm_monitored_component_key.barepath(), "/phys/diorite1"); |
| |
| Key lookup_key_2; |
| lookup_key_2.set_redfish_url_pattern("/redfish/v1/Chassis/Diorite_2"); |
| std::shared_ptr<const RedfishToUhmMappingValue> found2 = |
| trie.GetMappingFromUrl(lookup_key_2); |
| ASSERT_NE(found2, nullptr); |
| EXPECT_EQ(found2->uhm_monitored_component_key.barepath(), "/phys/diorite2"); |
| |
| // Prefix prefix checks (partial matches) |
| Key lookup_key_prefix; |
| lookup_key_prefix.set_redfish_url_pattern("/redfish/v1/Chassis"); |
| EXPECT_EQ(trie.GetMappingFromUrl(lookup_key_prefix), nullptr); |
| |
| Key lookup_key_extra; |
| lookup_key_extra.set_redfish_url_pattern( |
| "/redfish/v1/Chassis/Diorite_1/Extra"); |
| EXPECT_EQ(trie.GetMappingFromUrl(lookup_key_extra), nullptr); |
| } |
| |
| TEST(RedfishToUhmTrieTest, RegexLegMatching) { |
| RedfishToUhmTrie trie; |
| |
| auto val_regex = std::make_shared<RedfishToUhmMappingValue>(); |
| val_regex->uhm_monitored_component_key.set_barepath("/phys/any_dimm"); |
| |
| Key insert_key_regex; |
| insert_key_regex.set_redfish_url_pattern( |
| "/redfish/v1/Systems/system1/Memory/dimm[0-9]+"); |
| trie.Insert(insert_key_regex, val_regex); |
| |
| // Matches regex pattern |
| Key lookup_key_1; |
| lookup_key_1.set_redfish_url_pattern( |
| "/redfish/v1/Systems/system1/Memory/dimm5"); |
| auto found1 = trie.GetMappingFromUrl(lookup_key_1); |
| ASSERT_NE(found1, nullptr); |
| EXPECT_EQ(found1->uhm_monitored_component_key.barepath(), "/phys/any_dimm"); |
| |
| // Matches regex pattern with a different digit |
| Key lookup_key_2; |
| lookup_key_2.set_redfish_url_pattern( |
| "/redfish/v1/Systems/system1/Memory/dimm123"); |
| auto found2 = trie.GetMappingFromUrl(lookup_key_2); |
| ASSERT_NE(found2, nullptr); |
| EXPECT_EQ(found2->uhm_monitored_component_key.barepath(), "/phys/any_dimm"); |
| |
| // Does not match regex pattern (non-digit suffix) |
| Key lookup_key_fail; |
| lookup_key_fail.set_redfish_url_pattern( |
| "/redfish/v1/Systems/system1/Memory/dimmabc"); |
| auto found_fail = trie.GetMappingFromUrl(lookup_key_fail); |
| EXPECT_EQ(found_fail, nullptr); |
| } |
| |
| TEST(RedfishToUhmTrieTest, ExactMatchTakesPrecedenceOverRegex) { |
| RedfishToUhmTrie trie; |
| |
| auto val_exact = std::make_shared<RedfishToUhmMappingValue>(); |
| val_exact->uhm_monitored_component_key.set_barepath("/phys/dimm5_special"); |
| |
| auto val_regex = std::make_shared<RedfishToUhmMappingValue>(); |
| val_regex->uhm_monitored_component_key.set_barepath("/phys/dimm_generic"); |
| |
| Key insert_generic; |
| insert_generic.set_redfish_url_pattern( |
| "/redfish/v1/Systems/system1/Memory/dimm[0-9]+"); |
| trie.Insert(insert_generic, val_regex); |
| |
| Key insert_special; |
| insert_special.set_redfish_url_pattern( |
| "/redfish/v1/Systems/system1/Memory/dimm5"); |
| trie.Insert(insert_special, val_exact); |
| |
| // Exact match matches val_exact |
| Key lookup_special; |
| lookup_special.set_redfish_url_pattern( |
| "/redfish/v1/Systems/system1/Memory/dimm5"); |
| auto found_special = trie.GetMappingFromUrl(lookup_special); |
| ASSERT_NE(found_special, nullptr); |
| EXPECT_EQ(found_special->uhm_monitored_component_key.barepath(), |
| "/phys/dimm5_special"); |
| |
| // Other match falls back to generic regex |
| Key lookup_generic; |
| lookup_generic.set_redfish_url_pattern( |
| "/redfish/v1/Systems/system1/Memory/dimm6"); |
| auto found_generic = trie.GetMappingFromUrl(lookup_generic); |
| ASSERT_NE(found_generic, nullptr); |
| EXPECT_EQ(found_generic->uhm_monitored_component_key.barepath(), |
| "/phys/dimm_generic"); |
| } |
| |
| TEST(RedfishToUhmTrieTest, RegexDuplicateInsertionReusesNode) { |
| RedfishToUhmTrie trie; |
| |
| auto val1 = std::make_shared<RedfishToUhmMappingValue>(); |
| val1->uhm_monitored_component_key.set_barepath("/phys/dimm_generic_1"); |
| |
| auto val2 = std::make_shared<RedfishToUhmMappingValue>(); |
| val2->uhm_monitored_component_key.set_barepath("/phys/dimm_generic_2"); |
| |
| Key insert_key; |
| insert_key.set_redfish_url_pattern( |
| "/redfish/v1/Systems/system1/Memory/dimm[0-9]+"); |
| |
| trie.Insert(insert_key, val1); |
| // Re-insert same pattern to verify overwrite/reuse |
| trie.Insert(insert_key, val2); |
| |
| Key lookup_key; |
| lookup_key.set_redfish_url_pattern( |
| "/redfish/v1/Systems/system1/Memory/dimm5"); |
| auto found = trie.GetMappingFromUrl(lookup_key); |
| ASSERT_NE(found, nullptr); |
| EXPECT_EQ(found->uhm_monitored_component_key.barepath(), |
| "/phys/dimm_generic_2"); |
| } |
| |
| TEST(RedfishToUhmTrieTest, EmptyPatternLegLookupReturnsNull) { |
| RedfishToUhmTrie trie; |
| Key lookup_empty; |
| lookup_empty.set_redfish_url_pattern(""); |
| EXPECT_EQ(trie.GetMappingFromUrl(lookup_empty), nullptr); |
| } |
| |
| } // namespace |
| } // namespace devpath_plugin |