// Copyright (c) 2019 The Chromium 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 "quic/core/quic_time_accumulator.h"
#include "quic/platform/api/quic_test.h"
#include "quic/test_tools/mock_clock.h"

namespace quic {
namespace test {

TEST(QuicTimeAccumulator, DefaultConstruct) {
  MockClock clock;
  clock.AdvanceTime(QuicTime::Delta::FromMilliseconds(1));

  QuicTimeAccumulator acc;
  EXPECT_FALSE(acc.IsRunning());

  clock.AdvanceTime(QuicTime::Delta::FromMilliseconds(1));
  EXPECT_EQ(QuicTime::Delta::Zero(), acc.GetTotalElapsedTime());
  EXPECT_EQ(QuicTime::Delta::Zero(), acc.GetTotalElapsedTime(clock.Now()));
}

TEST(QuicTimeAccumulator, StartStop) {
  MockClock clock;
  clock.AdvanceTime(QuicTime::Delta::FromMilliseconds(1));

  QuicTimeAccumulator acc;
  acc.Start(clock.Now());
  EXPECT_TRUE(acc.IsRunning());

  clock.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
  acc.Stop(clock.Now());
  EXPECT_FALSE(acc.IsRunning());

  clock.AdvanceTime(QuicTime::Delta::FromMilliseconds(5));
  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), acc.GetTotalElapsedTime());
  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10),
            acc.GetTotalElapsedTime(clock.Now()));

  acc.Start(clock.Now());
  clock.AdvanceTime(QuicTime::Delta::FromMilliseconds(5));
  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), acc.GetTotalElapsedTime());
  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(15),
            acc.GetTotalElapsedTime(clock.Now()));

  clock.AdvanceTime(QuicTime::Delta::FromMilliseconds(5));
  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), acc.GetTotalElapsedTime());
  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(20),
            acc.GetTotalElapsedTime(clock.Now()));

  acc.Stop(clock.Now());
  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(20), acc.GetTotalElapsedTime());
  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(20),
            acc.GetTotalElapsedTime(clock.Now()));
}

TEST(QuicTimeAccumulator, ClockStepBackwards) {
  MockClock clock;
  clock.AdvanceTime(QuicTime::Delta::FromMilliseconds(100));

  QuicTimeAccumulator acc;
  acc.Start(clock.Now());

  clock.AdvanceTime(QuicTime::Delta::FromMilliseconds(-10));
  acc.Stop(clock.Now());
  EXPECT_EQ(QuicTime::Delta::Zero(), acc.GetTotalElapsedTime());
  EXPECT_EQ(QuicTime::Delta::Zero(), acc.GetTotalElapsedTime(clock.Now()));

  acc.Start(clock.Now());
  clock.AdvanceTime(QuicTime::Delta::FromMilliseconds(50));
  acc.Stop(clock.Now());

  acc.Start(clock.Now());
  clock.AdvanceTime(QuicTime::Delta::FromMilliseconds(-80));
  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(50), acc.GetTotalElapsedTime());
  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(50),
            acc.GetTotalElapsedTime(clock.Now()));
}

}  // namespace test
}  // namespace quic
