From 24522ff8442a5db84800389cef810bb6b8a4cdc1 Mon Sep 17 00:00:00 2001 From: Pavel Boyko Date: Fri, 3 Jul 2009 16:42:51 +0400 Subject: [PATCH] Unit test for rqueue added --- examples/wscript | 325 ++++++++++++++++---------------- samples/wscript | 103 +++++----- src/routing/aodv/aodv-rqueue.cc | 87 ++++++++- src/routing/aodv/aodv-rqueue.h | 16 +- 4 files changed, 311 insertions(+), 220 deletions(-) diff --git a/examples/wscript b/examples/wscript index 906355a4f..ff9b1b958 100644 --- a/examples/wscript +++ b/examples/wscript @@ -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' diff --git a/samples/wscript b/samples/wscript index c7f9e9a81..d026c1382 100644 --- a/samples/wscript +++ b/samples/wscript @@ -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' diff --git a/src/routing/aodv/aodv-rqueue.cc b/src/routing/aodv/aodv-rqueue.cc index 660de27c8..1bb1b7131 100644 --- a/src/routing/aodv/aodv-rqueue.cc +++ b/src/routing/aodv/aodv-rqueue.cc @@ -24,17 +24,25 @@ #include "aodv-rqueue.h" #include "ns3/simulator.h" +#include "ns3/test.h" #include 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 = Create(); + 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 = Create(); + 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 }} diff --git a/src/routing/aodv/aodv-rqueue.h b/src/routing/aodv/aodv-rqueue.h index 27faa2779..5fce86047 100644 --- a/src/routing/aodv/aodv-rqueue.h +++ b/src/routing/aodv/aodv-rqueue.h @@ -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 p; Ipv4Header header; Time enExpire; + + QueueEntry(Ptr 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 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);