1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "cast/streaming/rtp_time.h"
6
7 #include <chrono>
8
9 #include "gtest/gtest.h"
10 #include "util/chrono_helpers.h"
11
12 namespace openscreen {
13 namespace cast {
14
15 // Tests that conversions between std::chrono durations and RtpTimeDelta are
16 // accurate. Note that this implicitly tests the conversions to/from
17 // RtpTimeTicks as well due to shared implementation.
TEST(RtpTimeDeltaTest,ConversionToAndFromDurations)18 TEST(RtpTimeDeltaTest, ConversionToAndFromDurations) {
19 constexpr int kTimebase = 48000;
20
21 // Origin in both timelines is equivalent.
22 ASSERT_EQ(RtpTimeDelta(), RtpTimeDelta::FromTicks(0));
23 ASSERT_EQ(RtpTimeDelta(),
24 RtpTimeDelta::FromDuration(microseconds(0), kTimebase));
25 ASSERT_EQ(microseconds::zero(),
26 RtpTimeDelta::FromTicks(0).ToDuration<microseconds>(kTimebase));
27
28 // Conversions that are exact (i.e., do not require rounding).
29 ASSERT_EQ(RtpTimeDelta::FromTicks(480),
30 RtpTimeDelta::FromDuration(milliseconds(10), kTimebase));
31 ASSERT_EQ(RtpTimeDelta::FromTicks(96000),
32 RtpTimeDelta::FromDuration(seconds(2), kTimebase));
33 ASSERT_EQ(milliseconds(10),
34 RtpTimeDelta::FromTicks(480).ToDuration<microseconds>(kTimebase));
35 ASSERT_EQ(seconds(2),
36 RtpTimeDelta::FromTicks(96000).ToDuration<microseconds>(kTimebase));
37
38 // Conversions that are approximate (i.e., are rounded).
39 for (int error_us = -3; error_us <= +3; ++error_us) {
40 ASSERT_EQ(
41 RtpTimeDelta::FromTicks(0),
42 RtpTimeDelta::FromDuration(microseconds(0 + error_us), kTimebase));
43 ASSERT_EQ(
44 RtpTimeDelta::FromTicks(1),
45 RtpTimeDelta::FromDuration(microseconds(21 + error_us), kTimebase));
46 ASSERT_EQ(
47 RtpTimeDelta::FromTicks(2),
48 RtpTimeDelta::FromDuration(microseconds(42 + error_us), kTimebase));
49 ASSERT_EQ(
50 RtpTimeDelta::FromTicks(3),
51 RtpTimeDelta::FromDuration(microseconds(63 + error_us), kTimebase));
52 ASSERT_EQ(
53 RtpTimeDelta::FromTicks(4),
54 RtpTimeDelta::FromDuration(microseconds(83 + error_us), kTimebase));
55 ASSERT_EQ(
56 RtpTimeDelta::FromTicks(11200000000000),
57 RtpTimeDelta::FromDuration(
58 microseconds(INT64_C(233333333333333) + error_us), kTimebase));
59 }
60 ASSERT_EQ(microseconds(21),
61 RtpTimeDelta::FromTicks(1).ToDuration<microseconds>(kTimebase));
62 ASSERT_EQ(microseconds(42),
63 RtpTimeDelta::FromTicks(2).ToDuration<microseconds>(kTimebase));
64 ASSERT_EQ(microseconds(63),
65 RtpTimeDelta::FromTicks(3).ToDuration<microseconds>(kTimebase));
66 ASSERT_EQ(microseconds(83),
67 RtpTimeDelta::FromTicks(4).ToDuration<microseconds>(kTimebase));
68 ASSERT_EQ(microseconds(INT64_C(233333333333333)),
69 RtpTimeDelta::FromTicks(11200000000000)
70 .ToDuration<microseconds>(kTimebase));
71 }
72
73 } // namespace cast
74 } // namespace openscreen
75