summaryrefslogtreecommitdiffstats
path: root/ppapi
diff options
context:
space:
mode:
authorraymes@chromium.org <raymes@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-17 19:54:59 +0000
committerraymes@chromium.org <raymes@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-17 19:54:59 +0000
commita8b963830869332bf43c93f628dff96d11bc50fc (patch)
treeb107b8d7593dfd050f69b10f96e6c2895dab7fd8 /ppapi
parentd8904c086b07e64a091577e20e19217aefc78d1d (diff)
downloadchromium_src-a8b963830869332bf43c93f628dff96d11bc50fc.zip
chromium_src-a8b963830869332bf43c93f628dff96d11bc50fc.tar.gz
chromium_src-a8b963830869332bf43c93f628dff96d11bc50fc.tar.bz2
Fix PPAPI time conversion code to handle epoch times.
This fixes the time conversion code to be able to correctly handle epoch times (e.g. when passing a PP_Time of 0). This eliminates the need to special-case for epoch time in other code. In practice the problem this fixes only manifests itself in test code. BUG= Review URL: https://codereview.chromium.org/11567013 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@173516 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ppapi')
-rw-r--r--ppapi/ppapi_tests.gypi1
-rw-r--r--ppapi/shared_impl/time_conversion.cc6
-rw-r--r--ppapi/shared_impl/time_conversion_unittest.cc73
3 files changed, 80 insertions, 0 deletions
diff --git a/ppapi/ppapi_tests.gypi b/ppapi/ppapi_tests.gypi
index c989d9c..a229107 100644
--- a/ppapi/ppapi_tests.gypi
+++ b/ppapi/ppapi_tests.gypi
@@ -158,6 +158,7 @@
'proxy/serialized_var_unittest.cc',
'proxy/websocket_resource_unittest.cc',
'shared_impl/resource_tracker_unittest.cc',
+ 'shared_impl/time_conversion_unittest.cc',
'shared_impl/tracked_callback_unittest.cc',
'shared_impl/var_tracker_unittest.cc',
],
diff --git a/ppapi/shared_impl/time_conversion.cc b/ppapi/shared_impl/time_conversion.cc
index 53d7b99..07ca6f7 100644
--- a/ppapi/shared_impl/time_conversion.cc
+++ b/ppapi/shared_impl/time_conversion.cc
@@ -30,6 +30,12 @@ PP_Time TimeToPPTime(base::Time t) {
}
base::Time PPTimeToTime(PP_Time t) {
+ // The time code handles exact "0" values as special, and produces
+ // a "null" Time object. But calling code would expect t==0 to represent the
+ // epoch (according to the description of PP_Time). Hence we just return the
+ // epoch in this case.
+ if (t == 0.0)
+ return base::Time::UnixEpoch();
return base::Time::FromDoubleT(t);
}
diff --git a/ppapi/shared_impl/time_conversion_unittest.cc b/ppapi/shared_impl/time_conversion_unittest.cc
new file mode 100644
index 0000000..1ec70bf
--- /dev/null
+++ b/ppapi/shared_impl/time_conversion_unittest.cc
@@ -0,0 +1,73 @@
+// Copyright (c) 2012 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 <math.h>
+#include <stdlib.h>
+
+#include "ppapi/shared_impl/time_conversion.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace ppapi {
+
+// Slop we'll allow in two Time "internal values" to consider them equal.
+// Double conversion can introduce rounding errors. The internal values are in
+// microseconds, so an error here is very small.
+static const int kTimeInternalValueSlop = 2;
+
+// Same as above in double-precision seconds units.
+static const double kTimeSecondsSlop =
+ static_cast<double>(kTimeInternalValueSlop) /
+ base::Time::kMicrosecondsPerSecond;
+
+TEST(TimeConversion, Time) {
+ // Should be able to round-trip.
+ base::Time now = base::Time::Now();
+ base::Time converted = ppapi::PPTimeToTime(TimeToPPTime(now));
+ EXPECT_GE(kTimeInternalValueSlop,
+ abs(static_cast<int>((converted - now).ToInternalValue())));
+
+ // Units should be in seconds.
+ base::Time one_second_from_now = now + base::TimeDelta::FromSeconds(1);
+ double converted_one_second_from_now =
+ ppapi::TimeToPPTime(one_second_from_now) - ppapi::TimeToPPTime(now);
+ EXPECT_GE(kTimeSecondsSlop, fabs(converted_one_second_from_now - 1));
+}
+
+TEST(TimeConversion, EventTime) {
+ // Should be able to round-trip.
+ base::Time now = base::Time::Now();
+ double event_now = now.ToDoubleT();
+ double converted =
+ ppapi::EventTimeToPPTimeTicks(ppapi::PPTimeTicksToEventTime(event_now));
+ EXPECT_GE(kTimeSecondsSlop, fabs(converted - event_now));
+
+ // Units should be in seconds.
+ base::Time one_second_from_now = now + base::TimeDelta::FromSeconds(1);
+ double event_one_second_from_now = one_second_from_now.ToDoubleT();
+ EXPECT_GE(kTimeSecondsSlop,
+ 1.0 - ppapi::EventTimeToPPTimeTicks(event_one_second_from_now) -
+ ppapi::EventTimeToPPTimeTicks(event_now));
+}
+
+TEST(TimeConversion, EpochTime) {
+ // Should be able to round-trip from epoch time.
+ base::Time epoch = base::Time::UnixEpoch();
+ base::Time converted = ppapi::PPTimeToTime(TimeToPPTime(epoch));
+ EXPECT_GE(kTimeInternalValueSlop,
+ abs(static_cast<int>((converted - epoch).ToInternalValue())));
+
+ // Units should be in seconds.
+ base::Time one_second_from_epoch = epoch + base::TimeDelta::FromSeconds(1);
+ double converted_one_second_from_epoch =
+ ppapi::TimeToPPTime(one_second_from_epoch) - ppapi::TimeToPPTime(epoch);
+ EXPECT_GE(kTimeSecondsSlop, fabs(converted_one_second_from_epoch - 1));
+
+ // Epoch time should be equal to a PP_Time of 0.0.
+ EXPECT_GE(kTimeSecondsSlop, fabs(ppapi::TimeToPPTime(epoch) - 0.0));
+ EXPECT_GE(kTimeInternalValueSlop,
+ abs(static_cast<int>(
+ (ppapi::PPTimeToTime(0.0) - epoch).ToInternalValue())));
+}
+
+} // namespace ppapi