1 #include "event_log.hpp" 2 3 #include <nlohmann/json.hpp> 4 5 #include <cerrno> 6 #include <cstddef> 7 #include <ctime> 8 #include <string> 9 #include <string_view> 10 #include <vector> 11 12 #include <gmock/gmock.h> 13 #include <gtest/gtest.h> 14 15 namespace redfish::event_log 16 { 17 namespace 18 { 19 20 TEST(RedfishEventLog, GetUniqueEntryIDSuccess) 21 { 22 bool success = false; 23 std::string entryID; 24 std::string example = "2000-01-02T03:04:05"; 25 success = getUniqueEntryID(example, entryID); 26 27 ASSERT_EQ(success, true); 28 29 // assert the prefix since the specific number can depend on timezone 30 ASSERT_TRUE(entryID.starts_with("946")); 31 } 32 33 TEST(RedfishEventLog, GetUniqueEntryIDUnique) 34 { 35 bool success = false; 36 std::string entryID1; 37 std::string entryID2; 38 std::string example = "2000-08-02T03:04:05"; 39 40 success = getUniqueEntryID(example, entryID1); 41 ASSERT_EQ(success, true); 42 success = getUniqueEntryID(example, entryID2); 43 ASSERT_EQ(success, true); 44 45 // when calling a second time with the same argument 46 // there should be an underscore 47 ASSERT_TRUE(entryID2.contains("_")); 48 49 // only one '_' allowed 50 ASSERT_THAT(entryID2, testing::MatchesRegex("^[0-9]+_[0-9]+$")); 51 } 52 53 TEST(RedfishEventLog, GetUniqueEntryIDIndex) 54 { 55 std::string entryID1; 56 std::string entryID2; 57 std::string entryID3; 58 std::string example = "2000-08-02T03:04:05"; 59 60 getUniqueEntryID(example, entryID1); 61 getUniqueEntryID(example, entryID2); 62 getUniqueEntryID(example, entryID3); 63 64 const size_t index = entryID2.find('_'); 65 66 ASSERT_NE(index, std::string::npos); 67 68 const long n1 = std::stol(entryID2.substr(index + 1)); 69 70 // unique index for repeated timestamp is >= 0 71 ASSERT_GE(n1, 0); 72 73 const long n2 = std::stol(entryID3.substr(entryID3.find('_') + 1)); 74 75 // unique index is monotonic increasing 76 ASSERT_TRUE(n2 > n1); 77 } 78 79 TEST(RedfishEventLog, GetEventLogParamsSuccess) 80 { 81 int status = 0; 82 std::string logEntry = "32938 3,hello"; 83 84 std::string timestamp; 85 std::string messageID; 86 std::vector<std::string> messageArgs; 87 88 status = getEventLogParams(logEntry, timestamp, messageID, messageArgs); 89 90 ASSERT_EQ(status, 0); 91 92 ASSERT_EQ(timestamp, "32938"); 93 ASSERT_EQ(messageID, "3"); 94 ASSERT_EQ(messageArgs.size(), 1); 95 ASSERT_EQ(messageArgs[0], "hello"); 96 } 97 98 TEST(RedfishEventLog, GetEventLogParamsFailNoTimestamp) 99 { 100 int status = 0; 101 std::string logEntry = "3,hello"; 102 103 std::string timestamp; 104 std::string messageID; 105 std::vector<std::string> messageArgs; 106 107 status = getEventLogParams(logEntry, timestamp, messageID, messageArgs); 108 109 ASSERT_EQ(status, -EINVAL); 110 } 111 112 TEST(RedfishEventLog, GetEventLogParamsFailNoComma) 113 { 114 int status = 0; 115 std::string logEntry = "malformed"; 116 117 std::string timestamp; 118 std::string messageID; 119 std::vector<std::string> messageArgs; 120 121 status = getEventLogParams(logEntry, timestamp, messageID, messageArgs); 122 123 ASSERT_EQ(status, -EINVAL); 124 } 125 126 TEST(RedfishEventLog, FormatEventLogEntrySuccess) 127 { 128 int status = 0; 129 std::string logEntryID = "23849423_3"; 130 std::string messageID = "OpenBMC.0.1.PowerSupplyFanFailed"; 131 std::vector<std::string_view> messageArgs = {"PSU 1", "FAN 2"}; 132 std::string timestamp = "my-timestamp"; 133 std::string customText = "customText"; 134 135 nlohmann::json::object_t logEntryJson; 136 status = formatEventLogEntry(logEntryID, messageID, messageArgs, timestamp, 137 customText, logEntryJson); 138 139 ASSERT_EQ(status, 0); 140 141 ASSERT_TRUE(logEntryJson.contains("EventId")); 142 ASSERT_EQ(logEntryJson["EventId"], "23849423_3"); 143 144 ASSERT_TRUE(logEntryJson.contains("Message")); 145 ASSERT_EQ(logEntryJson["Message"], "Power supply PSU 1 fan FAN 2 failed."); 146 147 ASSERT_TRUE(logEntryJson.contains("MessageId")); 148 ASSERT_EQ(logEntryJson["MessageId"], "OpenBMC.0.1.PowerSupplyFanFailed"); 149 150 ASSERT_TRUE(logEntryJson.contains("MessageArgs")); 151 ASSERT_EQ(logEntryJson["MessageArgs"].size(), 2); 152 ASSERT_EQ(logEntryJson["MessageArgs"][0], "PSU 1"); 153 ASSERT_EQ(logEntryJson["MessageArgs"][1], "FAN 2"); 154 155 ASSERT_TRUE(logEntryJson.contains("EventTimestamp")); 156 157 // May need to fix this, it should not pass like this. 158 ASSERT_EQ(logEntryJson["EventTimestamp"], "my-timestamp"); 159 160 ASSERT_TRUE(logEntryJson.contains("Context")); 161 ASSERT_EQ(logEntryJson["Context"], "customText"); 162 } 163 164 TEST(RedfishEventLog, FormatEventLogEntryFail) 165 { 166 int status = 0; 167 std::string logEntryID = "malformed"; 168 std::string messageID; 169 std::vector<std::string_view> messageArgs; 170 std::string timestamp; 171 std::string customText; 172 173 nlohmann::json::object_t logEntryJson; 174 status = formatEventLogEntry(logEntryID, messageID, messageArgs, timestamp, 175 customText, logEntryJson); 176 177 ASSERT_EQ(status, -1); 178 } 179 180 } // namespace 181 } // namespace redfish::event_log 182