summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorAaron Terrell (Enus) <enus@lindenlab.com>2010-08-24 16:15:57 -0700
committerAaron Terrell (Enus) <enus@lindenlab.com>2010-08-24 16:15:57 -0700
commit9c24f2197403dd3c7f6ca6631ef446e4fb426511 (patch)
tree82177d6beb734a1fd799c0481ff34f447577903d /indra
parentee5a71be1091a4d71486fa5f7af1099c763684f2 (diff)
subclassing is working, thanks to changes to the subclass constructor and ridding it of member variables
Diffstat (limited to 'indra')
-rw-r--r--indra/test/test.cpp447
1 files changed, 82 insertions, 365 deletions
diff --git a/indra/test/test.cpp b/indra/test/test.cpp
index d6959a2662..2cc1b075ca 100644
--- a/indra/test/test.cpp
+++ b/indra/test/test.cpp
@@ -63,34 +63,33 @@ namespace tut
class LLTestCallback : public tut::callback
{
public:
- LLTestCallback(bool verbose_mode, std::ostream *stream, std::string suitename) :
+ LLTestCallback(bool verbose_mode, std::ostream *stream) :
mVerboseMode(verbose_mode),
mTotalTests(0),
mPassedTests(0),
mFailedTests(0),
mSkippedTests(0),
- mStream(stream),
- suite_name(suitename)
+ mStream(stream)
{
}
-
- LLTestCallback()
+
+ ~LLTestCallback()
{
}
-
+
virtual void run_started()
{
//std::cout << "run_started" << std::endl;
}
-
+
virtual void group_started(const std::string& name) {
std::cout << "group_started name=" << name << std::endl;
}
-
+
virtual void group_completed(const std::string& name) {
std::cout << "group_completed name=" << name << std::endl;
}
-
+
virtual void test_completed(const tut::test_result& tr)
{
++mTotalTests;
@@ -140,7 +139,7 @@ public:
std::cout << out.str() << std::endl;
}
}
-
+
virtual void run_completed()
{
if (mStream)
@@ -149,10 +148,9 @@ public:
}
run_completed_(std::cout);
}
-
+
virtual int getFailedTests() const { return mFailedTests; }
-
- //private:
+
virtual void run_completed_(std::ostream &stream)
{
stream << "\tTotal Tests:\t" << mTotalTests << std::endl;
@@ -162,13 +160,13 @@ public:
stream << "\tYAY!! \\o/";
}
stream << std::endl;
-
+
if (mSkippedTests > 0)
{
stream << "\tSkipped known failures:\t" << mSkippedTests
<< std::endl;
}
-
+
if(mFailedTests > 0)
{
stream << "*********************************" << std::endl;
@@ -177,9 +175,8 @@ public:
stream << "*********************************" << std::endl;
}
}
-
+
protected:
- std::string suite_name;
bool mVerboseMode;
int mTotalTests;
int mPassedTests;
@@ -188,258 +185,74 @@ protected:
std::ostream *mStream;
};
-// copy of LLTestCallback which should become a subclass (commented out below). Delete this LLTCTestCallback one fixed.
-
// TeamCity specific class which emits service messages
// http://confluence.jetbrains.net/display/TCD3/Build+Script+Interaction+with+TeamCity;#BuildScriptInteractionwithTeamCity-testReporting
-class LLTCTestCallback : public tut::callback
+class LLTCTestCallback : public LLTestCallback
{
public:
- LLTCTestCallback(bool verbose_mode, std::ostream *stream, std::string suitename) :
- mVerboseMode(verbose_mode),
- mTotalTests(0),
- mPassedTests(0),
- mFailedTests(0),
- mSkippedTests(0),
- mStream(stream),
- suite_name(suitename)
+ LLTCTestCallback(bool verbose_mode, std::ostream *stream) :
+ LLTestCallback(verbose_mode, stream)
{
}
-
- LLTCTestCallback()
+
+ ~LLTCTestCallback()
{
}
-
- virtual void run_started()
- {
- //std::cout << "unit test run_started" << std::flush;
- }
-
+
virtual void group_started(const std::string& name) {
- std::cout << "group_started name=" << name << std::endl;
+ LLTestCallback::group_started(name);
std::cout << "##teamcity[testSuiteStarted name='" << name << "']\n" << std::flush;
}
-
+
virtual void group_completed(const std::string& name) {
- std::cout << "group_completed name=" << name << std::endl;
+ LLTestCallback::group_completed(name);
std::cout << "##teamcity[testSuiteFinished name='" << name << "']\n" << std::flush;
}
-
+
virtual void test_completed(const tut::test_result& tr)
{
- ++mTotalTests;
- std::ostringstream out;
- out << "[" << tr.group << ", " << tr.test << "] \n";
+ LLTestCallback::test_completed(tr);
+
switch(tr.result)
{
case tut::test_result::ok:
- ++mPassedTests;
- out << "ok";
std::cout << "##teamcity[testStarted name='" << tr.group << "." << tr.test << "']\n" << std::flush;
std::cout << "##teamcity[testFinished name='" << tr.group << "." << tr.test << "']\n" << std::flush;
break;
case tut::test_result::fail:
- ++mFailedTests;
- out << "fail";
std::cout << "##teamcity[testStarted name='" << tr.group << "." << tr.test << "']\n" << std::flush;
std::cout << "##teamcity[testFailed name='" << tr.group << "." << tr.test << "' message='" << tr.message << "']\n" << std::flush;
std::cout << "##teamcity[testFinished name='" << tr.group << "." << tr.test << "']\n" << std::flush;
break;
case tut::test_result::ex:
- ++mFailedTests;
- out << "exception";
std::cout << "##teamcity[testStarted name='" << tr.group << "." << tr.test << "']\n" << std::flush;
std::cout << "##teamcity[testFailed name='" << tr.group << "." << tr.test << "' message='" << tr.message << "']\n" << std::flush;
std::cout << "##teamcity[testFinished name='" << tr.group << "." << tr.test << "']\n" << std::flush;
break;
case tut::test_result::warn:
- ++mFailedTests;
- out << "test destructor throw";
std::cout << "##teamcity[testStarted name='" << tr.group << "." << tr.test << "']\n" << std::flush;
std::cout << "##teamcity[testFailed name='" << tr.group << "." << tr.test << "' message='" << tr.message << "']\n" << std::flush;
std::cout << "##teamcity[testFinished name='" << tr.group << "." << tr.test << "']\n" << std::flush;
break;
case tut::test_result::term:
- ++mFailedTests;
- out << "abnormal termination";
std::cout << "##teamcity[testStarted name='" << tr.group << "." << tr.test << "']\n" << std::flush;
std::cout << "##teamcity[testFailed name='" << tr.group << "." << tr.test << "' message='" << tr.message << "']\n" << std::flush;
std::cout << "##teamcity[testFinished name='" << tr.group << "." << tr.test << "']\n" << std::flush;
break;
case tut::test_result::skip:
- ++mSkippedTests;
- out << "skipped known failure";
std::cout << "##teamcity[testStarted name='" << tr.group << "." << tr.test << "']\n" << std::flush;
std::cout << "##teamcity[testIgnored name='" << tr.group << "." << tr.test << "']\n" << std::flush;
std::cout << "##teamcity[testFinished name='" << tr.group << "." << tr.test << "']\n" << std::flush;
break;
default:
- ++mFailedTests;
- out << "unknown";
- }
- if(mVerboseMode || (tr.result != tut::test_result::ok))
- {
- if(!tr.message.empty())
- {
- out << ": '" << tr.message << "'";
- }
- if (mStream)
- {
- *mStream << out.str() << std::endl;
- }
-
- std::cout << out.str() << std::endl;
- }
- }
-
- virtual void run_completed()
- {
- if (mStream)
- {
- run_completed_(*mStream);
- }
- run_completed_(std::cout);
- }
-
- virtual int getFailedTests() const { return mFailedTests; }
-
- //private:
- virtual void run_completed_(std::ostream &stream)
- {
- stream << "\tTotal Tests:\t" << mTotalTests << std::endl;
- stream << "\tPassed Tests:\t" << mPassedTests;
- if (mPassedTests == mTotalTests)
- {
- stream << "\tYAY!! \\o/";
- }
- stream << std::endl;
-
- if (mSkippedTests > 0)
- {
- stream << "\tSkipped known failures:\t" << mSkippedTests
- << std::endl;
- }
-
- if(mFailedTests > 0)
- {
- stream << "*********************************" << std::endl;
- stream << "Failed Tests:\t" << mFailedTests << std::endl;
- stream << "Please report or fix the problem." << std::endl;
- stream << "*********************************" << std::endl;
+ break;
}
+
}
-
-protected:
- std::string suite_name;
- bool mVerboseMode;
- int mTotalTests;
- int mPassedTests;
- int mFailedTests;
- int mSkippedTests;
- std::ostream *mStream;
-};
+};
-/*
- // commented out subclass which should be fixed to eliminate the duplicated LLTestCallback and LLTCTestCallaback classes
- // when this is fixed, the duplicated code in the if(getenv("TEAMCITY_PROJECT_NAME") statements below
- //
- // currectly producing errors like thr following:
- // {path}viewer-tut-teamcity2/indra/build-darwin-i386/sharedlibs/RelWithDebInfo/RelWithDebInfo/PROJECT_llmessage_TEST_llmime
- // --touch={path}viewer-tut-teamcity2/indra/build-darwin-i386/llmessage/PROJECT_llmessage_TEST_llmime_ok.txt
- // --{path}viewer-tut-teamcity2/indra/llmessage
- //
- // run_started
- // group_started name=mime_index
- // ##teamcity[testSuiteStarted name='mime_index']
- // Segmentation fault
-
-
- // TeamCity specific class which emits service messages
- // http://confluence.jetbrains.net/display/TCD3/Build+Script+Interaction+with+TeamCity;#BuildScriptInteractionwithTeamCity-testReporting
-
- class LLTCTestCallback : public LLTestCallback
- {
- public:
- LLTCTestCallback(bool verbose_mode, std::ostream *stream, std::string suitename) :
- mVerboseMode(verbose_mode),
- mTotalTests(0),
- mPassedTests(0),
- mFailedTests(0),
- mSkippedTests(0),
- mStream(stream),
- suite_name(suitename)
- {
- }
-
- LLTCTestCallback()
- {
- }
-
- virtual void group_started(const std::string& name) {
- LLTestCallback::group_started(name);
- std::cout << "##teamcity[testSuiteStarted name='" << name << "']\n" << std::flush;
- }
-
- virtual void group_completed(const std::string& name) {
- LLTestCallback::group_completed(name);
- std::cout << "##teamcity[testSuiteFinished name='" << name << "']\n" << std::flush;
- }
-
- virtual void test_completed(const tut::test_result& tr)
- {
- LLTestCallback::test_completed(tr);
-
- switch(tr.result)
- {
- case tut::test_result::ok:
- std::cout << "##teamcity[testStarted name='" << tr.group << "." << tr.test << "']\n" << std::flush;
- std::cout << "##teamcity[testFinished name='" << tr.group << "." << tr.test << "']\n" << std::flush;
- break;
- case tut::test_result::fail:
- std::cout << "##teamcity[testStarted name='" << tr.group << "." << tr.test << "']\n" << std::flush;
- std::cout << "##teamcity[testFailed name='" << tr.group << "." << tr.test << "' message='" << tr.message << "']\n" << std::flush;
- std::cout << "##teamcity[testFinished name='" << tr.group << "." << tr.test << "']\n" << std::flush;
- break;
- case tut::test_result::ex:
- std::cout << "##teamcity[testStarted name='" << tr.group << "." << tr.test << "']\n" << std::flush;
- std::cout << "##teamcity[testFailed name='" << tr.group << "." << tr.test << "' message='" << tr.message << "']\n" << std::flush;
- std::cout << "##teamcity[testFinished name='" << tr.group << "." << tr.test << "']\n" << std::flush;
- break;
- case tut::test_result::warn:
- std::cout << "##teamcity[testStarted name='" << tr.group << "." << tr.test << "']\n" << std::flush;
- std::cout << "##teamcity[testFailed name='" << tr.group << "." << tr.test << "' message='" << tr.message << "']\n" << std::flush;
- std::cout << "##teamcity[testFinished name='" << tr.group << "." << tr.test << "']\n" << std::flush;
- break;
- case tut::test_result::term:
- std::cout << "##teamcity[testStarted name='" << tr.group << "." << tr.test << "']\n" << std::flush;
- std::cout << "##teamcity[testFailed name='" << tr.group << "." << tr.test << "' message='" << tr.message << "']\n" << std::flush;
- std::cout << "##teamcity[testFinished name='" << tr.group << "." << tr.test << "']\n" << std::flush;
- break;
- case tut::test_result::skip:
- std::cout << "##teamcity[testStarted name='" << tr.group << "." << tr.test << "']\n" << std::flush;
- std::cout << "##teamcity[testIgnored name='" << tr.group << "." << tr.test << "']\n" << std::flush;
- std::cout << "##teamcity[testFinished name='" << tr.group << "." << tr.test << "']\n" << std::flush;
- break;
- default:
- break;
- }
-
- }
-
- protected:
- std::string suite_name;
- bool mVerboseMode;
- int mTotalTests;
- int mPassedTests;
- int mFailedTests;
- int mSkippedTests;
- std::ostream *mStream;
- };
-
- }
- */
static const apr_getopt_option_t TEST_CL_OPTIONS[] =
{
@@ -460,9 +273,9 @@ void stream_usage(std::ostream& s, const char* app)
{
s << "Usage: " << app << " [OPTIONS]" << std::endl
<< std::endl;
-
+
s << "This application runs the unit tests." << std::endl << std::endl;
-
+
s << "Options: " << std::endl;
const apr_getopt_option_t* option = &TEST_CL_OPTIONS[0];
while(option->name)
@@ -473,7 +286,7 @@ void stream_usage(std::ostream& s, const char* app)
s << "\t" << option->description << std::endl << std::endl;
++option;
}
-
+
s << "Examples:" << std::endl;
s << " " << app << " --verbose" << std::endl;
s << "\tRun all the tests and report all results." << std::endl;
@@ -512,11 +325,11 @@ int main(int argc, char **argv)
LLError::setDefaultLevel(LLError::LEVEL_ERROR);
//< *TODO: should come from error config file. Note that we
// have a command line option that sets this to debug.
-
+
#ifdef CTYPE_WORKAROUND
ctype_workaround();
#endif
-
+
apr_initialize();
apr_pool_t* pool = NULL;
if(APR_SUCCESS != apr_pool_create(&pool, NULL))
@@ -530,20 +343,20 @@ int main(int argc, char **argv)
std::cerr << "Unable to pool" << std::endl;
return 1;
}
-
+
// values used for controlling application
bool verbose_mode = false;
bool wait_at_exit = false;
std::string test_group;
std::string suite_name;
-
+
// values use for options parsing
apr_status_t apr_err;
const char* opt_arg = NULL;
int opt_id = 0;
std::ofstream *output = NULL;
const char *touch = NULL;
-
+
while(true)
{
apr_err = apr_getopt_long(os, TEST_CL_OPTIONS, &opt_id, &opt_arg);
@@ -599,152 +412,56 @@ int main(int argc, char **argv)
break;
}
}
-
- /*
- // commented out test tunner logic which should be fixed when eliminate the duplicated LLTestCallback and LLTCTestCallaback classes
- // become proper class:subclass
- // if the Segmentation fault issue is resolved, all code in the block comments can be uncommented, and all code below can be removed.
-
- LLTestCallback* mycallback;
- if (getenv("TEAMCITY_PROJECT_NAME"))
- {
- mycallback = new LLTCTestCallback(verbose_mode, output, suite_name);
-
- }
- else
- {
- mycallback = new LLTestCallback(verbose_mode, output, suite_name);
- }
-
- tut::runner.get().set_callback(mycallback);
-
- if(test_group.empty())
- {
- tut::runner.get().run_tests();
- }
- else
- {
- tut::runner.get().run_tests(test_group);
- }
-
- bool success = (mycallback->getFailedTests() == 0);
-
- if (wait_at_exit)
- {
- std::cerr << "Press return to exit..." << std::endl;
- std::cin.get();
- }
-
- if (output)
- {
- output->close();
- delete output;
- }
-
- if (touch && success)
- {
- std::ofstream s;
- s.open(touch);
- s << "ok" << std::endl;
- s.close();
- }
-
- apr_terminate();
-
- int retval = (success ? 0 : 1);
- return retval;
- */
-
+
// run the tests
-
+
+ LLTestCallback* mycallback;
if (getenv("TEAMCITY_PROJECT_NAME"))
{
- LLTCTestCallback* mycallback;
- mycallback = new LLTCTestCallback(verbose_mode, output, suite_name);
-
- tut::runner.get().set_callback(mycallback);
-
- if(test_group.empty())
- {
- tut::runner.get().run_tests();
- }
- else
- {
- tut::runner.get().run_tests(test_group);
- }
-
- bool success = (mycallback->getFailedTests() == 0);
-
- if (wait_at_exit)
- {
- std::cerr << "Press return to exit..." << std::endl;
- std::cin.get();
- }
-
- if (output)
- {
- output->close();
- delete output;
- }
-
- if (touch && success)
- {
- std::ofstream s;
- s.open(touch);
- s << "ok" << std::endl;
- s.close();
- }
-
- apr_terminate();
-
- int retval = (success ? 0 : 1);
- return retval;
-
-
+ mycallback = new LLTCTestCallback(verbose_mode, output);
}
- // NOT if (getenv("TEAMCITY_PROJECT_NAME"))
else
{
- LLTestCallback* mycallback;
- mycallback = new LLTestCallback(verbose_mode, output, suite_name);
-
- tut::runner.get().set_callback(mycallback);
-
- if(test_group.empty())
- {
- tut::runner.get().run_tests();
- }
- else
- {
- tut::runner.get().run_tests(test_group);
- }
-
- bool success = (mycallback->getFailedTests() == 0);
-
- if (wait_at_exit)
- {
- std::cerr << "Press return to exit..." << std::endl;
- std::cin.get();
- }
-
- if (output)
- {
- output->close();
- delete output;
- }
-
- if (touch && success)
- {
- std::ofstream s;
- s.open(touch);
- s << "ok" << std::endl;
- s.close();
- }
-
- apr_terminate();
-
- int retval = (success ? 0 : 1);
- return retval;
-
+ mycallback = new LLTCTestCallback(verbose_mode, output);
+ }
+
+ tut::runner.get().set_callback(mycallback);
+
+ if(test_group.empty())
+ {
+ tut::runner.get().run_tests();
+ }
+ else
+ {
+ tut::runner.get().run_tests(test_group);
+ }
+
+ bool success = (mycallback->getFailedTests() == 0);
+
+ if (wait_at_exit)
+ {
+ std::cerr << "Press return to exit..." << std::endl;
+ std::cin.get();
+ }
+
+ if (output)
+ {
+ output->close();
+ delete output;
}
+
+ if (touch && success)
+ {
+ std::ofstream s;
+ s.open(touch);
+ s << "ok" << std::endl;
+ s.close();
+ }
+
+ apr_terminate();
+
+ int retval = (success ? 0 : 1);
+ return retval;
+
+ delete mycallback;
}