diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/platform/time_clamper_test.cc')
-rw-r--r-- | chromium/third_party/blink/renderer/platform/time_clamper_test.cc | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/chromium/third_party/blink/renderer/platform/time_clamper_test.cc b/chromium/third_party/blink/renderer/platform/time_clamper_test.cc new file mode 100644 index 00000000000..f519dcfb692 --- /dev/null +++ b/chromium/third_party/blink/renderer/platform/time_clamper_test.cc @@ -0,0 +1,99 @@ +// 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 "third_party/blink/renderer/platform/time_clamper.h" + +#include "testing/gtest/include/gtest/gtest.h" + +#include <cmath> + +namespace blink { +namespace { +const double kInterval = TimeClamper::kResolutionSeconds; +} + +TEST(TimeClamperTest, TimeStampsAreNonNegative) { + TimeClamper clamper; + EXPECT_GE(clamper.ClampTimeResolution(0), 0.f); + EXPECT_GE(clamper.ClampTimeResolution(TimeClamper::kResolutionSeconds), 0.f); +} + +TEST(TimeClamperTest, TimeStampsIncreaseByFixedAmount) { + const double kEpsilon = 1e-10; + TimeClamper clamper; + double prev = clamper.ClampTimeResolution(0); + for (double time_seconds = 0; time_seconds < kInterval * 100; + time_seconds += kInterval * 0.1) { + double clamped_time = clamper.ClampTimeResolution(time_seconds); + double delta = clamped_time - prev; + ASSERT_GE(delta, 0); + if (delta > kEpsilon) { + ASSERT_TRUE(std::fabs(delta - kInterval) < kEpsilon); + prev = clamped_time; + } + } +} + +TEST(TimeClamperTest, ClampingIsConsistent) { + TimeClamper clamper; + for (double time_seconds = 0; time_seconds < kInterval * 100; + time_seconds += kInterval * 0.1) { + double t1 = clamper.ClampTimeResolution(time_seconds); + double t2 = clamper.ClampTimeResolution(time_seconds); + EXPECT_EQ(t1, t2); + } +} + +TEST(TimeClamperTest, ClampingIsPerInstance) { + const double kEpsilon = 1e-10; + TimeClamper clamper1; + TimeClamper clamper2; + double time_seconds = 0; + while (true) { + if (std::fabs(clamper1.ClampTimeResolution(time_seconds) - + clamper2.ClampTimeResolution(time_seconds)) > kEpsilon) { + break; + } + time_seconds += kInterval; + } +} + +TEST(TimeClamperTest, ClampingIsUniform) { + const int kBuckets = 8; + const int kSampleCount = 10000; + const double kEpsilon = 1e-10; + const double kTimeStep = kInterval / kBuckets; + double time_seconds = 299792.458; + int histogram[kBuckets] = {0}; + TimeClamper clamper; + + // This test ensures the jitter thresholds are approximately uniformly + // distributed inside the clamping intervals. It samples individual intervals + // to detect where the threshold is and counts the number of steps taken. + for (int i = 0; i < kSampleCount; i++) { + double start = clamper.ClampTimeResolution(time_seconds); + for (int step = 0; step < kBuckets; step++) { + time_seconds += kTimeStep; + if (std::abs(clamper.ClampTimeResolution(time_seconds) - start) > + kEpsilon) { + histogram[step]++; + // Skip to the next interval to make sure each measurement is + // independent. + time_seconds = floor(time_seconds / kInterval) * kInterval + kInterval; + break; + } + } + } + + double expected_count = kSampleCount / kBuckets; + double chi_squared = 0; + for (int i = 0; i < kBuckets; ++i) { + double difference = histogram[i] - expected_count; + chi_squared += difference * difference / expected_count; + } + // P-value for a 0.001 significance level with 7 degrees of freedom. + EXPECT_LT(chi_squared, 24.322); +} + +} // namespace blink |