blob: 873a385d1e9ef0e778e90575d64dcfedf6d1ec2c [file] [log] [blame]
#include "utils/time_utils.hpp"
#include <gmock/gmock.h> // IWYU pragma: keep
#include <gtest/gtest.h> // IWYU pragma: keep
// IWYU pragma: no_include <gtest/gtest-message.h>
// IWYU pragma: no_include <gtest/gtest-test-part.h>
// IWYU pragma: no_include "gtest/gtest_pred_impl.h"
// IWYU pragma: no_include <gmock/gmock-matchers.h>
// IWYU pragma: no_include <gtest/gtest-matchers.h>
namespace redfish::time_utils
{
namespace
{
TEST(FromDurationTest, PositiveTests)
{
EXPECT_EQ(fromDurationString("PT12S"), std::chrono::milliseconds(12000));
EXPECT_EQ(fromDurationString("PT0.204S"), std::chrono::milliseconds(204));
EXPECT_EQ(fromDurationString("PT0.2S"), std::chrono::milliseconds(200));
EXPECT_EQ(fromDurationString("PT50M"), std::chrono::milliseconds(3000000));
EXPECT_EQ(fromDurationString("PT23H"), std::chrono::milliseconds(82800000));
EXPECT_EQ(fromDurationString("P51D"),
std::chrono::milliseconds(4406400000));
EXPECT_EQ(fromDurationString("PT2H40M10.1S"),
std::chrono::milliseconds(9610100));
EXPECT_EQ(fromDurationString("P20DT2H40M10.1S"),
std::chrono::milliseconds(1737610100));
EXPECT_EQ(fromDurationString(""), std::chrono::milliseconds(0));
}
TEST(FromDurationTest, NegativeTests)
{
EXPECT_EQ(fromDurationString("PTS"), std::nullopt);
EXPECT_EQ(fromDurationString("P1T"), std::nullopt);
EXPECT_EQ(fromDurationString("PT100M1000S100"), std::nullopt);
EXPECT_EQ(fromDurationString("PDTHMS"), std::nullopt);
EXPECT_EQ(fromDurationString("P9999999999999999999999999DT"), std::nullopt);
EXPECT_EQ(fromDurationString("PD222T222H222M222.222S"), std::nullopt);
EXPECT_EQ(fromDurationString("PT99999H9999999999999999999999M99999999999S"),
std::nullopt);
EXPECT_EQ(fromDurationString("PT-9H"), std::nullopt);
}
TEST(ToDurationTest, PositiveTests)
{
EXPECT_EQ(toDurationString(std::chrono::milliseconds(12000)), "PT12.000S");
EXPECT_EQ(toDurationString(std::chrono::milliseconds(204)), "PT0.204S");
EXPECT_EQ(toDurationString(std::chrono::milliseconds(200)), "PT0.200S");
EXPECT_EQ(toDurationString(std::chrono::milliseconds(3000000)), "PT50M");
EXPECT_EQ(toDurationString(std::chrono::milliseconds(82800000)), "PT23H");
EXPECT_EQ(toDurationString(std::chrono::milliseconds(4406400000)), "P51DT");
EXPECT_EQ(toDurationString(std::chrono::milliseconds(9610100)),
"PT2H40M10.100S");
EXPECT_EQ(toDurationString(std::chrono::milliseconds(1737610100)),
"P20DT2H40M10.100S");
}
TEST(ToDurationTest, NegativeTests)
{
EXPECT_EQ(toDurationString(std::chrono::milliseconds(-250)), "");
}
TEST(ToDurationStringFromUintTest, PositiveTests)
{
uint64_t maxAcceptedTimeMs =
static_cast<uint64_t>(std::chrono::milliseconds::max().count());
EXPECT_NE(toDurationStringFromUint(maxAcceptedTimeMs), std::nullopt);
EXPECT_EQ(toDurationStringFromUint(0), "PT");
EXPECT_EQ(toDurationStringFromUint(250), "PT0.250S");
EXPECT_EQ(toDurationStringFromUint(5000), "PT5.000S");
}
TEST(ToDurationStringFromUintTest, NegativeTests)
{
uint64_t minNotAcceptedTimeMs =
static_cast<uint64_t>(std::chrono::milliseconds::max().count()) + 1;
EXPECT_EQ(toDurationStringFromUint(minNotAcceptedTimeMs), std::nullopt);
EXPECT_EQ(toDurationStringFromUint(static_cast<uint64_t>(-1)),
std::nullopt);
}
TEST(GetDateTimeStdtime, ConversionTests)
{
// some time before the epoch
EXPECT_EQ(getDateTimeStdtime(std::time_t{-1234567}),
"1970-01-01T00:00:00+00:00");
// epoch
EXPECT_EQ(getDateTimeStdtime(std::time_t{0}), "1970-01-01T00:00:00+00:00");
// Limits
EXPECT_EQ(getDateTimeStdtime(std::numeric_limits<std::time_t>::max()),
"9999-12-31T23:59:59+00:00");
EXPECT_EQ(getDateTimeStdtime(std::numeric_limits<std::time_t>::min()),
"1970-01-01T00:00:00+00:00");
}
TEST(GetDateTimeUint, ConversionTests)
{
EXPECT_EQ(getDateTimeUint(uint64_t{1638312095}),
"2021-11-30T22:41:35+00:00");
// some time in the future, beyond 2038
EXPECT_EQ(getDateTimeUint(uint64_t{41638312095}),
"3289-06-18T21:48:15+00:00");
// the maximum time we support
EXPECT_EQ(getDateTimeUint(uint64_t{253402300799}),
"9999-12-31T23:59:59+00:00");
// returns the maximum Redfish date
EXPECT_EQ(getDateTimeUint(std::numeric_limits<uint64_t>::max()),
"9999-12-31T23:59:59+00:00");
EXPECT_EQ(getDateTimeUint(std::numeric_limits<uint64_t>::min()),
"1970-01-01T00:00:00+00:00");
}
TEST(GetDateTimeUintMs, ConverstionTests)
{
EXPECT_EQ(getDateTimeUintMs(uint64_t{1638312095123}),
"2021-11-30T22:41:35.123+00:00");
// returns the maximum Redfish date
EXPECT_EQ(getDateTimeUintMs(std::numeric_limits<uint64_t>::max()),
"9999-12-31T23:59:59.999+00:00");
EXPECT_EQ(getDateTimeUintMs(std::numeric_limits<uint64_t>::min()),
"1970-01-01T00:00:00.000+00:00");
}
TEST(Utility, GetDateTimeUintUs)
{
EXPECT_EQ(getDateTimeUintUs(uint64_t{1638312095123456}),
"2021-11-30T22:41:35.123456+00:00");
// returns the maximum Redfish date
EXPECT_EQ(getDateTimeUintUs(std::numeric_limits<uint64_t>::max()),
"9999-12-31T23:59:59.999999+00:00");
EXPECT_EQ(getDateTimeUintUs(std::numeric_limits<uint64_t>::min()),
"1970-01-01T00:00:00.000000+00:00");
}
TEST(Utility, DateStringToEpoch)
{
EXPECT_EQ(dateStringToEpoch("2021-11-30T22:41:35.123456+00:00"),
usSinceEpoch{1638312095123456});
// no timezone
EXPECT_EQ(dateStringToEpoch("2021-11-30T22:41:35.123456"),
usSinceEpoch{1638312095123456});
// Milliseconds precision
EXPECT_EQ(dateStringToEpoch("2021-11-30T22:41:35.123"),
usSinceEpoch{1638312095123000});
// Seconds precision
EXPECT_EQ(dateStringToEpoch("2021-11-30T22:41:35"),
usSinceEpoch{1638312095000000});
// Non zero timezone
EXPECT_EQ(dateStringToEpoch("2021-11-30T22:41:35.123456+04:00"),
usSinceEpoch{1638297695123456});
// Epoch
EXPECT_EQ(dateStringToEpoch("1970-01-01T00:00:00.000000+00:00"),
usSinceEpoch{0});
// Max time
EXPECT_EQ(dateStringToEpoch("9999-12-31T23:59:59.999999+00:00"),
usSinceEpoch{253402300799999999});
// Underflow
// Currently gives wrong result
// EXPECT_EQ(dateStringToEpoch("1969-12-30T23:59:59.999999+00:00"),
// std::nullopt);
}
} // namespace
} // namespace redfish::time_utils