forked from Pissandshittium/pissandshittium
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathleaky_bucket_unittest.cc
33 lines (25 loc) · 1.16 KB
/
leaky_bucket_unittest.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "remoting/base/leaky_bucket.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace remoting {
TEST(LeakyBucketTest, LargeTimeDelta_BucketIsEmpty) {
// This test triggers an integer underflow bug in the previous implementation.
// The large (but reasonable) time skip should result in an empty bucket.
// A bug (due to int64->int conversion) caused the bucket-level to be a large
// positive value, resulting in a bucket-empty time in the far future.
auto now = base::TimeTicks::Now();
int rate = 1e6;
LeakyBucket bucket(LeakyBucket::kUnlimitedDepth, rate);
// Small random amount, should empty very quickly.
bucket.RefillOrSpill(123, now);
// The amount of drainage is 3000 * rate = 3e9, which overflows a signed
// 32-bit int. This would be subtracted from the current level, under the
// old implementation.
now += base::Seconds(3000);
bucket.UpdateRate(rate, now);
auto empty_time = bucket.GetEmptyTime();
EXPECT_LE(empty_time, now);
}
} // namespace remoting