blob: d4dd192d373d084fb1ef4e808413b379328a2b71 [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::bits_per_second(kValue).bits_per_second(), kValue);
19 EXPECT_EQ(DataRate::bps(kValue).bps(), kValue);
20 EXPECT_EQ(DataRate::kbps(kValue).kbps(), kValue);
21}
22
23TEST(DataRateTest, GetDifferentPrefix) {
24 const int64_t kValue = 123 * 8000;
Sebastian Jansson30bd4032018-04-13 13:56:17 +020025 EXPECT_EQ(DataRate::bps(kValue).kbps(), kValue / 1000);
26}
27
28TEST(DataRateTest, IdentityChecks) {
29 const int64_t kValue = 3000;
30 EXPECT_TRUE(DataRate::Zero().IsZero());
Sebastian Jansson66fa5352018-04-30 16:54:57 +020031 EXPECT_FALSE(DataRate::bits_per_second(kValue).IsZero());
Sebastian Jansson30bd4032018-04-13 13:56:17 +020032
33 EXPECT_TRUE(DataRate::Infinity().IsInfinite());
34 EXPECT_FALSE(DataRate::Zero().IsInfinite());
Sebastian Jansson66fa5352018-04-30 16:54:57 +020035 EXPECT_FALSE(DataRate::bits_per_second(kValue).IsInfinite());
Sebastian Jansson30bd4032018-04-13 13:56:17 +020036
37 EXPECT_FALSE(DataRate::Infinity().IsFinite());
Sebastian Jansson66fa5352018-04-30 16:54:57 +020038 EXPECT_TRUE(DataRate::bits_per_second(kValue).IsFinite());
Sebastian Jansson30bd4032018-04-13 13:56:17 +020039 EXPECT_TRUE(DataRate::Zero().IsFinite());
40}
41
42TEST(DataRateTest, ComparisonOperators) {
43 const int64_t kSmall = 450;
44 const int64_t kLarge = 451;
Sebastian Jansson66fa5352018-04-30 16:54:57 +020045 const DataRate small = DataRate::bits_per_second(kSmall);
46 const DataRate large = DataRate::bits_per_second(kLarge);
Sebastian Jansson30bd4032018-04-13 13:56:17 +020047
48 EXPECT_EQ(DataRate::Zero(), DataRate::bps(0));
49 EXPECT_EQ(DataRate::Infinity(), DataRate::Infinity());
50 EXPECT_EQ(small, small);
51 EXPECT_LE(small, small);
52 EXPECT_GE(small, small);
53 EXPECT_NE(small, large);
54 EXPECT_LE(small, large);
55 EXPECT_LT(small, large);
56 EXPECT_GE(large, small);
57 EXPECT_GT(large, small);
58 EXPECT_LT(DataRate::Zero(), small);
59 EXPECT_GT(DataRate::Infinity(), large);
60}
61
62TEST(DataRateTest, MathOperations) {
63 const int64_t kValueA = 450;
64 const int64_t kValueB = 267;
Sebastian Jansson66fa5352018-04-30 16:54:57 +020065 const DataRate size_a = DataRate::bits_per_second(kValueA);
Sebastian Jansson30bd4032018-04-13 13:56:17 +020066 const int32_t kInt32Value = 123;
67 const double kFloatValue = 123.0;
Sebastian Jansson66fa5352018-04-30 16:54:57 +020068 EXPECT_EQ((size_a * kValueB).bits_per_second(), kValueA * kValueB);
69 EXPECT_EQ((size_a * kInt32Value).bits_per_second(), kValueA * kInt32Value);
70 EXPECT_EQ((size_a * kFloatValue).bits_per_second(), kValueA * kFloatValue);
Sebastian Jansson30bd4032018-04-13 13:56:17 +020071}
Sebastian Janssone31be152018-04-16 12:41:47 +020072
73TEST(UnitConversionTest, DataRateAndDataSizeAndTimeDelta) {
Sebastian Jansson66fa5352018-04-30 16:54:57 +020074 const int64_t kSeconds = 5;
75 const int64_t kBitsPerSecond = 440;
76 const int64_t kBytes = 44000;
77 const TimeDelta delta_a = TimeDelta::seconds(kSeconds);
78 const DataRate rate_b = DataRate::bits_per_second(kBitsPerSecond);
79 const DataSize size_c = DataSize::bytes(kBytes);
80 EXPECT_EQ((delta_a * rate_b).bytes(), kSeconds * kBitsPerSecond / 8);
81 EXPECT_EQ((rate_b * delta_a).bytes(), kSeconds * kBitsPerSecond / 8);
82 EXPECT_EQ((size_c / delta_a).bits_per_second(), kBytes * 8 / kSeconds);
83 EXPECT_EQ((size_c / rate_b).seconds(), kBytes * 8 / kBitsPerSecond);
Sebastian Janssone31be152018-04-16 12:41:47 +020084}
85
86#if GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
87TEST(UnitConversionTest, DivisionByZeroFails) {
88 const DataSize non_zero_size = DataSize::bytes(100);
89 const DataSize zero_size = DataSize::Zero();
90 const DataRate zero_rate = DataRate::Zero();
91 const TimeDelta zero_delta = TimeDelta::Zero();
92
93 EXPECT_DEATH(non_zero_size / zero_rate, "");
94 EXPECT_DEATH(non_zero_size / zero_delta, "");
95 EXPECT_DEATH(zero_size / zero_rate, "");
96 EXPECT_DEATH(zero_size / zero_delta, "");
97}
98
99TEST(UnitConversionTest, DivisionFailsOnLargeSize) {
100 // Note that the failure is expected since the current implementation is
101 // implementated in a way that does not support division of large sizes. If
102 // the implementation is changed, this test can safely be removed.
Sebastian Jansson66fa5352018-04-30 16:54:57 +0200103 const int64_t kJustSmallEnoughForDivision =
104 std::numeric_limits<int64_t>::max() / 8000000;
105 const int64_t kToolargeForDivision = kJustSmallEnoughForDivision + 1;
Sebastian Janssone31be152018-04-16 12:41:47 +0200106 const DataSize large_size = DataSize::bytes(kJustSmallEnoughForDivision);
107 const DataSize too_large_size = DataSize::bytes(kToolargeForDivision);
108 const DataRate data_rate = DataRate::kbps(100);
109 const TimeDelta time_delta = TimeDelta::ms(100);
110 EXPECT_TRUE((large_size / data_rate).IsFinite());
111 EXPECT_TRUE((large_size / time_delta).IsFinite());
112
113 EXPECT_DEATH(too_large_size / data_rate, "");
114 EXPECT_DEATH(too_large_size / time_delta, "");
115}
116#endif // GTEST_HAS_DEATH_TEST && !!defined(WEBRTC_ANDROID)
Sebastian Jansson30bd4032018-04-13 13:56:17 +0200117} // namespace test
118} // namespace webrtc