// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/developer/forensics/utils/time.h"

#include <string>

#include <gtest/gtest.h>

#include "src/lib/timekeeper/test_clock.h"

namespace forensics {
namespace {
constexpr zx::duration kZero(zx::sec(0));

constexpr zx::duration kSecsOnly(zx::sec(1));
constexpr zx::duration kMinsOnly(zx::min(2));
constexpr zx::duration kHoursOnly(zx::hour(3));
constexpr zx::duration kDaysOnly(zx::hour(4 * 24));

constexpr zx::duration kSecsAndMins(kSecsOnly + kMinsOnly);
constexpr zx::duration kSecsAndHours(kSecsOnly + kHoursOnly);
constexpr zx::duration kSecsAndDays(kSecsOnly + kDaysOnly);
constexpr zx::duration kMinsAndHours(kMinsOnly + kHoursOnly);
constexpr zx::duration kMinsAndDays(kMinsOnly + kDaysOnly);
constexpr zx::duration kHoursAndDays(kHoursOnly + kDaysOnly);

constexpr zx::duration kSecsAndMinsAndHours(kSecsOnly + kMinsOnly + kHoursOnly);
constexpr zx::duration kSecsAndMinsAndDays(kSecsOnly + kMinsOnly + kDaysOnly);
constexpr zx::duration kSecsAndHoursAndDays(kSecsOnly + kHoursOnly + kDaysOnly);
constexpr zx::duration kMinsAndHoursAndDays(kMinsOnly + kHoursOnly + kDaysOnly);

constexpr zx::duration kAllUnits(kSecsOnly + kMinsOnly + kHoursOnly + kDaysOnly);
constexpr zx::duration kRndmNSecs(zx::nsec(278232000000000));
constexpr zx::duration kNegRndmNSecs(zx::nsec(-278232000000000));

constexpr char kZeroString[] = "0d0h0m0s";
constexpr char kSecsOnlyString[] = "0d0h0m1s";
constexpr char kMinsOnlyString[] = "0d0h2m0s";
constexpr char kHoursOnlyString[] = "0d3h0m0s";
constexpr char kDaysOnlyString[] = "4d0h0m0s";
constexpr char kSecsAndMinsString[] = "0d0h2m1s";
constexpr char kSecsAndHoursString[] = "0d3h0m1s";
constexpr char kSecsAndDaysString[] = "4d0h0m1s";
constexpr char kMinsAndHoursString[] = "0d3h2m0s";
constexpr char kMinsAndDaysString[] = "4d0h2m0s";
constexpr char kHoursAndDaysString[] = "4d3h0m0s";
constexpr char kSecsAndMinsAndHoursString[] = "0d3h2m1s";
constexpr char kSecsAndMinsAndDaysString[] = "4d0h2m1s";
constexpr char kSecsAndHoursAndDaysString[] = "4d3h0m1s";
constexpr char kMinsAndHoursAndDaysString[] = "4d3h2m0s";
constexpr char kAllUnitsString[] = "4d3h2m1s";
constexpr char kRndmNSecsString[] = "3d5h17m12s";

constexpr zx::time_utc kTime1(0);
constexpr zx::time_utc kTime2((zx::hour(7) + zx::min(14) + zx::sec(52)).get());
constexpr zx::time_utc kTime3((zx::hour(3) * 24 + zx::hour(15) + zx::min(33) + zx::sec(17)).get());

constexpr char kTime1Str[] = "1970-01-01 00:00:00 GMT";
constexpr char kTime2Str[] = "1970-01-01 07:14:52 GMT";
constexpr char kTime3Str[] = "1970-01-04 15:33:17 GMT";

TEST(TimeTest, FormatDuration_ZeroDuration) {
  EXPECT_EQ(FormatDuration(kZero).value(), kZeroString);
}

TEST(TimeTest, FormatDuration_SecondOnly) {
  EXPECT_EQ(FormatDuration(kSecsOnly).value(), kSecsOnlyString);
}

TEST(TimeTest, FormatDuration_MinuteOnly) {
  EXPECT_EQ(FormatDuration(kMinsOnly).value(), kMinsOnlyString);
}
TEST(TimeTest, FormatDuration_HourOnly) {
  EXPECT_EQ(FormatDuration(kHoursOnly).value(), kHoursOnlyString);
}

TEST(TimeTest, FormatDuration_DayOnly) {
  EXPECT_EQ(FormatDuration(kDaysOnly).value(), kDaysOnlyString);
}

TEST(TimeTest, FormatDuration_SecondAndMinute) {
  EXPECT_EQ(FormatDuration(kSecsAndMins).value(), kSecsAndMinsString);
}

TEST(TimeTest, FormatDuration_SecondAndHour) {
  EXPECT_EQ(FormatDuration(kSecsAndHours).value(), kSecsAndHoursString);
}

TEST(TimeTest, FormatDuration_SecondAndDay) {
  EXPECT_EQ(FormatDuration(kSecsAndDays).value(), kSecsAndDaysString);
}

TEST(TimeTest, FormatDuration_MinuteAndHour) {
  EXPECT_EQ(FormatDuration(kMinsAndHours).value(), kMinsAndHoursString);
}

TEST(TimeTest, FormatDuration_MinuteAndDay) {
  EXPECT_EQ(FormatDuration(kMinsAndDays).value(), kMinsAndDaysString);
}

TEST(TimeTest, FormatDuration_HourAndDay) {
  EXPECT_EQ(FormatDuration(kHoursAndDays).value(), kHoursAndDaysString);
}

TEST(TimeTest, FormatDuration_SecAndMinAndHour) {
  EXPECT_EQ(FormatDuration(kSecsAndMinsAndHours).value(), kSecsAndMinsAndHoursString);
}

TEST(TimeTest, FormatDuration_SecAndMinAndDay) {
  EXPECT_EQ(FormatDuration(kSecsAndMinsAndDays).value(), kSecsAndMinsAndDaysString);
}

TEST(TimeTest, FormatDuration_SecAndHourAndDay) {
  EXPECT_EQ(FormatDuration(kSecsAndHoursAndDays).value(), kSecsAndHoursAndDaysString);
}

TEST(TimeTest, FormatDuration_MinAndHourAndDay) {
  EXPECT_EQ(FormatDuration(kMinsAndHoursAndDays).value(), kMinsAndHoursAndDaysString);
}

TEST(TimeTest, FormatDuration_AllUnits) {
  EXPECT_EQ(FormatDuration(kAllUnits).value(), kAllUnitsString);
}

TEST(TimeTest, FormatDuration_RandomNSec) {
  EXPECT_EQ(FormatDuration(kRndmNSecs).value(), kRndmNSecsString);
}

TEST(TimeTest, FormatDuration_NegativeRandomNSec) {
  EXPECT_EQ(FormatDuration(kNegRndmNSecs), std::nullopt);
}

TEST(TimeTest, CurrentUtcTimeRaw) {
  timekeeper::TestClock clock;

  clock.Set(kTime1);
  EXPECT_EQ(CurrentUtcTimeRaw(&clock), kTime1);

  clock.Set(kTime2);
  EXPECT_EQ(CurrentUtcTimeRaw(&clock), kTime2);

  clock.Set(kTime3);
  EXPECT_EQ(CurrentUtcTimeRaw(&clock), kTime3);
}

TEST(TimeTest, CurrentUtcTime) {
  timekeeper::TestClock clock;

  clock.Set(kTime1);
  EXPECT_EQ(CurrentUtcTime(&clock), kTime1Str);

  clock.Set(kTime2);
  EXPECT_EQ(CurrentUtcTime(&clock), kTime2Str);

  clock.Set(kTime3);
  EXPECT_EQ(CurrentUtcTime(&clock), kTime3Str);
}

}  // namespace
}  // namespace forensics
