2017-03-20 10:53:12 -07:00
|
|
|
/*
|
|
|
|
|
* Copyright 2017 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 <utility>
|
|
|
|
|
|
2017-09-15 06:47:31 +02:00
|
|
|
#include "p2p/base/packetlossestimator.h"
|
|
|
|
|
#include "rtc_base/gunit.h"
|
2017-03-20 10:53:12 -07:00
|
|
|
|
|
|
|
|
using cricket::PacketLossEstimator;
|
|
|
|
|
|
|
|
|
|
class PacketLossEstimatorTest : public testing::Test {};
|
|
|
|
|
|
|
|
|
|
TEST_F(PacketLossEstimatorTest, InitialResponseRate) {
|
|
|
|
|
PacketLossEstimator ple(5, 100);
|
|
|
|
|
EXPECT_EQ(1.0, ple.get_response_rate());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(PacketLossEstimatorTest, InitialUpdateResponseRate) {
|
|
|
|
|
PacketLossEstimator ple(5, 100);
|
|
|
|
|
ple.UpdateResponseRate(10);
|
|
|
|
|
EXPECT_EQ(1.0, ple.get_response_rate());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(PacketLossEstimatorTest, ResponseReceived) {
|
|
|
|
|
PacketLossEstimator ple(5, 100);
|
|
|
|
|
|
|
|
|
|
ple.ExpectResponse("a", 0);
|
|
|
|
|
ple.ReceivedResponse("a", 1);
|
|
|
|
|
ple.UpdateResponseRate(2);
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(1.0, ple.get_response_rate());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(PacketLossEstimatorTest, ResponseNotConsideredLostYet) {
|
|
|
|
|
PacketLossEstimator ple(5, 100);
|
|
|
|
|
|
|
|
|
|
ple.ExpectResponse("a", 0);
|
|
|
|
|
ple.UpdateResponseRate(2);
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(1.0, ple.get_response_rate());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(PacketLossEstimatorTest, ResponseConsideredLost) {
|
|
|
|
|
PacketLossEstimator ple(5, 100);
|
|
|
|
|
|
|
|
|
|
ple.ExpectResponse("a", 0);
|
|
|
|
|
ple.UpdateResponseRate(10);
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(0.0, ple.get_response_rate());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(PacketLossEstimatorTest, ResponseLate) {
|
|
|
|
|
PacketLossEstimator ple(5, 100);
|
|
|
|
|
|
|
|
|
|
ple.ExpectResponse("a", 0);
|
|
|
|
|
ple.ReceivedResponse("a", 6);
|
|
|
|
|
ple.UpdateResponseRate(10);
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(1.0, ple.get_response_rate());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(PacketLossEstimatorTest, ResponseForgotten) {
|
|
|
|
|
PacketLossEstimator ple(5, 100);
|
|
|
|
|
ple.ExpectResponse("a", 0);
|
|
|
|
|
ple.UpdateResponseRate(101);
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(1.0, ple.get_response_rate());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(PacketLossEstimatorTest, Lost1_Received1) {
|
|
|
|
|
PacketLossEstimator ple(5, 100);
|
|
|
|
|
|
|
|
|
|
ple.ExpectResponse("a", 0);
|
|
|
|
|
ple.ExpectResponse("b", 2);
|
|
|
|
|
ple.ReceivedResponse("b", 6);
|
|
|
|
|
ple.UpdateResponseRate(7);
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(0.5, ple.get_response_rate());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static const std::pair<std::string, int64_t> kFivePackets[5] = {{"a", 0},
|
|
|
|
|
{"b", 2},
|
|
|
|
|
{"c", 4},
|
|
|
|
|
{"d", 6},
|
|
|
|
|
{"e", 8}};
|
|
|
|
|
|
|
|
|
|
// Time: 0 1 2 3 4 5 6 7 8 9 10
|
|
|
|
|
// Sent: a b c d e |
|
|
|
|
|
// Recv: b |
|
|
|
|
|
// Wind: --------------> |
|
|
|
|
|
TEST_F(PacketLossEstimatorTest, Lost3_Received1_Waiting1) {
|
|
|
|
|
PacketLossEstimator ple(3, 100);
|
|
|
|
|
|
|
|
|
|
for (const auto& p : kFivePackets) {
|
|
|
|
|
ple.ExpectResponse(p.first, p.second);
|
|
|
|
|
}
|
|
|
|
|
ple.ReceivedResponse("b", 3);
|
|
|
|
|
ple.UpdateResponseRate(10);
|
|
|
|
|
EXPECT_EQ(0.25, ple.get_response_rate());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Time: 0 1 2 3 4 5 6 7 8 9 10
|
|
|
|
|
// Sent: a b c d e |
|
|
|
|
|
// Recv: e |
|
|
|
|
|
// Wind: --------------> |
|
|
|
|
|
TEST_F(PacketLossEstimatorTest, Lost4_Early1) {
|
|
|
|
|
PacketLossEstimator ple(3, 100);
|
|
|
|
|
|
|
|
|
|
for (const auto& p : kFivePackets) {
|
|
|
|
|
ple.ExpectResponse(p.first, p.second);
|
|
|
|
|
}
|
|
|
|
|
ple.ReceivedResponse("e", 9);
|
|
|
|
|
ple.UpdateResponseRate(10);
|
|
|
|
|
// e should be considered, even though its response was received less than
|
|
|
|
|
// |consider_lost_after_ms| ago.
|
|
|
|
|
EXPECT_EQ(0.2, ple.get_response_rate());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Time: 0 1 2 3 4 5 6 7 8 9 10
|
|
|
|
|
// Sent: a b c d e |
|
|
|
|
|
// Recv: c |
|
|
|
|
|
// Wind: <-------> |
|
|
|
|
|
TEST_F(PacketLossEstimatorTest, Forgot2_Received1_Lost1_Waiting1) {
|
|
|
|
|
PacketLossEstimator ple(3, 7);
|
|
|
|
|
|
|
|
|
|
for (const auto& p : kFivePackets) {
|
|
|
|
|
ple.ExpectResponse(p.first, p.second);
|
|
|
|
|
}
|
|
|
|
|
ple.ReceivedResponse("c", 5);
|
|
|
|
|
ple.UpdateResponseRate(10);
|
|
|
|
|
EXPECT_EQ(0.5, ple.get_response_rate());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Tests that old messages are forgotten if ExpectResponse is called
|
|
|
|
|
// |forget_after_ms| after |last_forgot_at|. It is important that ExpectResponse
|
|
|
|
|
// and ReceivedResponse forget old messages to avoid |tracked_packets_| growing
|
|
|
|
|
// without bound if UpdateResponseRate is never called (or rarely called).
|
|
|
|
|
//
|
|
|
|
|
// Time: 0 1 2 3 4 5 6
|
|
|
|
|
// Sent: a b
|
|
|
|
|
// Wind: <------->
|
|
|
|
|
TEST_F(PacketLossEstimatorTest, ExpectResponseForgetsOldPackets) {
|
|
|
|
|
PacketLossEstimator ple(1, 5);
|
|
|
|
|
ple.ExpectResponse("a", 0); // This message will be forgotten.
|
|
|
|
|
ple.ExpectResponse("b", 6); // This call should trigger clean up.
|
|
|
|
|
// a should be forgotten, b should be tracked.
|
|
|
|
|
EXPECT_EQ(1u, ple.tracked_packet_count_for_testing());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Tests that old messages are forgotten if ExpectResponse is called
|
|
|
|
|
// |forget_after_ms| after |last_forgot_at|. It is important that ExpectResponse
|
|
|
|
|
// and ReceivedResponse forget old messages to avoid |tracked_packets_| growing
|
|
|
|
|
// without bound if UpdateResponseRate is never called (or rarely called).
|
|
|
|
|
//
|
|
|
|
|
// Time: 0 1 2 3 4 5 6
|
|
|
|
|
// Sent: a
|
|
|
|
|
// Recv: b
|
|
|
|
|
// Wind: <------->
|
|
|
|
|
TEST_F(PacketLossEstimatorTest, ReceivedResponseForgetsOldPackets) {
|
|
|
|
|
PacketLossEstimator ple(1, 5);
|
|
|
|
|
ple.ExpectResponse("a", 0); // This message will be forgotten.
|
|
|
|
|
ple.ReceivedResponse("b", 6); // This call should trigger clean up.
|
|
|
|
|
// a should be forgoten, b should not be tracked (received but not sent).
|
|
|
|
|
EXPECT_EQ(0u, ple.tracked_packet_count_for_testing());
|
|
|
|
|
}
|