// 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.
  DOMHighResTimeStamp lower_limit =
      performance->MonotonicTimeToDOMHighResTimeStamp(base::TimeTicks::Now());

  DOMHighResTimeStamp current_time_in_milliseconds = performance->Now();

  DOMHighResTimeStamp upper_limit =
      performance->MonotonicTimeToDOMHighResTimeStamp(base::TimeTicks::Now());

  DCHECK_GE(current_time_in_milliseconds, lower_limit);
  DCHECK_LE(current_time_in_milliseconds, upper_limit);
}

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

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

  base::TimeTicks current_time_ticks = base::TimeTicks::Now();
  DOMHighResTimeStamp current_time = ClampTimeStampMinimumResolution(
      current_time_ticks,
      Performance::kPerformanceTimerMinResolutionInMicroseconds);
  DOMHighResTimeStamp current_time_respect_to_time_origin =
      performance->MonotonicTimeToDOMHighResTimeStamp(current_time_ticks);
  DOMHighResTimeStamp time_origin = ClampTimeStampMinimumResolution(
      performance->GetTimeOrigin(),
      Performance::kPerformanceTimerMinResolutionInMicroseconds);

  DCHECK_EQ(current_time_respect_to_time_origin, current_time - time_origin);
}

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());

  uint64 lower_limit =
      (base::TimeTicks::Now() - base::TimeTicks::UnixEpoch()).InMilliseconds();

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

  uint64 upper_limit =
      (base::TimeTicks::Now() - base::TimeTicks::UnixEpoch()).InMilliseconds();

  DCHECK_GE(performance->timing()->navigation_start(), lower_limit);
  DCHECK_LE(performance->timing()->navigation_start(), upper_limit);
}

}  // namespace dom
}  // namespace cobalt
