/* * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree.
*/
TEST_F(RateLimitTest, IncreasingMaxRate) { // Fill rate, extend window to full size.
EXPECT_TRUE(rate_limiter->TryUseRate(kRateFillingBytes / 2));
clock_.AdvanceTimeMilliseconds(kWindowSizeMs - 1);
EXPECT_TRUE(rate_limiter->TryUseRate(kRateFillingBytes / 2));
// All rate consumed.
EXPECT_FALSE(rate_limiter->TryUseRate(1));
// Double the available rate and fill that too.
rate_limiter->SetMaxRate(kMaxRateBps * 2);
EXPECT_TRUE(rate_limiter->TryUseRate(kRateFillingBytes));
// All rate consumed again.
EXPECT_FALSE(rate_limiter->TryUseRate(1));
}
TEST_F(RateLimitTest, DecreasingMaxRate) { // Fill rate, extend window to full size.
EXPECT_TRUE(rate_limiter->TryUseRate(kRateFillingBytes / 2));
clock_.AdvanceTimeMilliseconds(kWindowSizeMs - 1);
EXPECT_TRUE(rate_limiter->TryUseRate(kRateFillingBytes / 2));
// All rate consumed.
EXPECT_FALSE(rate_limiter->TryUseRate(1));
// Halve the available rate and move window so half of the data falls out.
rate_limiter->SetMaxRate(kMaxRateBps / 2);
clock_.AdvanceTimeMilliseconds(1);
// All rate still consumed.
EXPECT_FALSE(rate_limiter->TryUseRate(1));
}
TEST_F(RateLimitTest, ChangingWindowSize) { // Fill rate, extend window to full size.
EXPECT_TRUE(rate_limiter->TryUseRate(kRateFillingBytes / 2));
clock_.AdvanceTimeMilliseconds(kWindowSizeMs - 1);
EXPECT_TRUE(rate_limiter->TryUseRate(kRateFillingBytes / 2));
// All rate consumed.
EXPECT_FALSE(rate_limiter->TryUseRate(1));
// Decrease window size so half of the data falls out.
rate_limiter->SetWindowSize(kWindowSizeMs / 2); // Average rate should still be the same, so rate is still all consumed.
EXPECT_FALSE(rate_limiter->TryUseRate(1));
// Increase window size again. Now the rate is only half used (removed data // points don't come back to life).
rate_limiter->SetWindowSize(kWindowSizeMs);
EXPECT_TRUE(rate_limiter->TryUseRate(kRateFillingBytes / 2));
// All rate consumed again.
EXPECT_FALSE(rate_limiter->TryUseRate(1));
}
TEST_F(RateLimitTest, SingleUsageAlwaysOk) { // Using more bytes than can fit in a window is OK for a single packet.
EXPECT_TRUE(rate_limiter->TryUseRate(kRateFillingBytes + 1));
}
TEST_F(RateLimitTest, MultiThreadedUsage) { // Simple sanity test, with different threads calling the various methods. // Runs a few simple tasks, each on its own thread, but coordinated with // events so that they run in a serialized order. Intended to catch data // races when run with tsan et al.
// Half window size, double rate -> same amount of bytes needed to fill rate.
class SetWindowSizeTask : public ThreadTask { public: explicit SetWindowSizeTask(RateLimiter* rate_limiter)
: ThreadTask(rate_limiter) {}
~SetWindowSizeTask() override {}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.