blob: e8ddc096caa75f0f29e8e18ec578fdc0d04d248e [file] [log] [blame]
#include "config.h"
#include "elog_entry.hpp"
#include "elog_serialize.hpp"
#include "extensions.hpp"
#include "log_manager.hpp"
#include "paths.hpp"
#include <filesystem>
#include <thread>
#include <gtest/gtest.h>
namespace phosphor
{
namespace logging
{
namespace test
{
using namespace std::chrono_literals;
namespace fs = std::filesystem;
void deleteIsProhibitedMock(uint32_t /*id*/, bool& prohibited)
{
prohibited = true;
}
void deleteIsNotProhibitedMock(uint32_t /*id*/, bool& prohibited)
{
prohibited = false;
}
// Test that the update timestamp changes when the resolved property changes
TEST(TestUpdateTS, testChangeResolved)
{
// Setting resolved will serialize, so need this directory.
fs::create_directories(paths::error());
if (!fs::exists(paths::error()))
{
ADD_FAILURE() << "Could not create " << paths::error() << "\n";
exit(1);
}
auto bus = sdbusplus::bus::new_default();
phosphor::logging::internal::Manager manager(bus, OBJ_INTERNAL);
// Use a random number for the ID to avoid other CI
// testcases running in parallel.
std::srand(std::time(nullptr));
uint32_t id = std::rand();
if (fs::exists(fs::path{paths::error()} / std::to_string(id)))
{
std::cerr << "Another testcase is using ID " << id << "\n";
id = std::rand();
}
uint64_t timestamp{100};
std::string message{"test error"};
std::string fwLevel{"level42"};
std::string path{"/tmp/99"};
std::vector<std::string> testData{"additional", "data"};
phosphor::logging::AssociationList associations{};
Entry elog{bus,
std::string(OBJ_ENTRY) + '/' + std::to_string(id),
id,
timestamp,
Entry::Level::Informational,
std::move(message),
std::move(testData),
std::move(associations),
fwLevel,
path,
manager};
EXPECT_EQ(elog.timestamp(), elog.updateTimestamp());
std::this_thread::sleep_for(1ms);
elog.resolved(true);
auto updateTS = elog.updateTimestamp();
EXPECT_NE(updateTS, elog.timestamp());
std::this_thread::sleep_for(1ms);
elog.resolved(false);
EXPECT_NE(updateTS, elog.updateTimestamp());
updateTS = elog.updateTimestamp();
std::this_thread::sleep_for(1ms);
// No change
elog.resolved(false);
EXPECT_EQ(updateTS, elog.updateTimestamp());
// Leave the directory in case other CI instances are running
fs::remove(fs::path{paths::error()} / std::to_string(id));
}
TEST(TestResolveProhibited, testResolveFlagChange)
{
// Setting resolved will serialize, so need this directory.
fs::create_directory(ERRLOG_PERSIST_PATH);
if (!fs::exists(ERRLOG_PERSIST_PATH))
{
ADD_FAILURE() << "Could not create " << ERRLOG_PERSIST_PATH << "\n";
exit(1);
}
auto bus = sdbusplus::bus::new_default();
phosphor::logging::internal::Manager manager(bus, OBJ_INTERNAL);
// Use a random number for the ID to avoid other CI
// testcases running in parallel.
std::srand(std::time(nullptr));
uint32_t id = std::rand();
if (fs::exists(fs::path{ERRLOG_PERSIST_PATH} / std::to_string(id)))
{
std::cerr << "Another testcase is using ID " << id << "\n";
id = std::rand();
}
uint64_t timestamp{100};
std::string message{"test error"};
std::string fwLevel{"level42"};
std::string path{"/tmp/99"};
std::vector<std::string> testData{"additional", "data"};
phosphor::logging::AssociationList associations{};
Entry elog{bus,
std::string(OBJ_ENTRY) + '/' + std::to_string(id),
id,
timestamp,
Entry::Level::Informational,
std::move(message),
std::move(testData),
std::move(associations),
fwLevel,
path,
manager};
Extensions ext{deleteIsProhibitedMock};
EXPECT_THROW(elog.resolved(true),
sdbusplus::xyz::openbmc_project::Common::Error::Unavailable);
Extensions::getDeleteProhibitedFunctions().clear();
Extensions e{deleteIsNotProhibitedMock};
EXPECT_NO_THROW(elog.resolved(true));
EXPECT_EQ(elog.resolved(), true);
// Leave the directory in case other CI instances are running
fs::remove(fs::path{ERRLOG_PERSIST_PATH} / std::to_string(id));
}
} // namespace test
} // namespace logging
} // namespace phosphor