Files
unison/src/internet/test/tcp-rx-buffer-test.cc
2017-02-04 01:52:02 +01:00

363 lines
14 KiB
C++

/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation;
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#include "ns3/test.h"
#include "ns3/packet.h"
#include "ns3/log.h"
#include "ns3/tcp-rx-buffer.h"
using namespace ns3;
NS_LOG_COMPONENT_DEFINE ("TcpRxBufferTestSuite");
/**
* \ingroup internet-tests
* \ingroup tests
*
* \brief The TcpRxBuffer Test
*/
class TcpRxBufferTestCase : public TestCase
{
public:
TcpRxBufferTestCase ();
private:
virtual void DoRun (void);
virtual void DoTeardown (void);
/**
* \brief Test the SACK list update.
*/
void TestUpdateSACKList ();
};
TcpRxBufferTestCase::TcpRxBufferTestCase ()
: TestCase ("TcpRxBuffer Test")
{
}
void
TcpRxBufferTestCase::DoRun ()
{
TestUpdateSACKList ();
}
void
TcpRxBufferTestCase::TestUpdateSACKList ()
{
TcpRxBuffer rxBuf;
TcpOptionSack::SackList sackList;
TcpOptionSack::SackList::iterator it;
Ptr<Packet> p = Create<Packet> (100);
TcpHeader h;
// In order sequence
h.SetSequenceNumber (SequenceNumber32 (1));
rxBuf.SetNextRxSequence (SequenceNumber32 (1));
rxBuf.Add (p, h);
NS_TEST_ASSERT_MSG_EQ (rxBuf.NextRxSequence (), SequenceNumber32 (101),
"Sequence number differs from expected");
NS_TEST_ASSERT_MSG_EQ (sackList.size (), 0,
"SACK list with an element, while should be empty");
// Out-of-order sequence (SACK generated)
h.SetSequenceNumber (SequenceNumber32 (501));
rxBuf.Add (p, h);
NS_TEST_ASSERT_MSG_EQ (rxBuf.NextRxSequence (), SequenceNumber32 (101),
"Sequence number differs from expected");
sackList = rxBuf.GetSackList ();
NS_TEST_ASSERT_MSG_EQ (sackList.size (), 1,
"SACK list should contain one element");
it = sackList.begin ();
NS_TEST_ASSERT_MSG_EQ (it->first, SequenceNumber32 (501),
"SACK block different than expected");
NS_TEST_ASSERT_MSG_EQ (it->second, SequenceNumber32 (601),
"SACK block different than expected");
// In order sequence, not greater than the previous (the old SACK still in place)
h.SetSequenceNumber (SequenceNumber32 (101));
rxBuf.Add (p, h);
NS_TEST_ASSERT_MSG_EQ (rxBuf.NextRxSequence (), SequenceNumber32 (201),
"Sequence number differs from expected");
sackList = rxBuf.GetSackList ();
NS_TEST_ASSERT_MSG_EQ (sackList.size (), 1,
"SACK list should contain one element");
it = sackList.begin ();
NS_TEST_ASSERT_MSG_EQ (it->first, SequenceNumber32 (501),
"SACK block different than expected");
NS_TEST_ASSERT_MSG_EQ (it->second, SequenceNumber32 (601),
"SACK block different than expected");
// Out of order sequence, merge on the right
h.SetSequenceNumber (SequenceNumber32 (401));
rxBuf.Add (p, h);
NS_TEST_ASSERT_MSG_EQ (rxBuf.NextRxSequence (), SequenceNumber32 (201),
"Sequence number differs from expected");
sackList = rxBuf.GetSackList ();
NS_TEST_ASSERT_MSG_EQ (sackList.size (), 1,
"SACK list should contain one element");
it = sackList.begin ();
NS_TEST_ASSERT_MSG_EQ (it->first, SequenceNumber32 (401),
"SACK block different than expected");
NS_TEST_ASSERT_MSG_EQ (it->second, SequenceNumber32 (601),
"SACK block different than expected");
// Out of order sequence, merge on the left
h.SetSequenceNumber (SequenceNumber32 (601));
rxBuf.Add (p, h);
NS_TEST_ASSERT_MSG_EQ (rxBuf.NextRxSequence (), SequenceNumber32 (201),
"Sequence number differs from expected");
sackList = rxBuf.GetSackList ();
NS_TEST_ASSERT_MSG_EQ (sackList.size (), 1,
"SACK list should contain one element");
it = sackList.begin ();
NS_TEST_ASSERT_MSG_EQ (it->first, SequenceNumber32 (401),
"SACK block different than expected");
NS_TEST_ASSERT_MSG_EQ (it->second, SequenceNumber32 (701),
"SACK block different than expected");
// out of order sequence, different block, check also the order (newer first)
h.SetSequenceNumber (SequenceNumber32 (901));
rxBuf.Add (p, h);
NS_TEST_ASSERT_MSG_EQ (rxBuf.NextRxSequence (), SequenceNumber32 (201),
"Sequence number differs from expected");
sackList = rxBuf.GetSackList ();
NS_TEST_ASSERT_MSG_EQ (sackList.size (), 2,
"SACK list should contain two element");
it = sackList.begin ();
NS_TEST_ASSERT_MSG_EQ (it->first, SequenceNumber32 (901),
"SACK block different than expected");
NS_TEST_ASSERT_MSG_EQ (it->second, SequenceNumber32 (1001),
"SACK block different than expected");
++it;
NS_TEST_ASSERT_MSG_EQ (it->first, SequenceNumber32 (401),
"SACK block different than expected");
NS_TEST_ASSERT_MSG_EQ (it->second, SequenceNumber32 (701),
"SACK block different than expected");
// another out of order seq, different block, check the order (newer first)
h.SetSequenceNumber (SequenceNumber32 (1201));
rxBuf.Add (p, h);
NS_TEST_ASSERT_MSG_EQ (rxBuf.NextRxSequence (), SequenceNumber32 (201),
"Sequence number differs from expected");
sackList = rxBuf.GetSackList ();
NS_TEST_ASSERT_MSG_EQ (sackList.size (), 3,
"SACK list should contain three element");
it = sackList.begin ();
NS_TEST_ASSERT_MSG_EQ (it->first, SequenceNumber32 (1201),
"SACK block different than expected");
NS_TEST_ASSERT_MSG_EQ (it->second, SequenceNumber32 (1301),
"SACK block different than expected");
++it;
NS_TEST_ASSERT_MSG_EQ (it->first, SequenceNumber32 (901),
"SACK block different than expected");
NS_TEST_ASSERT_MSG_EQ (it->second, SequenceNumber32 (1001),
"SACK block different than expected");
++it;
NS_TEST_ASSERT_MSG_EQ (it->first, SequenceNumber32 (401),
"SACK block different than expected");
NS_TEST_ASSERT_MSG_EQ (it->second, SequenceNumber32 (701),
"SACK block different than expected");
// another out of order seq, different block, check the order (newer first)
h.SetSequenceNumber (SequenceNumber32 (1401));
rxBuf.Add (p, h);
NS_TEST_ASSERT_MSG_EQ (rxBuf.NextRxSequence (), SequenceNumber32 (201),
"Sequence number differs from expected");
sackList = rxBuf.GetSackList ();
NS_TEST_ASSERT_MSG_EQ (sackList.size (), 4,
"SACK list should contain four element");
it = sackList.begin ();
NS_TEST_ASSERT_MSG_EQ (it->first, SequenceNumber32 (1401),
"SACK block different than expected");
NS_TEST_ASSERT_MSG_EQ (it->second, SequenceNumber32 (1501),
"SACK block different than expected");
++it;
NS_TEST_ASSERT_MSG_EQ (it->first, SequenceNumber32 (1201),
"SACK block different than expected");
NS_TEST_ASSERT_MSG_EQ (it->second, SequenceNumber32 (1301),
"SACK block different than expected");
++it;
NS_TEST_ASSERT_MSG_EQ (it->first, SequenceNumber32 (901),
"SACK block different than expected");
NS_TEST_ASSERT_MSG_EQ (it->second, SequenceNumber32 (1001),
"SACK block different than expected");
++it;
NS_TEST_ASSERT_MSG_EQ (it->first, SequenceNumber32 (401),
"SACK block different than expected");
NS_TEST_ASSERT_MSG_EQ (it->second, SequenceNumber32 (701),
"SACK block different than expected");
// in order block! See if something get stripped off..
h.SetSequenceNumber (SequenceNumber32 (201));
rxBuf.Add (p, h);
NS_TEST_ASSERT_MSG_EQ (rxBuf.NextRxSequence (), SequenceNumber32 (301),
"Sequence number differs from expected");
sackList = rxBuf.GetSackList ();
NS_TEST_ASSERT_MSG_EQ (sackList.size (), 4,
"SACK list should contain four element");
// in order block! See if something get stripped off..
h.SetSequenceNumber (SequenceNumber32 (301));
rxBuf.Add (p, h);
NS_TEST_ASSERT_MSG_EQ (rxBuf.NextRxSequence (), SequenceNumber32 (701),
"Sequence number differs from expected");
sackList = rxBuf.GetSackList ();
NS_TEST_ASSERT_MSG_EQ (sackList.size (), 3,
"SACK list should contain three element");
it = sackList.begin ();
NS_TEST_ASSERT_MSG_EQ (it->first, SequenceNumber32 (1401),
"SACK block different than expected");
NS_TEST_ASSERT_MSG_EQ (it->second, SequenceNumber32 (1501),
"SACK block different than expected");
++it;
NS_TEST_ASSERT_MSG_EQ (it->first, SequenceNumber32 (1201),
"SACK block different than expected");
NS_TEST_ASSERT_MSG_EQ (it->second, SequenceNumber32 (1301),
"SACK block different than expected");
++it;
NS_TEST_ASSERT_MSG_EQ (it->first, SequenceNumber32 (901),
"SACK block different than expected");
NS_TEST_ASSERT_MSG_EQ (it->second, SequenceNumber32 (1001),
"SACK block different than expected");
// out of order block, I'm expecting a left-merge with a move on the top
h.SetSequenceNumber (SequenceNumber32 (801));
rxBuf.Add (p, h);
NS_TEST_ASSERT_MSG_EQ (rxBuf.NextRxSequence (), SequenceNumber32 (701),
"Sequence number differs from expected");
sackList = rxBuf.GetSackList ();
NS_TEST_ASSERT_MSG_EQ (sackList.size (), 3,
"SACK list should contain three element");
it = sackList.begin ();
NS_TEST_ASSERT_MSG_EQ (it->first, SequenceNumber32 (801),
"SACK block different than expected");
NS_TEST_ASSERT_MSG_EQ (it->second, SequenceNumber32 (1001),
"SACK block different than expected");
++it;
NS_TEST_ASSERT_MSG_EQ (it->first, SequenceNumber32 (1401),
"SACK block different than expected");
NS_TEST_ASSERT_MSG_EQ (it->second, SequenceNumber32 (1501),
"SACK block different than expected");
++it;
NS_TEST_ASSERT_MSG_EQ (it->first, SequenceNumber32 (1201),
"SACK block different than expected");
NS_TEST_ASSERT_MSG_EQ (it->second, SequenceNumber32 (1301),
"SACK block different than expected");
// In order block! Strip things away..
h.SetSequenceNumber (SequenceNumber32 (701));
rxBuf.Add (p, h);
NS_TEST_ASSERT_MSG_EQ (rxBuf.NextRxSequence (), SequenceNumber32 (1001),
"Sequence number differs from expected");
sackList = rxBuf.GetSackList ();
NS_TEST_ASSERT_MSG_EQ (sackList.size (), 2,
"SACK list should contain two element");
it = sackList.begin ();
NS_TEST_ASSERT_MSG_EQ (it->first, SequenceNumber32 (1401),
"SACK block different than expected");
NS_TEST_ASSERT_MSG_EQ (it->second, SequenceNumber32 (1501),
"SACK block different than expected");
++it;
NS_TEST_ASSERT_MSG_EQ (it->first, SequenceNumber32 (1201),
"SACK block different than expected");
NS_TEST_ASSERT_MSG_EQ (it->second, SequenceNumber32 (1301),
"SACK block different than expected");
// out of order... I'm expecting a right-merge with a move on top
h.SetSequenceNumber (SequenceNumber32 (1301));
rxBuf.Add (p, h);
NS_TEST_ASSERT_MSG_EQ (rxBuf.NextRxSequence (), SequenceNumber32 (1001),
"Sequence number differs from expected");
sackList = rxBuf.GetSackList ();
NS_TEST_ASSERT_MSG_EQ (sackList.size (), 1,
"SACK list should contain one element");
it = sackList.begin ();
NS_TEST_ASSERT_MSG_EQ (it->first, SequenceNumber32 (1201),
"SACK block different than expected");
NS_TEST_ASSERT_MSG_EQ (it->second, SequenceNumber32 (1501),
"SACK block different than expected");
// In order
h.SetSequenceNumber (SequenceNumber32 (1001));
rxBuf.Add (p, h);
NS_TEST_ASSERT_MSG_EQ (rxBuf.NextRxSequence (), SequenceNumber32 (1101),
"Sequence number differs from expected");
sackList = rxBuf.GetSackList ();
NS_TEST_ASSERT_MSG_EQ (sackList.size (), 1,
"SACK list should contain one element");
it = sackList.begin ();
NS_TEST_ASSERT_MSG_EQ (it->first, SequenceNumber32 (1201),
"SACK block different than expected");
NS_TEST_ASSERT_MSG_EQ (it->second, SequenceNumber32 (1501),
"SACK block different than expected");
// In order, empty the list
h.SetSequenceNumber (SequenceNumber32 (1101));
rxBuf.Add (p, h);
NS_TEST_ASSERT_MSG_EQ (rxBuf.NextRxSequence (), SequenceNumber32 (1501),
"Sequence number differs from expected");
sackList = rxBuf.GetSackList ();
NS_TEST_ASSERT_MSG_EQ (sackList.size (), 0,
"SACK list should contain no element");
}
void
TcpRxBufferTestCase::DoTeardown ()
{
}
/**
* \ingroup internet-test
* \ingroup tests
*
* \brief the TestSuite for the TcpRxBuffer test case
*/
class TcpRxBufferTestSuite : public TestSuite
{
public:
TcpRxBufferTestSuite ()
: TestSuite ("tcp-rx-buffer", UNIT)
{
AddTestCase (new TcpRxBufferTestCase, TestCase::QUICK);
}
};
static TcpRxBufferTestSuite g_tcpRxBufferTestSuite;