From 5ef163d11a7b64e3506908a95afc1e023e73515e Mon Sep 17 00:00:00 2001 From: Mitch Watrous Date: Mon, 10 Sep 2012 17:15:07 -0700 Subject: [PATCH] Bug 1284 - ./test.py performance tests do not exist --- src/core/model/test.cc | 4 + ...variables-one-get-value-call-test-suite.cc | 88 +++++++++++++++++++ ...ariable-many-get-value-calls-test-suite.cc | 88 +++++++++++++++++++ src/core/wscript | 2 + test.py | 29 ++++-- 5 files changed, 206 insertions(+), 5 deletions(-) create mode 100644 src/core/test/many-uniform-random-variables-one-get-value-call-test-suite.cc create mode 100644 src/core/test/one-uniform-random-variable-many-get-value-calls-test-suite.cc diff --git a/src/core/model/test.cc b/src/core/model/test.cc index 43d3a92ff..01cd4b553 100644 --- a/src/core/model/test.cc +++ b/src/core/model/test.cc @@ -727,6 +727,10 @@ TestRunnerImpl::Run (int argc, char *argv[]) { testType = TestSuite::SYSTEM; } + else if (testTypeString == "performance") + { + testType = TestSuite::PERFORMANCE; + } else { std::cout << "Invalid test type specified: " << testTypeString << std::endl; diff --git a/src/core/test/many-uniform-random-variables-one-get-value-call-test-suite.cc b/src/core/test/many-uniform-random-variables-one-get-value-call-test-suite.cc new file mode 100644 index 000000000..392a6f441 --- /dev/null +++ b/src/core/test/many-uniform-random-variables-one-get-value-call-test-suite.cc @@ -0,0 +1,88 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2012 University of Washington + * + * 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: Mitch Watrous (watrous@u.washington.edu) + */ + +#include "ns3/test.h" +#include "ns3/config.h" +#include "ns3/double.h" +#include "ns3/random-variable-stream.h" +#include + +using namespace ns3; + + +// =========================================================================== +// Test case for many uniform distribution random variable stream generators +// =========================================================================== + +class ManyUniformRandomVariablesOneGetValueCallTestCase : public TestCase +{ +public: + ManyUniformRandomVariablesOneGetValueCallTestCase (); + virtual ~ManyUniformRandomVariablesOneGetValueCallTestCase (); + +private: + virtual void DoRun (void); +}; + +ManyUniformRandomVariablesOneGetValueCallTestCase::ManyUniformRandomVariablesOneGetValueCallTestCase () + : TestCase ("Many Uniform Random Variables with One GetValue() Call") +{ +} + +ManyUniformRandomVariablesOneGetValueCallTestCase::~ManyUniformRandomVariablesOneGetValueCallTestCase () +{ +} + +void +ManyUniformRandomVariablesOneGetValueCallTestCase::DoRun (void) +{ + double min = 0.0; + double max = 10.0; + + Config::SetDefault ("ns3::UniformRandomVariable::Min", DoubleValue (min)); + Config::SetDefault ("ns3::UniformRandomVariable::Max", DoubleValue (max)); + + // Get 1 value from many uniform random number generators. + double value; + int count = 1000000; + std::vector< Ptr > uniformStreamVector (count); + for (int i = 0; i < count; i++) + { + uniformStreamVector.push_back (CreateObject ()); + value = uniformStreamVector.back ()->GetValue (); + + NS_TEST_ASSERT_MSG_GT (value, min, "Value less than minimum."); + NS_TEST_ASSERT_MSG_LT (value, max, "Value greater than maximum."); + } +} + +class ManyUniformRandomVariablesOneGetValueCallTestSuite : public TestSuite +{ +public: + ManyUniformRandomVariablesOneGetValueCallTestSuite (); +}; + +ManyUniformRandomVariablesOneGetValueCallTestSuite::ManyUniformRandomVariablesOneGetValueCallTestSuite () + : TestSuite ("many-uniform-random-variables-one-get-value-call", PERFORMANCE) +{ + AddTestCase (new ManyUniformRandomVariablesOneGetValueCallTestCase); +} + +static ManyUniformRandomVariablesOneGetValueCallTestSuite manyUniformRandomVariablesOneGetValueCallTestSuite; diff --git a/src/core/test/one-uniform-random-variable-many-get-value-calls-test-suite.cc b/src/core/test/one-uniform-random-variable-many-get-value-calls-test-suite.cc new file mode 100644 index 000000000..1b0230632 --- /dev/null +++ b/src/core/test/one-uniform-random-variable-many-get-value-calls-test-suite.cc @@ -0,0 +1,88 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2012 University of Washington + * + * 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: Mitch Watrous (watrous@u.washington.edu) + */ + +#include "ns3/test.h" +#include "ns3/config.h" +#include "ns3/double.h" +#include "ns3/random-variable-stream.h" +#include + +using namespace ns3; + + +// =========================================================================== +// Test case for one uniform distribution random variable stream generator +// =========================================================================== + +class OneUniformRandomVariableManyGetValueCallsTestCase : public TestCase +{ +public: + OneUniformRandomVariableManyGetValueCallsTestCase (); + virtual ~OneUniformRandomVariableManyGetValueCallsTestCase (); + +private: + virtual void DoRun (void); +}; + +OneUniformRandomVariableManyGetValueCallsTestCase::OneUniformRandomVariableManyGetValueCallsTestCase () + : TestCase ("One Uniform Random Variable with Many GetValue() Calls") +{ +} + +OneUniformRandomVariableManyGetValueCallsTestCase::~OneUniformRandomVariableManyGetValueCallsTestCase () +{ +} + +void +OneUniformRandomVariableManyGetValueCallsTestCase::DoRun (void) +{ + double min = 0.0; + double max = 10.0; + + Config::SetDefault ("ns3::UniformRandomVariable::Min", DoubleValue (min)); + Config::SetDefault ("ns3::UniformRandomVariable::Max", DoubleValue (max)); + + Ptr uniform = CreateObject (); + + // Get many values from 1 random number generator. + double value; + int count = 100000000; + for (int i = 0; i < count; i++) + { + value = uniform->GetValue (); + + NS_TEST_ASSERT_MSG_GT (value, min, "Value less than minimum."); + NS_TEST_ASSERT_MSG_LT (value, max, "Value greater than maximum."); + } +} + +class OneUniformRandomVariableManyGetValueCallsTestSuite : public TestSuite +{ +public: + OneUniformRandomVariableManyGetValueCallsTestSuite (); +}; + +OneUniformRandomVariableManyGetValueCallsTestSuite::OneUniformRandomVariableManyGetValueCallsTestSuite () + : TestSuite ("one-uniform-random-variable-many-get-value-calls", PERFORMANCE) +{ + AddTestCase (new OneUniformRandomVariableManyGetValueCallsTestCase); +} + +static OneUniformRandomVariableManyGetValueCallsTestSuite oneUniformRandomVariableManyGetValueCallsTestSuite; diff --git a/src/core/wscript b/src/core/wscript index c2c8d1ac7..07874e51a 100644 --- a/src/core/wscript +++ b/src/core/wscript @@ -162,6 +162,8 @@ def build(bld): 'test/object-test-suite.cc', 'test/ptr-test-suite.cc', 'test/random-variable-test-suite.cc', + 'test/many-uniform-random-variables-one-get-value-call-test-suite.cc', + 'test/one-uniform-random-variable-many-get-value-calls-test-suite.cc', 'test/sample-test-suite.cc', 'test/simulator-test-suite.cc', 'test/time-test-suite.cc', diff --git a/test.py b/test.py index cb55be27d..1a66c22ad 100755 --- a/test.py +++ b/test.py @@ -82,7 +82,7 @@ test_runner_name = "test-runner" # If the user has constrained us to run certain kinds of tests, we can tell waf # to only build # -core_kinds = ["bvt", "core", "system", "unit"] +core_kinds = ["bvt", "core", "performance", "system", "unit"] # # There are some special cases for test suites that kill valgrind. This is @@ -1212,6 +1212,21 @@ def run_tests(): suite_list = suites.split('\n') # + # Performance tests should only be run when they are requested, + # i.e. they are not run by default in test.py. + # + if options.constrain != 'performance': + + # Get a list of all of the performance tests. + path_cmd = os.path.join("utils", test_runner_name + " --print-test-name-list --test-type=%s" % "performance") + (rc, performance_tests, standard_err, et) = run_job_synchronously(path_cmd, os.getcwd(), False, False) + performance_test_list = performance_tests.split('\n') + + # Remove any performance tests from the suites list. + for performance_test in performance_test_list: + if performance_test in suite_list: + suite_list.remove(performance_test) + # We now have a possibly large number of test suites to run, so we want to # run them in parallel. We're going to spin up a number of worker threads # that will run our test jobs for us. @@ -1326,15 +1341,13 @@ def run_tests(): # This translates into allowing the following options with respect to the # suites # - # ./test,py: run all of the examples + # ./test.py: run all of the examples # ./test.py --constrain=unit run no examples # ./test.py --constrain=example run all of the examples # ./test.py --suite=some-test-suite: run no examples # ./test.py --example=some-example: run the single example # ./test.py --suite=some-suite --example=some-example: run the single example # - # XXX could use constrain to separate out examples used for performance - # testing # if len(options.suite) == 0 and len(options.example) == 0 and len(options.pyexample) == 0: if len(options.constrain) == 0 or options.constrain == "example": @@ -1545,7 +1558,10 @@ def run_tests(): crashed_tests = crashed_tests + 1 status = "CRASH" - print "%s: %s %s" % (status, kind, job.display_name) + if options.duration or options.constrain == "performance": + print "%s (%.3f): %s %s" % (status, job.elapsed_time, kind, job.display_name) + else: + print "%s: %s %s" % (status, kind, job.display_name) if job.is_example or job.is_pyexample: # @@ -1725,6 +1741,9 @@ def main(argv): metavar="KIND", help="constrain the test-runner by kind of test") + parser.add_option("-d", "--duration", action="store_true", dest="duration", default=False, + help="print the duration of each test suite and example") + parser.add_option("-e", "--example", action="store", type="string", dest="example", default="", metavar="EXAMPLE", help="specify a single example to run (with relative path)")