// Copyright 2015 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "cobalt/dom/performance.h"
#include "cobalt/dom/performance_high_resolution_time.h"
#include "cobalt/dom/testing/stub_environment_settings.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace cobalt {
namespace dom {

TEST(PerformanceTest, Now) {
  scoped_refptr<base::SystemMonotonicClock> clock(
      new base::SystemMonotonicClock());

  testing::StubEnvironmentSettings environment_settings;
  scoped_refptr<Performance> performance(new Performance(&environment_settings, clock));

  // Test that now returns a result that is within a correct range for the
  // current time.
  base::TimeDelta lower_limit = base::Time::Now() - base::Time::UnixEpoch();

  DOMHighResTimeStamp current_time_in_milliseconds = performance->Now();

  base::TimeDelta upper_limit = base::Time::Now() - base::Time::UnixEpoch();

  DCHECK_GE(current_time_in_milliseconds, ConvertTimeDeltaToDOMHighResTimeStamp(
      lower_limit - performance->get_time_origin(),
      Performance::kPerformanceTimerMinResolutionInMicroseconds));
  DCHECK_LE(current_time_in_milliseconds, ConvertTimeDeltaToDOMHighResTimeStamp(
      upper_limit - performance->get_time_origin(),
      Performance::kPerformanceTimerMinResolutionInMicroseconds));
}

TEST(PerformanceTest, TimeOrigin) {
  scoped_refptr<base::SystemMonotonicClock> clock(
      new base::SystemMonotonicClock());
  // Test that time_origin returns a result that is within a correct range for
  // the current time.
  base::Time lower_limit = base::Time::Now();

  testing::StubEnvironmentSettings environment_settings;
  scoped_refptr<Performance> performance(new Performance(&environment_settings, clock));

  base::Time upper_limit = base::Time::Now();

  base::TimeDelta lower_limit_delta = lower_limit - base::Time::UnixEpoch();
  base::TimeDelta upper_limit_delta = upper_limit - base::Time::UnixEpoch();

  base::TimeDelta time_zero =
      base::Time::UnixEpoch().ToDeltaSinceWindowsEpoch();

  DOMHighResTimeStamp lower_limit_milliseconds =
        ConvertTimeDeltaToDOMHighResTimeStamp(lower_limit_delta + time_zero,
            Performance::kPerformanceTimerMinResolutionInMicroseconds);

  DOMHighResTimeStamp upper_limit_milliseconds =
        ConvertTimeDeltaToDOMHighResTimeStamp(upper_limit_delta + time_zero,
            Performance::kPerformanceTimerMinResolutionInMicroseconds);

  DCHECK_GE(performance->time_origin(), lower_limit_milliseconds);
  DCHECK_LE(performance->time_origin(), upper_limit_milliseconds);
}

TEST(PerformanceTest, NavigationStart) {
  // navigationStart is supposed to return the time, in milliseconds, since
  // January 1st, 1970 (UTC):
  //   https://w3c.github.io/navigation-timing/#the-performancetiming-interface
  // We assume (and test) here though that navigationStart time will be set
  // relative to the time that the NavigationTiming object was created, since
  // the object will be created at the beginning of a new navigation.
  scoped_refptr<base::SystemMonotonicClock> clock(
      new base::SystemMonotonicClock());
  base::Time lower_limit = base::Time::Now();

  scoped_refptr<PerformanceTiming> performance_timing(
      new PerformanceTiming(clock));

  base::Time upper_limit = base::Time::Now();

  DCHECK_GE(performance_timing->navigation_start(),
            static_cast<uint64>(
                (lower_limit - base::Time::UnixEpoch()).InMilliseconds()));
  DCHECK_LE(performance_timing->navigation_start(),
            static_cast<uint64>(
                (upper_limit - base::Time::UnixEpoch()).InMilliseconds()));
}

}  // namespace dom
}  // namespace cobalt
