// Copyright 2018 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 "chrome/browser/resource_coordinator/usage_clock.h"

#include "base/test/scoped_task_environment.h"
#include "base/test/simple_test_tick_clock.h"
#include "chrome/browser/resource_coordinator/time.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker.h"

namespace resource_coordinator {

TEST(ResourceCoordinatorUsageClock, UsageClock) {
  // Required to use DesktopSessionDurationTracker.
  base::test::ScopedTaskEnvironment scoped_task_environment;

  {
    base::SimpleTestTickClock clock;
    clock.Advance(base::TimeDelta::FromMinutes(42));
    ScopedSetTickClockForTesting scoped_set_tick_clock_for_testing(&clock);

    metrics::DesktopSessionDurationTracker::Initialize();
    auto* tracker = metrics::DesktopSessionDurationTracker::Get();
    tracker->OnVisibilityChanged(true, base::TimeDelta());
    tracker->OnUserEvent();
    EXPECT_TRUE(tracker->in_session());

    UsageClock usage_clock;
    EXPECT_EQ(usage_clock.GetTotalUsageTime(), base::TimeDelta());
    EXPECT_TRUE(tracker->in_session());
    EXPECT_TRUE(usage_clock.IsInUse());

    // Verify that time advances when Chrome is in use.
    clock.Advance(base::TimeDelta::FromMinutes(1));
    EXPECT_EQ(usage_clock.GetTotalUsageTime(), base::TimeDelta::FromMinutes(1));
    clock.Advance(base::TimeDelta::FromMinutes(1));
    EXPECT_EQ(usage_clock.GetTotalUsageTime(), base::TimeDelta::FromMinutes(2));

    // Verify that time is updated when Chrome stops being used.
    clock.Advance(base::TimeDelta::FromMinutes(1));
    tracker->OnVisibilityChanged(false, base::TimeDelta());
    EXPECT_FALSE(tracker->in_session());
    EXPECT_FALSE(usage_clock.IsInUse());
    EXPECT_EQ(usage_clock.GetTotalUsageTime(), base::TimeDelta::FromMinutes(3));

    // Verify that time stays still when Chrome is not in use.
    clock.Advance(base::TimeDelta::FromMinutes(1));
    EXPECT_EQ(usage_clock.GetTotalUsageTime(), base::TimeDelta::FromMinutes(3));

    // Verify that time advances again when Chrome is in use.
    tracker->OnVisibilityChanged(true, base::TimeDelta());
    EXPECT_TRUE(tracker->in_session());
    EXPECT_TRUE(usage_clock.IsInUse());
    clock.Advance(base::TimeDelta::FromMinutes(1));
    EXPECT_EQ(usage_clock.GetTotalUsageTime(), base::TimeDelta::FromMinutes(4));
  }

  // Must be after UsageClock destruction.
  metrics::DesktopSessionDurationTracker::CleanupForTesting();
}

}  // namespace resource_coordinator
