blob: 9c91fd62470d25c7e5184f4d7e1603e2bb9b7df8 [file] [log] [blame]
Sebastian Jansson30bd4032018-04-13 13:56:17 +02001/*
2 * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Sebastian Jansson6fae6ec2018-05-08 10:43:18 +020011#include "api/units/data_rate.h"
Sebastian Jansson30bd4032018-04-13 13:56:17 +020012#include "test/gtest.h"
13
14namespace webrtc {
15namespace test {
Sebastian Jansson8e064192018-08-07 12:34:33 +020016
17TEST(DataRateTest, ConstExpr) {
Sebastian Janssonc1c8b8e2018-08-07 15:29:04 +020018 constexpr int64_t kValue = 12345;
Sebastian Jansson8e064192018-08-07 12:34:33 +020019 constexpr DataRate kDataRateZero = DataRate::Zero();
20 constexpr DataRate kDataRateInf = DataRate::Infinity();
21 static_assert(kDataRateZero.IsZero(), "");
22 static_assert(kDataRateInf.IsInfinite(), "");
Sebastian Janssonc1c8b8e2018-08-07 15:29:04 +020023 static_assert(kDataRateInf.bps_or(-1) == -1, "");
24 static_assert(kDataRateInf > kDataRateZero, "");
25
26 constexpr DataRate kDataRateBps = DataRate::BitsPerSec<kValue>();
27 constexpr DataRate kDataRateKbps = DataRate::KilobitsPerSec<kValue>();
28 static_assert(kDataRateBps.bps<double>() == kValue, "");
29 static_assert(kDataRateBps.bps_or(0) == kValue, "");
30 static_assert(kDataRateKbps.kbps_or(0) == kValue, "");
Sebastian Jansson8e064192018-08-07 12:34:33 +020031}
32
Sebastian Jansson30bd4032018-04-13 13:56:17 +020033TEST(DataRateTest, GetBackSameValues) {
34 const int64_t kValue = 123 * 8;
Sebastian Jansson30bd4032018-04-13 13:56:17 +020035 EXPECT_EQ(DataRate::bps(kValue).bps(), kValue);
36 EXPECT_EQ(DataRate::kbps(kValue).kbps(), kValue);
37}
38
39TEST(DataRateTest, GetDifferentPrefix) {
40 const int64_t kValue = 123 * 8000;
Sebastian Jansson30bd4032018-04-13 13:56:17 +020041 EXPECT_EQ(DataRate::bps(kValue).kbps(), kValue / 1000);
42}
43
44TEST(DataRateTest, IdentityChecks) {
45 const int64_t kValue = 3000;
46 EXPECT_TRUE(DataRate::Zero().IsZero());
Sebastian Jansson942b3602018-05-30 15:47:44 +020047 EXPECT_FALSE(DataRate::bps(kValue).IsZero());
Sebastian Jansson30bd4032018-04-13 13:56:17 +020048
49 EXPECT_TRUE(DataRate::Infinity().IsInfinite());
50 EXPECT_FALSE(DataRate::Zero().IsInfinite());
Sebastian Jansson942b3602018-05-30 15:47:44 +020051 EXPECT_FALSE(DataRate::bps(kValue).IsInfinite());
Sebastian Jansson30bd4032018-04-13 13:56:17 +020052
53 EXPECT_FALSE(DataRate::Infinity().IsFinite());
Sebastian Jansson942b3602018-05-30 15:47:44 +020054 EXPECT_TRUE(DataRate::bps(kValue).IsFinite());
Sebastian Jansson30bd4032018-04-13 13:56:17 +020055 EXPECT_TRUE(DataRate::Zero().IsFinite());
56}
57
58TEST(DataRateTest, ComparisonOperators) {
59 const int64_t kSmall = 450;
60 const int64_t kLarge = 451;
Sebastian Jansson942b3602018-05-30 15:47:44 +020061 const DataRate small = DataRate::bps(kSmall);
62 const DataRate large = DataRate::bps(kLarge);
Sebastian Jansson30bd4032018-04-13 13:56:17 +020063
64 EXPECT_EQ(DataRate::Zero(), DataRate::bps(0));
65 EXPECT_EQ(DataRate::Infinity(), DataRate::Infinity());
66 EXPECT_EQ(small, small);
67 EXPECT_LE(small, small);
68 EXPECT_GE(small, small);
69 EXPECT_NE(small, large);
70 EXPECT_LE(small, large);
71 EXPECT_LT(small, large);
72 EXPECT_GE(large, small);
73 EXPECT_GT(large, small);
74 EXPECT_LT(DataRate::Zero(), small);
75 EXPECT_GT(DataRate::Infinity(), large);
76}
77
Sebastian Jansson942b3602018-05-30 15:47:44 +020078TEST(DataRateTest, ConvertsToAndFromDouble) {
79 const int64_t kValue = 128;
80 const double kDoubleValue = static_cast<double>(kValue);
81 const double kDoubleKbps = kValue * 1e-3;
82 const double kFloatKbps = static_cast<float>(kDoubleKbps);
83
84 EXPECT_EQ(DataRate::bps(kValue).bps<double>(), kDoubleValue);
85 EXPECT_EQ(DataRate::bps(kValue).kbps<double>(), kDoubleKbps);
86 EXPECT_EQ(DataRate::bps(kValue).kbps<float>(), kFloatKbps);
87 EXPECT_EQ(DataRate::bps(kDoubleValue).bps(), kValue);
88 EXPECT_EQ(DataRate::kbps(kDoubleKbps).bps(), kValue);
89
90 const double kInfinity = std::numeric_limits<double>::infinity();
91 EXPECT_EQ(DataRate::Infinity().bps<double>(), kInfinity);
92 EXPECT_TRUE(DataRate::bps(kInfinity).IsInfinite());
93 EXPECT_TRUE(DataRate::kbps(kInfinity).IsInfinite());
94}
95
Sebastian Jansson30bd4032018-04-13 13:56:17 +020096TEST(DataRateTest, MathOperations) {
97 const int64_t kValueA = 450;
98 const int64_t kValueB = 267;
Sebastian Jansson942b3602018-05-30 15:47:44 +020099 const DataRate rate_a = DataRate::bps(kValueA);
100 const DataRate rate_b = DataRate::bps(kValueB);
Sebastian Jansson30bd4032018-04-13 13:56:17 +0200101 const int32_t kInt32Value = 123;
102 const double kFloatValue = 123.0;
Sebastian Jansson942b3602018-05-30 15:47:44 +0200103 EXPECT_EQ((rate_a * kValueB).bps(), kValueA * kValueB);
104 EXPECT_EQ((rate_a * kInt32Value).bps(), kValueA * kInt32Value);
105 EXPECT_EQ((rate_a * kFloatValue).bps(), kValueA * kFloatValue);
106
107 EXPECT_EQ(rate_a / rate_b, static_cast<double>(kValueA) / kValueB);
Sebastian Jansson30bd4032018-04-13 13:56:17 +0200108}
Sebastian Janssone31be152018-04-16 12:41:47 +0200109
110TEST(UnitConversionTest, DataRateAndDataSizeAndTimeDelta) {
Sebastian Jansson66fa5352018-04-30 16:54:57 +0200111 const int64_t kSeconds = 5;
112 const int64_t kBitsPerSecond = 440;
113 const int64_t kBytes = 44000;
114 const TimeDelta delta_a = TimeDelta::seconds(kSeconds);
Sebastian Jansson942b3602018-05-30 15:47:44 +0200115 const DataRate rate_b = DataRate::bps(kBitsPerSecond);
Sebastian Jansson66fa5352018-04-30 16:54:57 +0200116 const DataSize size_c = DataSize::bytes(kBytes);
117 EXPECT_EQ((delta_a * rate_b).bytes(), kSeconds * kBitsPerSecond / 8);
118 EXPECT_EQ((rate_b * delta_a).bytes(), kSeconds * kBitsPerSecond / 8);
Sebastian Jansson942b3602018-05-30 15:47:44 +0200119 EXPECT_EQ((size_c / delta_a).bps(), kBytes * 8 / kSeconds);
Sebastian Jansson66fa5352018-04-30 16:54:57 +0200120 EXPECT_EQ((size_c / rate_b).seconds(), kBytes * 8 / kBitsPerSecond);
Sebastian Janssone31be152018-04-16 12:41:47 +0200121}
122
Sebastian Janssone31be152018-04-16 12:41:47 +0200123TEST(UnitConversionTest, DivisionFailsOnLargeSize) {
124 // Note that the failure is expected since the current implementation is
125 // implementated in a way that does not support division of large sizes. If
126 // the implementation is changed, this test can safely be removed.
Sebastian Jansson66fa5352018-04-30 16:54:57 +0200127 const int64_t kJustSmallEnoughForDivision =
128 std::numeric_limits<int64_t>::max() / 8000000;
Sebastian Janssone31be152018-04-16 12:41:47 +0200129 const DataSize large_size = DataSize::bytes(kJustSmallEnoughForDivision);
Sebastian Janssone31be152018-04-16 12:41:47 +0200130 const DataRate data_rate = DataRate::kbps(100);
131 const TimeDelta time_delta = TimeDelta::ms(100);
132 EXPECT_TRUE((large_size / data_rate).IsFinite());
133 EXPECT_TRUE((large_size / time_delta).IsFinite());
Jonas Olsson0d4070a2018-06-28 13:09:43 +0200134#if GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) && RTC_DCHECK_IS_ON
135 const int64_t kToolargeForDivision = kJustSmallEnoughForDivision + 1;
136 const DataSize too_large_size = DataSize::bytes(kToolargeForDivision);
Sebastian Janssone31be152018-04-16 12:41:47 +0200137 EXPECT_DEATH(too_large_size / data_rate, "");
138 EXPECT_DEATH(too_large_size / time_delta, "");
Jonas Olsson0d4070a2018-06-28 13:09:43 +0200139#endif // GTEST_HAS_DEATH_TEST && !!defined(WEBRTC_ANDROID) && RTC_DCHECK_IS_ON
Sebastian Janssone31be152018-04-16 12:41:47 +0200140}
Sebastian Jansson30bd4032018-04-13 13:56:17 +0200141} // namespace test
142} // namespace webrtc