Bug 1108 - test.py -e option needs repair
authorMitch Watrous <watrous@u.washington.edu>
Tue, 26 Apr 2011 12:53:50 -0700
changeset 7087 18ae03e01c6f
parent 7086 d5eb93047270
child 7088 3f0535480de9
Bug 1108 - test.py -e option needs repair
doc/testing/source/testing-framework.rst
src/mpi/bindings/callbacks_list.py
src/mpi/bindings/modulegen__gcc_ILP32.py
src/mpi/bindings/modulegen__gcc_LP64.py
src/point-to-point/bindings/modulegen__gcc_ILP32.py
src/point-to-point/bindings/modulegen__gcc_LP64.py
test.py
--- a/doc/testing/source/testing-framework.rst	Tue Apr 26 15:38:09 2011 -0400
+++ b/doc/testing/source/testing-framework.rst	Tue Apr 26 12:53:50 2011 -0700
@@ -109,25 +109,31 @@
   
   Options:
     -h, --help            show this help message and exit
+    -b BUILDPATH, --buildpath=BUILDPATH
+                          specify the path where ns-3 was built (defaults to the
+                          build directory for the current variant)
     -c KIND, --constrain=KIND
                           constrain the test-runner by kind of test
     -e EXAMPLE, --example=EXAMPLE
-                          specify a single example to run
+                          specify a single example to run (with relative path)
     -g, --grind           run the test suites and examples using valgrind
     -k, --kinds           print the kinds of tests available
     -l, --list            print the list of known tests
     -m, --multiple        report multiple failures from test suites and test
                           cases
     -n, --nowaf           do not run waf before starting testing
+    -p PYEXAMPLE, --pyexample=PYEXAMPLE
+                          specify a single python example to run (with relative
+                          path)
+    -r, --retain          retain all temporary files (which are normally
+                          deleted)
     -s TEST-SUITE, --suite=TEST-SUITE
                           specify a single test suite to run
+    -t TEXT-FILE, --text=TEXT-FILE
+                          write detailed test results into TEXT-FILE.txt
     -v, --verbose         print progress and informational messages
     -w HTML-FILE, --web=HTML-FILE, --html=HTML-FILE
                           write detailed test results into HTML-FILE.html
-    -r, --retain          retain all temporary files (which are normally
-                          deleted)
-    -t TEXT-FILE, --text=TEXT-FILE
-                          write detailed test results into TEXT-FILE.txt
     -x XML-FILE, --xml=XML-FILE
                           write detailed test results into XML-FILE.xml
 
@@ -271,18 +277,44 @@
 Any of these listed suites can be selected to be run by itself using the 
 ``--suite`` option as shown above.
 
-Similarly to test suites, one can run a single example program using the ``--example``
-option.
+Similarly to test suites, one can run a single C++ example program
+using the ``--example`` option.  Note that the relative path for the
+example must be included and that the executables built for C++
+examples do not have extensions.  Entering
 
 ::
 
-  ./test.py --example=udp-echo
+  ./test.py --example=examples/udp/udp-echo
 
 results in that single example being run.
 
 ::
 
-  PASS: Example udp-echo
+  PASS: Example examples/udp/udp-echo
+
+You can specify the directory where ns-3 was built using the
+``--buildpath`` option as follows.
+
+::
+
+  ./test.py --buildpath=/home/craigdo/repos/ns-3-allinone-test/ns-3-dev/build/debug --example=examples/wireless/wifi-simple-adhoc
+
+One can run a single Python example program using the ``--pyexample``
+option.  Note that the relative path for the example must be included
+and that Python examples do need their extensions.  Entering
+
+::
+
+  ./test.py --pyexample=examples/tutorial/first.py
+
+results in that single example being run.
+
+::
+
+  PASS: Example examples/tutorial/first.py
+
+Because Python examples are not built, you do not need to specify the
+directory where ns-3 was built to run them.
 
 Normally when example programs are executed, they write a large amount of trace 
 file data.  This is normally saved to the base directory of the distribution 
--- a/src/mpi/bindings/callbacks_list.py	Tue Apr 26 15:38:09 2011 -0400
+++ b/src/mpi/bindings/callbacks_list.py	Tue Apr 26 12:53:50 2011 -0700
@@ -1,2 +1,3 @@
 callback_classes = [
+    ['void', 'ns3::Ptr<ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
 ]
--- a/src/mpi/bindings/modulegen__gcc_ILP32.py	Tue Apr 26 15:38:09 2011 -0400
+++ b/src/mpi/bindings/modulegen__gcc_ILP32.py	Tue Apr 26 12:53:50 2011 -0700
@@ -44,8 +44,6 @@
     module.add_class('LbtsMessage')
     ## mpi-interface.h (module 'mpi'): ns3::MpiInterface [class]
     module.add_class('MpiInterface')
-    ## mpi-net-device.h (module 'mpi'): ns3::MpiNetDevice [class]
-    module.add_class('MpiNetDevice', allow_subclassing=True)
     ## object-base.h (module 'core'): ns3::ObjectBase [class]
     module.add_class('ObjectBase', allow_subclassing=True, import_from_module='ns.core')
     ## object.h (module 'core'): ns3::ObjectDeleter [struct]
@@ -144,6 +142,8 @@
     module.add_class('EmptyAttributeValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## event-impl.h (module 'core'): ns3::EventImpl [class]
     module.add_class('EventImpl', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >'])
+    ## mpi-receiver.h (module 'mpi'): ns3::MpiReceiver [class]
+    module.add_class('MpiReceiver', parent=root_module['ns3::Object'])
     ## nix-vector.h (module 'network'): ns3::NixVector [class]
     module.add_class('NixVector', import_from_module='ns.network', parent=root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
     ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker [class]
@@ -184,7 +184,6 @@
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3LbtsMessage_methods(root_module, root_module['ns3::LbtsMessage'])
     register_Ns3MpiInterface_methods(root_module, root_module['ns3::MpiInterface'])
-    register_Ns3MpiNetDevice_methods(root_module, root_module['ns3::MpiNetDevice'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
     register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
     register_Ns3ObjectFactory_methods(root_module, root_module['ns3::ObjectFactory'])
@@ -230,6 +229,7 @@
     register_Ns3DistributedSimulatorImpl_methods(root_module, root_module['ns3::DistributedSimulatorImpl'])
     register_Ns3EmptyAttributeValue_methods(root_module, root_module['ns3::EmptyAttributeValue'])
     register_Ns3EventImpl_methods(root_module, root_module['ns3::EventImpl'])
+    register_Ns3MpiReceiver_methods(root_module, root_module['ns3::MpiReceiver'])
     register_Ns3NixVector_methods(root_module, root_module['ns3::NixVector'])
     register_Ns3ObjectFactoryChecker_methods(root_module, root_module['ns3::ObjectFactoryChecker'])
     register_Ns3ObjectFactoryValue_methods(root_module, root_module['ns3::ObjectFactoryValue'])
@@ -773,22 +773,6 @@
                    is_static=True)
     return
 
-def register_Ns3MpiNetDevice_methods(root_module, cls):
-    ## mpi-net-device.h (module 'mpi'): ns3::MpiNetDevice::MpiNetDevice() [constructor]
-    cls.add_constructor([])
-    ## mpi-net-device.h (module 'mpi'): ns3::MpiNetDevice::MpiNetDevice(ns3::MpiNetDevice const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::MpiNetDevice const &', 'arg0')])
-    ## mpi-net-device.h (module 'mpi'): void ns3::MpiNetDevice::MpiReceive(ns3::Ptr<ns3::Packet> p) [member function]
-    cls.add_method('MpiReceive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p')])
-    ## mpi-net-device.h (module 'mpi'): void ns3::MpiNetDevice::DoMpiReceive(ns3::Ptr<ns3::Packet> p) [member function]
-    cls.add_method('DoMpiReceive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
-                   is_pure_virtual=True, visibility='protected', is_virtual=True)
-    return
-
 def register_Ns3ObjectBase_methods(root_module, cls):
     ## object-base.h (module 'core'): ns3::ObjectBase::ObjectBase() [constructor]
     cls.add_constructor([])
@@ -2401,6 +2385,26 @@
                    is_pure_virtual=True, visibility='protected', is_virtual=True)
     return
 
+def register_Ns3MpiReceiver_methods(root_module, cls):
+    ## mpi-receiver.h (module 'mpi'): ns3::MpiReceiver::MpiReceiver() [constructor]
+    cls.add_constructor([])
+    ## mpi-receiver.h (module 'mpi'): ns3::MpiReceiver::MpiReceiver(ns3::MpiReceiver const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MpiReceiver const &', 'arg0')])
+    ## mpi-receiver.h (module 'mpi'): static ns3::TypeId ns3::MpiReceiver::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## mpi-receiver.h (module 'mpi'): void ns3::MpiReceiver::Receive(ns3::Ptr<ns3::Packet> p) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'p')])
+    ## mpi-receiver.h (module 'mpi'): void ns3::MpiReceiver::SetReceiveCallback(ns3::Callback<void, ns3::Ptr<ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetReceiveCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    return
+
 def register_Ns3NixVector_methods(root_module, cls):
     cls.add_output_stream_operator()
     ## nix-vector.h (module 'network'): ns3::NixVector::NixVector() [constructor]
--- a/src/mpi/bindings/modulegen__gcc_LP64.py	Tue Apr 26 15:38:09 2011 -0400
+++ b/src/mpi/bindings/modulegen__gcc_LP64.py	Tue Apr 26 12:53:50 2011 -0700
@@ -44,8 +44,6 @@
     module.add_class('LbtsMessage')
     ## mpi-interface.h (module 'mpi'): ns3::MpiInterface [class]
     module.add_class('MpiInterface')
-    ## mpi-net-device.h (module 'mpi'): ns3::MpiNetDevice [class]
-    module.add_class('MpiNetDevice', allow_subclassing=True)
     ## object-base.h (module 'core'): ns3::ObjectBase [class]
     module.add_class('ObjectBase', allow_subclassing=True, import_from_module='ns.core')
     ## object.h (module 'core'): ns3::ObjectDeleter [struct]
@@ -144,6 +142,8 @@
     module.add_class('EmptyAttributeValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## event-impl.h (module 'core'): ns3::EventImpl [class]
     module.add_class('EventImpl', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >'])
+    ## mpi-receiver.h (module 'mpi'): ns3::MpiReceiver [class]
+    module.add_class('MpiReceiver', parent=root_module['ns3::Object'])
     ## nix-vector.h (module 'network'): ns3::NixVector [class]
     module.add_class('NixVector', import_from_module='ns.network', parent=root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
     ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker [class]
@@ -184,7 +184,6 @@
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3LbtsMessage_methods(root_module, root_module['ns3::LbtsMessage'])
     register_Ns3MpiInterface_methods(root_module, root_module['ns3::MpiInterface'])
-    register_Ns3MpiNetDevice_methods(root_module, root_module['ns3::MpiNetDevice'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
     register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
     register_Ns3ObjectFactory_methods(root_module, root_module['ns3::ObjectFactory'])
@@ -230,6 +229,7 @@
     register_Ns3DistributedSimulatorImpl_methods(root_module, root_module['ns3::DistributedSimulatorImpl'])
     register_Ns3EmptyAttributeValue_methods(root_module, root_module['ns3::EmptyAttributeValue'])
     register_Ns3EventImpl_methods(root_module, root_module['ns3::EventImpl'])
+    register_Ns3MpiReceiver_methods(root_module, root_module['ns3::MpiReceiver'])
     register_Ns3NixVector_methods(root_module, root_module['ns3::NixVector'])
     register_Ns3ObjectFactoryChecker_methods(root_module, root_module['ns3::ObjectFactoryChecker'])
     register_Ns3ObjectFactoryValue_methods(root_module, root_module['ns3::ObjectFactoryValue'])
@@ -773,22 +773,6 @@
                    is_static=True)
     return
 
-def register_Ns3MpiNetDevice_methods(root_module, cls):
-    ## mpi-net-device.h (module 'mpi'): ns3::MpiNetDevice::MpiNetDevice() [constructor]
-    cls.add_constructor([])
-    ## mpi-net-device.h (module 'mpi'): ns3::MpiNetDevice::MpiNetDevice(ns3::MpiNetDevice const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::MpiNetDevice const &', 'arg0')])
-    ## mpi-net-device.h (module 'mpi'): void ns3::MpiNetDevice::MpiReceive(ns3::Ptr<ns3::Packet> p) [member function]
-    cls.add_method('MpiReceive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p')])
-    ## mpi-net-device.h (module 'mpi'): void ns3::MpiNetDevice::DoMpiReceive(ns3::Ptr<ns3::Packet> p) [member function]
-    cls.add_method('DoMpiReceive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
-                   is_pure_virtual=True, visibility='protected', is_virtual=True)
-    return
-
 def register_Ns3ObjectBase_methods(root_module, cls):
     ## object-base.h (module 'core'): ns3::ObjectBase::ObjectBase() [constructor]
     cls.add_constructor([])
@@ -2401,6 +2385,26 @@
                    is_pure_virtual=True, visibility='protected', is_virtual=True)
     return
 
+def register_Ns3MpiReceiver_methods(root_module, cls):
+    ## mpi-receiver.h (module 'mpi'): ns3::MpiReceiver::MpiReceiver() [constructor]
+    cls.add_constructor([])
+    ## mpi-receiver.h (module 'mpi'): ns3::MpiReceiver::MpiReceiver(ns3::MpiReceiver const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MpiReceiver const &', 'arg0')])
+    ## mpi-receiver.h (module 'mpi'): static ns3::TypeId ns3::MpiReceiver::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## mpi-receiver.h (module 'mpi'): void ns3::MpiReceiver::Receive(ns3::Ptr<ns3::Packet> p) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'p')])
+    ## mpi-receiver.h (module 'mpi'): void ns3::MpiReceiver::SetReceiveCallback(ns3::Callback<void, ns3::Ptr<ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetReceiveCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    return
+
 def register_Ns3NixVector_methods(root_module, cls):
     cls.add_output_stream_operator()
     ## nix-vector.h (module 'network'): ns3::NixVector::NixVector() [constructor]
--- a/src/point-to-point/bindings/modulegen__gcc_ILP32.py	Tue Apr 26 15:38:09 2011 -0400
+++ b/src/point-to-point/bindings/modulegen__gcc_ILP32.py	Tue Apr 26 12:53:50 2011 -0700
@@ -66,8 +66,6 @@
     module.add_class('Mac48Address', import_from_module='ns.network')
     ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
     root_module['ns3::Mac48Address'].implicitly_converts_to(root_module['ns3::Address'])
-    ## mpi-net-device.h (module 'mpi'): ns3::MpiNetDevice [class]
-    module.add_class('MpiNetDevice', allow_subclassing=True, import_from_module='ns.mpi')
     ## net-device-container.h (module 'network'): ns3::NetDeviceContainer [class]
     module.add_class('NetDeviceContainer', import_from_module='ns.network')
     ## node-container.h (module 'network'): ns3::NodeContainer [class]
@@ -221,7 +219,7 @@
     ## point-to-point-channel.h (module 'point-to-point'): ns3::PointToPointChannel [class]
     module.add_class('PointToPointChannel', parent=root_module['ns3::Channel'])
     ## point-to-point-net-device.h (module 'point-to-point'): ns3::PointToPointNetDevice [class]
-    module.add_class('PointToPointNetDevice', parent=[root_module['ns3::NetDevice'], root_module['ns3::MpiNetDevice']])
+    module.add_class('PointToPointNetDevice', parent=root_module['ns3::NetDevice'])
     ## point-to-point-remote-channel.h (module 'point-to-point'): ns3::PointToPointRemoteChannel [class]
     module.add_class('PointToPointRemoteChannel', parent=root_module['ns3::PointToPointChannel'])
     ## nstime.h (module 'core'): ns3::TimeChecker [class]
@@ -267,7 +265,6 @@
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
-    register_Ns3MpiNetDevice_methods(root_module, root_module['ns3::MpiNetDevice'])
     register_Ns3NetDeviceContainer_methods(root_module, root_module['ns3::NetDeviceContainer'])
     register_Ns3NodeContainer_methods(root_module, root_module['ns3::NodeContainer'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
@@ -1471,22 +1468,6 @@
                    is_static=True)
     return
 
-def register_Ns3MpiNetDevice_methods(root_module, cls):
-    ## mpi-net-device.h (module 'mpi'): ns3::MpiNetDevice::MpiNetDevice() [constructor]
-    cls.add_constructor([])
-    ## mpi-net-device.h (module 'mpi'): ns3::MpiNetDevice::MpiNetDevice(ns3::MpiNetDevice const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::MpiNetDevice const &', 'arg0')])
-    ## mpi-net-device.h (module 'mpi'): void ns3::MpiNetDevice::MpiReceive(ns3::Ptr<ns3::Packet> p) [member function]
-    cls.add_method('MpiReceive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p')])
-    ## mpi-net-device.h (module 'mpi'): void ns3::MpiNetDevice::DoMpiReceive(ns3::Ptr<ns3::Packet> p) [member function]
-    cls.add_method('DoMpiReceive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
-                   is_pure_virtual=True, visibility='protected', is_virtual=True)
-    return
-
 def register_Ns3NetDeviceContainer_methods(root_module, cls):
     ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(ns3::NetDeviceContainer const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::NetDeviceContainer const &', 'arg0')])
@@ -4284,7 +4265,7 @@
     cls.add_method('DoMpiReceive', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'p')], 
-                   visibility='protected', is_virtual=True)
+                   visibility='protected')
     ## point-to-point-net-device.h (module 'point-to-point'): void ns3::PointToPointNetDevice::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
--- a/src/point-to-point/bindings/modulegen__gcc_LP64.py	Tue Apr 26 15:38:09 2011 -0400
+++ b/src/point-to-point/bindings/modulegen__gcc_LP64.py	Tue Apr 26 12:53:50 2011 -0700
@@ -66,8 +66,6 @@
     module.add_class('Mac48Address', import_from_module='ns.network')
     ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
     root_module['ns3::Mac48Address'].implicitly_converts_to(root_module['ns3::Address'])
-    ## mpi-net-device.h (module 'mpi'): ns3::MpiNetDevice [class]
-    module.add_class('MpiNetDevice', allow_subclassing=True, import_from_module='ns.mpi')
     ## net-device-container.h (module 'network'): ns3::NetDeviceContainer [class]
     module.add_class('NetDeviceContainer', import_from_module='ns.network')
     ## node-container.h (module 'network'): ns3::NodeContainer [class]
@@ -221,7 +219,7 @@
     ## point-to-point-channel.h (module 'point-to-point'): ns3::PointToPointChannel [class]
     module.add_class('PointToPointChannel', parent=root_module['ns3::Channel'])
     ## point-to-point-net-device.h (module 'point-to-point'): ns3::PointToPointNetDevice [class]
-    module.add_class('PointToPointNetDevice', parent=[root_module['ns3::NetDevice'], root_module['ns3::MpiNetDevice']])
+    module.add_class('PointToPointNetDevice', parent=root_module['ns3::NetDevice'])
     ## point-to-point-remote-channel.h (module 'point-to-point'): ns3::PointToPointRemoteChannel [class]
     module.add_class('PointToPointRemoteChannel', parent=root_module['ns3::PointToPointChannel'])
     ## nstime.h (module 'core'): ns3::TimeChecker [class]
@@ -267,7 +265,6 @@
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
-    register_Ns3MpiNetDevice_methods(root_module, root_module['ns3::MpiNetDevice'])
     register_Ns3NetDeviceContainer_methods(root_module, root_module['ns3::NetDeviceContainer'])
     register_Ns3NodeContainer_methods(root_module, root_module['ns3::NodeContainer'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
@@ -1471,22 +1468,6 @@
                    is_static=True)
     return
 
-def register_Ns3MpiNetDevice_methods(root_module, cls):
-    ## mpi-net-device.h (module 'mpi'): ns3::MpiNetDevice::MpiNetDevice() [constructor]
-    cls.add_constructor([])
-    ## mpi-net-device.h (module 'mpi'): ns3::MpiNetDevice::MpiNetDevice(ns3::MpiNetDevice const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::MpiNetDevice const &', 'arg0')])
-    ## mpi-net-device.h (module 'mpi'): void ns3::MpiNetDevice::MpiReceive(ns3::Ptr<ns3::Packet> p) [member function]
-    cls.add_method('MpiReceive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p')])
-    ## mpi-net-device.h (module 'mpi'): void ns3::MpiNetDevice::DoMpiReceive(ns3::Ptr<ns3::Packet> p) [member function]
-    cls.add_method('DoMpiReceive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
-                   is_pure_virtual=True, visibility='protected', is_virtual=True)
-    return
-
 def register_Ns3NetDeviceContainer_methods(root_module, cls):
     ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(ns3::NetDeviceContainer const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::NetDeviceContainer const &', 'arg0')])
@@ -4284,7 +4265,7 @@
     cls.add_method('DoMpiReceive', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'p')], 
-                   visibility='protected', is_virtual=True)
+                   visibility='protected')
     ## point-to-point-net-device.h (module 'point-to-point'): void ns3::PointToPointNetDevice::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
--- a/test.py	Tue Apr 26 15:38:09 2011 -0400
+++ b/test.py	Tue Apr 26 12:53:50 2011 -0700
@@ -676,14 +676,17 @@
 #
 VALGRIND_SUPPRESSIONS_FILE = "testpy.supp"
 
-def run_job_synchronously(shell_command, directory, valgrind, is_python):
+def run_job_synchronously(shell_command, directory, valgrind, is_python, build_path=""):
     (base, build) = os.path.split (NS3_BUILDDIR)
     suppressions_path = os.path.join (base, VALGRIND_SUPPRESSIONS_FILE)
 
     if is_python:
         path_cmd = "python " + os.path.join (base, shell_command)
     else:
-        path_cmd = os.path.join (NS3_BUILDDIR, NS3_ACTIVE_VARIANT, shell_command)
+        if len(build_path):
+            path_cmd = os.path.join (build_path, shell_command)
+        else:
+            path_cmd = os.path.join (NS3_BUILDDIR, NS3_ACTIVE_VARIANT, shell_command)
 
     if valgrind:
         cmd = "valgrind --suppressions=%s --leak-check=full --show-reachable=yes --error-exitcode=2 %s" % (suppressions_path, 
@@ -737,6 +740,7 @@
         self.tmp_file_name = ""
         self.returncode = False
         self.elapsed_time = 0
+        self.build_path = ""
 
     #
     # A job is either a standard job or a special job indicating that a worker
@@ -780,6 +784,14 @@
         self.shell_command = shell_command
 
     #
+    # This is the build path where ns-3 was built.  For example,
+    #
+    #  "/home/craigdo/repos/ns-3-allinone-test/ns-3-dev/build/debug"
+    #
+    def set_build_path(self, build_path):
+        self.build_path = build_path
+
+    #
     # This is the dispaly name of the job, typically the test suite or example 
     # name.  For example,
     #
@@ -892,7 +904,7 @@
                     # "examples/mixed-wireless.py"
                     #
                     (job.returncode, standard_out, standard_err, et) = run_job_synchronously(job.shell_command, 
-                        job.cwd, options.valgrind, job.is_pyexample)
+                        job.cwd, options.valgrind, job.is_pyexample, job.build_path)
                 else:
                     #
                     # If we're a test suite, we need to provide a little more info
@@ -1269,6 +1281,7 @@
                         job.set_basedir(os.getcwd())
                         job.set_tempdir(testpy_output_dir)
                         job.set_shell_command(test)
+                        job.set_build_path("")
 
                         if options.valgrind and not eval(do_valgrind_run):
                             job.set_is_skip (True)
@@ -1293,7 +1306,8 @@
         job.set_cwd(testpy_output_dir)
         job.set_basedir(os.getcwd())
         job.set_tempdir(testpy_output_dir)
-        job.set_shell_command("examples/%s" % options.example)
+        job.set_shell_command(options.example)
+        job.set_build_path(options.buildpath)
         
         if options.verbose:
             print "Queue %s" % options.example
@@ -1336,6 +1350,7 @@
                         job.set_basedir(os.getcwd())
                         job.set_tempdir(testpy_output_dir)
                         job.set_shell_command(test)
+                        job.set_build_path("")
 
                         #
                         # Python programs and valgrind do not work and play
@@ -1374,7 +1389,8 @@
         job.set_cwd(testpy_output_dir)
         job.set_basedir(os.getcwd())
         job.set_tempdir(testpy_output_dir)
-        job.set_shell_command("examples/%s" % options.pyexample)
+        job.set_shell_command(options.pyexample)
+        job.set_build_path("")
         
         if options.verbose:
             print "Queue %s" % options.pyexample
@@ -1595,13 +1611,17 @@
 
 def main(argv):
     parser = optparse.OptionParser()
+    parser.add_option("-b", "--buildpath", action="store", type="string", dest="buildpath", default="",
+                      metavar="BUILDPATH",
+                      help="specify the path where ns-3 was built (defaults to the build directory for the current variant)")
+
     parser.add_option("-c", "--constrain", action="store", type="string", dest="constrain", default="",
                       metavar="KIND",
                       help="constrain the test-runner by kind of test")
 
     parser.add_option("-e", "--example", action="store", type="string", dest="example", default="",
                       metavar="EXAMPLE",
-                      help="specify a single example to run")
+                      help="specify a single example to run (with relative path)")
 
     parser.add_option("-g", "--grind", action="store_true", dest="valgrind", default=False,
                       help="run the test suites and examples using valgrind")
@@ -1620,7 +1640,7 @@
 
     parser.add_option("-p", "--pyexample", action="store", type="string", dest="pyexample", default="",
                       metavar="PYEXAMPLE",
-                      help="specify a single python example to run")
+                      help="specify a single python example to run (with relative path)")
 
     parser.add_option("-r", "--retain", action="store_true", dest="retain", default=False,
                       help="retain all temporary files (which are normally deleted)")