blob: 74a7a1b35afedf5e4a390fce7c5f3069f0fb205c [file] [log] [blame]
// Copyright 2017 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 "ui/events/fraction_of_time_without_user_input_recorder.h"
#include "base/test/metrics/histogram_tester.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/events/base_event_utils.h"
namespace ui {
namespace {
using base::Bucket;
using testing::ElementsAre;
using testing::Pair;
const char* kHistogram = "Event.FractionOfTimeWithoutUserInput";
class TestFractionOfTimeWithoutUserInputRecorder
: public FractionOfTimeWithoutUserInputRecorder {
public:
void RecordActiveInterval(base::TimeTicks start_time,
base::TimeTicks end_time) override {
active_intervals_.push_back(std::make_pair(start_time, end_time));
FractionOfTimeWithoutUserInputRecorder::RecordActiveInterval(start_time,
end_time);
}
void set_window_size_for_test(base::TimeDelta window_size) {
set_window_size(window_size);
}
void set_idle_timeout_for_test(base::TimeDelta idle_timeout) {
set_idle_timeout(idle_timeout);
}
const std::vector<std::pair<base::TimeTicks, base::TimeTicks>>&
active_intervals() {
return active_intervals_;
}
private:
std::vector<std::pair<base::TimeTicks, base::TimeTicks>> active_intervals_;
};
TEST(FractionOfTimeWithoutUserInputRecorderTest, IntervalIncludesIdleTimeout) {
TestFractionOfTimeWithoutUserInputRecorder idle_fraction_recorder;
idle_fraction_recorder.set_idle_timeout_for_test(
base::TimeDelta::FromSecondsD(0.1));
idle_fraction_recorder.RecordEventAtTime(EventTimeStampFromSeconds(0.5));
// Flush the previous event.
idle_fraction_recorder.RecordEventAtTime(EventTimeStampFromSeconds(100));
// We observed a single event, so the we consider it to have lasted a duration
// of one idle timeout.
EXPECT_THAT(idle_fraction_recorder.active_intervals(),
ElementsAre(Pair(EventTimeStampFromSeconds(0.5),
EventTimeStampFromSeconds(0.6))));
}
TEST(FractionOfTimeWithoutUserInputRecorderTest, TwoLongIntervals) {
TestFractionOfTimeWithoutUserInputRecorder idle_fraction_recorder;
idle_fraction_recorder.set_idle_timeout_for_test(
base::TimeDelta::FromSecondsD(0.1));
// Send events regularly between 0.1 seconds and 0.1 + 20 * 0.05 = 1.10
// seconds.
base::TimeTicks time = base::TimeTicks() + base::TimeDelta::FromSecondsD(0.1);
idle_fraction_recorder.RecordEventAtTime(time);
for (int i = 0; i < 20; ++i) {
time += base::TimeDelta::FromSecondsD(0.05);
idle_fraction_recorder.RecordEventAtTime(time);
}
// Send events regularly between 2.2 seconds and 2.2 + 20 * 0.05 = 3.20
// seconds.
time = base::TimeTicks() + base::TimeDelta::FromSecondsD(2.2);
idle_fraction_recorder.RecordEventAtTime(time);
for (int i = 0; i < 20; ++i) {
time += base::TimeDelta::FromSecondsD(0.05);
idle_fraction_recorder.RecordEventAtTime(time);
}
// Flush the previous event.
idle_fraction_recorder.RecordEventAtTime(EventTimeStampFromSeconds(100));
// Interval end times include idle timeout.
EXPECT_THAT(idle_fraction_recorder.active_intervals(),
ElementsAre(Pair(EventTimeStampFromSeconds(0.1),
EventTimeStampFromSeconds(1.2)),
Pair(EventTimeStampFromSeconds(2.2),
EventTimeStampFromSeconds(3.3))));
}
TEST(FractionOfTimeWithoutUserInputRecorderTest, SingleShortRange) {
TestFractionOfTimeWithoutUserInputRecorder idle_fraction_recorder;
idle_fraction_recorder.set_window_size_for_test(
base::TimeDelta::FromSecondsD(1));
base::HistogramTester tester;
// Start window at 1 second.
idle_fraction_recorder.RecordActiveInterval(EventTimeStampFromSeconds(1),
EventTimeStampFromSeconds(1));
idle_fraction_recorder.RecordActiveInterval(EventTimeStampFromSeconds(1.1),
EventTimeStampFromSeconds(1.6));
// Flush the previous interval.
idle_fraction_recorder.RecordActiveInterval(EventTimeStampFromSeconds(2),
EventTimeStampFromSeconds(2));
EXPECT_THAT(tester.GetAllSamples(kHistogram), ElementsAre(Bucket(50, 1)));
}
TEST(FractionOfTimeWithoutUserInputRecorderTest, SingleLongRange) {
TestFractionOfTimeWithoutUserInputRecorder idle_fraction_recorder;
idle_fraction_recorder.set_window_size_for_test(
base::TimeDelta::FromSecondsD(1));
base::HistogramTester tester;
// Start window at 1 second.
idle_fraction_recorder.RecordActiveInterval(EventTimeStampFromSeconds(1),
EventTimeStampFromSeconds(1));
idle_fraction_recorder.RecordActiveInterval(EventTimeStampFromSeconds(1.1),
EventTimeStampFromSeconds(4.2));
// Flush the previous interval.
idle_fraction_recorder.RecordActiveInterval(EventTimeStampFromSeconds(5),
EventTimeStampFromSeconds(5));
// The windows contain: [1.1, 2], [2, 3], [3, 4], [4, 4.2].
EXPECT_THAT(tester.GetAllSamples(kHistogram),
ElementsAre(Bucket(0, 2), Bucket(10, 1), Bucket(80, 1)));
}
TEST(FractionOfTimeWithoutUserInputRecorderTest, TwoLongRanges) {
TestFractionOfTimeWithoutUserInputRecorder idle_fraction_recorder;
idle_fraction_recorder.set_window_size_for_test(
base::TimeDelta::FromSecondsD(1));
base::HistogramTester tester;
// Start window at 1 second.
idle_fraction_recorder.RecordActiveInterval(EventTimeStampFromSeconds(1),
EventTimeStampFromSeconds(1));
idle_fraction_recorder.RecordActiveInterval(EventTimeStampFromSeconds(1.1),
EventTimeStampFromSeconds(2.2));
idle_fraction_recorder.RecordActiveInterval(EventTimeStampFromSeconds(2.6),
EventTimeStampFromSeconds(3.2));
// Flush the previous interval.
idle_fraction_recorder.RecordActiveInterval(EventTimeStampFromSeconds(4),
EventTimeStampFromSeconds(4));
// The windows contain:
// 1: 1.1 - 2.0
// 2: 2.0 - 2.2, 2.6 - 3.0
// 3: 3.0 - 3.2
EXPECT_THAT(tester.GetAllSamples(kHistogram),
ElementsAre(Bucket(10, 1), Bucket(40, 1), Bucket(80, 1)));
}
} // namespace
} // namespace ui