// 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
