A Discrete-Event Network Simulator
API
tcp-sack-permitted-test.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2016 Natale Patriciello <natale.patriciello@gmail.com>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  */
19 
20 #include "tcp-general-test.h"
21 #include "ns3/node.h"
22 #include "ns3/log.h"
23 #include "ns3/tcp-option-sack-permitted.h"
24 #include "ns3/tcp-header.h"
25 
26 using namespace ns3;
27 
28 NS_LOG_COMPONENT_DEFINE ("SackPermittedTestSuite");
29 
38 {
39 public:
42  {
46  ENABLED
47  };
48 
54 protected:
55  virtual Ptr<TcpSocketMsgBase> CreateReceiverSocket (Ptr<Node> node);
56  virtual Ptr<TcpSocketMsgBase> CreateSenderSocket (Ptr<Node> node);
57 
58  virtual void Tx (const Ptr<const Packet> p, const TcpHeader&h, SocketWho who);
59 
61 };
62 
64  : TcpGeneralTest ("Testing the TCP Sack Permitted option")
65 {
67 }
68 
71 {
72  Ptr<TcpSocketMsgBase> socket = TcpGeneralTest::CreateReceiverSocket (node);
73 
74  switch (m_configuration)
75  {
76  case DISABLED:
77  socket->SetAttribute ("Sack", BooleanValue (false));
78  break;
79 
80  case ENABLED_RECEIVER:
81  socket->SetAttribute ("Sack", BooleanValue (true));
82  break;
83 
84  case ENABLED_SENDER:
85  socket->SetAttribute ("Sack", BooleanValue (false));
86  break;
87 
88  case ENABLED:
89  socket->SetAttribute ("Sack", BooleanValue (true));
90  break;
91  }
92 
93  return socket;
94 }
95 
98 {
99  Ptr<TcpSocketMsgBase> socket = TcpGeneralTest::CreateSenderSocket (node);
100 
101  switch (m_configuration)
102  {
103  case DISABLED:
104  socket->SetAttribute ("Sack", BooleanValue (false));
105  break;
106 
107  case ENABLED_RECEIVER:
108  socket->SetAttribute ("Sack", BooleanValue (false));
109  break;
110 
111  case ENABLED_SENDER:
112  socket->SetAttribute ("Sack", BooleanValue (true));
113  break;
114 
115  case ENABLED:
116  socket->SetAttribute ("Sack", BooleanValue (true));
117  break;
118  }
119 
120  return socket;
121 }
122 
123 void
125 {
126 
127  if (!(h.GetFlags () & TcpHeader::SYN))
128  {
129  NS_TEST_ASSERT_MSG_EQ (h.HasOption (TcpOption::SACKPERMITTED), false,
130  "SackPermitted in non-SYN segment");
131  return;
132  }
133 
134  if (m_configuration == DISABLED)
135  {
136  NS_TEST_ASSERT_MSG_EQ (h.HasOption (TcpOption::SACKPERMITTED), false,
137  "SackPermitted disabled but option enabled");
138  }
139  else if (m_configuration == ENABLED)
140  {
141  NS_TEST_ASSERT_MSG_EQ (h.HasOption (TcpOption::SACKPERMITTED), true,
142  "SackPermitted enabled but option disabled");
143  }
144 
145  NS_LOG_INFO (h);
146  if (who == SENDER)
147  {
148  if (h.GetFlags () & TcpHeader::SYN)
149  {
151  {
152  NS_TEST_ASSERT_MSG_EQ (h.HasOption (TcpOption::SACKPERMITTED), false,
153  "SackPermitted disabled but option enabled");
154  }
155  else if (m_configuration == ENABLED_SENDER)
156  {
157  NS_TEST_ASSERT_MSG_EQ (h.HasOption (TcpOption::SACKPERMITTED), true,
158  "SackPermitted enabled but option disabled");
159  }
160  }
161  else
162  {
163  if (m_configuration != ENABLED)
164  {
165  NS_TEST_ASSERT_MSG_EQ (h.HasOption (TcpOption::SACKPERMITTED), false,
166  "SackPermitted disabled but option enabled");
167  }
168  }
169  }
170  else if (who == RECEIVER)
171  {
172  if (h.GetFlags () & TcpHeader::SYN)
173  {
174  // Sender has not sent SackPermitted, so implementation should disable ts
176  {
177  NS_TEST_ASSERT_MSG_EQ (h.HasOption (TcpOption::SACKPERMITTED), false,
178  "sender has not ts, but receiver sent anyway");
179  }
180  else if (m_configuration == ENABLED_SENDER)
181  {
182  NS_TEST_ASSERT_MSG_EQ (h.HasOption (TcpOption::SACKPERMITTED), false,
183  "receiver has not ts enabled but sent anyway");
184  }
185  }
186  else
187  {
188  if (m_configuration != ENABLED)
189  {
190  NS_TEST_ASSERT_MSG_EQ (h.HasOption (TcpOption::SACKPERMITTED), false,
191  "SackPermitted disabled but option enabled");
192  }
193  }
194  }
195 }
196 
204 {
205 public:
208  : TestSuite ("tcp-sack-permitted", UNIT)
209  {
214  }
215 
216 };
217 
Test case for checking the SACK-PERMITTED option.
virtual void Tx(const Ptr< const Packet > p, const TcpHeader &h, SocketWho who)
Packet transmitted down to IP layer.
Configuration
Configuration of the test.
SackPermittedTestCase(SackPermittedTestCase::Configuration conf)
Constructor.
virtual Ptr< TcpSocketMsgBase > CreateReceiverSocket(Ptr< Node > node)
Create and install the socket to install on the receiver.
virtual Ptr< TcpSocketMsgBase > CreateSenderSocket(Ptr< Node > node)
Create and install the socket to install on the sender.
Configuration m_configuration
The configuration.
The test case for testing the TCP SACK PERMITTED option.
AttributeValue implementation for Boolean.
Definition: boolean.h:37
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:74
General infrastructure for TCP testing.
SocketWho
Used as parameter of methods, specifies on what node the caller is interested (e.g.
@ RECEIVER
Receiver node.
Header for the Transmission Control Protocol.
Definition: tcp-header.h:45
bool HasOption(uint8_t kind) const
Check if the header has the option specified.
Definition: tcp-header.cc:511
uint8_t GetFlags() const
Get the flags.
Definition: tcp-header.cc:173
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:299
A suite of tests to run.
Definition: test.h:1188
@ UNIT
This test suite implements a Unit Test.
Definition: test.h:1197
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:281
#define NS_TEST_ASSERT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report and abort if not.
Definition: test.h:141
Definition: conf.py:1
Every class exported by the ns3 library is enclosed in the ns3 namespace.
static TcpSackPermittedTestSuite g_tcpSackPermittedTestSuite
Static variable for test initialization.