47   double delta, difference;
 
   53     double max = (std::fabs (x1) > std::fabs (x2)) ? x1 : x2;
 
   54     (void)std::frexp (max, &exponent);
 
   60   delta = std::ldexp (epsilon, exponent);
 
   63   if (difference > delta || difference < -delta)
 
   87                    std::string _limit, std::string _message, 
 
   88                    std::string _file, int32_t _line);
 
  105   os << 
"    test=\""  << failure.
cond 
  106      << 
"\" actual=\"" << failure.
actual 
  107      << 
"\" limit=\""  << failure.
limit 
  108      << 
"\" in=\""     << failure.
file 
  109      << 
":"            << failure.
line  
  171   int Run (
int argc, 
char *argv[]);
 
  218                           std::list<TestCase *>::const_iterator end,
 
  219                           bool printTestType) 
const;
 
  226   void PrintHelp (
const char *programName) 
const;
 
  238   std::list<TestCase *> 
FilterTests (std::string testName,
 
  257                                   std::string _limit, std::string _message, 
 
  258                                   std::string _file, int32_t _line)
 
  259   : cond (_cond), actual (_actual), limit (_limit),
 
  260     message (_message), file (_file), line (_line)
 
  262   NS_LOG_FUNCTION (
this << _cond << _actual << _limit << _message << _file << _line);
 
  265   : childrenFailed (false)
 
  289   for (std::vector<TestCase *>::const_iterator i = 
m_children.begin (); i != 
m_children.end (); ++i)
 
  313   std::string badchars = 
"\"/\\|?";
 
  320   std::string::size_type badch = testCase->
m_name.find_first_of (badchars);
 
  321   if (badch != std::string::npos)
 
  329                       << badchars << 
"': " << testCase->
m_name);
 
  352   for (std::vector<TestCase *>::const_iterator i = 
m_children.begin (); i != 
m_children.end (); ++i)
 
  381                              std::string limit, std::string message, 
 
  382                              std::string file, int32_t line)
 
  384   NS_LOG_FUNCTION (
this << cond << actual << limit << message << file << line);
 
  386                                                 message, file, line));
 
  414   while (current != 0 && current->
m_dataDir == 
"")
 
  420       NS_FATAL_ERROR (
"No one called SetDataDir prior to calling this function");
 
  437       std::list<std::string> names;
 
  441           names.push_front (current->
m_name);
 
  504    m_assertOnFailure (false),
 
  505    m_continueOnFailure (true),
 
  548   bool haveVersion = 
false;
 
  549   bool haveLicense = 
false;
 
  557   for (std::list<std::string>::const_iterator i = files.begin (); i != files.end (); ++i)
 
  563       else if (*i == 
"LICENSE")
 
  569   return haveVersion && haveLicense;
 
  578   while (!elements.empty ())
 
  585       elements.pop_back ();
 
  587   NS_FATAL_ERROR (
"Could not find source directory from self=" << 
self);
 
  599   typedef std::map <char, std::string> specials_map;
 
  600   specials_map specials;
 
  601   specials[
'<'] = 
"<";
 
  602   specials[
'>'] = 
">";
 
  603   specials[
'&'] = 
"&";
 
  604   specials[
'"'] = 
"'";
 
  605   specials[
'\''] = 
""";
 
  608   std::size_t length = xml.length ();
 
  610   for (
size_t i = 0; i < length; ++i)
 
  612       char character = xml[i];
 
  614       specials_map::const_iterator it = specials.find (character);
 
  616       if (it == specials.end ())
 
  618           result.push_back (character);
 
  622           result += it->second;
 
  652   for (
int i = 0; i < val.
level; i++)
 
  669   const double MS_PER_SEC = 1000.;
 
  674   std::streamsize oldPrecision = (*os).precision (3);
 
  677   std::string statusString = test->
IsFailed ()?
"FAIL":
"PASS";
 
  680       *os << 
Indent (level) << 
"<Test>" << std::endl;
 
  682           << 
"</Name>" << std::endl;
 
  683       *os << 
Indent (level+1) << 
"<Result>" << statusString << 
"</Result>" << std::endl;
 
  684       *os << 
Indent (level+1) << 
"<Time real=\"" << real << 
"\" user=\"" << user 
 
  685           << 
"\" system=\"" << system << 
"\"/>" << std::endl;
 
  689           *os << 
Indent (level+2) << 
"<FailureDetails>" << std::endl
 
  690               << 
Indent (level+3) << 
"<Condition>"  
  692               << 
Indent (level+3) << 
"<Actual>"  
  694               << 
Indent (level+3) << 
"<Limit>"  
  696               << 
Indent (level+3) << 
"<Message>"  
  698               << 
Indent (level+3) << 
"<File>"  
  700               << 
Indent (level+3) << 
"<Line>" << failure.
line << 
"</Line>" << std::endl
 
  701               << 
Indent (level+2) << 
"</FailureDetails>" << std::endl;
 
  703       for (uint32_t i = 0; i < test->
m_children.size (); i++)
 
  708       *os << 
Indent (level) << 
"</Test>" << std::endl;
 
  712       *os << 
Indent (level) << statusString << 
" " << test->
GetName () 
 
  713           << 
" " << real << 
" s" << std::endl;
 
  720           for (uint32_t i = 0; i < test->
m_children.size (); i++)
 
  728   (*os).unsetf(std::ios_base::floatfield);
 
  729   (*os).precision (oldPrecision);
 
  736   std::cout << 
"Usage: " << program_name << 
" [OPTIONS]" << std::endl
 
  738             << 
"Options: " << std::endl
 
  739             << 
"  --help                 : print these options" << std::endl
 
  740             << 
"  --print-test-name-list : print the list of names of tests available" << std::endl
 
  741             << 
"  --list                 : an alias for --print-test-name-list" << std::endl
 
  742             << 
"  --print-test-types     : print the type of tests along with their names" << std::endl
 
  743             << 
"  --print-test-type-list : print the list of types of tests available" << std::endl
 
  744             << 
"  --print-temp-dir       : print name of temporary directory before running " << std::endl
 
  745             << 
"                           the tests" << std::endl
 
  746             << 
"  --test-type=TYPE       : process only tests of type TYPE" << std::endl
 
  747             << 
"  --test-name=NAME       : process only test whose name matches NAME" << std::endl
 
  748             << 
"  --suite=NAME           : an alias (here for compatibility reasons only) " << std::endl
 
  749             << 
"                           for --test-name=NAME" << std::endl
 
  750             << 
"  --assert-on-failure    : when a test fails, crash immediately (useful" << std::endl
 
  751             << 
"                           when running under a debugger" << std::endl
 
  752             << 
"  --stop-on-failure      : when a test fails, stop immediately" << std::endl
 
  753             << 
"  --fullness=FULLNESS    : choose the duration of tests to run: QUICK, " << std::endl
 
  754             << 
"                           EXTENSIVE, or TAKES_FOREVER, where EXTENSIVE " << std::endl
 
  755             << 
"                           includes QUICK and TAKES_FOREVER includes " << std::endl
 
  756             << 
"                           QUICK and EXTENSIVE (only QUICK tests are " << std::endl
 
  757             << 
"                           run by default)" << std::endl
 
  758             << 
"  --verbose              : print details of test execution" << std::endl
 
  759             << 
"  --xml                  : format test run output as xml" << std::endl
 
  760             << 
"  --tempdir=DIR          : set temp dir for tests to store output files" << std::endl
 
  761             << 
"  --datadir=DIR          : set data dir for tests to read reference files" << std::endl
 
  762             << 
"  --out=FILE             : send test result to FILE instead of standard " 
  763             << 
"output" << std::endl
 
  764             << 
"  --append=FILE          : append test result to FILE instead of standard " 
  765             << 
"output" << std::endl
 
  771                                    std::list<TestCase *>::const_iterator end,
 
  772                                    bool printTestType)
 const 
  775   std::map<TestSuite::Type, std::string> label;
 
  784   for (std::list<TestCase *>::const_iterator i = begin; i != end; ++i)
 
  792       std::cout << test->
GetName () << std::endl;
 
  800   std::cout << 
"  bvt:         Build Verification Tests (to see if build completed successfully)" << std::endl;
 
  801   std::cout << 
"  core:        Run all TestSuite-based tests (exclude examples)" << std::endl;
 
  802   std::cout << 
"  example:     Examples (to see if example programs run successfully)" << std::endl;
 
  803   std::cout << 
"  performance: Performance Tests (check to see if the system is as fast as expected)" << std::endl;
 
  804   std::cout << 
"  system:      System Tests (spans modules to check integration of modules)" << std::endl;
 
  805   std::cout << 
"  unit:        Unit Tests (within modules to check basic functionality)" << std::endl;
 
  809 std::list<TestCase *>
 
  815   std::list<TestCase *> tests;
 
  816   for (uint32_t i = 0; i < 
m_suites.size (); ++i)
 
  824       if (testName != 
"" && test->
GetName () != testName)
 
  831       std::vector<TestCase *>::iterator j;
 
  832       for (j = test->m_children.begin (); j != test->m_children.end ();)
 
  838           if (testCase->
m_duration > maximumTestDuration)
 
  844               j = test->m_children.erase (j);
 
  855       tests.push_back (test);
 
  865   std::string testName = 
"";
 
  866   std::string testTypeString = 
"";
 
  867   std::string out = 
"";
 
  868   std::string fullness = 
"";
 
  871   bool printTempDir = 
false;
 
  872   bool printTestTypeList = 
false;
 
  873   bool printTestNameList = 
false;
 
  874   bool printTestTypeAndName = 
false;
 
  876   char *progname = argv[0];
 
  884       if (strcmp(arg, 
"--assert-on-failure") == 0)
 
  888       else if (strcmp (arg, 
"--stop-on-failure") == 0)
 
  892       else if (strcmp (arg, 
"--verbose") == 0)
 
  896       else if (strcmp (arg, 
"--print-temp-dir") == 0)
 
  900       else if (strcmp (arg, 
"--update-data") == 0)
 
  904       else if (strcmp (arg, 
"--help") == 0)
 
  909       else if (strcmp (arg, 
"--print-test-name-list") == 0 ||
 
  910                strcmp(arg, 
"--list") == 0)
 
  912           printTestNameList = 
true;
 
  914       else if (strcmp (arg, 
"--print-test-types") == 0)
 
  916           printTestTypeAndName = 
true;
 
  918       else if (strcmp (arg, 
"--print-test-type-list") == 0)
 
  920           printTestTypeList = 
true;
 
  922      else if (strcmp(arg, 
"--append") == 0)
 
  926       else if (strcmp(arg, 
"--xml") == 0)
 
  930       else if (strncmp(arg, 
"--test-type=", strlen(
"--test-type=")) == 0)
 
  932           testTypeString = arg + strlen(
"--test-type=");
 
  934       else if (strncmp(arg, 
"--test-name=", strlen(
"--test-name=")) == 0)
 
  936           testName = arg + strlen(
"--test-name=");
 
  938       else if (strncmp(arg, 
"--suite=", strlen(
"--suite=")) == 0)
 
  940           testName = arg + strlen(
"--suite=");
 
  942       else if (strncmp(arg, 
"--tempdir=", strlen(
"--tempdir=")) == 0)
 
  946       else if (strncmp(arg, 
"--out=", strlen(
"--out=")) == 0)
 
  948           out = arg + strlen(
"--out=");
 
  950       else if (strncmp(arg, 
"--fullness=", strlen(
"--fullness=")) == 0)
 
  952           fullness = arg + strlen(
"--fullness=");
 
  955           if (fullness == 
"EXTENSIVE")
 
  959           else if (fullness == 
"TAKES_FOREVER")
 
  977   if (testTypeString == 
"")
 
  981   else if (testTypeString == 
"bvt")
 
  985   else if (testTypeString == 
"core")
 
  989   else if (testTypeString == 
"example")
 
  993   else if (testTypeString == 
"unit")
 
  997   else if (testTypeString == 
"system")
 
 1001   else if (testTypeString == 
"performance")
 
 1007       std::cout << 
"Invalid test type specified: " << testTypeString << std::endl;
 
 1012   std::list<TestCase *> tests = 
FilterTests (testName, testType, maximumTestDuration);
 
 1022   if (printTestNameList)
 
 1027   if (printTestTypeList)
 
 1038       ofs = 
new std::ofstream();
 
 1039       std::ios_base::openmode mode = std::ios_base::out;
 
 1042           mode |= std::ios_base::app;
 
 1046           mode |= std::ios_base::trunc;
 
 1048       ofs->open (out.c_str (), mode);
 
 1057   bool failed = 
false;
 
 1058   if (tests.size () == 0)
 
 1060       std::cerr << 
"Error:  no tests match the requested string" << std::endl;
 
 1063   for (std::list<TestCase *>::const_iterator i = tests.begin (); i != tests.end (); ++i)
 
std::string message
The associated message. 
 
virtual void DoSetup(void)
Implementation to do any local setup required for this TestCase. 
 
bool MustAssertOnFailure(void) const 
Check if this run should assert on failure. 
 
void PrintHelp(const char *programName) const 
Print the help text. 
 
Helper to indent output a specified number of steps. 
 
virtual void DoTeardown(void)
Implementation to do any local setup required for this TestCase. 
 
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
 
ns3::Singleton declaration and template implementation. 
 
TestCaseFailure(std::string _cond, std::string _actual, std::string _limit, std::string _message, std::string _file, int32_t _line)
Constructor. 
 
SystemWallClockMs clock
Test running time. 
 
Container for results from a TestCase. 
 
void AddTestSuite(TestSuite *testSuite)
Add a new top-level TestSuite. 
 
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
 
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name. 
 
bool IsFailed(void) const 
Check if any tests failed. 
 
bool m_continueOnFailure
true if we should continue on failure. 
 
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate. 
 
Definition of the testing macros and declaration of the testing classes. 
 
enum TestDuration m_duration
TestCase duration. 
 
This test suite implements a Unit Test. 
 
static TestRunnerImpl * Get(void)
Get a pointer to the singleton instance. 
 
TestSuiteVector m_suites
The list of tests. 
 
void PrintReport(TestCase *test, std::ostream *os, bool xml, int level)
Print the test report. 
 
void PrintTestNameList(std::list< TestCase * >::const_iterator begin, std::list< TestCase * >::const_iterator end, bool printTestType) const 
Print the list of all requested test suites. 
 
TestSuite(std::string name, Type type=UNIT)
Constuct a new test suite. 
 
std::list< std::string > Split(std::string path)
Split a file system path into directories according to the local path separator. 
 
TestDuration
How long the test takes to execute. 
 
This test suite implements an Example Test. 
 
virtual void DoRun(void)
Implementation to actually run this TestCase. 
 
std::list< TestCase * > FilterTests(std::string testName, enum TestSuite::Type testType, enum TestCase::TestDuration maximumTestDuration)
Generate the list of tests matching the constraints. 
 
System-independent file and directory function declarations. 
 
std::string GetTempDir(void) const 
Get the path to temporary directory. 
 
TestRunnerImpl()
Constructor. 
 
Measure elapsed wall clock time in milliseconds. 
 
std::string Join(std::list< std::string >::const_iterator begin, std::list< std::string >::const_iterator end)
Join a list of file system path directories into a single file system path. 
 
TestCase * m_parent
Pointer to my parent TestCase. 
 
TestRunnerImpl * m_runner
Pointer to the TestRunner. 
 
void AddTestCase(TestCase *testCase, enum TestDuration duration)
Add an individual child TestCase to this test suite. 
 
std::string cond
The name of the condition being tested. 
 
Definition of assertion macros NS_ASSERT() and NS_ASSERT_MSG(). 
 
std::string MakeTemporaryDirectoryName(void)
Get the name of a temporary directory. 
 
std::list< std::string > ReadFiles(std::string path)
Get the list of files located in a file system directory. 
 
std::string GetTopLevelSourceDir(void) const 
Get the path to the root of the source tree. 
 
bool childrenFailed
true if any child TestCases failed. 
 
bool TestDoubleIsEqual(const double x1, const double x2, const double epsilon)
Compare two double precision floating point numbers and declare them equal if they are within some ep...
 
std::string m_tempDir
The temporary directory. 
 
void Start(void)
Start a measure. 
 
bool MustUpdateData(void) const 
Check if this run should update the reference data. 
 
TestSuite::Type m_type
Type of this TestSuite. 
 
bool MustAssertOnFailure(void) const 
Check if this run should assert on failure. 
 
TestCase(std::string name)
Constructor. 
 
std::ostream & operator<<(std::ostream &os, const Angles &a)
print a struct Angles to output 
 
bool MustContinueOnFailure(void) const 
Check if this run should continue on failure. 
 
virtual ~TestCase()
Destructor. 
 
bool m_updateData
true if we should update reference data. 
 
int32_t line
The source line. 
 
Every class exported by the ns3 library is enclosed in the ns3 namespace. 
 
std::string CreateDataDirFilename(std::string filename)
Construct the full path to a file in the data directory. 
 
This test suite implements a Performance Test. 
 
virtual void DoRun(void)=0
Implementation to actually run this TestCase. 
 
struct Result * m_result
Results data. 
 
bool IsStatusFailure(void) const 
Check if any tests failed. 
 
TestCase * GetParent() const 
Get the parent of this TestCsse. 
 
void ReportTestFailure(std::string cond, std::string actual, std::string limit, std::string message, std::string file, int32_t line)
Log the failure of this TestCase. 
 
#define NS_LOG_UNCOND(msg)
Output the requested message unconditionaly. 
 
bool m_verbose
Produce verbose output. 
 
void Run(TestRunnerImpl *runner)
Actually run this TestCase. 
 
bool IsStatusSuccess(void) const 
Check if all tests passed. 
 
void MakeDirectories(std::string path)
Create all the directories leading to path. 
 
int64_t GetElapsedUser(void) const 
 
Indent(int level)
Constructor. 
 
This test suite implements a System Test. 
 
std::string actual
The actual value returned by the test. 
 
std::string FindSelfDirectory(void)
Get the file system path to the current executable. 
 
std::string file
The soure file. 
 
std::string CreateTempDirFilename(std::string filename)
Construct the full path to a file in a temporary directory. 
 
std::string Append(std::string left, std::string right)
Join two file system path elements. 
 
This test suite implements a Build Verification Test. 
 
int64_t GetElapsedReal(void) const 
 
std::string ReplaceXmlSpecialCharacters(std::string xml) const 
Clean up characters not allowed in XML. 
 
void SetDataDir(std::string directory)
Set the data directory where reference trace files can be found. 
 
std::vector< TestSuite * > TestSuiteVector
Container type for the test. 
 
std::vector< TestCase * > m_children
Vector of my children. 
 
int64_t GetElapsedSystem(void) const 
 
Container for details of a test failure. 
 
std::string GetName(void) const 
 
bool IsTopLevelSourceDir(std::string path) const 
Check if this is the root of the source tree. 
 
int level
The number of steps. 
 
TestSuite::Type GetTestType(void)
get the kind of test this test suite implements 
 
void PrintTestTypeList(void) const 
Print the list of test types. 
 
std::vector< TestCaseFailure > failure
TestCaseFailure records for each child. 
 
int64_t End(void)
Stop measuring the time since Start() was called. 
 
static int Run(int argc, char *argv[])
Run the requested suite of tests, according to the given command line arguments. 
 
int Run(int argc, char *argv[])
Run the requested suite of tests, according to the given command line arguments. 
 
std::string m_name
TestCase name. 
 
void test(void)
Example use of ns3::SystemThread. 
 
std::string m_dataDir
My data directory. 
 
bool m_assertOnFailure
true if we should assert on failure. 
 
bool MustContinueOnFailure(void) const 
Check if this run should continue on failure. 
 
NS_ABORT_x macro definitions. 
 
std::string limit
The expected value.