Unit test for rqueue added

This commit is contained in:
Pavel Boyko
2009-07-03 16:42:51 +04:00
parent 62d10ad156
commit 24522ff844
4 changed files with 311 additions and 220 deletions

View File

@@ -1,165 +1,166 @@
## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
def build(bld):
obj = bld.create_ns3_program('hello-simulator')
obj.source = 'hello-simulator.cc'
obj = bld.create_ns3_program('first',
['core', 'simulator', 'point-to-point', 'internet-stack'])
obj.source = 'first.cc'
obj = bld.create_ns3_program('second',
['core', 'simulator', 'point-to-point', 'csma', 'internet-stack'])
obj.source = 'second.cc'
obj = bld.create_ns3_program('third',
['core', 'simulator', 'point-to-point', 'csma', 'wifi', 'internet-stack'])
obj.source = 'third.cc'
obj = bld.create_ns3_program('object-names',
['core', 'simulator', 'csma', 'internet-stack'])
obj.source = 'object-names.cc'
obj = bld.create_ns3_program('mixed-wireless',
['core', 'simulator', 'mobility', 'wifi', 'point-to-point', 'internet-stack'])
obj.source = 'mixed-wireless.cc'
obj = bld.create_ns3_program('dynamic-global-routing',
['point-to-point', 'csma', 'internet-stack', 'global-routing'])
obj.source = 'dynamic-global-routing.cc'
obj = bld.create_ns3_program('static-routing-slash32',
['point-to-point', 'internet-stack', 'global-routing'])
obj.source = 'static-routing-slash32.cc'
obj = bld.create_ns3_program('global-routing-slash32',
['point-to-point', 'internet-stack', 'global-routing'])
obj.source = 'global-routing-slash32.cc'
obj = bld.create_ns3_program('simple-global-routing',
['point-to-point', 'internet-stack', 'global-routing'])
obj.source = 'simple-global-routing.cc'
obj = bld.create_ns3_program('virtual-net-device',
['point-to-point', 'internet-stack', 'global-routing', 'virtual-net-device'])
obj.source = 'virtual-net-device.cc'
obj = bld.create_ns3_program('simple-alternate-routing',
['point-to-point', 'internet-stack', 'global-routing'])
obj.source = 'simple-alternate-routing.cc'
obj = bld.create_ns3_program('simple-error-model',
['point-to-point', 'internet-stack'])
obj.source = 'simple-error-model.cc'
obj = bld.create_ns3_program('csma-one-subnet',
['csma', 'internet-stack'])
obj.source = 'csma-one-subnet.cc'
obj = bld.create_ns3_program('csma-bridge',
['bridge', 'csma', 'internet-stack'])
obj.source = 'csma-bridge.cc'
obj = bld.create_ns3_program('csma-bridge-one-hop',
['bridge', 'csma', 'internet-stack'])
obj.source = 'csma-bridge-one-hop.cc'
obj = bld.create_ns3_program('udp-echo',
['csma', 'internet-stack'])
obj.source = 'udp-echo.cc'
obj = bld.create_ns3_program('realtime-udp-echo',
['csma', 'internet-stack'])
obj.source = 'realtime-udp-echo.cc'
obj = bld.create_ns3_program('csma-broadcast',
['csma', 'internet-stack'])
obj.source = 'csma-broadcast.cc'
obj = bld.create_ns3_program('csma-packet-socket',
['csma', 'internet-stack'])
obj.source = 'csma-packet-socket.cc'
obj = bld.create_ns3_program('csma-multicast',
['csma', 'internet-stack'])
obj.source = 'csma-multicast.cc'
obj = bld.create_ns3_program( 'mixed-global-routing',
['point-to-point', 'internet-stack', 'global-routing' , 'csma-cd'])
obj.source = 'mixed-global-routing.cc'
obj = bld.create_ns3_program('simple-point-to-point-olsr',
['point-to-point', 'internet-stack', 'olsr'])
obj.source = 'simple-point-to-point-olsr.cc'
obj = bld.create_ns3_program('tcp-large-transfer',
['point-to-point', 'internet-stack'])
obj.source = 'tcp-large-transfer.cc'
obj = bld.create_ns3_program('tcp-nsc-lfn',
['point-to-point', 'internet-stack'])
obj.source = 'tcp-nsc-lfn.cc'
obj = bld.create_ns3_program('tcp-nsc-zoo',
['csma', 'internet-stack'])
obj.source = 'tcp-nsc-zoo.cc'
obj = bld.create_ns3_program('tcp-star-server',
['point-to-point', 'internet-stack'])
obj.source = 'tcp-star-server.cc'
obj = bld.create_ns3_program('star',
['point-to-point', 'internet-stack'])
obj.source = 'star.cc'
obj = bld.create_ns3_program('csma-star',
['csma', 'internet-stack'])
obj.source = 'csma-star.cc'
obj = bld.create_ns3_program('wifi-adhoc',
['core', 'simulator', 'mobility', 'wifi'])
obj.source = 'wifi-adhoc.cc'
obj = bld.create_ns3_program('wifi-clear-channel-cmu',
['core', 'simulator', 'mobility', 'wifi'])
obj.source = 'wifi-clear-channel-cmu.cc'
obj = bld.create_ns3_program('wifi-ap',
['core', 'simulator', 'mobility', 'wifi'])
obj.source = 'wifi-ap.cc'
bld.add_subdirs('stats')
obj = bld.create_ns3_program('wifi-wired-bridging',
['core', 'simulator', 'mobility', 'wifi',
'csma', 'helper', 'bridge'])
obj.source = 'wifi-wired-bridging.cc'
obj = bld.create_ns3_program('csma-raw-ip-socket',
['csma', 'internet-stack'])
obj.source = 'csma-raw-ip-socket.cc'
obj = bld.create_ns3_program('csma-ping',
['csma', 'internet-stack', 'v4ping'])
obj.source = 'csma-ping.cc'
obj = bld.create_ns3_program('test-ipv6',
['point-to-point', 'internet-stack'])
obj.source = 'test-ipv6.cc'
env = bld.env_of_name('default')
if env['ENABLE_EMU']:
obj = bld.create_ns3_program('emu-udp-echo', ['emu', 'internet-stack'])
obj.source = 'emu-udp-echo.cc'
obj = bld.create_ns3_program('emu-ping', ['emu', 'internet-stack'])
obj.source = 'emu-ping.cc'
if env['ENABLE_TAP']:
obj = bld.create_ns3_program('tap-wifi-dumbbell',
['wifi', 'csma', 'point-to-point', 'tap-bridge', 'internet-stack'])
obj.source = 'tap-wifi-dumbbell.cc'
obj = bld.create_ns3_program('simple-wifi-frame-aggregation',
['core', 'simulator', 'mobility', 'wifi'])
obj.source = 'simple-wifi-frame-aggregation.cc'
print "Don't want to build examples"
# obj = bld.create_ns3_program('hello-simulator')
# obj.source = 'hello-simulator.cc'
#
# obj = bld.create_ns3_program('first',
# ['core', 'simulator', 'point-to-point', 'internet-stack'])
# obj.source = 'first.cc'
#
# obj = bld.create_ns3_program('second',
# ['core', 'simulator', 'point-to-point', 'csma', 'internet-stack'])
# obj.source = 'second.cc'
#
# obj = bld.create_ns3_program('third',
# ['core', 'simulator', 'point-to-point', 'csma', 'wifi', 'internet-stack'])
# obj.source = 'third.cc'
#
# obj = bld.create_ns3_program('object-names',
# ['core', 'simulator', 'csma', 'internet-stack'])
# obj.source = 'object-names.cc'
#
# obj = bld.create_ns3_program('mixed-wireless',
# ['core', 'simulator', 'mobility', 'wifi', 'point-to-point', 'internet-stack'])
# obj.source = 'mixed-wireless.cc'
#
# obj = bld.create_ns3_program('dynamic-global-routing',
# ['point-to-point', 'csma', 'internet-stack', 'global-routing'])
# obj.source = 'dynamic-global-routing.cc'
#
# obj = bld.create_ns3_program('static-routing-slash32',
# ['point-to-point', 'internet-stack', 'global-routing'])
# obj.source = 'static-routing-slash32.cc'
#
# obj = bld.create_ns3_program('global-routing-slash32',
# ['point-to-point', 'internet-stack', 'global-routing'])
# obj.source = 'global-routing-slash32.cc'
#
# obj = bld.create_ns3_program('simple-global-routing',
# ['point-to-point', 'internet-stack', 'global-routing'])
# obj.source = 'simple-global-routing.cc'
#
# obj = bld.create_ns3_program('virtual-net-device',
# ['point-to-point', 'internet-stack', 'global-routing', 'virtual-net-device'])
# obj.source = 'virtual-net-device.cc'
#
# obj = bld.create_ns3_program('simple-alternate-routing',
# ['point-to-point', 'internet-stack', 'global-routing'])
# obj.source = 'simple-alternate-routing.cc'
#
# obj = bld.create_ns3_program('simple-error-model',
# ['point-to-point', 'internet-stack'])
# obj.source = 'simple-error-model.cc'
#
# obj = bld.create_ns3_program('csma-one-subnet',
# ['csma', 'internet-stack'])
# obj.source = 'csma-one-subnet.cc'
#
# obj = bld.create_ns3_program('csma-bridge',
# ['bridge', 'csma', 'internet-stack'])
# obj.source = 'csma-bridge.cc'
#
# obj = bld.create_ns3_program('csma-bridge-one-hop',
# ['bridge', 'csma', 'internet-stack'])
# obj.source = 'csma-bridge-one-hop.cc'
#
# obj = bld.create_ns3_program('udp-echo',
# ['csma', 'internet-stack'])
# obj.source = 'udp-echo.cc'
#
# obj = bld.create_ns3_program('realtime-udp-echo',
# ['csma', 'internet-stack'])
# obj.source = 'realtime-udp-echo.cc'
#
# obj = bld.create_ns3_program('csma-broadcast',
# ['csma', 'internet-stack'])
# obj.source = 'csma-broadcast.cc'
#
# obj = bld.create_ns3_program('csma-packet-socket',
# ['csma', 'internet-stack'])
# obj.source = 'csma-packet-socket.cc'
#
# obj = bld.create_ns3_program('csma-multicast',
# ['csma', 'internet-stack'])
# obj.source = 'csma-multicast.cc'
#
# obj = bld.create_ns3_program( 'mixed-global-routing',
# ['point-to-point', 'internet-stack', 'global-routing' , 'csma-cd'])
# obj.source = 'mixed-global-routing.cc'
#
# obj = bld.create_ns3_program('simple-point-to-point-olsr',
# ['point-to-point', 'internet-stack', 'olsr'])
# obj.source = 'simple-point-to-point-olsr.cc'
#
# obj = bld.create_ns3_program('tcp-large-transfer',
# ['point-to-point', 'internet-stack'])
# obj.source = 'tcp-large-transfer.cc'
#
# obj = bld.create_ns3_program('tcp-nsc-lfn',
# ['point-to-point', 'internet-stack'])
# obj.source = 'tcp-nsc-lfn.cc'
#
# obj = bld.create_ns3_program('tcp-nsc-zoo',
# ['csma', 'internet-stack'])
# obj.source = 'tcp-nsc-zoo.cc'
#
# obj = bld.create_ns3_program('tcp-star-server',
# ['point-to-point', 'internet-stack'])
# obj.source = 'tcp-star-server.cc'
#
# obj = bld.create_ns3_program('star',
# ['point-to-point', 'internet-stack'])
# obj.source = 'star.cc'
#
# obj = bld.create_ns3_program('csma-star',
# ['csma', 'internet-stack'])
# obj.source = 'csma-star.cc'
#
# obj = bld.create_ns3_program('wifi-adhoc',
# ['core', 'simulator', 'mobility', 'wifi'])
# obj.source = 'wifi-adhoc.cc'
#
# obj = bld.create_ns3_program('wifi-clear-channel-cmu',
# ['core', 'simulator', 'mobility', 'wifi'])
# obj.source = 'wifi-clear-channel-cmu.cc'
#
# obj = bld.create_ns3_program('wifi-ap',
# ['core', 'simulator', 'mobility', 'wifi'])
# obj.source = 'wifi-ap.cc'
#
# bld.add_subdirs('stats')
#
# obj = bld.create_ns3_program('wifi-wired-bridging',
# ['core', 'simulator', 'mobility', 'wifi',
# 'csma', 'helper', 'bridge'])
# obj.source = 'wifi-wired-bridging.cc'
#
# obj = bld.create_ns3_program('csma-raw-ip-socket',
# ['csma', 'internet-stack'])
# obj.source = 'csma-raw-ip-socket.cc'
#
# obj = bld.create_ns3_program('csma-ping',
# ['csma', 'internet-stack', 'v4ping'])
# obj.source = 'csma-ping.cc'
#
# obj = bld.create_ns3_program('test-ipv6',
# ['point-to-point', 'internet-stack'])
# obj.source = 'test-ipv6.cc'
#
# env = bld.env_of_name('default')
# if env['ENABLE_EMU']:
# obj = bld.create_ns3_program('emu-udp-echo', ['emu', 'internet-stack'])
# obj.source = 'emu-udp-echo.cc'
#
# obj = bld.create_ns3_program('emu-ping', ['emu', 'internet-stack'])
# obj.source = 'emu-ping.cc'
#
# if env['ENABLE_TAP']:
# obj = bld.create_ns3_program('tap-wifi-dumbbell',
# ['wifi', 'csma', 'point-to-point', 'tap-bridge', 'internet-stack'])
# obj.source = 'tap-wifi-dumbbell.cc'
#
# obj = bld.create_ns3_program('simple-wifi-frame-aggregation',
# ['core', 'simulator', 'mobility', 'wifi'])
# obj.source = 'simple-wifi-frame-aggregation.cc'

View File

@@ -1,56 +1,57 @@
## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
def build(bld):
obj = bld.create_ns3_program('main-attribute-value')
obj.source = 'main-attribute-value.cc'
obj = bld.create_ns3_program('main-callback')
obj.source = 'main-callback.cc'
obj = bld.create_ns3_program('main-simulator')
obj.source = 'main-simulator.cc'
obj = bld.create_ns3_program('main-ptr')
obj.source = 'main-ptr.cc'
obj = bld.create_ns3_program('main-random-variable')
obj.source = 'main-random-variable.cc'
obj = bld.create_ns3_program('main-packet-header', ['common', 'simulator'])
obj.source = 'main-packet-header.cc'
obj = bld.create_ns3_program('main-packet-tag', ['common', 'simulator'])
obj.source = 'main-packet-tag.cc'
obj = bld.create_ns3_program('main-test')
obj.source = 'main-test.cc'
if bld.env['ENABLE_THREADING'] and bld.env["ENABLE_REAL_TIME"]:
obj = bld.create_ns3_program('main-test-sync')
obj.source = 'main-test-sync.cc'
obj = bld.create_ns3_program('main-simple',
['node', 'internet-stack', 'onoff'])
obj.source = 'main-simple.cc'
obj = bld.create_ns3_program('main-grid-topology',
['core', 'simulator', 'mobility', 'internet-stack'])
obj.source = 'main-grid-topology.cc'
obj = bld.create_ns3_program('main-random-topology',
['core', 'simulator', 'mobility'])
obj.source = 'main-random-topology.cc'
obj = bld.create_ns3_program('main-random-walk',
['core', 'simulator', 'mobility'])
obj.source = 'main-random-walk.cc'
obj = bld.create_ns3_program('main-propagation-loss',
['core', 'simulator', 'mobility', 'wifi'])
obj.source = 'main-propagation-loss.cc'
obj = bld.create_ns3_program('main-ns2-mob',
['core', 'simulator', 'mobility', 'wifi'])
obj.source = 'main-ns2-mob.cc'
print "Don't want to build samples"
# obj = bld.create_ns3_program('main-attribute-value')
# obj.source = 'main-attribute-value.cc'
#
# obj = bld.create_ns3_program('main-callback')
# obj.source = 'main-callback.cc'
#
# obj = bld.create_ns3_program('main-simulator')
# obj.source = 'main-simulator.cc'
#
# obj = bld.create_ns3_program('main-ptr')
# obj.source = 'main-ptr.cc'
#
# obj = bld.create_ns3_program('main-random-variable')
# obj.source = 'main-random-variable.cc'
#
# obj = bld.create_ns3_program('main-packet-header', ['common', 'simulator'])
# obj.source = 'main-packet-header.cc'
#
# obj = bld.create_ns3_program('main-packet-tag', ['common', 'simulator'])
# obj.source = 'main-packet-tag.cc'
#
# obj = bld.create_ns3_program('main-test')
# obj.source = 'main-test.cc'
#
# if bld.env['ENABLE_THREADING'] and bld.env["ENABLE_REAL_TIME"]:
# obj = bld.create_ns3_program('main-test-sync')
# obj.source = 'main-test-sync.cc'
#
# obj = bld.create_ns3_program('main-simple',
# ['node', 'internet-stack', 'onoff'])
# obj.source = 'main-simple.cc'
#
# obj = bld.create_ns3_program('main-grid-topology',
# ['core', 'simulator', 'mobility', 'internet-stack'])
# obj.source = 'main-grid-topology.cc'
#
# obj = bld.create_ns3_program('main-random-topology',
# ['core', 'simulator', 'mobility'])
# obj.source = 'main-random-topology.cc'
#
# obj = bld.create_ns3_program('main-random-walk',
# ['core', 'simulator', 'mobility'])
# obj.source = 'main-random-walk.cc'
#
# obj = bld.create_ns3_program('main-propagation-loss',
# ['core', 'simulator', 'mobility', 'wifi'])
# obj.source = 'main-propagation-loss.cc'
#
# obj = bld.create_ns3_program('main-ns2-mob',
# ['core', 'simulator', 'mobility', 'wifi'])
# obj.source = 'main-ns2-mob.cc'

View File

@@ -24,17 +24,25 @@
#include "aodv-rqueue.h"
#include "ns3/simulator.h"
#include "ns3/test.h"
#include <algorithm>
namespace ns3 {
namespace aodv {
aodv_rqueue::aodv_rqueue() : limit_(AODV_RTQ_MAX_LEN), timeout_(AODV_RTQ_TIMEOUT)
aodv_rqueue::aodv_rqueue() : limit_(AODV_RTQ_MAX_LEN), timeout_(Seconds(AODV_RTQ_TIMEOUT))
{
}
uint32_t
aodv_rqueue::size ()
{
purge();
return queue.size();
}
void
aodv_rqueue::enque(QueueEntry entry)
aodv_rqueue::enque(QueueEntry & entry)
{
// Purge any packets that have timed out.
purge();
@@ -78,7 +86,7 @@ QueueEntry
aodv_rqueue::remove_head()
{
QueueEntry entry = queue.front();
queue.erase(queue.begin());
queue.erase(queue.begin());
return entry;
}
@@ -86,7 +94,7 @@ struct IsExpired
{
bool operator() (QueueEntry const & e) const
{
return (e.enExpire > Simulator::Now());
return (e.enExpire < Simulator::Now());
}
};
@@ -105,4 +113,75 @@ aodv_rqueue::drop(QueueEntry)
// TODO do nothing now.
}
#ifdef RUN_SELF_TESTS
/// Unit test for aodv_rqueue
struct AodvRqueueTest : public Test
{
AodvRqueueTest () : Test ("AODV/Rqueue"), result(true) {}
virtual bool RunTests();
void CheckSizeLimit ();
void CheckTimeout ();
aodv_rqueue q;
bool result;
};
/// Test instance
static AodvRqueueTest g_AodvRqueueTest;
bool
AodvRqueueTest::RunTests ()
{
Ptr<Packet> packet = Create<Packet>();
Ipv4Header header;
QueueEntry e1 (packet, header);
q.enque (e1);
QueueEntry e2 = q.deque ();
NS_TEST_ASSERT (e1 == e2);
Ipv4Address dst("1.2.3.4");
header.SetDestination (dst);
e1 = QueueEntry (packet, header);
q.enque (e1);
bool ok = q.deque (dst, e2);
NS_TEST_ASSERT (ok);
NS_TEST_ASSERT (e1 == e2);
NS_TEST_ASSERT (! q.find(dst));
q.enque (e1);
NS_TEST_ASSERT (q.find(dst));
CheckSizeLimit ();
Simulator::Schedule (Seconds(AODV_RTQ_TIMEOUT+1), & AodvRqueueTest::CheckTimeout, this);
Simulator::Run ();
Simulator::Destroy ();
return result;
}
void
AodvRqueueTest::CheckSizeLimit ()
{
Ptr<Packet> packet = Create<Packet>();
Ipv4Header header;
QueueEntry e1 (packet, header);
for (uint32_t i = 0; i < AODV_RTQ_MAX_LEN; ++i)
q.enque (e1);
NS_TEST_ASSERT (q.size() == AODV_RTQ_MAX_LEN);
for (uint32_t i = 0; i < AODV_RTQ_MAX_LEN; ++i)
q.enque (e1);
NS_TEST_ASSERT (q.size() == AODV_RTQ_MAX_LEN);
}
void
AodvRqueueTest::CheckTimeout ()
{
NS_TEST_ASSERT (q.size() == 0);
}
#endif
}}

View File

@@ -33,15 +33,22 @@ namespace ns3 {
namespace aodv {
/// The maximum number of packets that we allow a routing protocol to buffer.
#define AODV_RTQ_MAX_LEN 64
#define AODV_RTQ_MAX_LEN 64
/// The maximum period of time that a routing protocol is allowed to buffer a packet for, seconds.
#define AODV_RTQ_TIMEOUT 30
#define AODV_RTQ_TIMEOUT 30
struct QueueEntry
{
Ptr<Packet> p;
Ipv4Header header;
Time enExpire;
QueueEntry(Ptr<Packet> pa, Ipv4Header const & h, Time exp = Seconds(0)) : p(pa), header(h), enExpire(exp) {}
bool operator==(QueueEntry const & o) const
{
return ((p == o.p)/*&& header == o.header*/ && (enExpire == o.enExpire));
}
};
class aodv_rqueue
@@ -50,18 +57,21 @@ public:
/// default c-tor
aodv_rqueue();
/// Push element in queue.
void enque(QueueEntry entry);
void enque(QueueEntry & entry);
/// Returns a element from the head of the queue.
QueueEntry deque();
/// Return first found (the earliest) entry for given destination
bool deque(Ipv4Address dst, QueueEntry & entry);
/// Finds whether a packet with destination dst exists in the queue
bool find(Ipv4Address dst);
/// Number of entries
uint32_t size();
private:
std::vector<QueueEntry> queue;
/// Remove and return first entry from queue
QueueEntry remove_head();
/// Remove all expired entries
void purge();
/// Find packet with destination address dst, return true on success
bool findPacketWithDst(Ipv4Address dst, QueueEntry & entry);