syncevolution/src/TestMain.cpp
2006-09-07 18:28:22 +00:00

152 lines
4.4 KiB
C++

/*
* Copyright (C) 2005 Patrick Ohly
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* 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
*/
#include <cppunit/CompilerOutputter.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/ui/text/TestRunner.h>
#include <cppunit/TestListener.h>
#include <cppunit/TestResult.h>
#include <cppunit/TestFailure.h>
#include <posix/base/posixlog.h>
#include <string>
#include <stdexcept>
using namespace std;
#include "Test.h"
class Sync4jOutputter : public CppUnit::CompilerOutputter {
public:
Sync4jOutputter(CppUnit::TestResultCollector *result, std::ostream &stream) :
CompilerOutputter(result, stream) {}
void write() {
// ensure that output goes to console again
setLogFile("sync.log", 0);
CompilerOutputter::write();
}
};
class Sync4jListener : public CppUnit::TestListener {
public:
Sync4jListener() :
m_failed(false) {
}
void addAllowedFailures(string allowedFailures) {
int start = 0, end;
while ((end = allowedFailures.find(',', start)) != allowedFailures.npos) {
int len = end - start;
if (len) {
m_allowedFailures.insert(allowedFailures.substr(start, len));
}
start = end + 1;
}
if (allowedFailures.size() > start) {
m_allowedFailures.insert(allowedFailures.substr(start));
}
}
void startTest (CppUnit::Test *test) {
m_currentTest = test->getName();
setLogFile( "-", 0 );
cerr << m_currentTest;
string logfile = m_currentTest + ".log";
simplifyFilename(logfile);
remove(logfile.c_str());
setLogFile( logfile.c_str(), 1 );
m_testFailed = false;
}
void addFailure(const CppUnit::TestFailure &failure) {
m_testFailed = true;
}
void endTest (CppUnit::Test *test) {
setLogFile( "-", 0 );
if (m_testFailed) {
if (m_allowedFailures.find(m_currentTest) == m_allowedFailures.end()) {
cerr << " *** failed ***";
m_failed = true;
} else {
cerr << " *** failure ignored ***";
}
}
cerr << "\n";
}
bool hasFailed() { return m_failed; }
const string &getCurrentTest() const { return m_currentTest; }
private:
set<string> m_allowedFailures;
bool m_failed, m_testFailed;
string m_currentTest;
} syncListener;
const string &getCurrentTest() {
return syncListener.getCurrentTest();
}
void simplifyFilename(string &filename)
{
size_t pos = 0;
while (true) {
pos = filename.find(":", pos);
if (pos == filename.npos ) {
break;
}
filename.replace(pos, 1, "_");
}
}
int main(int argc, char* argv[])
{
// Get the top level suite from the registry
CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest();
// Adds the test to the list of test to run
CppUnit::TextUi::TestRunner runner;
runner.addTest( suite );
// Change the default outputter to a compiler error format outputter
runner.setOutputter( new Sync4jOutputter( &runner.result(),
std::cerr ) );
// track current test and failure state
const char *allowedFailures = getenv("TEST_EVOLUTION_FAILURES");
if (allowedFailures) {
syncListener.addAllowedFailures(allowedFailures);
}
runner.eventManager().addListener(&syncListener);
try {
// Run the tests.
runner.run(argc > 1 ? argv[1] : "", false, true, false);
// Return error code 1 if the one of test failed.
return syncListener.hasFailed() ? 1 : 0;
} catch (invalid_argument e) {
// Test path not resolved
std::cerr << std::endl
<< "ERROR: " << e.what()
<< std::endl;
return 1;
}
}