blob: b369ca1d9d623a63bdff5bd6e17ab0f4e8a63eb4 [file] [log] [blame]
// Copyright 2020 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 "components/autofill_assistant/browser/actions/stopwatch.h"
#include "base/logging.h"
#include "base/time/time_override.h"
#include "testing/gmock/include/gmock/gmock.h"
namespace autofill_assistant {
namespace {
class TimeTicksOverride {
public:
static base::TimeTicks Now() { return now_ticks_; }
static base::TimeTicks now_ticks_;
};
// static
base::TimeTicks TimeTicksOverride::now_ticks_ = base::TimeTicks::Now();
class StopwatchTest : public testing::Test {
protected:
Stopwatch stopwatch_;
};
TEST_F(StopwatchTest, SimpleRun) {
base::subtle::ScopedTimeClockOverrides overrides(
nullptr, &TimeTicksOverride::Now, nullptr);
EXPECT_TRUE(stopwatch_.Start());
EXPECT_FALSE(stopwatch_.Start());
EXPECT_TRUE(stopwatch_.IsRunning());
TimeTicksOverride::now_ticks_ += base::Seconds(1);
EXPECT_EQ(base::Seconds(1), stopwatch_.TotalElapsed());
TimeTicksOverride::now_ticks_ += base::Seconds(2);
EXPECT_TRUE(stopwatch_.Stop());
EXPECT_FALSE(stopwatch_.Stop());
EXPECT_EQ(base::Seconds(3), stopwatch_.TotalElapsed());
TimeTicksOverride::now_ticks_ += base::Seconds(2);
EXPECT_TRUE(stopwatch_.Start());
TimeTicksOverride::now_ticks_ += base::Seconds(1);
EXPECT_EQ(base::Seconds(4), stopwatch_.TotalElapsed());
TimeTicksOverride::now_ticks_ += base::Seconds(1);
EXPECT_TRUE(stopwatch_.Stop());
EXPECT_EQ(base::Seconds(5), stopwatch_.TotalElapsed());
}
TEST_F(StopwatchTest, AddTime) {
base::subtle::ScopedTimeClockOverrides overrides(
nullptr, &TimeTicksOverride::Now, nullptr);
stopwatch_.Start();
TimeTicksOverride::now_ticks_ += base::Seconds(1);
stopwatch_.Stop();
stopwatch_.AddTime(base::Seconds(2));
EXPECT_EQ(base::Seconds(3), stopwatch_.TotalElapsed());
}
TEST_F(StopwatchTest, RemoveTime) {
base::subtle::ScopedTimeClockOverrides overrides(
nullptr, &TimeTicksOverride::Now, nullptr);
stopwatch_.Start();
TimeTicksOverride::now_ticks_ += base::Seconds(2);
stopwatch_.Stop();
stopwatch_.RemoveTime(base::Seconds(1));
EXPECT_EQ(base::Seconds(1), stopwatch_.TotalElapsed());
}
TEST_F(StopwatchTest, RemoveGreaterThanElapsed) {
base::subtle::ScopedTimeClockOverrides overrides(
nullptr, &TimeTicksOverride::Now, nullptr);
stopwatch_.Start();
TimeTicksOverride::now_ticks_ += base::Seconds(1);
stopwatch_.Stop();
stopwatch_.RemoveTime(base::Seconds(2));
EXPECT_EQ(base::Seconds(0), stopwatch_.TotalElapsed());
}
// This parameterized test uses 4 parameters: time to start at, time to stop at,
// expected time before the stop is invoked and expected time at the end.
// If start at or stop at times are 0, the regular Start() and Stop() methods
// are used instead of the StartAt(time) or StopAt(time).
class StopwatchStartStopTest
: public StopwatchTest,
public testing::WithParamInterface<std::tuple<long, long, long, long>> {};
INSTANTIATE_TEST_SUITE_P(ParametrizedTests,
StopwatchStartStopTest,
testing::Values(std::make_tuple(-1, 1, 1, 2),
std::make_tuple(1, 2, 0, 1),
std::make_tuple(2, 1, 0, 0),
std::make_tuple(-1, 0, 1, 1),
std::make_tuple(1, 0, 0, 0),
std::make_tuple(0, 1, 0, 1)));
TEST_P(StopwatchStartStopTest, StartAndStopAt) {
base::subtle::ScopedTimeClockOverrides overrides(
nullptr, &TimeTicksOverride::Now, nullptr);
long start_at = std::get<0>(GetParam());
long stop_at = std::get<1>(GetParam());
long expected_while_running = std::get<2>(GetParam());
long expected = std::get<3>(GetParam());
if (start_at) {
stopwatch_.StartAt(TimeTicksOverride::now_ticks_ + base::Seconds(start_at));
} else {
stopwatch_.Start();
}
EXPECT_EQ(base::Seconds(expected_while_running), stopwatch_.TotalElapsed());
if (stop_at) {
stopwatch_.StopAt(TimeTicksOverride::now_ticks_ + base::Seconds(stop_at));
} else {
stopwatch_.Stop();
}
EXPECT_EQ(base::Seconds(expected), stopwatch_.TotalElapsed());
}
class ActionStopwatchTest : public testing::Test {
protected:
ActionStopwatch action_stopwatch_;
};
TEST_F(ActionStopwatchTest, SimpleRun) {
base::subtle::ScopedTimeClockOverrides overrides(
nullptr, &TimeTicksOverride::Now, nullptr);
action_stopwatch_.StartActiveTime();
TimeTicksOverride::now_ticks_ += base::Seconds(1);
action_stopwatch_.StartWaitTime();
TimeTicksOverride::now_ticks_ += base::Seconds(2);
action_stopwatch_.Stop();
EXPECT_EQ(base::Seconds(1), action_stopwatch_.TotalActiveTime());
EXPECT_EQ(base::Seconds(2), action_stopwatch_.TotalWaitTime());
}
TEST_F(ActionStopwatchTest, TransferToActive) {
base::subtle::ScopedTimeClockOverrides overrides(
nullptr, &TimeTicksOverride::Now, nullptr);
action_stopwatch_.StartActiveTime();
TimeTicksOverride::now_ticks_ += base::Seconds(4);
action_stopwatch_.StartWaitTime();
TimeTicksOverride::now_ticks_ += base::Seconds(2);
action_stopwatch_.Stop();
action_stopwatch_.TransferToActiveTime(base::Seconds(3));
EXPECT_EQ(base::Seconds(7), action_stopwatch_.TotalActiveTime());
EXPECT_EQ(base::Seconds(0), action_stopwatch_.TotalWaitTime());
}
TEST_F(ActionStopwatchTest, TransferToWait) {
base::subtle::ScopedTimeClockOverrides overrides(
nullptr, &TimeTicksOverride::Now, nullptr);
action_stopwatch_.StartActiveTime();
TimeTicksOverride::now_ticks_ += base::Seconds(2);
action_stopwatch_.StartWaitTime();
TimeTicksOverride::now_ticks_ += base::Seconds(4);
action_stopwatch_.Stop();
action_stopwatch_.TransferToWaitTime(base::Seconds(3));
EXPECT_EQ(base::Seconds(0), action_stopwatch_.TotalActiveTime());
EXPECT_EQ(base::Seconds(7), action_stopwatch_.TotalWaitTime());
}
TEST_F(ActionStopwatchTest, StartTimesAt) {
base::subtle::ScopedTimeClockOverrides overrides(
nullptr, &TimeTicksOverride::Now, nullptr);
action_stopwatch_.StartActiveTimeAt(TimeTicksOverride::now_ticks_ +
base::Seconds(1));
TimeTicksOverride::now_ticks_ += base::Seconds(5);
action_stopwatch_.StartWaitTimeAt(TimeTicksOverride::now_ticks_ -
base::Seconds(1));
TimeTicksOverride::now_ticks_ += base::Seconds(2);
action_stopwatch_.Stop();
EXPECT_EQ(base::Seconds(3), action_stopwatch_.TotalActiveTime());
EXPECT_EQ(base::Seconds(3), action_stopwatch_.TotalWaitTime());
}
} // namespace
} // namespace autofill_assistant