Move tests from core module to its test library and update CHANGES.html
authorMitch Watrous <watrous@u.washington.edu>
Wed, 06 Apr 2011 15:32:12 -0700
changeset 7003 a0b1500cdaad
parent 7002 74bb8a65407e
child 7004 70288abe65d0
Move tests from core module to its test library and update CHANGES.html
CHANGES.html
src/core/model/command-line.cc
src/core/model/config.cc
src/core/model/global-value.cc
src/core/model/object.cc
src/core/model/random-variable.cc
src/core/test/command-line-test-suite.cc
src/core/test/config-test-suite.cc
src/core/test/global-value-test-suite.cc
src/core/test/object-test-suite.cc
src/core/test/random-variable-test-suite.cc
src/core/wscript
--- a/CHANGES.html	Wed Apr 06 15:26:57 2011 -0400
+++ b/CHANGES.html	Wed Apr 06 15:32:12 2011 -0700
@@ -62,6 +62,11 @@
 </pre>
 </ol>
 </p></li>
+<li><b> Subsets of modules can be enabled using the ns-3 configuration file</b>
+<p>A new configuration file, .ns3rc, has been added to ns-3 that
+specifies the modules that should be enabled during the ns-3 build.
+See the documentation for details.
+</p></li>
 </ul>
 
 <h2>New API:</h2>
--- a/src/core/model/command-line.cc	Wed Apr 06 15:26:57 2011 -0400
+++ b/src/core/model/command-line.cc	Wed Apr 06 15:32:12 2011 -0700
@@ -22,7 +22,6 @@
 #include "config.h"
 #include "global-value.h"
 #include "type-id.h"
-#include "test.h"
 #include "string.h"
 #include <stdlib.h>
 #include <stdarg.h>
@@ -306,202 +305,4 @@
   m_items.push_back (item);
 }
 
-// ===========================================================================
-// A test base class that drives Command Line parsing
-// ===========================================================================
-class CommandLineTestCaseBase : public TestCase
-{
-public:
-  CommandLineTestCaseBase (std::string description);
-  virtual ~CommandLineTestCaseBase () {}
-
-  void Parse (const CommandLine &cmd, int n, ...);
-};
-
-CommandLineTestCaseBase::CommandLineTestCaseBase (std::string description)
-  : TestCase (description)
-{
-}
-
-void
-CommandLineTestCaseBase::Parse (const CommandLine &cmd, int n, ...)
-{
-  char **args = new char* [n+1];
-  args[0] = (char *) "Test";
-  va_list ap;
-  va_start (ap, n);
-  int i = 0;
-  while (i < n)
-    {
-      char *arg = va_arg (ap, char *);
-      args[i+1] = arg;
-      i++;
-    }
-  int argc = n + 1;
-  cmd.Parse (argc, args);
-  delete [] args;
-}
-
-// ===========================================================================
-// Test boolean Command Line processing
-// ===========================================================================
-class CommandLineBooleanTestCase : public CommandLineTestCaseBase
-{
-public:
-  CommandLineBooleanTestCase ();
-  virtual ~CommandLineBooleanTestCase () {}
-
-private:
-  virtual void DoRun (void);
-
-};
-
-CommandLineBooleanTestCase::CommandLineBooleanTestCase ()
-  : CommandLineTestCaseBase ("Check boolean arguments")
-{
-}
-
-void
-CommandLineBooleanTestCase::DoRun (void)
-{
-  CommandLine cmd;
-  bool myBool = true;
-
-  cmd.AddValue ("my-bool", "help", myBool);
-
-  Parse (cmd, 1, "--my-bool=0");
-  NS_TEST_ASSERT_MSG_EQ (myBool, false, "Command parser did not correctly set a boolean value to false");
-
-  Parse (cmd, 1, "--my-bool=1");
-  NS_TEST_ASSERT_MSG_EQ (myBool, true, "Command parser did not correctly set a boolean value to true");
-}
-
-// ===========================================================================
-// Test int Command Line processing
-// ===========================================================================
-class CommandLineIntTestCase : public CommandLineTestCaseBase
-{
-public:
-  CommandLineIntTestCase ();
-  virtual ~CommandLineIntTestCase () {}
-
-private:
-  virtual void DoRun (void);
-
-};
-
-CommandLineIntTestCase::CommandLineIntTestCase ()
-  : CommandLineTestCaseBase ("Check int arguments")
-{
-}
-
-void
-CommandLineIntTestCase::DoRun (void)
-{
-  CommandLine cmd;
-  bool myBool = true;
-  int32_t myInt32 = 10;
-
-  cmd.AddValue ("my-bool", "help", myBool);
-  cmd.AddValue ("my-int32", "help", myInt32);
-
-  Parse (cmd, 2, "--my-bool=0", "--my-int32=-3");
-  NS_TEST_ASSERT_MSG_EQ (myBool, false, "Command parser did not correctly set a boolean value to false");
-  NS_TEST_ASSERT_MSG_EQ (myInt32, -3, "Command parser did not correctly set an integer value to -3");
-
-  Parse (cmd, 2, "--my-bool=1", "--my-int32=+2");
-  NS_TEST_ASSERT_MSG_EQ (myBool, true, "Command parser did not correctly set a boolean value to true");
-  NS_TEST_ASSERT_MSG_EQ (myInt32, +2, "Command parser did not correctly set an integer value to +2");
-}
-
-// ===========================================================================
-// Test unsigned int Command Line processing
-// ===========================================================================
-class CommandLineUnsignedIntTestCase : public CommandLineTestCaseBase
-{
-public:
-  CommandLineUnsignedIntTestCase ();
-  virtual ~CommandLineUnsignedIntTestCase () {}
-
-private:
-  virtual void DoRun (void);
-
-};
-
-CommandLineUnsignedIntTestCase::CommandLineUnsignedIntTestCase ()
-  : CommandLineTestCaseBase ("Check unsigned int arguments")
-{
-}
-
-void
-CommandLineUnsignedIntTestCase::DoRun (void)
-{
-  CommandLine cmd;
-  bool myBool = true;
-  uint32_t myUint32 = 10;
-
-  cmd.AddValue ("my-bool", "help", myBool);
-  cmd.AddValue ("my-uint32", "help", myUint32);
-
-  Parse (cmd, 2, "--my-bool=0", "--my-uint32=9");
-
-  NS_TEST_ASSERT_MSG_EQ (myBool, false, "Command parser did not correctly set a boolean value to true");
-  NS_TEST_ASSERT_MSG_EQ (myUint32, 9, "Command parser did not correctly set an unsigned integer value to 9");
-}
-
-// ===========================================================================
-// Test string Command Line processing
-// ===========================================================================
-class CommandLineStringTestCase : public CommandLineTestCaseBase
-{
-public:
-  CommandLineStringTestCase ();
-  virtual ~CommandLineStringTestCase () {}
-
-private:
-  virtual void DoRun (void);
-
-};
-
-CommandLineStringTestCase::CommandLineStringTestCase ()
-  : CommandLineTestCaseBase ("Check unsigned int arguments")
-{
-}
-
-void
-CommandLineStringTestCase::DoRun (void)
-{
-  CommandLine cmd;
-  uint32_t myUint32 = 10;
-  std::string myStr = "MyStr";
-
-  cmd.AddValue ("my-uint32", "help", myUint32);
-  cmd.AddValue ("my-str", "help", myStr);
-
-  Parse (cmd, 2, "--my-uint32=9", "--my-str=XX");
-
-  NS_TEST_ASSERT_MSG_EQ (myUint32, 9, "Command parser did not correctly set an unsigned integer value to 9");
-  NS_TEST_ASSERT_MSG_EQ (myStr, "XX", "Command parser did not correctly set an string value to \"XX\"");
-}
-
-// ===========================================================================
-// The Test Suite that glues all of the Test Cases together.
-// ===========================================================================
-class CommandLineTestSuite : public TestSuite
-{
-public:
-  CommandLineTestSuite ();
-};
-
-CommandLineTestSuite::CommandLineTestSuite ()
-  : TestSuite ("command-line", BVT)
-{
-  AddTestCase (new CommandLineBooleanTestCase);
-  AddTestCase (new CommandLineIntTestCase);
-  AddTestCase (new CommandLineUnsignedIntTestCase);
-  AddTestCase (new CommandLineStringTestCase);
-}
-
-static CommandLineTestSuite CommandLineTestSuite;
-
 } // namespace ns3
--- a/src/core/model/config.cc	Wed Apr 06 15:26:57 2011 -0400
+++ b/src/core/model/config.cc	Wed Apr 06 15:32:12 2011 -0700
@@ -26,12 +26,6 @@
 #include "pointer.h"
 #include "log.h"
 
-#include "test.h"
-#include "integer.h"
-#include "traced-value.h"
-#include "trace-source-accessor.h"
-#include "callback.h"
-
 #include <sstream>
 
 NS_LOG_COMPONENT_DEFINE ("Config");
@@ -654,582 +648,4 @@
 
 } // namespace Config
 
-// ===========================================================================
-// An object with some attributes that we can play with using config.
-// ===========================================================================
-class ConfigTestObject : public Object
-{
-public:
-  static TypeId GetTypeId (void);
-
-  void AddNodeA (Ptr<ConfigTestObject> a);
-  void AddNodeB (Ptr<ConfigTestObject> b);
-
-  void SetNodeA (Ptr<ConfigTestObject> a);
-  void SetNodeB (Ptr<ConfigTestObject> b);
-
-  int8_t GetA (void) const;
-  int8_t GetB (void) const;
-
-private:
-  std::vector<Ptr<ConfigTestObject> > m_nodesA;
-  std::vector<Ptr<ConfigTestObject> > m_nodesB;
-  Ptr<ConfigTestObject> m_nodeA;
-  Ptr<ConfigTestObject> m_nodeB;
-  int8_t m_a;
-  int8_t m_b;
-  TracedValue<int16_t> m_trace;
-};
-
-TypeId
-ConfigTestObject::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ConfigTestObject")
-    .SetParent<Object> ()
-    .AddAttribute ("NodesA", "",
-		   ObjectVectorValue (),
-		   MakeObjectVectorAccessor (&ConfigTestObject::m_nodesA),
-		   MakeObjectVectorChecker<ConfigTestObject> ())
-    .AddAttribute ("NodesB", "",
-		   ObjectVectorValue (),
-		   MakeObjectVectorAccessor (&ConfigTestObject::m_nodesB),
-		   MakeObjectVectorChecker<ConfigTestObject> ())
-    .AddAttribute ("NodeA", "",
-                   PointerValue (),
-		   MakePointerAccessor (&ConfigTestObject::m_nodeA),
-		   MakePointerChecker<ConfigTestObject> ())
-    .AddAttribute ("NodeB", "",
-                   PointerValue (),
-		   MakePointerAccessor (&ConfigTestObject::m_nodeB),
-		   MakePointerChecker<ConfigTestObject> ())
-    .AddAttribute ("A", "",
-		   IntegerValue (10),
-		   MakeIntegerAccessor (&ConfigTestObject::m_a),
-		   MakeIntegerChecker<int8_t> ())
-    .AddAttribute ("B", "",
-		   IntegerValue (9),
-		   MakeIntegerAccessor (&ConfigTestObject::m_b),
-		   MakeIntegerChecker<int8_t> ())
-    .AddAttribute ("Source", "XX",
-		   IntegerValue (-1),
-		   MakeIntegerAccessor (&ConfigTestObject::m_trace),
-		   MakeIntegerChecker<int16_t> ())
-    .AddTraceSource ("Source", "XX",
-		     MakeTraceSourceAccessor (&ConfigTestObject::m_trace))
-    ;
-  return tid;
-}
-
-void
-ConfigTestObject::SetNodeA (Ptr<ConfigTestObject> a)
-{
-  m_nodeA = a;
-}
-
-void
-ConfigTestObject::SetNodeB (Ptr<ConfigTestObject> b)
-{
-  m_nodeB = b;
-}
-
-void 
-ConfigTestObject::AddNodeA (Ptr<ConfigTestObject> a)
-{
-  m_nodesA.push_back (a);
-}
-
-void 
-ConfigTestObject::AddNodeB (Ptr<ConfigTestObject> b)
-{
-  m_nodesB.push_back (b);
-}
-
-int8_t 
-ConfigTestObject::GetA (void) const
-{
-  return m_a;
-}
-
-int8_t 
-ConfigTestObject::GetB (void) const
-{
-  return m_b;
-}
-
-// ===========================================================================
-// Test for the ability to register and use a root namespace
-// ===========================================================================
-class RootNamespaceConfigTestCase : public TestCase
-{
-public:
-  RootNamespaceConfigTestCase ();
-  virtual ~RootNamespaceConfigTestCase () {}
-
-private:
-  virtual void DoRun (void);
-};
-
-RootNamespaceConfigTestCase::RootNamespaceConfigTestCase ()
-  : TestCase ("Check ability to register a root namespace and use it")
-{
-}
-
-void
-RootNamespaceConfigTestCase::DoRun (void)
-{
-  IntegerValue iv;
-  //
-  // Create an object and register its attributes directly in the root 
-  // namespace.
-  //
-  Ptr<ConfigTestObject> root = CreateObject<ConfigTestObject> ();
-  Config::RegisterRootNamespaceObject (root);
-
-  //
-  // We should find the default values there.
-  //
-  root->GetAttribute ("A", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 10, "Object Attribute \"A\" not initialized as expected");
-
-  //
-  // Now use the config mechanism to set the attribute; and we should find the
-  // new value.
-  //
-  Config::Set ("/A", IntegerValue (1));
-  root->GetAttribute ("A", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 1, "Object Attribute \"A\" not set correctly");
-
-  //
-  // We should find the default values of "B" too.
-  //
-  root->GetAttribute ("B", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 9, "Object Attribute \"B\" not initialized as expected");
-
-  //
-  // Now use the config mechanism to set the attribute; and we should find the
-  // new value.
-  //
-  Config::Set ("/B", IntegerValue (-1));
-  root->GetAttribute ("B", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -1, "Object Attribute \"B\" not set correctly");
-}
-
-// ===========================================================================
-// Test for the ability to add an object under the root namespace.
-// ===========================================================================
-class UnderRootNamespaceConfigTestCase : public TestCase
-{
-public:
-  UnderRootNamespaceConfigTestCase ();
-  virtual ~UnderRootNamespaceConfigTestCase () {}
-
-private:
-  virtual void DoRun (void);
-};
-
-UnderRootNamespaceConfigTestCase::UnderRootNamespaceConfigTestCase ()
-  : TestCase ("Check ability to register an object under the root namespace and use it")
-{
-}
-
-void
-UnderRootNamespaceConfigTestCase::DoRun (void)
-{
-  IntegerValue iv;
-  //
-  // Create an object and register its attributes directly in the root 
-  // namespace.
-  //
-  Ptr<ConfigTestObject> root = CreateObject<ConfigTestObject> ();
-  Config::RegisterRootNamespaceObject (root);
-
-  Ptr<ConfigTestObject> a = CreateObject<ConfigTestObject> ();
-  root->SetNodeA (a);
-
-  //
-  // We should find the default values there.
-  //
-  a->GetAttribute ("A", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 10, "Object Attribute \"A\" not initialized as expected");
-
-  //
-  // Now use the config mechanism to set the attribute; and we should find the
-  // new value.
-  //
-  Config::Set ("/NodeA/A", IntegerValue (1));
-  a->GetAttribute ("A", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 1, "Object Attribute \"A\" not set correctly");
-
-  //
-  // We should find the default values of "B" too.
-  //
-  a->GetAttribute ("B", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 9, "Object Attribute \"B\" not initialized as expected");
-
-  //
-  // Now use the config mechanism to set the attribute; and we should find the
-  // new value.
-  //
-  Config::Set ("/NodeA/B", IntegerValue (-1));
-  a->GetAttribute ("B", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -1, "Object Attribute \"B\" not set correctly");
-
-  //
-  // Try and set through a nonexistent path.  Should do nothing.
-  //
-  Config::Set ("/NodeB/A", IntegerValue (1234));
-  a->GetAttribute ("A", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 1, "Object Attribute \"A\" unexpectedly set via bad path");
-
-  Config::Set ("/NodeB/B", IntegerValue (1234));
-  a->GetAttribute ("B", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -1, "Object Attribute \"B\" unexpectedly set via bad path");
-
-  //
-  // Step down one level of recursion and try again
-  //
-  Ptr<ConfigTestObject> b = CreateObject<ConfigTestObject> ();
-
-  //
-  // We should find the default values there.
-  //
-  b->GetAttribute ("A", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 10, "Object Attribute \"A\" not initialized as expected");
-  b->GetAttribute ("B", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 9, "Object Attribute \"B\" not initialized as expected");
-
-  //
-  // Now tell A that it has a B; and we should be able to set this new object's
-  // Attributes.
-  //
-  a->SetNodeB (b);
-
-  Config::Set ("/NodeA/NodeB/A", IntegerValue (4));
-  Config::Set ("/NodeA/NodeB/B", IntegerValue (-4));
-  b->GetAttribute ("A", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 4, "Object Attribute \"A\" not set as expected");
-  b->GetAttribute ("B", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -4, "Object Attribute \"B\" not set as expected");
-}
-
-// ===========================================================================
-// Test for the ability to deal configure with vectors of objects.
-// ===========================================================================
-class ObjectVectorConfigTestCase : public TestCase
-{
-public:
-  ObjectVectorConfigTestCase ();
-  virtual ~ObjectVectorConfigTestCase () {}
-
-private:
-  virtual void DoRun (void);
-};
-
-ObjectVectorConfigTestCase::ObjectVectorConfigTestCase ()
-  : TestCase ("Check ability to configure vectors of Object using regular expressions")
-{
-}
-
-void
-ObjectVectorConfigTestCase::DoRun (void)
-{
-  IntegerValue iv;
-
-  //
-  // Create a root namespace object
-  //
-  Ptr<ConfigTestObject> root = CreateObject<ConfigTestObject> ();
-  Config::RegisterRootNamespaceObject (root);
-
-  //
-  // Create an object under the root.
-  //
-  Ptr<ConfigTestObject> a = CreateObject<ConfigTestObject> ();
-  root->SetNodeA (a);
-
-  //
-  // Create an object one level down.
-  //
-  Ptr<ConfigTestObject> b = CreateObject<ConfigTestObject> ();
-  a->SetNodeB (b);
-
-  //
-  // Add four objects to the ObjectVector Attribute at the bottom of the 
-  // object hierarchy.  By this point, we believe that the Attributes
-  // will be initialized correctly.
-  //
-  Ptr<ConfigTestObject> obj0 = CreateObject<ConfigTestObject> ();
-  Ptr<ConfigTestObject> obj1 = CreateObject<ConfigTestObject> ();
-  Ptr<ConfigTestObject> obj2 = CreateObject<ConfigTestObject> ();
-  Ptr<ConfigTestObject> obj3 = CreateObject<ConfigTestObject> ();
-  b->AddNodeB (obj0);
-  b->AddNodeB (obj1);
-  b->AddNodeB (obj2);
-  b->AddNodeB (obj3);
-
-  //
-  // Set an Attribute of the zeroth Object in the vector by explicitly writing
-  // the '0' and make sure that only the one thing changed.
-  //
-  Config::Set ("/NodeA/NodeB/NodesB/0/A", IntegerValue (-11));
-  obj0->GetAttribute ("A", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -11, "Object Attribute \"A\" not set as expected");
-
-  obj1->GetAttribute ("A", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 10, "Object Attribute \"A\" unexpectedly set");
-
-  obj2->GetAttribute ("A", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 10, "Object Attribute \"A\" unexpectedly set");
-
-  obj3->GetAttribute ("A", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 10, "Object Attribute \"A\" unexpectedly set");
-
-  //
-  // Start using regular expression-like syntax to set Attributes.  First try
-  // the OR syntax.  Make sure that the two objects changed and nothing else
-  //
-  Config::Set ("/NodeA/NodeB/NodesB/0|1/A", IntegerValue (-12));
-  obj0->GetAttribute ("A", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -12, "Object Attribute \"A\" not set as expected");
-
-  obj1->GetAttribute ("A", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -12, "Object Attribute \"A\" not set as expected");
-
-  obj2->GetAttribute ("A", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 10, "Object Attribute \"A\" unexpectedly set");
-
-  obj3->GetAttribute ("A", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 10, "Object Attribute \"A\" unexpectedly set");
-
-  //
-  // Make sure that extra '|' are allowed at the start and end of the regular expression
-  //
-  Config::Set ("/NodeA/NodeB/NodesB/|0|1|/A", IntegerValue (-13));
-  obj0->GetAttribute ("A", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -13, "Object Attribute \"A\" not set as expected");
-
-  obj1->GetAttribute ("A", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -13, "Object Attribute \"A\" not set as expected");
-
-  obj2->GetAttribute ("A", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 10, "Object Attribute \"A\" unexpectedly set");
-
-  obj3->GetAttribute ("A", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 10, "Object Attribute \"A\" unexpectedly set");
-
-  //
-  // Try the [x-y] syntax
-  //
-  Config::Set ("/NodeA/NodeB/NodesB/[0-2]/A", IntegerValue (-14));
-  obj0->GetAttribute ("A", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -14, "Object Attribute \"A\" not set as expected");
-
-  obj1->GetAttribute ("A", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -14, "Object Attribute \"A\" not set as expected");
-
-  obj2->GetAttribute ("A", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -14, "Object Attribute \"A\" not set as expected");
-
-  obj3->GetAttribute ("A", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 10, "Object Attribute \"A\" unexpectedly set");
-
-  //
-  // Try the [x-y] syntax at the other limit
-  //
-  Config::Set ("/NodeA/NodeB/NodesB/[1-3]/A", IntegerValue (-15));
-  obj0->GetAttribute ("A", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -14, "Object Attribute \"A\" unexpectedly set");
-
-  obj1->GetAttribute ("A", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -15, "Object Attribute \"A\" not set as expected");
-
-  obj2->GetAttribute ("A", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -15, "Object Attribute \"A\" not set as expected");
-
-  obj3->GetAttribute ("A", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -15, "Object Attribute \"A\" not set as expected");
-
-  //
-  // Combine the [x-y] syntax and the OR sntax
-  //
-  Config::Set ("/NodeA/NodeB/NodesB/[0-1]|3/A", IntegerValue (-16));
-  obj0->GetAttribute ("A", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -16, "Object Attribute \"A\" not set as expected");
-
-  obj1->GetAttribute ("A", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -16, "Object Attribute \"A\" not set as expected");
-
-  obj2->GetAttribute ("A", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -15, "Object Attribute \"A\" unexpectedly set");
-
-  obj3->GetAttribute ("A", iv);
-  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -16, "Object Attribute \"A\" not set as expected");
-}
-
-// ===========================================================================
-// Test for the ability to trace configure with vectors of objects.
-// ===========================================================================
-class ObjectVectorTraceConfigTestCase : public TestCase
-{
-public:
-  ObjectVectorTraceConfigTestCase ();
-  virtual ~ObjectVectorTraceConfigTestCase () {}
-
-  void Trace (int16_t oldValue, int16_t newValue) {m_newValue = newValue;}
-  void TraceWithPath (std::string path, int16_t old, int16_t newValue) {m_newValue = newValue; m_path = path;}
-
-private:
-  virtual void DoRun (void);
-
-  int16_t m_newValue;
-  std::string m_path;
-};
-
-ObjectVectorTraceConfigTestCase::ObjectVectorTraceConfigTestCase ()
-  : TestCase ("Check ability to trace connect through vectors of Object using regular expressions")
-{
-}
-
-void
-ObjectVectorTraceConfigTestCase::DoRun (void)
-{
-  IntegerValue iv;
-
-  //
-  // Create a root namespace object
-  //
-  Ptr<ConfigTestObject> root = CreateObject<ConfigTestObject> ();
-  Config::RegisterRootNamespaceObject (root);
-
-  //
-  // Create an object under the root.
-  //
-  Ptr<ConfigTestObject> a = CreateObject<ConfigTestObject> ();
-  root->SetNodeA (a);
-
-  //
-  // Create an object one level down.
-  //
-  Ptr<ConfigTestObject> b = CreateObject<ConfigTestObject> ();
-  a->SetNodeB (b);
-
-  //
-  // Add four objects to the ObjectVector Attribute at the bottom of the 
-  // object hierarchy.  By this point, we believe that the Attributes
-  // will be initialized correctly.
-  //
-  Ptr<ConfigTestObject> obj0 = CreateObject<ConfigTestObject> ();
-  Ptr<ConfigTestObject> obj1 = CreateObject<ConfigTestObject> ();
-  Ptr<ConfigTestObject> obj2 = CreateObject<ConfigTestObject> ();
-  Ptr<ConfigTestObject> obj3 = CreateObject<ConfigTestObject> ();
-  b->AddNodeB (obj0);
-  b->AddNodeB (obj1);
-  b->AddNodeB (obj2);
-  b->AddNodeB (obj3);
-
-  //
-  // Do a trace connect to some of the sources.  We already checked parsing of
-  // the regular expressions, so we'll concentrate on the tracing part of the 
-  // puzzle here.
-  //
-  Config::ConnectWithoutContext ("/NodeA/NodeB/NodesB/[0-1]|3/Source", 
-                                 MakeCallback (&ObjectVectorTraceConfigTestCase::Trace, this));
-
-  // 
-  // If we bug the trace source referred to by index '0' above, we should see 
-  // the trace fire.
-  //
-  m_newValue = 0;
-  obj0->SetAttribute ("Source", IntegerValue (-1));
-  NS_TEST_ASSERT_MSG_EQ (m_newValue, -1, "Trace 0 did not fire as expected");
-
-  // 
-  // If we bug the trace source referred to by index '1' above, we should see 
-  // the trace fire.
-  //
-  m_newValue = 0;
-  obj1->SetAttribute ("Source", IntegerValue (-2));
-  NS_TEST_ASSERT_MSG_EQ (m_newValue, -2, "Trace 1 did not fire as expected");
-
-  // 
-  // If we bug the trace source referred to by index '2' which is skipped above,
-  // we should not see the trace fire.
-  //
-  m_newValue = 0;
-  obj2->SetAttribute ("Source", IntegerValue (-3));
-  NS_TEST_ASSERT_MSG_EQ (m_newValue, 0, "Trace 2 fired unexpectedly");
-
-  // 
-  // If we bug the trace source referred to by index '3' above, we should see 
-  // the trace fire.
-  //
-  m_newValue = 0;
-  obj3->SetAttribute ("Source", IntegerValue (-4));
-  NS_TEST_ASSERT_MSG_EQ (m_newValue, -4, "Trace 3 did not fire as expected");
-
-  //
-  // Do a trace connect (with context) to some of the sources.
-  //
-  Config::Connect ("/NodeA/NodeB/NodesB/[0-1]|3/Source", 
-                   MakeCallback (&ObjectVectorTraceConfigTestCase::TraceWithPath, this));
-
-  // 
-  // If we bug the trace source referred to by index '0' above, we should see 
-  // the trace fire with the expected context path.
-  //
-  m_newValue = 0;
-  m_path = "";
-  obj0->SetAttribute ("Source", IntegerValue (-1));
-  NS_TEST_ASSERT_MSG_EQ (m_newValue, -1, "Trace 0 did not fire as expected");
-  NS_TEST_ASSERT_MSG_EQ (m_path, "/NodeA/NodeB/NodesB/0/Source", "Trace 0 did not provide expected context");
-
-  // 
-  // If we bug the trace source referred to by index '1' above, we should see 
-  // the trace fire with the expected context path.
-  //
-  m_newValue = 0;
-  m_path = "";
-  obj1->SetAttribute ("Source", IntegerValue (-2));
-  NS_TEST_ASSERT_MSG_EQ (m_newValue, -2, "Trace 1 did not fire as expected");
-  NS_TEST_ASSERT_MSG_EQ (m_path, "/NodeA/NodeB/NodesB/1/Source", "Trace 1 did not provide expected context");
-
-  // 
-  // If we bug the trace source referred to by index '2' which is skipped above,
-  // we should not see the trace fire.
-  //
-  m_newValue = 0;
-  m_path = "";
-  obj2->SetAttribute ("Source", IntegerValue (-3));
-  NS_TEST_ASSERT_MSG_EQ (m_newValue, 0, "Trace 2 fired unexpectedly");
-
-  // 
-  // If we bug the trace source referred to by index '3' above, we should see 
-  // the trace fire with the expected context path.
-  //
-  m_newValue = 0;
-  m_path = "";
-  obj3->SetAttribute ("Source", IntegerValue (-4));
-  NS_TEST_ASSERT_MSG_EQ (m_newValue, -4, "Trace 3 did not fire as expected");
-  NS_TEST_ASSERT_MSG_EQ (m_path, "/NodeA/NodeB/NodesB/1/Source", "Trace 1 did not provide expected context");
-}
-
-// ===========================================================================
-// The Test Suite that glues all of the Test Cases together.
-// ===========================================================================
-class ConfigTestSuite : public TestSuite
-{
-public:
-  ConfigTestSuite ();
-};
-
-ConfigTestSuite::ConfigTestSuite ()
-  : TestSuite ("config", BVT)
-{
-  AddTestCase (new RootNamespaceConfigTestCase);
-  AddTestCase (new UnderRootNamespaceConfigTestCase);
-  AddTestCase (new ObjectVectorConfigTestCase);
-}
-
-static ConfigTestSuite configTestSuite;
-
 } // namespace ns3
--- a/src/core/model/global-value.cc	Wed Apr 06 15:26:57 2011 -0400
+++ b/src/core/model/global-value.cc	Wed Apr 06 15:32:12 2011 -0700
@@ -22,7 +22,6 @@
 #include "attribute.h"
 #include "string.h"
 #include "uinteger.h"
-#include "test.h"
 
 #include "ns3/core-config.h"
 #ifdef HAVE_STDLIB_H
@@ -208,72 +207,5 @@
   return &vector;
 }
 
-// ===========================================================================
-// Test for the ability to get at a GlobalValue.
-// ===========================================================================
-class GlobalValueTestCase : public TestCase
-{
-public:
-  GlobalValueTestCase ();
-  virtual ~GlobalValueTestCase () {}
-
-private:
-  virtual void DoRun (void);
-};
-
-GlobalValueTestCase::GlobalValueTestCase ()
-  : TestCase ("Check GlobalValue mechanism")
-{
-}
-
-void
-GlobalValueTestCase::DoRun (void)
-{
-  //
-  // Typically these are static globals but we can make one on the stack to 
-  // keep it hidden from the documentation.
-  //
-  GlobalValue uint = GlobalValue ("TestUint", "help text",
-				  UintegerValue (10),
-				  MakeUintegerChecker<uint32_t> ());
-
-  //
-  // Make sure we can get at the value and that it was initialized correctly.
-  //
-  UintegerValue uv;
-  uint.GetValue (uv);
-  NS_TEST_ASSERT_MSG_EQ (uv.Get (), 10, "GlobalValue \"TestUint\" not initialized as expected");
-
-  //
-  // Remove the global value for a valgrind clean run
-  //
-  GlobalValue::Vector *vector = GlobalValue::GetVector ();
-  for (GlobalValue::Vector::iterator i = vector->begin (); i != vector->end (); ++i)
-    {
-      if ((*i) == &uint)
-	{
-	  vector->erase (i);
-          break;
-        }
-    }
-}
-
-// ===========================================================================
-// The Test Suite that glues all of the Test Cases together.
-// ===========================================================================
-class GlobalValueTestSuite : public TestSuite
-{
-public:
-  GlobalValueTestSuite ();
-};
-
-GlobalValueTestSuite::GlobalValueTestSuite ()
-  : TestSuite ("global-value", BVT)
-{
-  AddTestCase (new GlobalValueTestCase);
-}
-
-static GlobalValueTestSuite globalValueTestSuite;
-
 } // namespace ns3
 
--- a/src/core/model/object.cc	Wed Apr 06 15:26:57 2011 -0400
+++ b/src/core/model/object.cc	Wed Apr 06 15:32:12 2011 -0700
@@ -18,7 +18,6 @@
  * Authors: Gustavo Carneiro <gjcarneiro@gmail.com>,
  *          Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
-#include "test.h"
 #include "object.h"
 #include "object-factory.h"
 #include "assert.h"
@@ -390,407 +389,3 @@
 }
 } // namespace ns3
 
-namespace {
-
-class BaseA : public ns3::Object
-{
-public:
-  static ns3::TypeId GetTypeId (void) {
-    static ns3::TypeId tid = ns3::TypeId ("BaseA")
-      .SetParent (Object::GetTypeId ())
-      .HideFromDocumentation ()
-      .AddConstructor<BaseA> ();
-    return tid;
-  }
-  BaseA ()
-  {}
-  virtual void Dispose (void) {}
-};
-
-class DerivedA : public BaseA
-{
-public:
-  static ns3::TypeId GetTypeId (void) {
-    static ns3::TypeId tid = ns3::TypeId ("DerivedA")
-      .SetParent (BaseA::GetTypeId ())
-      .HideFromDocumentation ()
-      .AddConstructor<DerivedA> ();
-    return tid;
-  }
-  DerivedA ()
-  {}
-  virtual void Dispose (void) {
-    BaseA::Dispose ();
-  }
-};
-
-class BaseB : public ns3::Object
-{
-public:
-  static ns3::TypeId GetTypeId (void) {
-    static ns3::TypeId tid = ns3::TypeId ("BaseB")
-      .SetParent (Object::GetTypeId ())
-      .HideFromDocumentation ()
-      .AddConstructor<BaseB> ();
-    return tid;
-  }
-  BaseB ()
-  {}
-  virtual void Dispose (void) {}
-};
-
-class DerivedB : public BaseB
-{
-public:
-  static ns3::TypeId GetTypeId (void) {
-    static ns3::TypeId tid = ns3::TypeId ("DerivedB")
-      .SetParent (BaseB::GetTypeId ())
-      .HideFromDocumentation ()
-      .AddConstructor<DerivedB> ();
-    return tid;
-  }
-  DerivedB ()
-  {}
-  virtual void Dispose (void) {
-    BaseB::Dispose ();
-  }
-};
-
-NS_OBJECT_ENSURE_REGISTERED (BaseA);
-NS_OBJECT_ENSURE_REGISTERED (DerivedA);
-NS_OBJECT_ENSURE_REGISTERED (BaseB);
-NS_OBJECT_ENSURE_REGISTERED (DerivedB);
-
-} // namespace anonymous
-
-namespace ns3 {
-
-// ===========================================================================
-// Test case to make sure that we can make Objects using CreateObject.
-// ===========================================================================
-class CreateObjectTestCase : public TestCase
-{
-public:
-  CreateObjectTestCase ();
-  virtual ~CreateObjectTestCase ();
-
-private:
-  virtual void DoRun (void);
-};
-
-CreateObjectTestCase::CreateObjectTestCase ()
-  : TestCase ("Check CreateObject<Type> template function")
-{
-}
-
-CreateObjectTestCase::~CreateObjectTestCase ()
-{
-}
-
-void
-CreateObjectTestCase::DoRun (void)
-{
-  Ptr<BaseA> baseA = CreateObject<BaseA> ();
-  NS_TEST_ASSERT_MSG_NE (baseA, 0, "Unable to CreateObject<BaseA>");
-
-  //
-  // Since baseA is a BaseA, we must be able to successfully ask for a BaseA.
-  //
-  NS_TEST_ASSERT_MSG_EQ (baseA->GetObject<BaseA> (), baseA, "GetObject() of same type returns different Ptr");
-
-  //
-  // Since BaseA is a BaseA and not a DerivedA, we must not find a DerivedA if we look.
-  //
-  NS_TEST_ASSERT_MSG_EQ (baseA->GetObject<DerivedA> (), 0, "GetObject() of unrelated type returns nonzero pointer");
-
-  //
-  // Since baseA is not a BaseA, we must not be able to ask for a DerivedA even if we
-  // try an implied cast back to a BaseA.
-  //
-  NS_TEST_ASSERT_MSG_EQ (baseA->GetObject<BaseA> (DerivedA::GetTypeId ()), 0, "GetObject() of unrelated returns nonzero Ptr");
-
-  baseA = CreateObject<DerivedA> ();
-  NS_TEST_ASSERT_MSG_NE (baseA, 0, "Unable to CreateObject<DerivedA> with implicit cast to BaseA");
-
-  //
-  // If we create a DerivedA and cast it to a BaseA, then if we do a GetObject for
-  // that BaseA we should get the same address (same Object).
-  //
-  NS_TEST_ASSERT_MSG_EQ (baseA->GetObject<BaseA> (), baseA, "Unable to GetObject<BaseA> on BaseA");
-
-  //
-  // Since we created a DerivedA and cast it to a BaseA, we should be able to 
-  // get back a DerivedA and it should be the original Ptr.
-  //
-  NS_TEST_ASSERT_MSG_EQ (baseA->GetObject<DerivedA> (), baseA, "GetObject() of the original type returns different Ptr");
-
-  // If we created a DerivedA and cast it to a BaseA, then we GetObject for the 
-  // same DerivedA and cast it back to the same BaseA, we should get the same 
-  // object.
-  //
-  NS_TEST_ASSERT_MSG_EQ (baseA->GetObject<BaseA> (DerivedA::GetTypeId ()), baseA, "GetObject returns different Ptr");
-}
-
-// ===========================================================================
-// Test case to make sure that we can aggregate Objects.
-// ===========================================================================
-class AggregateObjectTestCase : public TestCase
-{
-public:
-  AggregateObjectTestCase ();
-  virtual ~AggregateObjectTestCase ();
-
-private:
-  virtual void DoRun (void);
-};
-
-AggregateObjectTestCase::AggregateObjectTestCase ()
-  : TestCase ("Check Object aggregation functionality")
-{
-}
-
-AggregateObjectTestCase::~AggregateObjectTestCase ()
-{
-}
-
-void
-AggregateObjectTestCase::DoRun (void)
-{
-  Ptr<BaseA> baseA = CreateObject<BaseA> ();
-  NS_TEST_ASSERT_MSG_NE (baseA, 0, "Unable to CreateObject<BaseA>");
-
-  Ptr<BaseB> baseB = CreateObject<BaseB> ();
-  NS_TEST_ASSERT_MSG_NE (baseB, 0, "Unable to CreateObject<BaseB>");
-
-  Ptr<BaseB> baseBCopy = baseB;
-  NS_TEST_ASSERT_MSG_NE (baseBCopy, 0, "Unable to copy BaseB");
-
-  //
-  // Make an aggregation of a BaseA object and a BaseB object.
-  //
-  baseA->AggregateObject (baseB);
-
-  //
-  // We should be able to ask the aggregation (through baseA) for the BaseA part
-  // of the aggregation.
-  //
-  NS_TEST_ASSERT_MSG_NE (baseA->GetObject<BaseA> (), 0, "Cannot GetObject (through baseA) for BaseA Object");
-
-  //
-  // There is no DerivedA in this picture, so we should not be able to GetObject
-  // for that type.
-  //
-  NS_TEST_ASSERT_MSG_EQ (baseA->GetObject<DerivedA> (), 0, "Unexpectedly found a DerivedA through baseA");
-
-  //
-  // We should be able to ask the aggregation (through baseA) for the BaseB part
-  //
-  NS_TEST_ASSERT_MSG_NE (baseA->GetObject<BaseB> (), 0, "Cannot GetObject (through baseA) for BaseB Object");
-
-  //
-  // There is no DerivedB in this picture, so we should not be able to GetObject
-  // for that type.
-  //
-  NS_TEST_ASSERT_MSG_EQ (baseA->GetObject<DerivedB> (), 0, "Unexpectedly found a DerivedB through baseA");
-
-  //
-  // We should be able to ask the aggregation (through baseA) for the BaseB part
-  //
-  NS_TEST_ASSERT_MSG_NE (baseB->GetObject<BaseB> (), 0, "Cannot GetObject (through baseB) for BaseB Object");
-
-  //
-  // There is no DerivedB in this picture, so we should not be able to GetObject
-  // for that type.
-  //
-  NS_TEST_ASSERT_MSG_EQ (baseB->GetObject<DerivedB> (), 0, "Unexpectedly found a DerivedB through baseB");
-
-  //
-  // We should be able to ask the aggregation (through baseB) for the BaseA part
-  // of the aggregation.
-  //
-  NS_TEST_ASSERT_MSG_NE (baseB->GetObject<BaseA> (), 0, "Cannot GetObject (through baseB) for BaseA Object");
-
-  //
-  // There is no DerivedA in this picture, so we should not be able to GetObject
-  // for that type.
-  //
-  NS_TEST_ASSERT_MSG_EQ (baseB->GetObject<DerivedA> (), 0, "Unexpectedly found a DerivedA through baseB");
-
-  //
-  // baseBCopy is a copy of the original Ptr to the Object BaseB.  Even though
-  // we didn't use baseBCopy directly in the aggregations, the object to which
-  // it points was used, therefore, we should be able to use baseBCopy as if
-  // it were baseB and get a BaseA out of the aggregation.
-  //
-  NS_TEST_ASSERT_MSG_NE (baseBCopy->GetObject<BaseA> (), 0, "Cannot GetObject (through baseBCopy) for a BaseA Object");
-
-  //
-  // Now, change the underlying type of the objects to be the derived types.
-  //
-  baseA = CreateObject<DerivedA> ();
-  NS_TEST_ASSERT_MSG_NE (baseA, 0, "Unable to CreateObject<DerivedA> with implicit cast to BaseA");
-
-  baseB = CreateObject<DerivedB> ();
-  NS_TEST_ASSERT_MSG_NE (baseB, 0, "Unable to CreateObject<DerivedB> with implicit cast to BaseB");
-
-  //
-  // Create an aggregation of two objects, both of the derived types; and leave
-  // an unaggregated copy of one lying around.
-  //
-  baseBCopy = baseB;
-  baseA->AggregateObject (baseB);
-
-  //
-  // We should be able to ask the aggregation (through baseA) for the DerivedB part
-  //
-  NS_TEST_ASSERT_MSG_NE (baseA->GetObject<DerivedB> (), 0, "Cannot GetObject (through baseA) for DerivedB Object");
-
-  //
-  // Since the DerivedB is also a BaseB, we should be able to ask the aggregation 
-  // (through baseA) for the BaseB part
-  //
-  NS_TEST_ASSERT_MSG_NE (baseA->GetObject<BaseB> (), 0, "Cannot GetObject (through baseA) for BaseB Object");
-
-  //
-  // We should be able to ask the aggregation (through baseB) for the DerivedA part
-  //
-  NS_TEST_ASSERT_MSG_NE (baseB->GetObject<DerivedA> (), 0, "Cannot GetObject (through baseB) for DerivedA Object");
-
-  //
-  // Since the DerivedA is also a BaseA, we should be able to ask the aggregation 
-  // (through baseB) for the BaseA part
-  //
-  NS_TEST_ASSERT_MSG_NE (baseB->GetObject<BaseA> (), 0, "Cannot GetObject (through baseB) for BaseA Object");
-
-  //
-  // baseBCopy is a copy of the original Ptr to the Object BaseB.  Even though
-  // we didn't use baseBCopy directly in the aggregations, the object to which
-  // it points was used, therefore, we should be able to use baseBCopy as if
-  // it were baseB (same underlying Object) and get a BaseA and a DerivedA out 
-  // of the aggregation through baseBCopy.
-  //
-  NS_TEST_ASSERT_MSG_NE (baseBCopy->GetObject<BaseA> (), 0, "Cannot GetObject (through baseBCopy) for a BaseA Object");
-  NS_TEST_ASSERT_MSG_NE (baseBCopy->GetObject<DerivedA> (), 0, "Cannot GetObject (through baseBCopy) for a BaseA Object");
-
-  //
-  // Since the Ptr<BaseB> is actually a DerivedB, we should be able to ask the 
-  // aggregation (through baseB) for the DerivedB part
-  //
-  NS_TEST_ASSERT_MSG_NE (baseB->GetObject<DerivedB> (), 0, "Cannot GetObject (through baseB) for DerivedB Object");
-
-  //
-  // Since the DerivedB was cast to a BaseB, we should be able to ask the 
-  // aggregation (through baseB) for the BaseB part
-  //
-  NS_TEST_ASSERT_MSG_NE (baseB->GetObject<BaseB> (), 0, "Cannot GetObject (through baseB) for BaseB Object");
-
-  //
-  // Make sure reference counting works in the aggregate.  Create two Objects
-  // and aggregate them, then release one of them.  The aggregation should
-  // keep a reference to both and the Object we released should still be there.
-  //
-  baseA = CreateObject<BaseA> ();
-  NS_TEST_ASSERT_MSG_NE (baseA, 0, "Unable to CreateObject<BaseA>");
-
-  baseB = CreateObject<BaseB> ();
-  NS_TEST_ASSERT_MSG_NE (baseB, 0, "Unable to CreateObject<BaseA>");
-
-  baseA->AggregateObject (baseB);
-  baseA = 0;
-
-  baseA = baseB->GetObject<BaseA> ();
-  NS_TEST_ASSERT_MSG_NE (baseA, 0, "Unable to GetObject on released object");
-}
-
-// ===========================================================================
-// Test case to make sure that an Object factory can create Objects
-// ===========================================================================
-class ObjectFactoryTestCase : public TestCase
-{
-public:
-  ObjectFactoryTestCase ();
-  virtual ~ObjectFactoryTestCase ();
-
-private:
-  virtual void DoRun (void);
-};
-
-ObjectFactoryTestCase::ObjectFactoryTestCase ()
-  : TestCase ("Check ObjectFactory functionality")
-{
-}
-
-ObjectFactoryTestCase::~ObjectFactoryTestCase ()
-{
-}
-
-void
-ObjectFactoryTestCase::DoRun (void)
-{
-  ObjectFactory factory;
-
-  //
-  // Create an Object of type BaseA through an object factory.
-  //
-  factory.SetTypeId (BaseA::GetTypeId ());
-  Ptr<Object> a = factory.Create ();
-  NS_TEST_ASSERT_MSG_NE (a, 0, "Unable to factory.Create() a BaseA");
-
-  //
-  // What we made should be a BaseA, not have anything to do with a DerivedA
-  //
-  NS_TEST_ASSERT_MSG_EQ (a->GetObject<BaseA> (DerivedA::GetTypeId ()), 0, "BaseA is unexpectedly a DerivedA also");
-
-  //
-  // The BaseA we got should not respond to a GetObject for DerivedA
-  //
-  NS_TEST_ASSERT_MSG_EQ (a->GetObject<DerivedA> (), 0, "BaseA unexpectedly responds to GetObject for DerivedA");
-
-  //
-  // Now tell the factory to make DerivedA Objects and create one with an 
-  // implied cast back to a BaseA
-  //
-  factory.SetTypeId (DerivedA::GetTypeId ());
-  a = factory.Create ();
-
-  //
-  // Since the DerivedA has a BaseA part, we should be able to use GetObject to 
-  // dynamically cast back to a BaseA.
-  //
-  NS_TEST_ASSERT_MSG_EQ (a->GetObject<BaseA> (), a, "Unable to use GetObject as dynamic_cast<BaseA>()");
-
-  //
-  // Since a is already a BaseA and is really a DerivedA, we should be able to
-  // GetObject for the DerivedA and cast it back to a BaseA getting the same
-  // value that is there.
-  //
-  NS_TEST_ASSERT_MSG_EQ (a->GetObject<BaseA> (DerivedA::GetTypeId ()), a, "GetObject with implied cast returns different Ptr");
-
-  //
-  // Since a declared a BaseA, even if it is really a DerivedA, we should not
-  // be able to GetOBject for a DerivedA since this would break the type
-  // declaration.
-  //
-  NS_TEST_ASSERT_MSG_NE (a->GetObject<DerivedA> (), 0, "Unexpectedly able to work around C++ type system");
-}
-
-// ===========================================================================
-// The Test Suite that glues the Test Cases together.
-// ===========================================================================
-class ObjectTestSuite : public TestSuite
-{
-public:
-  ObjectTestSuite ();
-};
-
-ObjectTestSuite::ObjectTestSuite ()
-  : TestSuite ("object", BVT)
-{
-  AddTestCase (new CreateObjectTestCase);
-  AddTestCase (new AggregateObjectTestCase);
-  AddTestCase (new ObjectFactoryTestCase);
-}
-
-static ObjectTestSuite objectTestSuite;
-
-} // namespace ns3
--- a/src/core/model/random-variable.cc	Wed Apr 06 15:26:57 2011 -0400
+++ b/src/core/model/random-variable.cc	Wed Apr 06 15:32:12 2011 -0700
@@ -32,7 +32,6 @@
 #include <sstream>
 #include <vector>
 
-#include "test.h"
 #include "assert.h"
 #include "config.h"
 #include "integer.h"
@@ -2046,118 +2045,4 @@
   return is;
 }
 
-class BasicRandomNumberTestCase : public TestCase
-{
-public:
-  BasicRandomNumberTestCase ();
-  virtual ~BasicRandomNumberTestCase ()
-  {
-  }
-
-private:
-  virtual void DoRun (void);
-};
-
-BasicRandomNumberTestCase::BasicRandomNumberTestCase ()
-  : TestCase ("Check basic random number operation")
-{
-}
-
-void
-BasicRandomNumberTestCase::DoRun (void)
-{
-  const double desiredMean = 1.0;
-  const double desiredStdDev = 1.0;
-
-  double tmp = log (1 + (desiredStdDev / desiredMean) * (desiredStdDev / desiredMean));
-  double sigma = sqrt (tmp);
-  double mu = log (desiredMean) - 0.5 * tmp;
-
-  //
-  // Test a custom lognormal instance to see if its moments have any relation
-  // expected reality.
-  //
-  LogNormalVariable lognormal (mu, sigma);
-  vector<double> samples;
-  const int NSAMPLES = 10000;
-  double sum = 0;
-
-  //
-  // Get and store a bunch of samples.  As we go along sum them and then find
-  // the mean value of the samples.
-  //
-  for (int n = NSAMPLES; n; --n)
-    {
-      double value = lognormal.GetValue ();
-      sum += value;
-      samples.push_back (value);
-    }
-  double obtainedMean = sum / NSAMPLES;
-  NS_TEST_EXPECT_MSG_EQ_TOL (obtainedMean, desiredMean, 0.1, "Got unexpected mean value from LogNormalVariable");
-
-  //
-  // Wander back through the saved stamples and find their standard deviation
-  //
-  sum = 0;
-  for (vector<double>::iterator iter = samples.begin (); iter != samples.end (); iter++)
-    {
-      double tmp = (*iter - obtainedMean);
-      sum += tmp * tmp;
-    }
-  double obtainedStdDev = sqrt (sum / (NSAMPLES - 1));
-  NS_TEST_EXPECT_MSG_EQ_TOL (obtainedStdDev, desiredStdDev, 0.1, "Got unexpected standard deviation from LogNormalVariable");
-}
-
-class RandomNumberSerializationTestCase : public TestCase
-{
-public:
-  RandomNumberSerializationTestCase ();
-  virtual ~RandomNumberSerializationTestCase ()
-  {
-  }
-
-private:
-  virtual void DoRun (void);
-};
-
-RandomNumberSerializationTestCase::RandomNumberSerializationTestCase ()
-  : TestCase ("Check basic random number operation")
-{
-}
-
-void
-RandomNumberSerializationTestCase::DoRun (void)
-{
-  RandomVariableValue val;
-  val.DeserializeFromString ("Uniform:0.1:0.2", MakeRandomVariableChecker ());
-  RandomVariable rng = val.Get ();
-  NS_TEST_ASSERT_MSG_EQ (val.SerializeToString (MakeRandomVariableChecker ()), "Uniform:0.1:0.2",
-                         "Deserialize and Serialize \"Uniform:0.1:0.2\" mismatch");
-
-  val.DeserializeFromString ("Normal:0.1:0.2", MakeRandomVariableChecker ());
-  rng = val.Get ();
-  NS_TEST_ASSERT_MSG_EQ (val.SerializeToString (MakeRandomVariableChecker ()), "Normal:0.1:0.2",
-                         "Deserialize and Serialize \"Normal:0.1:0.2\" mismatch");
-
-  val.DeserializeFromString ("Normal:0.1:0.2:0.15", MakeRandomVariableChecker ());
-  rng = val.Get ();
-  NS_TEST_ASSERT_MSG_EQ (val.SerializeToString (MakeRandomVariableChecker ()), "Normal:0.1:0.2:0.15",
-                         "Deserialize and Serialize \"Normal:0.1:0.2:0.15\" mismatch");
-}
-
-class BasicRandomNumberTestSuite : public TestSuite
-{
-public:
-  BasicRandomNumberTestSuite ();
-};
-
-BasicRandomNumberTestSuite::BasicRandomNumberTestSuite ()
-  : TestSuite ("basic-random-number", BVT)
-{
-  AddTestCase (new BasicRandomNumberTestCase);
-  AddTestCase (new RandomNumberSerializationTestCase);
-}
-
-static BasicRandomNumberTestSuite BasicRandomNumberTestSuite;
-
 } // namespace ns3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/core/test/command-line-test-suite.cc	Wed Apr 06 15:32:12 2011 -0700
@@ -0,0 +1,230 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2008 INRIA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ */
+#include "ns3/command-line.h"
+#include "ns3/log.h"
+#include "ns3/config.h"
+#include "ns3/global-value.h"
+#include "ns3/type-id.h"
+#include "ns3/test.h"
+#include "ns3/string.h"
+#include <stdlib.h>
+#include <stdarg.h>
+
+namespace ns3 {
+
+// ===========================================================================
+// A test base class that drives Command Line parsing
+// ===========================================================================
+class CommandLineTestCaseBase : public TestCase
+{
+public:
+  CommandLineTestCaseBase (std::string description);
+  virtual ~CommandLineTestCaseBase () {}
+
+  void Parse (const CommandLine &cmd, int n, ...);
+};
+
+CommandLineTestCaseBase::CommandLineTestCaseBase (std::string description)
+  : TestCase (description)
+{
+}
+
+void
+CommandLineTestCaseBase::Parse (const CommandLine &cmd, int n, ...)
+{
+  char **args = new char* [n+1];
+  args[0] = (char *) "Test";
+  va_list ap;
+  va_start (ap, n);
+  int i = 0;
+  while (i < n)
+    {
+      char *arg = va_arg (ap, char *);
+      args[i+1] = arg;
+      i++;
+    }
+  int argc = n + 1;
+  cmd.Parse (argc, args);
+  delete [] args;
+}
+
+// ===========================================================================
+// Test boolean Command Line processing
+// ===========================================================================
+class CommandLineBooleanTestCase : public CommandLineTestCaseBase
+{
+public:
+  CommandLineBooleanTestCase ();
+  virtual ~CommandLineBooleanTestCase () {}
+
+private:
+  virtual void DoRun (void);
+
+};
+
+CommandLineBooleanTestCase::CommandLineBooleanTestCase ()
+  : CommandLineTestCaseBase ("Check boolean arguments")
+{
+}
+
+void
+CommandLineBooleanTestCase::DoRun (void)
+{
+  CommandLine cmd;
+  bool myBool = true;
+
+  cmd.AddValue ("my-bool", "help", myBool);
+
+  Parse (cmd, 1, "--my-bool=0");
+  NS_TEST_ASSERT_MSG_EQ (myBool, false, "Command parser did not correctly set a boolean value to false");
+
+  Parse (cmd, 1, "--my-bool=1");
+  NS_TEST_ASSERT_MSG_EQ (myBool, true, "Command parser did not correctly set a boolean value to true");
+}
+
+// ===========================================================================
+// Test int Command Line processing
+// ===========================================================================
+class CommandLineIntTestCase : public CommandLineTestCaseBase
+{
+public:
+  CommandLineIntTestCase ();
+  virtual ~CommandLineIntTestCase () {}
+
+private:
+  virtual void DoRun (void);
+
+};
+
+CommandLineIntTestCase::CommandLineIntTestCase ()
+  : CommandLineTestCaseBase ("Check int arguments")
+{
+}
+
+void
+CommandLineIntTestCase::DoRun (void)
+{
+  CommandLine cmd;
+  bool myBool = true;
+  int32_t myInt32 = 10;
+
+  cmd.AddValue ("my-bool", "help", myBool);
+  cmd.AddValue ("my-int32", "help", myInt32);
+
+  Parse (cmd, 2, "--my-bool=0", "--my-int32=-3");
+  NS_TEST_ASSERT_MSG_EQ (myBool, false, "Command parser did not correctly set a boolean value to false");
+  NS_TEST_ASSERT_MSG_EQ (myInt32, -3, "Command parser did not correctly set an integer value to -3");
+
+  Parse (cmd, 2, "--my-bool=1", "--my-int32=+2");
+  NS_TEST_ASSERT_MSG_EQ (myBool, true, "Command parser did not correctly set a boolean value to true");
+  NS_TEST_ASSERT_MSG_EQ (myInt32, +2, "Command parser did not correctly set an integer value to +2");
+}
+
+// ===========================================================================
+// Test unsigned int Command Line processing
+// ===========================================================================
+class CommandLineUnsignedIntTestCase : public CommandLineTestCaseBase
+{
+public:
+  CommandLineUnsignedIntTestCase ();
+  virtual ~CommandLineUnsignedIntTestCase () {}
+
+private:
+  virtual void DoRun (void);
+
+};
+
+CommandLineUnsignedIntTestCase::CommandLineUnsignedIntTestCase ()
+  : CommandLineTestCaseBase ("Check unsigned int arguments")
+{
+}
+
+void
+CommandLineUnsignedIntTestCase::DoRun (void)
+{
+  CommandLine cmd;
+  bool myBool = true;
+  uint32_t myUint32 = 10;
+
+  cmd.AddValue ("my-bool", "help", myBool);
+  cmd.AddValue ("my-uint32", "help", myUint32);
+
+  Parse (cmd, 2, "--my-bool=0", "--my-uint32=9");
+
+  NS_TEST_ASSERT_MSG_EQ (myBool, false, "Command parser did not correctly set a boolean value to true");
+  NS_TEST_ASSERT_MSG_EQ (myUint32, 9, "Command parser did not correctly set an unsigned integer value to 9");
+}
+
+// ===========================================================================
+// Test string Command Line processing
+// ===========================================================================
+class CommandLineStringTestCase : public CommandLineTestCaseBase
+{
+public:
+  CommandLineStringTestCase ();
+  virtual ~CommandLineStringTestCase () {}
+
+private:
+  virtual void DoRun (void);
+
+};
+
+CommandLineStringTestCase::CommandLineStringTestCase ()
+  : CommandLineTestCaseBase ("Check unsigned int arguments")
+{
+}
+
+void
+CommandLineStringTestCase::DoRun (void)
+{
+  CommandLine cmd;
+  uint32_t myUint32 = 10;
+  std::string myStr = "MyStr";
+
+  cmd.AddValue ("my-uint32", "help", myUint32);
+  cmd.AddValue ("my-str", "help", myStr);
+
+  Parse (cmd, 2, "--my-uint32=9", "--my-str=XX");
+
+  NS_TEST_ASSERT_MSG_EQ (myUint32, 9, "Command parser did not correctly set an unsigned integer value to 9");
+  NS_TEST_ASSERT_MSG_EQ (myStr, "XX", "Command parser did not correctly set an string value to \"XX\"");
+}
+
+// ===========================================================================
+// The Test Suite that glues all of the Test Cases together.
+// ===========================================================================
+class CommandLineTestSuite : public TestSuite
+{
+public:
+  CommandLineTestSuite ();
+};
+
+CommandLineTestSuite::CommandLineTestSuite ()
+  : TestSuite ("command-line", BVT)
+{
+  AddTestCase (new CommandLineBooleanTestCase);
+  AddTestCase (new CommandLineIntTestCase);
+  AddTestCase (new CommandLineUnsignedIntTestCase);
+  AddTestCase (new CommandLineStringTestCase);
+}
+
+static CommandLineTestSuite CommandLineTestSuite;
+
+} // namespace ns3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/core/test/config-test-suite.cc	Wed Apr 06 15:32:12 2011 -0700
@@ -0,0 +1,617 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2008 INRIA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ */
+#include "ns3/config.h"
+#include "ns3/test.h"
+#include "ns3/integer.h"
+#include "ns3/traced-value.h"
+#include "ns3/trace-source-accessor.h"
+#include "ns3/callback.h"
+
+#include "ns3/singleton.h"
+#include "ns3/object.h"
+#include "ns3/object-vector.h"
+#include "ns3/names.h"
+#include "ns3/pointer.h"
+#include "ns3/log.h"
+
+
+#include <sstream>
+
+namespace ns3 {
+
+// ===========================================================================
+// An object with some attributes that we can play with using config.
+// ===========================================================================
+class ConfigTestObject : public Object
+{
+public:
+  static TypeId GetTypeId (void);
+
+  void AddNodeA (Ptr<ConfigTestObject> a);
+  void AddNodeB (Ptr<ConfigTestObject> b);
+
+  void SetNodeA (Ptr<ConfigTestObject> a);
+  void SetNodeB (Ptr<ConfigTestObject> b);
+
+  int8_t GetA (void) const;
+  int8_t GetB (void) const;
+
+private:
+  std::vector<Ptr<ConfigTestObject> > m_nodesA;
+  std::vector<Ptr<ConfigTestObject> > m_nodesB;
+  Ptr<ConfigTestObject> m_nodeA;
+  Ptr<ConfigTestObject> m_nodeB;
+  int8_t m_a;
+  int8_t m_b;
+  TracedValue<int16_t> m_trace;
+};
+
+TypeId
+ConfigTestObject::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ConfigTestObject")
+    .SetParent<Object> ()
+    .AddAttribute ("NodesA", "",
+		   ObjectVectorValue (),
+		   MakeObjectVectorAccessor (&ConfigTestObject::m_nodesA),
+		   MakeObjectVectorChecker<ConfigTestObject> ())
+    .AddAttribute ("NodesB", "",
+		   ObjectVectorValue (),
+		   MakeObjectVectorAccessor (&ConfigTestObject::m_nodesB),
+		   MakeObjectVectorChecker<ConfigTestObject> ())
+    .AddAttribute ("NodeA", "",
+                   PointerValue (),
+		   MakePointerAccessor (&ConfigTestObject::m_nodeA),
+		   MakePointerChecker<ConfigTestObject> ())
+    .AddAttribute ("NodeB", "",
+                   PointerValue (),
+		   MakePointerAccessor (&ConfigTestObject::m_nodeB),
+		   MakePointerChecker<ConfigTestObject> ())
+    .AddAttribute ("A", "",
+		   IntegerValue (10),
+		   MakeIntegerAccessor (&ConfigTestObject::m_a),
+		   MakeIntegerChecker<int8_t> ())
+    .AddAttribute ("B", "",
+		   IntegerValue (9),
+		   MakeIntegerAccessor (&ConfigTestObject::m_b),
+		   MakeIntegerChecker<int8_t> ())
+    .AddAttribute ("Source", "XX",
+		   IntegerValue (-1),
+		   MakeIntegerAccessor (&ConfigTestObject::m_trace),
+		   MakeIntegerChecker<int16_t> ())
+    .AddTraceSource ("Source", "XX",
+		     MakeTraceSourceAccessor (&ConfigTestObject::m_trace))
+    ;
+  return tid;
+}
+
+void
+ConfigTestObject::SetNodeA (Ptr<ConfigTestObject> a)
+{
+  m_nodeA = a;
+}
+
+void
+ConfigTestObject::SetNodeB (Ptr<ConfigTestObject> b)
+{
+  m_nodeB = b;
+}
+
+void 
+ConfigTestObject::AddNodeA (Ptr<ConfigTestObject> a)
+{
+  m_nodesA.push_back (a);
+}
+
+void 
+ConfigTestObject::AddNodeB (Ptr<ConfigTestObject> b)
+{
+  m_nodesB.push_back (b);
+}
+
+int8_t 
+ConfigTestObject::GetA (void) const
+{
+  return m_a;
+}
+
+int8_t 
+ConfigTestObject::GetB (void) const
+{
+  return m_b;
+}
+
+// ===========================================================================
+// Test for the ability to register and use a root namespace
+// ===========================================================================
+class RootNamespaceConfigTestCase : public TestCase
+{
+public:
+  RootNamespaceConfigTestCase ();
+  virtual ~RootNamespaceConfigTestCase () {}
+
+private:
+  virtual void DoRun (void);
+};
+
+RootNamespaceConfigTestCase::RootNamespaceConfigTestCase ()
+  : TestCase ("Check ability to register a root namespace and use it")
+{
+}
+
+void
+RootNamespaceConfigTestCase::DoRun (void)
+{
+  IntegerValue iv;
+  //
+  // Create an object and register its attributes directly in the root 
+  // namespace.
+  //
+  Ptr<ConfigTestObject> root = CreateObject<ConfigTestObject> ();
+  Config::RegisterRootNamespaceObject (root);
+
+  //
+  // We should find the default values there.
+  //
+  root->GetAttribute ("A", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 10, "Object Attribute \"A\" not initialized as expected");
+
+  //
+  // Now use the config mechanism to set the attribute; and we should find the
+  // new value.
+  //
+  Config::Set ("/A", IntegerValue (1));
+  root->GetAttribute ("A", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 1, "Object Attribute \"A\" not set correctly");
+
+  //
+  // We should find the default values of "B" too.
+  //
+  root->GetAttribute ("B", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 9, "Object Attribute \"B\" not initialized as expected");
+
+  //
+  // Now use the config mechanism to set the attribute; and we should find the
+  // new value.
+  //
+  Config::Set ("/B", IntegerValue (-1));
+  root->GetAttribute ("B", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -1, "Object Attribute \"B\" not set correctly");
+}
+
+// ===========================================================================
+// Test for the ability to add an object under the root namespace.
+// ===========================================================================
+class UnderRootNamespaceConfigTestCase : public TestCase
+{
+public:
+  UnderRootNamespaceConfigTestCase ();
+  virtual ~UnderRootNamespaceConfigTestCase () {}
+
+private:
+  virtual void DoRun (void);
+};
+
+UnderRootNamespaceConfigTestCase::UnderRootNamespaceConfigTestCase ()
+  : TestCase ("Check ability to register an object under the root namespace and use it")
+{
+}
+
+void
+UnderRootNamespaceConfigTestCase::DoRun (void)
+{
+  IntegerValue iv;
+  //
+  // Create an object and register its attributes directly in the root 
+  // namespace.
+  //
+  Ptr<ConfigTestObject> root = CreateObject<ConfigTestObject> ();
+  Config::RegisterRootNamespaceObject (root);
+
+  Ptr<ConfigTestObject> a = CreateObject<ConfigTestObject> ();
+  root->SetNodeA (a);
+
+  //
+  // We should find the default values there.
+  //
+  a->GetAttribute ("A", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 10, "Object Attribute \"A\" not initialized as expected");
+
+  //
+  // Now use the config mechanism to set the attribute; and we should find the
+  // new value.
+  //
+  Config::Set ("/NodeA/A", IntegerValue (1));
+  a->GetAttribute ("A", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 1, "Object Attribute \"A\" not set correctly");
+
+  //
+  // We should find the default values of "B" too.
+  //
+  a->GetAttribute ("B", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 9, "Object Attribute \"B\" not initialized as expected");
+
+  //
+  // Now use the config mechanism to set the attribute; and we should find the
+  // new value.
+  //
+  Config::Set ("/NodeA/B", IntegerValue (-1));
+  a->GetAttribute ("B", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -1, "Object Attribute \"B\" not set correctly");
+
+  //
+  // Try and set through a nonexistent path.  Should do nothing.
+  //
+  Config::Set ("/NodeB/A", IntegerValue (1234));
+  a->GetAttribute ("A", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 1, "Object Attribute \"A\" unexpectedly set via bad path");
+
+  Config::Set ("/NodeB/B", IntegerValue (1234));
+  a->GetAttribute ("B", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -1, "Object Attribute \"B\" unexpectedly set via bad path");
+
+  //
+  // Step down one level of recursion and try again
+  //
+  Ptr<ConfigTestObject> b = CreateObject<ConfigTestObject> ();
+
+  //
+  // We should find the default values there.
+  //
+  b->GetAttribute ("A", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 10, "Object Attribute \"A\" not initialized as expected");
+  b->GetAttribute ("B", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 9, "Object Attribute \"B\" not initialized as expected");
+
+  //
+  // Now tell A that it has a B; and we should be able to set this new object's
+  // Attributes.
+  //
+  a->SetNodeB (b);
+
+  Config::Set ("/NodeA/NodeB/A", IntegerValue (4));
+  Config::Set ("/NodeA/NodeB/B", IntegerValue (-4));
+  b->GetAttribute ("A", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 4, "Object Attribute \"A\" not set as expected");
+  b->GetAttribute ("B", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -4, "Object Attribute \"B\" not set as expected");
+}
+
+// ===========================================================================
+// Test for the ability to deal configure with vectors of objects.
+// ===========================================================================
+class ObjectVectorConfigTestCase : public TestCase
+{
+public:
+  ObjectVectorConfigTestCase ();
+  virtual ~ObjectVectorConfigTestCase () {}
+
+private:
+  virtual void DoRun (void);
+};
+
+ObjectVectorConfigTestCase::ObjectVectorConfigTestCase ()
+  : TestCase ("Check ability to configure vectors of Object using regular expressions")
+{
+}
+
+void
+ObjectVectorConfigTestCase::DoRun (void)
+{
+  IntegerValue iv;
+
+  //
+  // Create a root namespace object
+  //
+  Ptr<ConfigTestObject> root = CreateObject<ConfigTestObject> ();
+  Config::RegisterRootNamespaceObject (root);
+
+  //
+  // Create an object under the root.
+  //
+  Ptr<ConfigTestObject> a = CreateObject<ConfigTestObject> ();
+  root->SetNodeA (a);
+
+  //
+  // Create an object one level down.
+  //
+  Ptr<ConfigTestObject> b = CreateObject<ConfigTestObject> ();
+  a->SetNodeB (b);
+
+  //
+  // Add four objects to the ObjectVector Attribute at the bottom of the 
+  // object hierarchy.  By this point, we believe that the Attributes
+  // will be initialized correctly.
+  //
+  Ptr<ConfigTestObject> obj0 = CreateObject<ConfigTestObject> ();
+  Ptr<ConfigTestObject> obj1 = CreateObject<ConfigTestObject> ();
+  Ptr<ConfigTestObject> obj2 = CreateObject<ConfigTestObject> ();
+  Ptr<ConfigTestObject> obj3 = CreateObject<ConfigTestObject> ();
+  b->AddNodeB (obj0);
+  b->AddNodeB (obj1);
+  b->AddNodeB (obj2);
+  b->AddNodeB (obj3);
+
+  //
+  // Set an Attribute of the zeroth Object in the vector by explicitly writing
+  // the '0' and make sure that only the one thing changed.
+  //
+  Config::Set ("/NodeA/NodeB/NodesB/0/A", IntegerValue (-11));
+  obj0->GetAttribute ("A", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -11, "Object Attribute \"A\" not set as expected");
+
+  obj1->GetAttribute ("A", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 10, "Object Attribute \"A\" unexpectedly set");
+
+  obj2->GetAttribute ("A", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 10, "Object Attribute \"A\" unexpectedly set");
+
+  obj3->GetAttribute ("A", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 10, "Object Attribute \"A\" unexpectedly set");
+
+  //
+  // Start using regular expression-like syntax to set Attributes.  First try
+  // the OR syntax.  Make sure that the two objects changed and nothing else
+  //
+  Config::Set ("/NodeA/NodeB/NodesB/0|1/A", IntegerValue (-12));
+  obj0->GetAttribute ("A", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -12, "Object Attribute \"A\" not set as expected");
+
+  obj1->GetAttribute ("A", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -12, "Object Attribute \"A\" not set as expected");
+
+  obj2->GetAttribute ("A", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 10, "Object Attribute \"A\" unexpectedly set");
+
+  obj3->GetAttribute ("A", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 10, "Object Attribute \"A\" unexpectedly set");
+
+  //
+  // Make sure that extra '|' are allowed at the start and end of the regular expression
+  //
+  Config::Set ("/NodeA/NodeB/NodesB/|0|1|/A", IntegerValue (-13));
+  obj0->GetAttribute ("A", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -13, "Object Attribute \"A\" not set as expected");
+
+  obj1->GetAttribute ("A", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -13, "Object Attribute \"A\" not set as expected");
+
+  obj2->GetAttribute ("A", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 10, "Object Attribute \"A\" unexpectedly set");
+
+  obj3->GetAttribute ("A", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 10, "Object Attribute \"A\" unexpectedly set");
+
+  //
+  // Try the [x-y] syntax
+  //
+  Config::Set ("/NodeA/NodeB/NodesB/[0-2]/A", IntegerValue (-14));
+  obj0->GetAttribute ("A", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -14, "Object Attribute \"A\" not set as expected");
+
+  obj1->GetAttribute ("A", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -14, "Object Attribute \"A\" not set as expected");
+
+  obj2->GetAttribute ("A", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -14, "Object Attribute \"A\" not set as expected");
+
+  obj3->GetAttribute ("A", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), 10, "Object Attribute \"A\" unexpectedly set");
+
+  //
+  // Try the [x-y] syntax at the other limit
+  //
+  Config::Set ("/NodeA/NodeB/NodesB/[1-3]/A", IntegerValue (-15));
+  obj0->GetAttribute ("A", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -14, "Object Attribute \"A\" unexpectedly set");
+
+  obj1->GetAttribute ("A", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -15, "Object Attribute \"A\" not set as expected");
+
+  obj2->GetAttribute ("A", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -15, "Object Attribute \"A\" not set as expected");
+
+  obj3->GetAttribute ("A", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -15, "Object Attribute \"A\" not set as expected");
+
+  //
+  // Combine the [x-y] syntax and the OR sntax
+  //
+  Config::Set ("/NodeA/NodeB/NodesB/[0-1]|3/A", IntegerValue (-16));
+  obj0->GetAttribute ("A", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -16, "Object Attribute \"A\" not set as expected");
+
+  obj1->GetAttribute ("A", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -16, "Object Attribute \"A\" not set as expected");
+
+  obj2->GetAttribute ("A", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -15, "Object Attribute \"A\" unexpectedly set");
+
+  obj3->GetAttribute ("A", iv);
+  NS_TEST_ASSERT_MSG_EQ (iv.Get (), -16, "Object Attribute \"A\" not set as expected");
+}
+
+// ===========================================================================
+// Test for the ability to trace configure with vectors of objects.
+// ===========================================================================
+class ObjectVectorTraceConfigTestCase : public TestCase
+{
+public:
+  ObjectVectorTraceConfigTestCase ();
+  virtual ~ObjectVectorTraceConfigTestCase () {}
+
+  void Trace (int16_t oldValue, int16_t newValue) {m_newValue = newValue;}
+  void TraceWithPath (std::string path, int16_t old, int16_t newValue) {m_newValue = newValue; m_path = path;}
+
+private:
+  virtual void DoRun (void);
+
+  int16_t m_newValue;
+  std::string m_path;
+};
+
+ObjectVectorTraceConfigTestCase::ObjectVectorTraceConfigTestCase ()
+  : TestCase ("Check ability to trace connect through vectors of Object using regular expressions")
+{
+}
+
+void
+ObjectVectorTraceConfigTestCase::DoRun (void)
+{
+  IntegerValue iv;
+
+  //
+  // Create a root namespace object
+  //
+  Ptr<ConfigTestObject> root = CreateObject<ConfigTestObject> ();
+  Config::RegisterRootNamespaceObject (root);
+
+  //
+  // Create an object under the root.
+  //
+  Ptr<ConfigTestObject> a = CreateObject<ConfigTestObject> ();
+  root->SetNodeA (a);
+
+  //
+  // Create an object one level down.
+  //
+  Ptr<ConfigTestObject> b = CreateObject<ConfigTestObject> ();
+  a->SetNodeB (b);
+
+  //
+  // Add four objects to the ObjectVector Attribute at the bottom of the 
+  // object hierarchy.  By this point, we believe that the Attributes
+  // will be initialized correctly.
+  //
+  Ptr<ConfigTestObject> obj0 = CreateObject<ConfigTestObject> ();
+  Ptr<ConfigTestObject> obj1 = CreateObject<ConfigTestObject> ();
+  Ptr<ConfigTestObject> obj2 = CreateObject<ConfigTestObject> ();
+  Ptr<ConfigTestObject> obj3 = CreateObject<ConfigTestObject> ();
+  b->AddNodeB (obj0);
+  b->AddNodeB (obj1);
+  b->AddNodeB (obj2);
+  b->AddNodeB (obj3);
+
+  //
+  // Do a trace connect to some of the sources.  We already checked parsing of
+  // the regular expressions, so we'll concentrate on the tracing part of the 
+  // puzzle here.
+  //
+  Config::ConnectWithoutContext ("/NodeA/NodeB/NodesB/[0-1]|3/Source", 
+                                 MakeCallback (&ObjectVectorTraceConfigTestCase::Trace, this));
+
+  // 
+  // If we bug the trace source referred to by index '0' above, we should see 
+  // the trace fire.
+  //
+  m_newValue = 0;
+  obj0->SetAttribute ("Source", IntegerValue (-1));
+  NS_TEST_ASSERT_MSG_EQ (m_newValue, -1, "Trace 0 did not fire as expected");
+
+  // 
+  // If we bug the trace source referred to by index '1' above, we should see 
+  // the trace fire.
+  //
+  m_newValue = 0;
+  obj1->SetAttribute ("Source", IntegerValue (-2));
+  NS_TEST_ASSERT_MSG_EQ (m_newValue, -2, "Trace 1 did not fire as expected");
+
+  // 
+  // If we bug the trace source referred to by index '2' which is skipped above,
+  // we should not see the trace fire.
+  //
+  m_newValue = 0;
+  obj2->SetAttribute ("Source", IntegerValue (-3));
+  NS_TEST_ASSERT_MSG_EQ (m_newValue, 0, "Trace 2 fired unexpectedly");
+
+  // 
+  // If we bug the trace source referred to by index '3' above, we should see 
+  // the trace fire.
+  //
+  m_newValue = 0;
+  obj3->SetAttribute ("Source", IntegerValue (-4));
+  NS_TEST_ASSERT_MSG_EQ (m_newValue, -4, "Trace 3 did not fire as expected");
+
+  //
+  // Do a trace connect (with context) to some of the sources.
+  //
+  Config::Connect ("/NodeA/NodeB/NodesB/[0-1]|3/Source", 
+                   MakeCallback (&ObjectVectorTraceConfigTestCase::TraceWithPath, this));
+
+  // 
+  // If we bug the trace source referred to by index '0' above, we should see 
+  // the trace fire with the expected context path.
+  //
+  m_newValue = 0;
+  m_path = "";
+  obj0->SetAttribute ("Source", IntegerValue (-1));
+  NS_TEST_ASSERT_MSG_EQ (m_newValue, -1, "Trace 0 did not fire as expected");
+  NS_TEST_ASSERT_MSG_EQ (m_path, "/NodeA/NodeB/NodesB/0/Source", "Trace 0 did not provide expected context");
+
+  // 
+  // If we bug the trace source referred to by index '1' above, we should see 
+  // the trace fire with the expected context path.
+  //
+  m_newValue = 0;
+  m_path = "";
+  obj1->SetAttribute ("Source", IntegerValue (-2));
+  NS_TEST_ASSERT_MSG_EQ (m_newValue, -2, "Trace 1 did not fire as expected");
+  NS_TEST_ASSERT_MSG_EQ (m_path, "/NodeA/NodeB/NodesB/1/Source", "Trace 1 did not provide expected context");
+
+  // 
+  // If we bug the trace source referred to by index '2' which is skipped above,
+  // we should not see the trace fire.
+  //
+  m_newValue = 0;
+  m_path = "";
+  obj2->SetAttribute ("Source", IntegerValue (-3));
+  NS_TEST_ASSERT_MSG_EQ (m_newValue, 0, "Trace 2 fired unexpectedly");
+
+  // 
+  // If we bug the trace source referred to by index '3' above, we should see 
+  // the trace fire with the expected context path.
+  //
+  m_newValue = 0;
+  m_path = "";
+  obj3->SetAttribute ("Source", IntegerValue (-4));
+  NS_TEST_ASSERT_MSG_EQ (m_newValue, -4, "Trace 3 did not fire as expected");
+  NS_TEST_ASSERT_MSG_EQ (m_path, "/NodeA/NodeB/NodesB/1/Source", "Trace 1 did not provide expected context");
+}
+
+// ===========================================================================
+// The Test Suite that glues all of the Test Cases together.
+// ===========================================================================
+class ConfigTestSuite : public TestSuite
+{
+public:
+  ConfigTestSuite ();
+};
+
+ConfigTestSuite::ConfigTestSuite ()
+  : TestSuite ("config", BVT)
+{
+  AddTestCase (new RootNamespaceConfigTestCase);
+  AddTestCase (new UnderRootNamespaceConfigTestCase);
+  AddTestCase (new ObjectVectorConfigTestCase);
+}
+
+static ConfigTestSuite configTestSuite;
+
+} // namespace ns3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/core/test/global-value-test-suite.cc	Wed Apr 06 15:32:12 2011 -0700
@@ -0,0 +1,94 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2008 INRIA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ */
+#include "ns3/global-value.h"
+#include "ns3/test.h"
+#include "ns3/uinteger.h"
+
+namespace ns3 {
+
+// ===========================================================================
+// Test for the ability to get at a GlobalValue.
+// ===========================================================================
+class GlobalValueTestCase : public TestCase
+{
+public:
+  GlobalValueTestCase ();
+  virtual ~GlobalValueTestCase () {}
+
+private:
+  virtual void DoRun (void);
+};
+
+GlobalValueTestCase::GlobalValueTestCase ()
+  : TestCase ("Check GlobalValue mechanism")
+{
+}
+
+void
+GlobalValueTestCase::DoRun (void)
+{
+  //
+  // Typically these are static globals but we can make one on the stack to 
+  // keep it hidden from the documentation.
+  //
+  GlobalValue uint = GlobalValue ("TestUint", "help text",
+				  UintegerValue (10),
+				  MakeUintegerChecker<uint32_t> ());
+
+  //
+  // Make sure we can get at the value and that it was initialized correctly.
+  //
+  UintegerValue uv;
+  uint.GetValue (uv);
+  NS_TEST_ASSERT_MSG_EQ (uv.Get (), 10, "GlobalValue \"TestUint\" not initialized as expected");
+
+  //
+  // Remove the global value for a valgrind clean run
+  //
+  GlobalValue::Vector *vector = GlobalValue::GetVector ();
+  for (GlobalValue::Vector::iterator i = vector->begin (); i != vector->end (); ++i)
+    {
+      if ((*i) == &uint)
+	{
+	  vector->erase (i);
+          break;
+        }
+    }
+}
+
+// ===========================================================================
+// The Test Suite that glues all of the Test Cases together.
+// ===========================================================================
+class GlobalValueTestSuite : public TestSuite
+{
+public:
+  GlobalValueTestSuite ();
+};
+
+GlobalValueTestSuite::GlobalValueTestSuite ()
+  : TestSuite ("global-value", BVT)
+{
+  AddTestCase (new GlobalValueTestCase);
+}
+
+static GlobalValueTestSuite globalValueTestSuite;
+
+} // namespace ns3
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/core/test/object-test-suite.cc	Wed Apr 06 15:32:12 2011 -0700
@@ -0,0 +1,429 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2007 INRIA, Gustavo Carneiro
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Gustavo Carneiro <gjcarneiro@gmail.com>,
+ *          Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ */
+#include "ns3/test.h"
+#include "ns3/object.h"
+#include "ns3/object-factory.h"
+#include "ns3/assert.h"
+
+namespace {
+
+class BaseA : public ns3::Object
+{
+public:
+  static ns3::TypeId GetTypeId (void) {
+    static ns3::TypeId tid = ns3::TypeId ("BaseA")
+      .SetParent (Object::GetTypeId ())
+      .HideFromDocumentation ()
+      .AddConstructor<BaseA> ();
+    return tid;
+  }
+  BaseA ()
+  {}
+  virtual void Dispose (void) {}
+};
+
+class DerivedA : public BaseA
+{
+public:
+  static ns3::TypeId GetTypeId (void) {
+    static ns3::TypeId tid = ns3::TypeId ("DerivedA")
+      .SetParent (BaseA::GetTypeId ())
+      .HideFromDocumentation ()
+      .AddConstructor<DerivedA> ();
+    return tid;
+  }
+  DerivedA ()
+  {}
+  virtual void Dispose (void) {
+    BaseA::Dispose ();
+  }
+};
+
+class BaseB : public ns3::Object
+{
+public:
+  static ns3::TypeId GetTypeId (void) {
+    static ns3::TypeId tid = ns3::TypeId ("BaseB")
+      .SetParent (Object::GetTypeId ())
+      .HideFromDocumentation ()
+      .AddConstructor<BaseB> ();
+    return tid;
+  }
+  BaseB ()
+  {}
+  virtual void Dispose (void) {}
+};
+
+class DerivedB : public BaseB
+{
+public:
+  static ns3::TypeId GetTypeId (void) {
+    static ns3::TypeId tid = ns3::TypeId ("DerivedB")
+      .SetParent (BaseB::GetTypeId ())
+      .HideFromDocumentation ()
+      .AddConstructor<DerivedB> ();
+    return tid;
+  }
+  DerivedB ()
+  {}
+  virtual void Dispose (void) {
+    BaseB::Dispose ();
+  }
+};
+
+NS_OBJECT_ENSURE_REGISTERED (BaseA);
+NS_OBJECT_ENSURE_REGISTERED (DerivedA);
+NS_OBJECT_ENSURE_REGISTERED (BaseB);
+NS_OBJECT_ENSURE_REGISTERED (DerivedB);
+
+} // namespace anonymous
+
+namespace ns3 {
+
+// ===========================================================================
+// Test case to make sure that we can make Objects using CreateObject.
+// ===========================================================================
+class CreateObjectTestCase : public TestCase
+{
+public:
+  CreateObjectTestCase ();
+  virtual ~CreateObjectTestCase ();
+
+private:
+  virtual void DoRun (void);
+};
+
+CreateObjectTestCase::CreateObjectTestCase ()
+  : TestCase ("Check CreateObject<Type> template function")
+{
+}
+
+CreateObjectTestCase::~CreateObjectTestCase ()
+{
+}
+
+void
+CreateObjectTestCase::DoRun (void)
+{
+  Ptr<BaseA> baseA = CreateObject<BaseA> ();
+  NS_TEST_ASSERT_MSG_NE (baseA, 0, "Unable to CreateObject<BaseA>");
+
+  //
+  // Since baseA is a BaseA, we must be able to successfully ask for a BaseA.
+  //
+  NS_TEST_ASSERT_MSG_EQ (baseA->GetObject<BaseA> (), baseA, "GetObject() of same type returns different Ptr");
+
+  //
+  // Since BaseA is a BaseA and not a DerivedA, we must not find a DerivedA if we look.
+  //
+  NS_TEST_ASSERT_MSG_EQ (baseA->GetObject<DerivedA> (), 0, "GetObject() of unrelated type returns nonzero pointer");
+
+  //
+  // Since baseA is not a BaseA, we must not be able to ask for a DerivedA even if we
+  // try an implied cast back to a BaseA.
+  //
+  NS_TEST_ASSERT_MSG_EQ (baseA->GetObject<BaseA> (DerivedA::GetTypeId ()), 0, "GetObject() of unrelated returns nonzero Ptr");
+
+  baseA = CreateObject<DerivedA> ();
+  NS_TEST_ASSERT_MSG_NE (baseA, 0, "Unable to CreateObject<DerivedA> with implicit cast to BaseA");
+
+  //
+  // If we create a DerivedA and cast it to a BaseA, then if we do a GetObject for
+  // that BaseA we should get the same address (same Object).
+  //
+  NS_TEST_ASSERT_MSG_EQ (baseA->GetObject<BaseA> (), baseA, "Unable to GetObject<BaseA> on BaseA");
+
+  //
+  // Since we created a DerivedA and cast it to a BaseA, we should be able to 
+  // get back a DerivedA and it should be the original Ptr.
+  //
+  NS_TEST_ASSERT_MSG_EQ (baseA->GetObject<DerivedA> (), baseA, "GetObject() of the original type returns different Ptr");
+
+  // If we created a DerivedA and cast it to a BaseA, then we GetObject for the 
+  // same DerivedA and cast it back to the same BaseA, we should get the same 
+  // object.
+  //
+  NS_TEST_ASSERT_MSG_EQ (baseA->GetObject<BaseA> (DerivedA::GetTypeId ()), baseA, "GetObject returns different Ptr");
+}
+
+// ===========================================================================
+// Test case to make sure that we can aggregate Objects.
+// ===========================================================================
+class AggregateObjectTestCase : public TestCase
+{
+public:
+  AggregateObjectTestCase ();
+  virtual ~AggregateObjectTestCase ();
+
+private:
+  virtual void DoRun (void);
+};
+
+AggregateObjectTestCase::AggregateObjectTestCase ()
+  : TestCase ("Check Object aggregation functionality")
+{
+}
+
+AggregateObjectTestCase::~AggregateObjectTestCase ()
+{
+}
+
+void
+AggregateObjectTestCase::DoRun (void)
+{
+  Ptr<BaseA> baseA = CreateObject<BaseA> ();
+  NS_TEST_ASSERT_MSG_NE (baseA, 0, "Unable to CreateObject<BaseA>");
+
+  Ptr<BaseB> baseB = CreateObject<BaseB> ();
+  NS_TEST_ASSERT_MSG_NE (baseB, 0, "Unable to CreateObject<BaseB>");
+
+  Ptr<BaseB> baseBCopy = baseB;
+  NS_TEST_ASSERT_MSG_NE (baseBCopy, 0, "Unable to copy BaseB");
+
+  //
+  // Make an aggregation of a BaseA object and a BaseB object.
+  //
+  baseA->AggregateObject (baseB);
+
+  //
+  // We should be able to ask the aggregation (through baseA) for the BaseA part
+  // of the aggregation.
+  //
+  NS_TEST_ASSERT_MSG_NE (baseA->GetObject<BaseA> (), 0, "Cannot GetObject (through baseA) for BaseA Object");
+
+  //
+  // There is no DerivedA in this picture, so we should not be able to GetObject
+  // for that type.
+  //
+  NS_TEST_ASSERT_MSG_EQ (baseA->GetObject<DerivedA> (), 0, "Unexpectedly found a DerivedA through baseA");
+
+  //
+  // We should be able to ask the aggregation (through baseA) for the BaseB part
+  //
+  NS_TEST_ASSERT_MSG_NE (baseA->GetObject<BaseB> (), 0, "Cannot GetObject (through baseA) for BaseB Object");
+
+  //
+  // There is no DerivedB in this picture, so we should not be able to GetObject
+  // for that type.
+  //
+  NS_TEST_ASSERT_MSG_EQ (baseA->GetObject<DerivedB> (), 0, "Unexpectedly found a DerivedB through baseA");
+
+  //
+  // We should be able to ask the aggregation (through baseA) for the BaseB part
+  //
+  NS_TEST_ASSERT_MSG_NE (baseB->GetObject<BaseB> (), 0, "Cannot GetObject (through baseB) for BaseB Object");
+
+  //
+  // There is no DerivedB in this picture, so we should not be able to GetObject
+  // for that type.
+  //
+  NS_TEST_ASSERT_MSG_EQ (baseB->GetObject<DerivedB> (), 0, "Unexpectedly found a DerivedB through baseB");
+
+  //
+  // We should be able to ask the aggregation (through baseB) for the BaseA part
+  // of the aggregation.
+  //
+  NS_TEST_ASSERT_MSG_NE (baseB->GetObject<BaseA> (), 0, "Cannot GetObject (through baseB) for BaseA Object");
+
+  //
+  // There is no DerivedA in this picture, so we should not be able to GetObject
+  // for that type.
+  //
+  NS_TEST_ASSERT_MSG_EQ (baseB->GetObject<DerivedA> (), 0, "Unexpectedly found a DerivedA through baseB");
+
+  //
+  // baseBCopy is a copy of the original Ptr to the Object BaseB.  Even though
+  // we didn't use baseBCopy directly in the aggregations, the object to which
+  // it points was used, therefore, we should be able to use baseBCopy as if
+  // it were baseB and get a BaseA out of the aggregation.
+  //
+  NS_TEST_ASSERT_MSG_NE (baseBCopy->GetObject<BaseA> (), 0, "Cannot GetObject (through baseBCopy) for a BaseA Object");
+
+  //
+  // Now, change the underlying type of the objects to be the derived types.
+  //
+  baseA = CreateObject<DerivedA> ();
+  NS_TEST_ASSERT_MSG_NE (baseA, 0, "Unable to CreateObject<DerivedA> with implicit cast to BaseA");
+
+  baseB = CreateObject<DerivedB> ();
+  NS_TEST_ASSERT_MSG_NE (baseB, 0, "Unable to CreateObject<DerivedB> with implicit cast to BaseB");
+
+  //
+  // Create an aggregation of two objects, both of the derived types; and leave
+  // an unaggregated copy of one lying around.
+  //
+  baseBCopy = baseB;
+  baseA->AggregateObject (baseB);
+
+  //
+  // We should be able to ask the aggregation (through baseA) for the DerivedB part
+  //
+  NS_TEST_ASSERT_MSG_NE (baseA->GetObject<DerivedB> (), 0, "Cannot GetObject (through baseA) for DerivedB Object");
+
+  //
+  // Since the DerivedB is also a BaseB, we should be able to ask the aggregation 
+  // (through baseA) for the BaseB part
+  //
+  NS_TEST_ASSERT_MSG_NE (baseA->GetObject<BaseB> (), 0, "Cannot GetObject (through baseA) for BaseB Object");
+
+  //
+  // We should be able to ask the aggregation (through baseB) for the DerivedA part
+  //
+  NS_TEST_ASSERT_MSG_NE (baseB->GetObject<DerivedA> (), 0, "Cannot GetObject (through baseB) for DerivedA Object");
+
+  //
+  // Since the DerivedA is also a BaseA, we should be able to ask the aggregation 
+  // (through baseB) for the BaseA part
+  //
+  NS_TEST_ASSERT_MSG_NE (baseB->GetObject<BaseA> (), 0, "Cannot GetObject (through baseB) for BaseA Object");
+
+  //
+  // baseBCopy is a copy of the original Ptr to the Object BaseB.  Even though
+  // we didn't use baseBCopy directly in the aggregations, the object to which
+  // it points was used, therefore, we should be able to use baseBCopy as if
+  // it were baseB (same underlying Object) and get a BaseA and a DerivedA out 
+  // of the aggregation through baseBCopy.
+  //
+  NS_TEST_ASSERT_MSG_NE (baseBCopy->GetObject<BaseA> (), 0, "Cannot GetObject (through baseBCopy) for a BaseA Object");
+  NS_TEST_ASSERT_MSG_NE (baseBCopy->GetObject<DerivedA> (), 0, "Cannot GetObject (through baseBCopy) for a BaseA Object");
+
+  //
+  // Since the Ptr<BaseB> is actually a DerivedB, we should be able to ask the 
+  // aggregation (through baseB) for the DerivedB part
+  //
+  NS_TEST_ASSERT_MSG_NE (baseB->GetObject<DerivedB> (), 0, "Cannot GetObject (through baseB) for DerivedB Object");
+
+  //
+  // Since the DerivedB was cast to a BaseB, we should be able to ask the 
+  // aggregation (through baseB) for the BaseB part
+  //
+  NS_TEST_ASSERT_MSG_NE (baseB->GetObject<BaseB> (), 0, "Cannot GetObject (through baseB) for BaseB Object");
+
+  //
+  // Make sure reference counting works in the aggregate.  Create two Objects
+  // and aggregate them, then release one of them.  The aggregation should
+  // keep a reference to both and the Object we released should still be there.
+  //
+  baseA = CreateObject<BaseA> ();
+  NS_TEST_ASSERT_MSG_NE (baseA, 0, "Unable to CreateObject<BaseA>");
+
+  baseB = CreateObject<BaseB> ();
+  NS_TEST_ASSERT_MSG_NE (baseB, 0, "Unable to CreateObject<BaseA>");
+
+  baseA->AggregateObject (baseB);
+  baseA = 0;
+
+  baseA = baseB->GetObject<BaseA> ();
+  NS_TEST_ASSERT_MSG_NE (baseA, 0, "Unable to GetObject on released object");
+}
+
+// ===========================================================================
+// Test case to make sure that an Object factory can create Objects
+// ===========================================================================
+class ObjectFactoryTestCase : public TestCase
+{
+public:
+  ObjectFactoryTestCase ();
+  virtual ~ObjectFactoryTestCase ();
+
+private:
+  virtual void DoRun (void);
+};
+
+ObjectFactoryTestCase::ObjectFactoryTestCase ()
+  : TestCase ("Check ObjectFactory functionality")
+{
+}
+
+ObjectFactoryTestCase::~ObjectFactoryTestCase ()
+{
+}
+
+void
+ObjectFactoryTestCase::DoRun (void)
+{
+  ObjectFactory factory;
+
+  //
+  // Create an Object of type BaseA through an object factory.
+  //
+  factory.SetTypeId (BaseA::GetTypeId ());
+  Ptr<Object> a = factory.Create ();
+  NS_TEST_ASSERT_MSG_NE (a, 0, "Unable to factory.Create() a BaseA");
+
+  //
+  // What we made should be a BaseA, not have anything to do with a DerivedA
+  //
+  NS_TEST_ASSERT_MSG_EQ (a->GetObject<BaseA> (DerivedA::GetTypeId ()), 0, "BaseA is unexpectedly a DerivedA also");
+
+  //
+  // The BaseA we got should not respond to a GetObject for DerivedA
+  //
+  NS_TEST_ASSERT_MSG_EQ (a->GetObject<DerivedA> (), 0, "BaseA unexpectedly responds to GetObject for DerivedA");
+
+  //
+  // Now tell the factory to make DerivedA Objects and create one with an 
+  // implied cast back to a BaseA
+  //
+  factory.SetTypeId (DerivedA::GetTypeId ());
+  a = factory.Create ();
+
+  //
+  // Since the DerivedA has a BaseA part, we should be able to use GetObject to 
+  // dynamically cast back to a BaseA.
+  //
+  NS_TEST_ASSERT_MSG_EQ (a->GetObject<BaseA> (), a, "Unable to use GetObject as dynamic_cast<BaseA>()");
+
+  //
+  // Since a is already a BaseA and is really a DerivedA, we should be able to
+  // GetObject for the DerivedA and cast it back to a BaseA getting the same
+  // value that is there.
+  //
+  NS_TEST_ASSERT_MSG_EQ (a->GetObject<BaseA> (DerivedA::GetTypeId ()), a, "GetObject with implied cast returns different Ptr");
+
+  //
+  // Since a declared a BaseA, even if it is really a DerivedA, we should not
+  // be able to GetOBject for a DerivedA since this would break the type
+  // declaration.
+  //
+  NS_TEST_ASSERT_MSG_NE (a->GetObject<DerivedA> (), 0, "Unexpectedly able to work around C++ type system");
+}
+
+// ===========================================================================
+// The Test Suite that glues the Test Cases together.
+// ===========================================================================
+class ObjectTestSuite : public TestSuite
+{
+public:
+  ObjectTestSuite ();
+};
+
+ObjectTestSuite::ObjectTestSuite ()
+  : TestSuite ("object", BVT)
+{
+  AddTestCase (new CreateObjectTestCase);
+  AddTestCase (new AggregateObjectTestCase);
+  AddTestCase (new ObjectFactoryTestCase);
+}
+
+static ObjectTestSuite objectTestSuite;
+
+} // namespace ns3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/core/test/random-variable-test-suite.cc	Wed Apr 06 15:32:12 2011 -0700
@@ -0,0 +1,147 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+//
+// Copyright (c) 2006 Georgia Tech Research Corporation
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2 as
+// published by the Free Software Foundation;
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//
+// Author: Rajib Bhattacharjea<raj.b@gatech.edu>
+// Author: Hadi Arbabi<marbabi@cs.odu.edu>
+//
+
+#include <iostream>
+#include <math.h>
+
+#include "ns3/test.h"
+#include "ns3/assert.h"
+#include "ns3/integer.h"
+#include "ns3/random-variable.h"
+
+using namespace std;
+
+namespace ns3 {
+class BasicRandomNumberTestCase : public TestCase
+{
+public:
+  BasicRandomNumberTestCase ();
+  virtual ~BasicRandomNumberTestCase ()
+  {
+  }
+
+private:
+  virtual void DoRun (void);
+};
+
+BasicRandomNumberTestCase::BasicRandomNumberTestCase ()
+  : TestCase ("Check basic random number operation")
+{
+}
+
+void
+BasicRandomNumberTestCase::DoRun (void)
+{
+  const double desiredMean = 1.0;
+  const double desiredStdDev = 1.0;
+
+  double tmp = log (1 + (desiredStdDev / desiredMean) * (desiredStdDev / desiredMean));
+  double sigma = sqrt (tmp);
+  double mu = log (desiredMean) - 0.5 * tmp;
+
+  //
+  // Test a custom lognormal instance to see if its moments have any relation
+  // expected reality.
+  //
+  LogNormalVariable lognormal (mu, sigma);
+  vector<double> samples;
+  const int NSAMPLES = 10000;
+  double sum = 0;
+
+  //
+  // Get and store a bunch of samples.  As we go along sum them and then find
+  // the mean value of the samples.
+  //
+  for (int n = NSAMPLES; n; --n)
+    {
+      double value = lognormal.GetValue ();
+      sum += value;
+      samples.push_back (value);
+    }
+  double obtainedMean = sum / NSAMPLES;
+  NS_TEST_EXPECT_MSG_EQ_TOL (obtainedMean, desiredMean, 0.1, "Got unexpected mean value from LogNormalVariable");
+
+  //
+  // Wander back through the saved stamples and find their standard deviation
+  //
+  sum = 0;
+  for (vector<double>::iterator iter = samples.begin (); iter != samples.end (); iter++)
+    {
+      double tmp = (*iter - obtainedMean);
+      sum += tmp * tmp;
+    }
+  double obtainedStdDev = sqrt (sum / (NSAMPLES - 1));
+  NS_TEST_EXPECT_MSG_EQ_TOL (obtainedStdDev, desiredStdDev, 0.1, "Got unexpected standard deviation from LogNormalVariable");
+}
+
+class RandomNumberSerializationTestCase : public TestCase
+{
+public:
+  RandomNumberSerializationTestCase ();
+  virtual ~RandomNumberSerializationTestCase ()
+  {
+  }
+
+private:
+  virtual void DoRun (void);
+};
+
+RandomNumberSerializationTestCase::RandomNumberSerializationTestCase ()
+  : TestCase ("Check basic random number operation")
+{
+}
+
+void
+RandomNumberSerializationTestCase::DoRun (void)
+{
+  RandomVariableValue val;
+  val.DeserializeFromString ("Uniform:0.1:0.2", MakeRandomVariableChecker ());
+  RandomVariable rng = val.Get ();
+  NS_TEST_ASSERT_MSG_EQ (val.SerializeToString (MakeRandomVariableChecker ()), "Uniform:0.1:0.2",
+                         "Deserialize and Serialize \"Uniform:0.1:0.2\" mismatch");
+
+  val.DeserializeFromString ("Normal:0.1:0.2", MakeRandomVariableChecker ());
+  rng = val.Get ();
+  NS_TEST_ASSERT_MSG_EQ (val.SerializeToString (MakeRandomVariableChecker ()), "Normal:0.1:0.2",
+                         "Deserialize and Serialize \"Normal:0.1:0.2\" mismatch");
+
+  val.DeserializeFromString ("Normal:0.1:0.2:0.15", MakeRandomVariableChecker ());
+  rng = val.Get ();
+  NS_TEST_ASSERT_MSG_EQ (val.SerializeToString (MakeRandomVariableChecker ()), "Normal:0.1:0.2:0.15",
+                         "Deserialize and Serialize \"Normal:0.1:0.2:0.15\" mismatch");
+}
+
+class BasicRandomNumberTestSuite : public TestSuite
+{
+public:
+  BasicRandomNumberTestSuite ();
+};
+
+BasicRandomNumberTestSuite::BasicRandomNumberTestSuite ()
+  : TestSuite ("basic-random-number", BVT)
+{
+  AddTestCase (new BasicRandomNumberTestCase);
+  AddTestCase (new RandomNumberSerializationTestCase);
+}
+
+static BasicRandomNumberTestSuite BasicRandomNumberTestSuite;
+
+} // namespace ns3
--- a/src/core/wscript	Wed Apr 06 15:26:57 2011 -0400
+++ b/src/core/wscript	Wed Apr 06 15:32:12 2011 -0700
@@ -144,9 +144,14 @@
     core_test.source = [
         'test/attribute-test-suite.cc',
         'test/callback-test-suite.cc',
+        'test/command-line-test-suite.cc',
+        'test/config-test-suite.cc',
+        'test/global-value-test-suite.cc',
         'test/high-precision-test-suite.cc',
         'test/names-test-suite.cc',
+        'test/object-test-suite.cc',
         'test/ptr-test-suite.cc',
+        'test/random-variable-test-suite.cc',
         'test/simulator-test-suite.cc',
         'test/time-test-suite.cc',
         'test/timer-test-suite.cc',
@@ -173,6 +178,7 @@
         'model/calendar-scheduler.h',
         'model/ns2-calendar-scheduler.h',
         'model/simulation-singleton.h',
+        'model/singleton.h',
         'model/timer.h',
         'model/timer-impl.h',
         'model/watchdog.h',