xref: /aosp_15_r20/external/openscreen/cast/streaming/rtp_time_unittest.cc (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
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