Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1728)

Unified Diff: content/common/inter_process_time_ticks_converter_unittest.cc

Issue 7602023: Use a monotonic clock (TimeTicks) to report network times to WebCore. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Sync & Merge Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/common/inter_process_time_ticks_converter.cc ('k') | content/common/resource_dispatcher.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/common/inter_process_time_ticks_converter_unittest.cc
diff --git a/content/common/inter_process_time_ticks_converter_unittest.cc b/content/common/inter_process_time_ticks_converter_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..1d1f30155870318d068bdb1769613d183777053c
--- /dev/null
+++ b/content/common/inter_process_time_ticks_converter_unittest.cc
@@ -0,0 +1,206 @@
+// Copyright (c) 2011 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 "base/time.h"
+#include "content/common/inter_process_time_ticks_converter.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using base::TimeTicks;
+
+namespace content {
+
+namespace {
+
+struct TestParams {
+ int64 local_lower_bound;
+ int64 remote_lower_bound;
+ int64 remote_upper_bound;
+ int64 local_upper_bound;
+ int64 test_time;
+ int64 test_delta;
+};
+
+struct TestResults {
+ int64 result_time;
+ int32 result_delta;
+};
+
+TestResults RunTest(const TestParams& params) {
+ TimeTicks local_lower_bound = TimeTicks::FromInternalValue(
+ params.local_lower_bound);
+ TimeTicks local_upper_bound = TimeTicks::FromInternalValue(
+ params.local_upper_bound);
+ TimeTicks remote_lower_bound = TimeTicks::FromInternalValue(
+ params.remote_lower_bound);
+ TimeTicks remote_upper_bound = TimeTicks::FromInternalValue(
+ params.remote_upper_bound);
+ TimeTicks test_time = TimeTicks::FromInternalValue(params.test_time);
+
+ InterProcessTimeTicksConverter converter(
+ LocalTimeTicks::FromTimeTicks(local_lower_bound),
+ LocalTimeTicks::FromTimeTicks(local_upper_bound),
+ RemoteTimeTicks::FromTimeTicks(remote_lower_bound),
+ RemoteTimeTicks::FromTimeTicks(remote_upper_bound));
+
+ TestResults results;
+ results.result_time = converter.ToLocalTimeTicks(
+ RemoteTimeTicks::FromTimeTicks(
+ test_time)).ToTimeTicks().ToInternalValue();
+ results.result_delta = converter.ToLocalTimeDelta(
+ RemoteTimeDelta::FromRawDelta(params.test_delta)).ToInt32();
+ return results;
+}
+
+TEST(InterProcessTimeTicksConverterTest, NoSkew) {
+ // All times are monotonic and centered, so no adjustment should occur.
+ TestParams p;
+ p.local_lower_bound = 0;
+ p.remote_lower_bound = 1;
+ p.remote_upper_bound = 4;
+ p.local_upper_bound = 5;
+ p.test_time = 2;
+ p.test_delta = 1;
+ TestResults results = RunTest(p);
+ EXPECT_EQ(2, results.result_time);
+ EXPECT_EQ(1, results.result_delta);
+}
+
+TEST(InterProcessTimeTicksConverterTest, OffsetMidpoints) {
+ // All times are monotonic, but not centered. Adjust the |remote_*| times so
+ // they are centered within the |local_*| times.
+ TestParams p;
+ p.local_lower_bound = 0;
+ p.remote_lower_bound = 2;
+ p.remote_upper_bound = 5;
+ p.local_upper_bound = 5;
+ p.test_time = 3;
+ p.test_delta = 1;
+ TestResults results = RunTest(p);
+ EXPECT_EQ(2, results.result_time);
+ EXPECT_EQ(1, results.result_delta);
+}
+
+TEST(InterProcessTimeTicksConverterTest, DoubleEndedSkew) {
+ // |remote_lower_bound| occurs before |local_lower_bound| and
+ // |remote_upper_bound| occurs after |local_upper_bound|. We must adjust both
+ // bounds and scale down the delta. |test_time| is on the midpoint, so it
+ // doesn't change. The ratio of local time to network time is 1:2, so we scale
+ // |test_delta| to half.
+ TestParams p;
+ p.local_lower_bound = 2;
+ p.remote_lower_bound = 0;
+ p.remote_upper_bound = 8;
+ p.local_upper_bound = 6;
+ p.test_time = 4;
+ p.test_delta = 2;
+ TestResults results = RunTest(p);
+ EXPECT_EQ(4, results.result_time);
+ EXPECT_EQ(1, results.result_delta);
+}
+
+TEST(InterProcessTimeTicksConverterTest, FrontEndSkew) {
+ // |remote_upper_bound| is coherent, but |remote_lower_bound| is not. So we
+ // adjust the lower bound and move |test_time| out. The scale factor is 2:3,
+ // but since we use integers, the numbers truncate from 3.33 to 3 and 1.33
+ // to 1.
+ TestParams p;
+ p.local_lower_bound = 2;
+ p.remote_lower_bound = 0;
+ p.remote_upper_bound = 6;
+ p.local_upper_bound = 6;
+ p.test_time = 2;
+ p.test_delta = 2;
+ TestResults results = RunTest(p);
+ EXPECT_EQ(3, results.result_time);
+ EXPECT_EQ(1, results.result_delta);
+}
+
+TEST(InterProcessTimeTicksConverterTest, BackEndSkew) {
+ // Like the previous test, but |remote_lower_bound| is coherent and
+ // |remote_upper_bound| is skewed.
+ TestParams p;
+ p.local_lower_bound = 0;
+ p.remote_lower_bound = 0;
+ p.remote_upper_bound = 6;
+ p.local_upper_bound = 4;
+ p.test_time = 2;
+ p.test_delta = 2;
+ TestResults results = RunTest(p);
+ EXPECT_EQ(1, results.result_time);
+ EXPECT_EQ(1, results.result_delta);
+}
+
+TEST(InterProcessTimeTicksConverterTest, Instantaneous) {
+ // The bounds are all okay, but the |remote_lower_bound| and
+ // |remote_upper_bound| have the same value. No adjustments should be made and
+ // no divide-by-zero errors should occur.
+ TestParams p;
+ p.local_lower_bound = 0;
+ p.remote_lower_bound = 1;
+ p.remote_upper_bound = 1;
+ p.local_upper_bound = 2;
+ p.test_time = 1;
+ p.test_delta = 0;
+ TestResults results = RunTest(p);
+ EXPECT_EQ(1, results.result_time);
+ EXPECT_EQ(0, results.result_delta);
+}
+
+TEST(InterProcessTimeTicksConverterTest, OffsetInstantaneous) {
+ // The bounds are all okay, but the |remote_lower_bound| and
+ // |remote_upper_bound| have the same value and are offset from the midpoint
+ // of |local_lower_bound| and |local_upper_bound|. An offset should be applied
+ // to make the midpoints line up.
+ TestParams p;
+ p.local_lower_bound = 0;
+ p.remote_lower_bound = 2;
+ p.remote_upper_bound = 2;
+ p.local_upper_bound = 2;
+ p.test_time = 2;
+ p.test_delta = 0;
+ TestResults results = RunTest(p);
+ EXPECT_EQ(1, results.result_time);
+ EXPECT_EQ(0, results.result_delta);
+}
+
+TEST(InterProcessTimeTicksConverterTest, DisjointInstantaneous) {
+ // |local_lower_bound| and |local_upper_bound| are the same. No matter what
+ // the other values are, they must fit within [local_lower_bound,
+ // local_upper_bound]. So, all of the values should be adjusted so they are
+ // exactly that value.
+ TestParams p;
+ p.local_lower_bound = 1;
+ p.remote_lower_bound = 2;
+ p.remote_upper_bound = 2;
+ p.local_upper_bound = 1;
+ p.test_time = 2;
+ p.test_delta = 0;
+ TestResults results = RunTest(p);
+ EXPECT_EQ(1, results.result_time);
+ EXPECT_EQ(0, results.result_delta);
+}
+
+TEST(InterProcessTimeTicksConverterTest, RoundingNearEdges) {
+ // Verify that rounding never causes a value to appear outside the given
+ // |local_*| range.
+ const int kMaxRange = 100;
+ for (int i = 0; i < kMaxRange; ++i) {
+ for (int j = 0; j < kMaxRange; ++j) {
+ TestParams p;
+ p.local_lower_bound = 0;
+ p.remote_lower_bound = 0;
+ p.remote_upper_bound = j;
+ p.local_upper_bound = i;
+ p.test_time = 0;
+ p.test_delta = j;
+ TestResults results = RunTest(p);
+ EXPECT_LE(0, results.result_time);
+ EXPECT_GE(i, results.result_delta);
+ }
+ }
+}
+
+} // anonymous namespace
+
+} // namespace content
« no previous file with comments | « content/common/inter_process_time_ticks_converter.cc ('k') | content/common/resource_dispatcher.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698