A Discrete-Event Network Simulator
API
test-lte-rlc-header.cc
Go to the documentation of this file.
1/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2011, 2012, 2013 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
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 * Author: Lluis Parcerisa <lparcerisa@cttc.cat> (TestUtils from test-asn1-encoding.cc)
19 * Nicola Baldo <nbaldo@cttc.es> (actual test)
20 */
21
22#include "ns3/log.h"
23#include "ns3/test.h"
24#include "ns3/ptr.h"
25#include "ns3/packet.h"
26
27#include "ns3/lte-rlc-am-header.h"
28
29#include <list>
30#include <bitset>
31#include <iomanip>
32
33
34NS_LOG_COMPONENT_DEFINE ("TestLteRlcHeader");
35
36namespace ns3 {
37
45{
46public:
52 static std::string sprintPacketContentsHex (Ptr<Packet> pkt)
53 {
54 uint32_t psize = pkt->GetSize ();
55 uint8_t buffer[psize];
56 std::ostringstream oss (std::ostringstream::out);
57 pkt->CopyData (buffer, psize);
58 for (uint32_t i = 0; i < psize; i++)
59 {
60 oss << std::setfill ('0') << std::setw (2) << std::hex << (uint32_t) buffer[i];
61 }
62 return oss.str ();
63 }
64
70 static std::string sprintPacketContentsBin (Ptr<Packet> pkt)
71 {
72 uint32_t psize = pkt->GetSize ();
73 uint8_t buffer[psize];
74 std::ostringstream oss (std::ostringstream::out);
75 pkt->CopyData (buffer, psize);
76 for (uint32_t i = 0; i < psize; i++)
77 {
78 oss << (std::bitset<8> (buffer[i]));
79 }
80 return std::string (oss.str () + "\n");
81 }
82
88 {
89 NS_LOG_DEBUG ("---- SERIALIZED PACKET CONTENTS (HEX): -------");
92 }
93
99 template <class T>
100 static void LogPacketInfo (T source,std::string s)
101 {
102 NS_LOG_DEBUG ("--------- " << s.data () << " INFO: -------");
103 std::ostringstream oss (std::ostringstream::out);
104 source.Print (oss);
105 NS_LOG_DEBUG (oss.str ());
106 }
107};
108
109
117{
118public:
127 std::list<SequenceNumber10> nackSnList,
128 std::string hex);
129
130protected:
131 virtual void DoRun (void);
132
134 std::list<SequenceNumber10> m_nackSnList;
135 std::string m_hex;
136
137};
138
139
141 std::list<SequenceNumber10> nackSnList ,
142 std::string hex)
143 : TestCase (hex),
144 m_ackSn (ackSn),
145 m_nackSnList (nackSnList),
146 m_hex (hex)
147{
148 NS_LOG_FUNCTION (this << hex);
149}
150
151void
152
154{
155 NS_LOG_FUNCTION (this);
156
157 Ptr<Packet> p = Create<Packet> ();
160 h.SetAckSn (m_ackSn);
161 for (std::list<SequenceNumber10>::iterator it = m_nackSnList.begin ();
162 it != m_nackSnList.end ();
163 ++it)
164 {
165 h.PushNack (it->GetValue ());
166 }
167 p->AddHeader (h);
168
170 std::string hex = TestUtils::sprintPacketContentsHex (p);
171 NS_TEST_ASSERT_MSG_EQ (m_hex, hex, "serialized packet content " << hex << " differs from test vector " << m_hex);
172
174 p->RemoveHeader (h2);
175 SequenceNumber10 ackSn = h2.GetAckSn ();
176 NS_TEST_ASSERT_MSG_EQ (ackSn, m_ackSn, "deserialized ACK SN differs from test vector");
177
178 for (std::list<SequenceNumber10>::iterator it = m_nackSnList.begin ();
179 it != m_nackSnList.end ();
180 ++it)
181 {
182 int nackSn = h2.PopNack ();
183 NS_TEST_ASSERT_MSG_GT (nackSn, -1, "not enough elements in deserialized NACK list");
184 NS_TEST_ASSERT_MSG_EQ (nackSn, it->GetValue (), "deserialized NACK SN differs from test vector");
185 }
186 int retVal = h2.PopNack ();
187 NS_TEST_ASSERT_MSG_LT (retVal, 0, "too many elements in deserialized NACK list");
188}
189
190
198{
199public:
202
204 : TestSuite ("lte-rlc-header", UNIT)
205{
206 NS_LOG_FUNCTION (this);
207
208 {
209 SequenceNumber10 ackSn (8);
210 std::list<SequenceNumber10> nackSnList;
211 std::string hex ("0020");
212 AddTestCase (new RlcAmStatusPduTestCase (ackSn, nackSnList, hex), TestCase::QUICK);
213 }
214
215 {
216 SequenceNumber10 ackSn (873);
217 std::list<SequenceNumber10> nackSnList;
218 std::string hex ("0da4");
219 AddTestCase (new RlcAmStatusPduTestCase (ackSn, nackSnList, hex), TestCase::QUICK);
220 }
221
222 {
223 SequenceNumber10 ackSn (2);
224 std::list<SequenceNumber10> nackSnList;
225 nackSnList.push_back (SequenceNumber10 (873));
226 std::string hex ("000bb480");
227 AddTestCase (new RlcAmStatusPduTestCase (ackSn, nackSnList, hex), TestCase::QUICK);
228 }
229
230
231 {
232 SequenceNumber10 ackSn (2);
233 std::list<SequenceNumber10> nackSnList;
234 nackSnList.push_back (SequenceNumber10 (1021));
235 nackSnList.push_back (SequenceNumber10 (754));
236 std::string hex ("000bfed790");
237 AddTestCase (new RlcAmStatusPduTestCase (ackSn, nackSnList, hex), TestCase::QUICK);
238 }
239
240
241 {
242 SequenceNumber10 ackSn (2);
243 std::list<SequenceNumber10> nackSnList;
244 nackSnList.push_back (SequenceNumber10 (1021));
245 nackSnList.push_back (SequenceNumber10 (754));
246 nackSnList.push_back (SequenceNumber10 (947));
247 std::string hex ("000bfed795d980");
248 AddTestCase (new RlcAmStatusPduTestCase (ackSn, nackSnList, hex), TestCase::QUICK);
249 }
250
251
252 {
253 SequenceNumber10 ackSn (2);
254 std::list<SequenceNumber10> nackSnList;
255 nackSnList.push_back (SequenceNumber10 (1021));
256 nackSnList.push_back (SequenceNumber10 (754));
257 nackSnList.push_back (SequenceNumber10 (947));
258 nackSnList.push_back (SequenceNumber10 (347));
259 std::string hex ("000bfed795d9cad8");
260 AddTestCase (new RlcAmStatusPduTestCase (ackSn, nackSnList, hex), TestCase::QUICK);
261 }
262
263}
264
265
266} // namespace ns3
The packet header for the AM Radio Link Control (RLC) protocol packets.
SequenceNumber10 GetAckSn() const
Get ack sn function.
void PushNack(int nack)
Add one more NACK to the CONTROL PDU.
int PopNack(void)
Retrieve one NACK from the CONTROL PDU.
void SetAckSn(SequenceNumber10 ackSn)
Set ack sn function.
void SetControlPdu(uint8_t controlPduType)
Set control PDU function.
Lte Rlc Header Test Suite.
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
Definition: packet.cc:280
void AddHeader(const Header &header)
Add header to this packet.
Definition: packet.cc:256
uint32_t CopyData(uint8_t *buffer, uint32_t size) const
Copy the packet contents to a byte buffer.
Definition: packet.cc:378
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Definition: packet.h:856
Rlc Am Status Pdu Test Case.
std::list< SequenceNumber10 > m_nackSnList
list of nack sequence numbers
RlcAmStatusPduTestCase(SequenceNumber10 ackSn, std::list< SequenceNumber10 > nackSnList, std::string hex)
Constructor.
SequenceNumber10 m_ackSn
ack sequence number
virtual void DoRun(void)
Implementation to actually run this TestCase.
SequenceNumber10 class.
encapsulates test code
Definition: test.h:994
@ QUICK
Fast test.
Definition: test.h:999
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
static std::string sprintPacketContentsBin(Ptr< Packet > pkt)
Function to convert packet contents in binary format.
static std::string sprintPacketContentsHex(Ptr< Packet > pkt)
Function to convert packet contents in hex format.
static void LogPacketInfo(T source, std::string s)
Log packet info function.
static void LogPacketContents(Ptr< Packet > pkt)
Function to log packet contents.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:273
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_TEST_ASSERT_MSG_LT(actual, limit, msg)
Test that an actual value is less than a limit and report and abort if not.
Definition: test.h:675
#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
#define NS_TEST_ASSERT_MSG_GT(actual, limit, msg)
Test that an actual value is greater than a limit and report and abort if not.
Definition: test.h:825
ns3::LteRlcHeaderTestSuite staticLteRlcHeaderTestSuiteInstance
the test suite
Every class exported by the ns3 library is enclosed in the ns3 namespace.