| #include "rde/rde_dictionary_manager.hpp" |
| |
| #include <cstring> |
| #include <memory> |
| #include <optional> |
| #include <span> |
| |
| #include <gmock/gmock-matchers.h> |
| #include <gmock/gmock.h> |
| #include <gtest/gtest.h> |
| |
| namespace bios_bmc_smm_error_logger |
| { |
| namespace rde |
| { |
| |
| constexpr std::array<uint8_t, 132> dummyDictionary1{ |
| {0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x17, 0x01, 0x00, 0x00, 0x0, 0x0, |
| 0xc, 0x0, 0x0, 0xf0, 0xf0, 0xf1, 0x17, 0x1, 0x0, 0x0, 0x0, 0x0, |
| 0x0, 0x16, 0x0, 0x5, 0x0, 0xc, 0x84, 0x0, 0x14, 0x0, 0x0, 0x48, |
| 0x0, 0x1, 0x0, 0x13, 0x90, 0x0, 0x56, 0x1, 0x0, 0x0, 0x0, 0x0, |
| 0x0, 0x3, 0xa3, 0x0, 0x74, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, |
| 0xa6, 0x0, 0x34, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xbc, 0x0, |
| 0x64, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0xd2, 0x0, 0x0, 0x0, |
| 0x0, 0x52, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x74, 0x0, 0x0, 0x0, |
| 0x0, 0x0, 0x0, 0xf, 0xe5, 0x0, 0x46, 0x1, 0x0, 0x66, 0x0, 0x3, |
| 0x0, 0xb, 0xf4, 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, |
| 0xff, 0x0, 0x50, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x8, 0x1}}; |
| |
| constexpr std::array<uint8_t, 14> dummyDictionary2{ |
| {0x65, 0x0, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x41, 0x72, 0x72, 0x61, 0x79, |
| 0x50, 0x72}}; |
| |
| class RdeDictionaryManagerTest : public ::testing::Test |
| { |
| protected: |
| uint32_t resourceId = 1; |
| DictionaryManager dm; |
| }; |
| |
| TEST_F(RdeDictionaryManagerTest, DictionarySetTest) |
| { |
| // Add a single dictionary. |
| dm.startDictionaryEntry(resourceId, std::span(dummyDictionary1)); |
| EXPECT_THAT(dm.getDictionaryCount(), 0); |
| |
| // Mark the dictionary as a valid dictionary. |
| dm.markDataComplete(resourceId); |
| EXPECT_THAT(dm.getDictionaryCount(), 1); |
| |
| // Request the dictionary back and verify the data. |
| auto dataOrErr = dm.getDictionary(resourceId); |
| EXPECT_TRUE(dataOrErr); |
| EXPECT_THAT((*dataOrErr).size_bytes(), dummyDictionary1.size()); |
| EXPECT_THAT(memcmp((*dataOrErr).data(), dummyDictionary1.data(), |
| dummyDictionary1.size()), |
| 0); |
| } |
| |
| TEST_F(RdeDictionaryManagerTest, DictionaryNotSetTest) |
| { |
| // Add a single dictionary. |
| dm.startDictionaryEntry(resourceId, std::span(dummyDictionary1)); |
| EXPECT_THAT(dm.getDictionaryCount(), 0); |
| // Request the dictionary back without marking it complete. Request should |
| // fail. |
| EXPECT_FALSE(dm.getDictionary(resourceId)); |
| } |
| |
| TEST_F(RdeDictionaryManagerTest, DictionaryMultiSetTest) |
| { |
| // Creates a dictionary |
| dm.startDictionaryEntry(resourceId, std::span(dummyDictionary1)); |
| EXPECT_THAT(dm.getDictionaryCount(), 0); |
| dm.markDataComplete(resourceId); |
| EXPECT_THAT(dm.getDictionaryCount(), 1); |
| |
| // Creates a second dictionary. |
| dm.startDictionaryEntry(annotationResourceId, std::span(dummyDictionary2)); |
| dm.markDataComplete(annotationResourceId); |
| EXPECT_THAT(dm.getDictionaryCount(), 2); |
| |
| auto data1OrErr = dm.getDictionary(resourceId); |
| EXPECT_TRUE(data1OrErr); |
| EXPECT_THAT((*data1OrErr).size_bytes(), dummyDictionary1.size()); |
| EXPECT_THAT(memcmp((*data1OrErr).data(), dummyDictionary1.data(), |
| dummyDictionary1.size()), |
| 0); |
| |
| auto data2OrErr = dm.getDictionary(annotationResourceId); |
| EXPECT_TRUE(data2OrErr); |
| EXPECT_THAT((*data2OrErr).size_bytes(), dummyDictionary2.size()); |
| EXPECT_THAT(memcmp((*data2OrErr).data(), dummyDictionary2.data(), |
| dummyDictionary2.size()), |
| 0); |
| } |
| |
| TEST_F(RdeDictionaryManagerTest, DictionaryOverwriteTest) |
| { |
| dm.startDictionaryEntry(resourceId, std::span(dummyDictionary2)); |
| |
| // Recreate another one on the same location. |
| dm.startDictionaryEntry(resourceId, std::span(dummyDictionary1)); |
| EXPECT_THAT(dm.getDictionaryCount(), 0); |
| dm.markDataComplete(resourceId); |
| EXPECT_THAT(dm.getDictionaryCount(), 1); |
| |
| auto dataOrErr = dm.getDictionary(resourceId); |
| EXPECT_TRUE(dataOrErr); |
| EXPECT_THAT((*dataOrErr).size_bytes(), dummyDictionary1.size()); |
| EXPECT_THAT(memcmp((*dataOrErr).data(), dummyDictionary1.data(), |
| dummyDictionary1.size()), |
| 0); |
| |
| // Recreate another one on the same location. |
| dm.startDictionaryEntry(resourceId, std::span(dummyDictionary2)); |
| EXPECT_THAT(dm.getDictionaryCount(), 0); |
| dm.markDataComplete(resourceId); |
| EXPECT_THAT(dm.getDictionaryCount(), 1); |
| |
| auto newDataOrErr = dm.getDictionary(resourceId); |
| EXPECT_TRUE(newDataOrErr); |
| EXPECT_THAT((*newDataOrErr).size_bytes(), dummyDictionary2.size()); |
| EXPECT_THAT(memcmp((*newDataOrErr).data(), dummyDictionary2.data(), |
| dummyDictionary2.size()), |
| 0); |
| } |
| |
| TEST_F(RdeDictionaryManagerTest, DictionaryAppendDataTest) |
| { |
| // Creates a dictionary |
| dm.startDictionaryEntry(resourceId, std::span(dummyDictionary1)); |
| EXPECT_THAT(dm.getDictionaryCount(), 0); |
| |
| // Lets copy the dictionary in two sizes. |
| const uint32_t copySize1 = dummyDictionary2.size() / 2; |
| const uint32_t copySize2 = dummyDictionary2.size() - copySize1; |
| |
| // Overwrite on the same location as before. |
| dm.startDictionaryEntry(resourceId, |
| std::span(dummyDictionary2.data(), copySize1)); |
| dm.addDictionaryData( |
| resourceId, std::span(dummyDictionary2.data() + copySize1, copySize2)); |
| dm.markDataComplete(resourceId); |
| EXPECT_THAT(dm.getDictionaryCount(), 1); |
| |
| auto dataOrErr = dm.getDictionary(resourceId); |
| EXPECT_TRUE(dataOrErr); |
| EXPECT_THAT((*dataOrErr).size_bytes(), dummyDictionary2.size()); |
| EXPECT_THAT(memcmp((*dataOrErr).data(), dummyDictionary2.data(), |
| dummyDictionary2.size()), |
| 0); |
| } |
| |
| TEST_F(RdeDictionaryManagerTest, DictionaryOverrideWithAddDataTest) |
| { |
| dm.startDictionaryEntry(resourceId, std::span(dummyDictionary1)); |
| dm.markDataComplete(resourceId); |
| EXPECT_THAT(dm.getDictionaryCount(), 1); |
| |
| dm.addDictionaryData(resourceId, std::span(dummyDictionary2)); |
| EXPECT_THAT(dm.getDictionaryCount(), 0); |
| dm.markDataComplete(resourceId); |
| EXPECT_THAT(dm.getDictionaryCount(), 1); |
| } |
| |
| TEST_F(RdeDictionaryManagerTest, DictionaryInvalidateTest) |
| { |
| dm.startDictionaryEntry(resourceId, std::span(dummyDictionary1)); |
| dm.markDataComplete(resourceId); |
| EXPECT_THAT(dm.getDictionaryCount(), 1); |
| |
| dm.invalidateDictionaries(); |
| EXPECT_THAT(dm.getDictionaryCount(), 0); |
| } |
| |
| } // namespace rde |
| } // namespace bios_bmc_smm_error_logger |