blob: 9a58b47b21afe09f88540be6b6f946b7f59a623c [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 {
16TEST(DataRateTest, GetBackSameValues) {
17 const int64_t kValue = 123 * 8;
Sebastian Jansson30bd4032018-04-13 13:56:17 +020018 EXPECT_EQ(DataRate::bps(kValue).bps(), kValue);
19 EXPECT_EQ(DataRate::kbps(kValue).kbps(), kValue);
20}
21
22TEST(DataRateTest, GetDifferentPrefix) {
23 const int64_t kValue = 123 * 8000;
Sebastian Jansson30bd4032018-04-13 13:56:17 +020024 EXPECT_EQ(DataRate::bps(kValue).kbps(), kValue / 1000);
25}
26
27TEST(DataRateTest, IdentityChecks) {
28 const int64_t kValue = 3000;
29 EXPECT_TRUE(DataRate::Zero().IsZero());
Sebastian Jansson942b3602018-05-30 15:47:44 +020030 EXPECT_FALSE(DataRate::bps(kValue).IsZero());
Sebastian Jansson30bd4032018-04-13 13:56:17 +020031
32 EXPECT_TRUE(DataRate::Infinity().IsInfinite());
33 EXPECT_FALSE(DataRate::Zero().IsInfinite());
Sebastian Jansson942b3602018-05-30 15:47:44 +020034 EXPECT_FALSE(DataRate::bps(kValue).IsInfinite());
Sebastian Jansson30bd4032018-04-13 13:56:17 +020035
36 EXPECT_FALSE(DataRate::Infinity().IsFinite());
Sebastian Jansson942b3602018-05-30 15:47:44 +020037 EXPECT_TRUE(DataRate::bps(kValue).IsFinite());
Sebastian Jansson30bd4032018-04-13 13:56:17 +020038 EXPECT_TRUE(DataRate::Zero().IsFinite());
39}
40
41TEST(DataRateTest, ComparisonOperators) {
42 const int64_t kSmall = 450;
43 const int64_t kLarge = 451;
Sebastian Jansson942b3602018-05-30 15:47:44 +020044 const DataRate small = DataRate::bps(kSmall);
45 const DataRate large = DataRate::bps(kLarge);
Sebastian Jansson30bd4032018-04-13 13:56:17 +020046
47 EXPECT_EQ(DataRate::Zero(), DataRate::bps(0));
48 EXPECT_EQ(DataRate::Infinity(), DataRate::Infinity());
49 EXPECT_EQ(small, small);
50 EXPECT_LE(small, small);
51 EXPECT_GE(small, small);
52 EXPECT_NE(small, large);
53 EXPECT_LE(small, large);
54 EXPECT_LT(small, large);
55 EXPECT_GE(large, small);
56 EXPECT_GT(large, small);
57 EXPECT_LT(DataRate::Zero(), small);
58 EXPECT_GT(DataRate::Infinity(), large);
59}
60
Sebastian Jansson942b3602018-05-30 15:47:44 +020061TEST(DataRateTest, ConvertsToAndFromDouble) {
62 const int64_t kValue = 128;
63 const double kDoubleValue = static_cast<double>(kValue);
64 const double kDoubleKbps = kValue * 1e-3;
65 const double kFloatKbps = static_cast<float>(kDoubleKbps);
66
67 EXPECT_EQ(DataRate::bps(kValue).bps<double>(), kDoubleValue);
68 EXPECT_EQ(DataRate::bps(kValue).kbps<double>(), kDoubleKbps);
69 EXPECT_EQ(DataRate::bps(kValue).kbps<float>(), kFloatKbps);
70 EXPECT_EQ(DataRate::bps(kDoubleValue).bps(), kValue);
71 EXPECT_EQ(DataRate::kbps(kDoubleKbps).bps(), kValue);
72
73 const double kInfinity = std::numeric_limits<double>::infinity();
74 EXPECT_EQ(DataRate::Infinity().bps<double>(), kInfinity);
75 EXPECT_TRUE(DataRate::bps(kInfinity).IsInfinite());
76 EXPECT_TRUE(DataRate::kbps(kInfinity).IsInfinite());
77}
78
Sebastian Jansson30bd4032018-04-13 13:56:17 +020079TEST(DataRateTest, MathOperations) {
80 const int64_t kValueA = 450;
81 const int64_t kValueB = 267;
Sebastian Jansson942b3602018-05-30 15:47:44 +020082 const DataRate rate_a = DataRate::bps(kValueA);
83 const DataRate rate_b = DataRate::bps(kValueB);
Sebastian Jansson30bd4032018-04-13 13:56:17 +020084 const int32_t kInt32Value = 123;
85 const double kFloatValue = 123.0;
Sebastian Jansson942b3602018-05-30 15:47:44 +020086 EXPECT_EQ((rate_a * kValueB).bps(), kValueA * kValueB);
87 EXPECT_EQ((rate_a * kInt32Value).bps(), kValueA * kInt32Value);
88 EXPECT_EQ((rate_a * kFloatValue).bps(), kValueA * kFloatValue);
89
90 EXPECT_EQ(rate_a / rate_b, static_cast<double>(kValueA) / kValueB);
Sebastian Jansson30bd4032018-04-13 13:56:17 +020091}
Sebastian Janssone31be152018-04-16 12:41:47 +020092
93TEST(UnitConversionTest, DataRateAndDataSizeAndTimeDelta) {
Sebastian Jansson66fa5352018-04-30 16:54:57 +020094 const int64_t kSeconds = 5;
95 const int64_t kBitsPerSecond = 440;
96 const int64_t kBytes = 44000;
97 const TimeDelta delta_a = TimeDelta::seconds(kSeconds);
Sebastian Jansson942b3602018-05-30 15:47:44 +020098 const DataRate rate_b = DataRate::bps(kBitsPerSecond);
Sebastian Jansson66fa5352018-04-30 16:54:57 +020099 const DataSize size_c = DataSize::bytes(kBytes);
100 EXPECT_EQ((delta_a * rate_b).bytes(), kSeconds * kBitsPerSecond / 8);
101 EXPECT_EQ((rate_b * delta_a).bytes(), kSeconds * kBitsPerSecond / 8);
Sebastian Jansson942b3602018-05-30 15:47:44 +0200102 EXPECT_EQ((size_c / delta_a).bps(), kBytes * 8 / kSeconds);
Sebastian Jansson66fa5352018-04-30 16:54:57 +0200103 EXPECT_EQ((size_c / rate_b).seconds(), kBytes * 8 / kBitsPerSecond);
Sebastian Janssone31be152018-04-16 12:41:47 +0200104}
105
106#if GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
107TEST(UnitConversionTest, DivisionByZeroFails) {
108 const DataSize non_zero_size = DataSize::bytes(100);
109 const DataSize zero_size = DataSize::Zero();
110 const DataRate zero_rate = DataRate::Zero();
111 const TimeDelta zero_delta = TimeDelta::Zero();
112
113 EXPECT_DEATH(non_zero_size / zero_rate, "");
114 EXPECT_DEATH(non_zero_size / zero_delta, "");
115 EXPECT_DEATH(zero_size / zero_rate, "");
116 EXPECT_DEATH(zero_size / zero_delta, "");
117}
118
119TEST(UnitConversionTest, DivisionFailsOnLargeSize) {
120 // Note that the failure is expected since the current implementation is
121 // implementated in a way that does not support division of large sizes. If
122 // the implementation is changed, this test can safely be removed.
Sebastian Jansson66fa5352018-04-30 16:54:57 +0200123 const int64_t kJustSmallEnoughForDivision =
124 std::numeric_limits<int64_t>::max() / 8000000;
125 const int64_t kToolargeForDivision = kJustSmallEnoughForDivision + 1;
Sebastian Janssone31be152018-04-16 12:41:47 +0200126 const DataSize large_size = DataSize::bytes(kJustSmallEnoughForDivision);
127 const DataSize too_large_size = DataSize::bytes(kToolargeForDivision);
128 const DataRate data_rate = DataRate::kbps(100);
129 const TimeDelta time_delta = TimeDelta::ms(100);
130 EXPECT_TRUE((large_size / data_rate).IsFinite());
131 EXPECT_TRUE((large_size / time_delta).IsFinite());
132
133 EXPECT_DEATH(too_large_size / data_rate, "");
134 EXPECT_DEATH(too_large_size / time_delta, "");
135}
136#endif // GTEST_HAS_DEATH_TEST && !!defined(WEBRTC_ANDROID)
Sebastian Jansson30bd4032018-04-13 13:56:17 +0200137} // namespace test
138} // namespace webrtc