| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2015 The WebRTC Project Authors. All rights reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 #include "webrtc/base/gunit.h" | 11 #include "webrtc/base/gunit.h" |
| 12 #include "webrtc/base/ratetracker.h" | 12 #include "webrtc/base/ratetracker.h" |
| 13 | 13 |
| 14 namespace rtc { | 14 namespace rtc { |
| 15 namespace { | 15 namespace { |
| 16 const uint32_t kBucketIntervalMs = 100; | 16 const uint32_t kBucketIntervalMs = 100; |
| 17 } // namespace | 17 } // namespace |
| 18 | 18 |
| 19 class RateTrackerForTest : public RateTracker { | 19 class RateTrackerForTest : public RateTracker { |
| 20 public: | 20 public: |
| 21 RateTrackerForTest() : RateTracker(kBucketIntervalMs, 10u), time_(0) {} | 21 RateTrackerForTest() : RateTracker(kBucketIntervalMs, 10u), time_(0) {} |
| 22 virtual uint32_t Time() const { return time_; } | 22 virtual int64_t Time() const { return time_; } |
| 23 void AdvanceTime(uint32_t delta) { time_ += delta; } | 23 void AdvanceTime(int delta) { time_ += delta; } |
| 24 | 24 |
| 25 private: | 25 private: |
| 26 uint32_t time_; | 26 int64_t time_; |
| 27 }; | 27 }; |
| 28 | 28 |
| 29 TEST(RateTrackerTest, Test30FPS) { | 29 TEST(RateTrackerTest, Test30FPS) { |
| 30 RateTrackerForTest tracker; | 30 RateTrackerForTest tracker; |
| 31 | 31 |
| 32 for (int i = 0; i < 300; ++i) { | 32 for (int i = 0; i < 300; ++i) { |
| 33 tracker.AddSamples(1); | 33 tracker.AddSamples(1); |
| 34 tracker.AdvanceTime(33); | 34 tracker.AdvanceTime(33); |
| 35 if (i % 3 == 0) { | 35 if (i % 3 == 0) { |
| 36 tracker.AdvanceTime(1); | 36 tracker.AdvanceTime(1); |
| 37 } | 37 } |
| 38 } | 38 } |
| 39 EXPECT_DOUBLE_EQ(30.0, tracker.ComputeRateForInterval(50000u)); | 39 EXPECT_DOUBLE_EQ(30.0, tracker.ComputeRateForInterval(50000)); |
| 40 } | 40 } |
| 41 | 41 |
| 42 TEST(RateTrackerTest, Test60FPS) { | 42 TEST(RateTrackerTest, Test60FPS) { |
| 43 RateTrackerForTest tracker; | 43 RateTrackerForTest tracker; |
| 44 | 44 |
| 45 for (int i = 0; i < 300; ++i) { | 45 for (int i = 0; i < 300; ++i) { |
| 46 tracker.AddSamples(1); | 46 tracker.AddSamples(1); |
| 47 tracker.AdvanceTime(16); | 47 tracker.AdvanceTime(16); |
| 48 if (i % 3 != 0) { | 48 if (i % 3 != 0) { |
| 49 tracker.AdvanceTime(1); | 49 tracker.AdvanceTime(1); |
| 50 } | 50 } |
| 51 } | 51 } |
| 52 EXPECT_DOUBLE_EQ(60.0, tracker.ComputeRateForInterval(1000u)); | 52 EXPECT_DOUBLE_EQ(60.0, tracker.ComputeRateForInterval(1000)); |
| 53 } | 53 } |
| 54 | 54 |
| 55 TEST(RateTrackerTest, TestRateTrackerBasics) { | 55 TEST(RateTrackerTest, TestRateTrackerBasics) { |
| 56 RateTrackerForTest tracker; | 56 RateTrackerForTest tracker; |
| 57 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRateForInterval(1000u)); | 57 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRateForInterval(1000)); |
| 58 | 58 |
| 59 // Add a sample. | 59 // Add a sample. |
| 60 tracker.AddSamples(1234); | 60 tracker.AddSamples(1234); |
| 61 // Advance the clock by less than one bucket interval (no rate returned). | 61 // Advance the clock by less than one bucket interval (no rate returned). |
| 62 tracker.AdvanceTime(kBucketIntervalMs - 1); | 62 tracker.AdvanceTime(kBucketIntervalMs - 1); |
| 63 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRate()); | 63 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRate()); |
| 64 // Advance the clock by 100 ms (one bucket interval). | 64 // Advance the clock by 100 ms (one bucket interval). |
| 65 tracker.AdvanceTime(1); | 65 tracker.AdvanceTime(1); |
| 66 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeRateForInterval(1000u)); | 66 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeRateForInterval(1000)); |
| 67 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeRate()); | 67 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeRate()); |
| 68 EXPECT_EQ(1234U, tracker.TotalSampleCount()); | 68 EXPECT_EQ(1234U, tracker.TotalSampleCount()); |
| 69 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeTotalRate()); | 69 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeTotalRate()); |
| 70 | 70 |
| 71 // Repeat. | 71 // Repeat. |
| 72 tracker.AddSamples(1234); | 72 tracker.AddSamples(1234); |
| 73 tracker.AdvanceTime(100); | 73 tracker.AdvanceTime(100); |
| 74 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeRateForInterval(1000u)); | 74 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeRateForInterval(1000)); |
| 75 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeRate()); | 75 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeRate()); |
| 76 EXPECT_EQ(1234U * 2, tracker.TotalSampleCount()); | 76 EXPECT_EQ(1234U * 2, tracker.TotalSampleCount()); |
| 77 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeTotalRate()); | 77 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeTotalRate()); |
| 78 | 78 |
| 79 // Advance the clock by 800 ms, so we've elapsed a full second. | 79 // Advance the clock by 800 ms, so we've elapsed a full second. |
| 80 // units_second should now be filled in properly. | 80 // units_second should now be filled in properly. |
| 81 tracker.AdvanceTime(800); | 81 tracker.AdvanceTime(800); |
| 82 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeRateForInterval(1000u)); | 82 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeRateForInterval(1000)); |
| 83 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeRate()); | 83 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeRate()); |
| 84 EXPECT_EQ(1234U * 2, tracker.TotalSampleCount()); | 84 EXPECT_EQ(1234U * 2, tracker.TotalSampleCount()); |
| 85 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeTotalRate()); | 85 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeTotalRate()); |
| 86 | 86 |
| 87 // Poll the tracker again immediately. The reported rate should stay the same. | 87 // Poll the tracker again immediately. The reported rate should stay the same. |
| 88 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeRateForInterval(1000u)); | 88 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeRateForInterval(1000)); |
| 89 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeRate()); | 89 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeRate()); |
| 90 EXPECT_EQ(1234U * 2, tracker.TotalSampleCount()); | 90 EXPECT_EQ(1234U * 2, tracker.TotalSampleCount()); |
| 91 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeTotalRate()); | 91 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeTotalRate()); |
| 92 | 92 |
| 93 // Do nothing and advance by a second. We should drop down to zero. | 93 // Do nothing and advance by a second. We should drop down to zero. |
| 94 tracker.AdvanceTime(1000); | 94 tracker.AdvanceTime(1000); |
| 95 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRateForInterval(1000u)); | 95 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRateForInterval(1000)); |
| 96 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRate()); | 96 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRate()); |
| 97 EXPECT_EQ(1234U * 2, tracker.TotalSampleCount()); | 97 EXPECT_EQ(1234U * 2, tracker.TotalSampleCount()); |
| 98 EXPECT_DOUBLE_EQ(1234.0, tracker.ComputeTotalRate()); | 98 EXPECT_DOUBLE_EQ(1234.0, tracker.ComputeTotalRate()); |
| 99 | 99 |
| 100 // Send a bunch of data at a constant rate for 5.5 "seconds". | 100 // Send a bunch of data at a constant rate for 5.5 "seconds". |
| 101 // We should report the rate properly. | 101 // We should report the rate properly. |
| 102 for (int i = 0; i < 5500; i += 100) { | 102 for (int i = 0; i < 5500; i += 100) { |
| 103 tracker.AddSamples(9876U); | 103 tracker.AddSamples(9876U); |
| 104 tracker.AdvanceTime(100); | 104 tracker.AdvanceTime(100); |
| 105 } | 105 } |
| 106 EXPECT_DOUBLE_EQ(9876.0 * 10.0, tracker.ComputeRateForInterval(1000u)); | 106 EXPECT_DOUBLE_EQ(9876.0 * 10.0, tracker.ComputeRateForInterval(1000)); |
| 107 EXPECT_DOUBLE_EQ(9876.0 * 10.0, tracker.ComputeRate()); | 107 EXPECT_DOUBLE_EQ(9876.0 * 10.0, tracker.ComputeRate()); |
| 108 EXPECT_EQ(1234U * 2 + 9876U * 55, tracker.TotalSampleCount()); | 108 EXPECT_EQ(1234U * 2 + 9876U * 55, tracker.TotalSampleCount()); |
| 109 EXPECT_DOUBLE_EQ((1234.0 * 2.0 + 9876.0 * 55.0) / 7.5, | 109 EXPECT_DOUBLE_EQ((1234.0 * 2.0 + 9876.0 * 55.0) / 7.5, |
| 110 tracker.ComputeTotalRate()); | 110 tracker.ComputeTotalRate()); |
| 111 | 111 |
| 112 // Advance the clock by 500 ms. Since we sent nothing over this half-second, | 112 // Advance the clock by 500 ms. Since we sent nothing over this half-second, |
| 113 // the reported rate should be reduced by half. | 113 // the reported rate should be reduced by half. |
| 114 tracker.AdvanceTime(500); | 114 tracker.AdvanceTime(500); |
| 115 EXPECT_DOUBLE_EQ(9876.0 * 5.0, tracker.ComputeRateForInterval(1000u)); | 115 EXPECT_DOUBLE_EQ(9876.0 * 5.0, tracker.ComputeRateForInterval(1000)); |
| 116 EXPECT_DOUBLE_EQ(9876.0 * 5.0, tracker.ComputeRate()); | 116 EXPECT_DOUBLE_EQ(9876.0 * 5.0, tracker.ComputeRate()); |
| 117 EXPECT_EQ(1234U * 2 + 9876U * 55, tracker.TotalSampleCount()); | 117 EXPECT_EQ(1234U * 2 + 9876U * 55, tracker.TotalSampleCount()); |
| 118 EXPECT_DOUBLE_EQ((1234.0 * 2.0 + 9876.0 * 55.0) / 8.0, | 118 EXPECT_DOUBLE_EQ((1234.0 * 2.0 + 9876.0 * 55.0) / 8.0, |
| 119 tracker.ComputeTotalRate()); | 119 tracker.ComputeTotalRate()); |
| 120 | 120 |
| 121 // Rate over the last half second should be zero. | 121 // Rate over the last half second should be zero. |
| 122 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRateForInterval(500u)); | 122 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRateForInterval(500)); |
| 123 } | 123 } |
| 124 | 124 |
| 125 TEST(RateTrackerTest, TestLongPeriodBetweenSamples) { | 125 TEST(RateTrackerTest, TestLongPeriodBetweenSamples) { |
| 126 RateTrackerForTest tracker; | 126 RateTrackerForTest tracker; |
| 127 tracker.AddSamples(1); | 127 tracker.AddSamples(1); |
| 128 tracker.AdvanceTime(1000); | 128 tracker.AdvanceTime(1000); |
| 129 EXPECT_DOUBLE_EQ(1.0, tracker.ComputeRate()); | 129 EXPECT_DOUBLE_EQ(1.0, tracker.ComputeRate()); |
| 130 | 130 |
| 131 tracker.AdvanceTime(2000); | 131 tracker.AdvanceTime(2000); |
| 132 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRate()); | 132 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRate()); |
| 133 | 133 |
| 134 tracker.AdvanceTime(2000); | 134 tracker.AdvanceTime(2000); |
| 135 tracker.AddSamples(1); | 135 tracker.AddSamples(1); |
| 136 EXPECT_DOUBLE_EQ(1.0, tracker.ComputeRate()); | 136 EXPECT_DOUBLE_EQ(1.0, tracker.ComputeRate()); |
| 137 } | 137 } |
| 138 | 138 |
| 139 TEST(RateTrackerTest, TestRolloff) { | 139 TEST(RateTrackerTest, TestRolloff) { |
| 140 RateTrackerForTest tracker; | 140 RateTrackerForTest tracker; |
| 141 for (int i = 0; i < 10; ++i) { | 141 for (int i = 0; i < 10; ++i) { |
| 142 tracker.AddSamples(1U); | 142 tracker.AddSamples(1U); |
| 143 tracker.AdvanceTime(100); | 143 tracker.AdvanceTime(100); |
| 144 } | 144 } |
| 145 EXPECT_DOUBLE_EQ(10.0, tracker.ComputeRate()); | 145 EXPECT_DOUBLE_EQ(10.0, tracker.ComputeRate()); |
| 146 | 146 |
| 147 for (int i = 0; i < 10; ++i) { | 147 for (int i = 0; i < 10; ++i) { |
| 148 tracker.AddSamples(1U); | 148 tracker.AddSamples(1U); |
| 149 tracker.AdvanceTime(50); | 149 tracker.AdvanceTime(50); |
| 150 } | 150 } |
| 151 EXPECT_DOUBLE_EQ(15.0, tracker.ComputeRate()); | 151 EXPECT_DOUBLE_EQ(15.0, tracker.ComputeRate()); |
| 152 EXPECT_DOUBLE_EQ(20.0, tracker.ComputeRateForInterval(500u)); | 152 EXPECT_DOUBLE_EQ(20.0, tracker.ComputeRateForInterval(500)); |
| 153 | 153 |
| 154 for (int i = 0; i < 10; ++i) { | 154 for (int i = 0; i < 10; ++i) { |
| 155 tracker.AddSamples(1U); | 155 tracker.AddSamples(1U); |
| 156 tracker.AdvanceTime(50); | 156 tracker.AdvanceTime(50); |
| 157 } | 157 } |
| 158 EXPECT_DOUBLE_EQ(20.0, tracker.ComputeRate()); | 158 EXPECT_DOUBLE_EQ(20.0, tracker.ComputeRate()); |
| 159 } | 159 } |
| 160 | 160 |
| 161 TEST(RateTrackerTest, TestGetUnitSecondsAfterInitialValue) { | 161 TEST(RateTrackerTest, TestGetUnitSecondsAfterInitialValue) { |
| 162 RateTrackerForTest tracker; | 162 RateTrackerForTest tracker; |
| 163 tracker.AddSamples(1234); | 163 tracker.AddSamples(1234); |
| 164 tracker.AdvanceTime(1000); | 164 tracker.AdvanceTime(1000); |
| 165 EXPECT_DOUBLE_EQ(1234.0, tracker.ComputeRateForInterval(1000u)); | 165 EXPECT_DOUBLE_EQ(1234.0, tracker.ComputeRateForInterval(1000)); |
| 166 } | 166 } |
| 167 | 167 |
| 168 } // namespace rtc | 168 } // namespace rtc |
| OLD | NEW |