|  | // 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 "net/third_party/quiche/src/quic/core/quic_time_accumulator.h" | 
|  | #include "net/third_party/quiche/src/quic/platform/api/quic_test.h" | 
|  | #include "net/third_party/quiche/src/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 |