blob: 7615a9fbb1ad0c6aefb253d2d8ba0e675b79a182 [file] [log] [blame]
/*
* Copyright (c) 2018 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.
*/
#include "modules/congestion_controller/bbr/data_transfer_tracker.h"
#include "test/gtest.h"
namespace webrtc {
namespace bbr {
namespace test {
namespace {
struct ResultForTest {
int64_t ack_span_ms;
int64_t send_span_ms;
int64_t acked_bytes;
};
class DataTransferTrackerForTest : public DataTransferTracker {
public:
void AddSample(int bytes, int send_time_ms, int ack_time_ms) {
DataTransferTracker::AddSample(DataSize::bytes(bytes),
Timestamp::ms(send_time_ms),
Timestamp::ms(ack_time_ms));
}
void ClearOldSamples(int excluding_end_ms) {
DataTransferTracker::ClearOldSamples(Timestamp::ms(excluding_end_ms));
}
ResultForTest GetRatesByAckTime(int covered_start_ms, int including_end_ms) {
auto result = DataTransferTracker::GetRatesByAckTime(
Timestamp::ms(covered_start_ms), Timestamp::ms(including_end_ms));
return ResultForTest{result.ack_timespan.ms(), result.send_timespan.ms(),
result.acked_data.bytes()};
}
};
} // namespace
TEST(DataTransferTrackerTest, TracksData) {
DataTransferTrackerForTest calc;
// Since we dont have any previous reference for the first packet, it won't be
// counted.
calc.AddSample(5555, 100000, 100100);
calc.AddSample(1000, 100020, 100120);
calc.AddSample(1000, 100040, 100140);
calc.AddSample(1000, 100060, 100160);
auto result = calc.GetRatesByAckTime(100000, 100200);
EXPECT_EQ(result.acked_bytes, 3000);
EXPECT_EQ(result.ack_span_ms, 60);
EXPECT_EQ(result.send_span_ms, 60);
}
TEST(DataTransferTrackerTest, CoversStartTime) {
DataTransferTrackerForTest calc;
calc.AddSample(5555, 100000, 100100);
calc.AddSample(1000, 100020, 100120);
calc.AddSample(1000, 100040, 100140);
calc.AddSample(1000, 100060, 100160);
calc.AddSample(1000, 100080, 100180);
auto result = calc.GetRatesByAckTime(100140, 100200);
EXPECT_EQ(result.acked_bytes, 3000);
EXPECT_EQ(result.ack_span_ms, 60);
EXPECT_EQ(result.send_span_ms, 60);
}
TEST(DataTransferTrackerTest, IncludesEndExcludesPastEnd) {
DataTransferTrackerForTest calc;
calc.AddSample(5555, 100000, 100100);
calc.AddSample(1000, 100020, 100120);
calc.AddSample(1000, 100040, 100140);
calc.AddSample(1000, 100060, 100160);
calc.AddSample(1000, 100080, 100180);
auto result = calc.GetRatesByAckTime(100120, 100160);
EXPECT_EQ(result.acked_bytes, 3000);
EXPECT_EQ(result.ack_span_ms, 60);
EXPECT_EQ(result.send_span_ms, 60);
}
TEST(DataTransferTrackerTest, AccumulatesDuplicates) {
DataTransferTrackerForTest calc;
calc.AddSample(5555, 100000, 100100);
// Two packets at same time, should be accumulated.
calc.AddSample(1000, 100020, 100120);
calc.AddSample(1000, 100020, 100120);
calc.AddSample(1000, 100060, 100160);
// Two packets at same time, should be accumulated.
calc.AddSample(1000, 100100, 100200);
calc.AddSample(1000, 100100, 100200);
calc.AddSample(1000, 100120, 100220);
auto result = calc.GetRatesByAckTime(100120, 100200);
EXPECT_EQ(result.acked_bytes, 5000);
EXPECT_EQ(result.ack_span_ms, 100);
EXPECT_EQ(result.send_span_ms, 100);
}
TEST(DataTransferTrackerTest, RemovesOldData) {
DataTransferTrackerForTest calc;
calc.AddSample(5555, 100000, 100100);
calc.AddSample(1000, 100020, 100120);
calc.AddSample(1000, 100040, 100140);
calc.AddSample(1000, 100060, 100160);
calc.AddSample(1000, 100080, 100180);
{
auto result = calc.GetRatesByAckTime(100120, 100200);
EXPECT_EQ(result.acked_bytes, 4000);
EXPECT_EQ(result.ack_span_ms, 80);
EXPECT_EQ(result.send_span_ms, 80);
}
// Note that this operation means that the packet acked at 100140 will not be
// counted any more, just used as time reference.
calc.ClearOldSamples(100140);
{
auto result = calc.GetRatesByAckTime(100120, 100200);
EXPECT_EQ(result.acked_bytes, 2000);
EXPECT_EQ(result.ack_span_ms, 40);
EXPECT_EQ(result.send_span_ms, 40);
}
}
} // namespace test
} // namespace bbr
} // namespace webrtc