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];
885 if (strcmp(arg,
"--assert-on-failure") == 0)
889 else if (strcmp (arg,
"--stop-on-failure") == 0)
893 else if (strcmp (arg,
"--verbose") == 0)
897 else if (strcmp (arg,
"--print-temp-dir") == 0)
901 else if (strcmp (arg,
"--update-data") == 0)
905 else if (strcmp (arg,
"--help") == 0)
910 else if (strcmp (arg,
"--print-test-name-list") == 0 ||
911 strcmp(arg,
"--list") == 0)
913 printTestNameList =
true;
915 else if (strcmp (arg,
"--print-test-types") == 0)
917 printTestTypeAndName =
true;
919 else if (strcmp (arg,
"--print-test-type-list") == 0)
921 printTestTypeList =
true;
923 else if (strcmp(arg,
"--append") == 0)
927 else if (strcmp(arg,
"--xml") == 0)
931 else if (strncmp(arg,
"--test-type=", strlen(
"--test-type=")) == 0)
933 testTypeString = arg + strlen(
"--test-type=");
935 else if (strncmp(arg,
"--test-name=", strlen(
"--test-name=")) == 0)
937 testName = arg + strlen(
"--test-name=");
939 else if (strncmp(arg,
"--suite=", strlen(
"--suite=")) == 0)
941 testName = arg + strlen(
"--suite=");
943 else if (strncmp(arg,
"--tempdir=", strlen(
"--tempdir=")) == 0)
947 else if (strncmp(arg,
"--out=", strlen(
"--out=")) == 0)
949 out = arg + strlen(
"--out=");
951 else if (strncmp(arg,
"--fullness=", strlen(
"--fullness=")) == 0)
953 fullness = arg + strlen(
"--fullness=");
956 if (fullness ==
"EXTENSIVE")
960 else if (fullness ==
"TAKES_FOREVER")
978 if (testTypeString ==
"")
982 else if (testTypeString ==
"bvt")
986 else if (testTypeString ==
"core")
990 else if (testTypeString ==
"example")
994 else if (testTypeString ==
"unit")
998 else if (testTypeString ==
"system")
1002 else if (testTypeString ==
"performance")
1008 std::cout <<
"Invalid test type specified: " << testTypeString << std::endl;
1013 std::list<TestCase *> tests =
FilterTests (testName, testType, maximumTestDuration);
1023 if (printTestNameList)
1028 if (printTestTypeList)
1039 ofs =
new std::ofstream();
1040 std::ios_base::openmode mode = std::ios_base::out;
1043 mode |= std::ios_base::app;
1047 mode |= std::ios_base::trunc;
1049 ofs->open (out.c_str (), mode);
1058 bool failed =
false;
1059 if (tests.size () == 0)
1061 std::cerr <<
"Error: no tests match the requested string" << std::endl;
1064 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.
This test suite implements a System Test.
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.
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.
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.
This test suite implements a Performance Test.
TestCase(std::string name)
Constructor.
This test suite implements a Build Verification Test.
std::ostream & operator<<(std::ostream &os, const Angles &a)
print a struct Angles to output
TestDuration
How long the test takes to execute.
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.
std::string CreateDataDirFilename(std::string filename)
Construct the full path to a file in the data directory.
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.
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.
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.
This test suite implements an Example Test.
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.
This test suite implements a Unit Test.
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.