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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
#include <iostream>
#include "gtest/gtest.h"
#include "test_env.h"
#include "common.h"
#include "list.h"
using namespace std;
using namespace srt;
class CRcvLossListTest
: public ::testing::Test
{
protected:
void SetUp() override
{
m_lossList = new CRcvLossList(CRcvLossListTest::SIZE);
}
void TearDown() override
{
delete m_lossList;
}
void CheckEmptyArray()
{
EXPECT_EQ(m_lossList->getLossLength(), 0);
EXPECT_EQ(m_lossList->getFirstLostSeq(), SRT_SEQNO_NONE);
}
void CleanUpList()
{
//while (m_lossList->popLostSeq() != -1);
}
CRcvLossList* m_lossList;
public:
const int SIZE = 256;
};
/// Check the state of the freshly created list.
/// Capacity, loss length and pop().
TEST_F(CRcvLossListTest, Create)
{
CheckEmptyArray();
}
///////////////////////////////////////////////////////////////////////////////
///
/// The first group of tests checks insert and pop()
///
///////////////////////////////////////////////////////////////////////////////
/// Insert and remove one element from the list.
TEST_F(CRcvLossListTest, InsertRemoveOneElem)
{
EXPECT_EQ(m_lossList->insert(1, 1), 1);
EXPECT_EQ(m_lossList->getLossLength(), 1);
EXPECT_TRUE(m_lossList->remove(1, 1));
CheckEmptyArray();
}
/// Insert and pop one element from the list.
TEST_F(CRcvLossListTest, InsertTwoElemsEdge)
{
EXPECT_EQ(m_lossList->insert(CSeqNo::m_iMaxSeqNo, 1), 3);
EXPECT_EQ(m_lossList->getLossLength(), 3);
EXPECT_TRUE(m_lossList->remove(CSeqNo::m_iMaxSeqNo, 1));
CheckEmptyArray();
}
TEST(CRcvFreshLossListTest, CheckFreshLossList)
{
srt::TestInit srtinit;
std::deque<CRcvFreshLoss> floss {
CRcvFreshLoss (10, 15, 5),
CRcvFreshLoss (25, 29, 10),
CRcvFreshLoss (30, 30, 3),
CRcvFreshLoss (45, 80, 100)
};
EXPECT_EQ(floss.size(), 4u);
// Ok, now let's do element removal
int had_ttl = 0;
bool rm = CRcvFreshLoss::removeOne((floss), 26, &had_ttl);
EXPECT_EQ(rm, true);
EXPECT_EQ(had_ttl, 10);
EXPECT_EQ(floss.size(), 5u);
// Now we expect to have [10-15] [25-25] [27-35]...
// After revoking 25 it should have removed it.
// SPLIT
rm = CRcvFreshLoss::removeOne((floss), 27, &had_ttl);
EXPECT_EQ(rm, true);
EXPECT_EQ(had_ttl, 10);
EXPECT_EQ(floss.size(), 5u);
// STRIP
rm = CRcvFreshLoss::removeOne((floss), 28, &had_ttl);
EXPECT_EQ(rm, true);
EXPECT_EQ(had_ttl, 10);
EXPECT_EQ(floss.size(), 5u);
// DELETE
rm = CRcvFreshLoss::removeOne((floss), 25, &had_ttl);
EXPECT_EQ(rm, true);
EXPECT_EQ(had_ttl, 10);
EXPECT_EQ(floss.size(), 4u);
// SPLIT
rm = CRcvFreshLoss::removeOne((floss), 50, &had_ttl);
EXPECT_EQ(rm, true);
EXPECT_EQ(had_ttl, 100);
EXPECT_EQ(floss.size(), 5u);
// DELETE
rm = CRcvFreshLoss::removeOne((floss), 30, &had_ttl);
EXPECT_EQ(rm, true);
EXPECT_EQ(had_ttl, 3);
EXPECT_EQ(floss.size(), 4u);
// Remove nonexistent sequence, but existing before.
rm = CRcvFreshLoss::removeOne((floss), 25, NULL);
EXPECT_EQ(rm, false);
EXPECT_EQ(floss.size(), 4u);
// Remove nonexistent sequence that didn't exist before.
rm = CRcvFreshLoss::removeOne((floss), 31, &had_ttl);
EXPECT_EQ(rm, false);
EXPECT_EQ(had_ttl, 0);
EXPECT_EQ(floss.size(), 4u);
}
|