summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'QA/Checker/checker.cpp')
-rw-r--r--QA/Checker/checker.cpp214
1 files changed, 139 insertions, 75 deletions
diff --git a/QA/Checker/checker.cpp b/QA/Checker/checker.cpp
index 1ec8892..4d6a90e 100644
--- a/QA/Checker/checker.cpp
+++ b/QA/Checker/checker.cpp
@@ -1,86 +1,150 @@
/*
- * Copyright (c) 2010 Remko Tronçon
- * Licensed under the GNU General Public License v3.
- * See Documentation/Licenses/GPLv3.txt for more information.
+ * Copyright (c) 2010-2019 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
*/
+#include <cstdlib>
+#include <fstream>
#include <string>
-#include <cppunit/ui/text/TestRunner.h>
-#include <cppunit/extensions/TestFactoryRegistry.h>
-#include <cppunit/XmlOutputter.h>
-#include <cppunit/TextTestResult.h>
+#include <sstream>
+
+#include <boost/algorithm/string/predicate.hpp>
+
+#include <gtest/gtest.h>
+#include <QA/Checker/CppUnitTestResultPrinter.h>
+
#include <cppunit/BriefTestProgressListener.h>
-#include <cppunit/TextTestProgressListener.h>
#include <cppunit/TextOutputter.h>
+#include <cppunit/TextTestProgressListener.h>
+#include <cppunit/TextTestResult.h>
+#include <cppunit/XmlOutputter.h>
+#include <cppunit/extensions/TestFactoryRegistry.h>
+#include <cppunit/ui/text/TestRunner.h>
#include <Swiften/Base/Log.h>
+using Swift::Log;
+
int main(int argc, char* argv[]) {
- bool verbose = false;
- bool outputXML = false;
-
- Swift::Log::setLogLevel(Swift::Log::error);
-
- // Parse parameters
- std::vector<std::string> testsToRun;
- for (int i = 1; i < argc; ++i) {
- std::string param(argv[i]);
- if (param == "--verbose") {
- verbose = true;
- }
- else if (param == "--xml") {
- outputXML = true;
- }
- else if (param == "--debug") {
- Swift::Log::setLogLevel(Swift::Log::debug);
- }
- else {
- testsToRun.push_back(param);
- }
- }
- if (testsToRun.empty()) {
- testsToRun.push_back("");
- }
-
- // Set up the listeners
- CppUnit::TestResult controller;
-
- CppUnit::TestResultCollector result;
- controller.addListener(&result);
-
- CppUnit::TextTestProgressListener progressListener;
- CppUnit::BriefTestProgressListener verboseListener;
- if (!outputXML) {
- if (verbose) {
- controller.addListener(&verboseListener);
- }
- else {
- controller.addListener(&progressListener);
- }
- }
-
- // Run the tests
- CppUnit::TestRunner runner;
- runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
- for (std::vector<std::string>::const_iterator i = testsToRun.begin(); i != testsToRun.end(); ++i) {
- try {
- runner.run(controller, *i);
- }
- catch (const std::exception& e) {
- std::cerr << "Error: " << e.what() << std::endl;
- return -1;
- }
- }
-
- // Output the results
- if (outputXML) {
- CppUnit::XmlOutputter outputter(&result, std::cout);
- outputter.write();
- }
- else {
- CppUnit::TextOutputter outputter(&result, std::cerr);
- outputter.write();
- }
-
- return result.wasSuccessful() ? 0 : 1;
+ bool verbose = false;
+ bool outputXML = false;
+
+ Log::setLogLevel(Swift::Log::error);
+
+ // Parse parameters
+ std::vector<std::string> testsToRun;
+ for (int i = 1; i < argc; ++i) {
+ std::string param(argv[i]);
+ if (param == "--verbose") {
+ verbose = true;
+ }
+ else if (param == "--xml") {
+ outputXML = true;
+ }
+ else if (param == "--debug") {
+ Swift::Log::setLogLevel(Swift::Log::debug);
+ }
+ else if (boost::starts_with(param, "--")) {
+ continue;
+ }
+ else {
+ testsToRun.push_back(param);
+ }
+ }
+
+ if (testsToRun.empty()) {
+ testsToRun.push_back("");
+ }
+
+ // generate output filenames for XML test output
+ std::string gtestOutputFilename;
+ std::string cppunitOutputFilename;
+
+ if (outputXML) {
+ auto programName = std::string(argv[0]);
+
+ std::stringstream outFileStringStreamGTest("");
+ outFileStringStreamGTest << "xml:" << programName << "-report.gtest.xml";
+ gtestOutputFilename = outFileStringStreamGTest.str();
+
+ std::stringstream outFileStringStreamCppUnit("");
+ outFileStringStreamCppUnit << programName << "-report.cppunit.xml";
+ cppunitOutputFilename = outFileStringStreamCppUnit.str();
+ }
+
+ if (outputXML && (std::getenv("GTEST_OUTPUT") == nullptr)) {
+ ::testing::GTEST_FLAG(output) = gtestOutputFilename;
+ }
+
+ // Google Test might throw an exception in an anonymous namespace. Exiting
+ // due to uncaught execption is fine here.
+ // coverity[fun_call_w_exception]
+ ::testing::InitGoogleTest(&argc, argv);
+
+ // Set up the listeners
+ CppUnit::TestResult controller;
+
+ CppUnit::TestResultCollector result;
+ controller.addListener(&result);
+
+ CppUnit::TextTestProgressListener progressListener;
+ CppUnit::BriefTestProgressListener verboseListener;
+ if (!outputXML) {
+ if (verbose) {
+ controller.addListener(&verboseListener);
+ }
+ else {
+ controller.addListener(&progressListener);
+ }
+ }
+
+ // Run the tests
+ CppUnit::TestRunner runner;
+ runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
+ for (std::vector<std::string>::const_iterator i = testsToRun.begin(); i != testsToRun.end(); ++i) {
+ try {
+ runner.run(controller, *i);
+ }
+ catch (const std::exception& e) {
+ std::cerr << "Error: " << e.what() << std::endl;
+ return -1;
+ }
+ }
+
+ // Output the results
+ if (outputXML) {
+ std::ofstream cppUnitXUnitOutputFile;
+ cppUnitXUnitOutputFile.open(cppunitOutputFilename, std::ofstream::out | std::ofstream::trunc);
+ if (cppUnitXUnitOutputFile.is_open()) {
+ CppUnit::XmlOutputter outputter(&result, cppUnitXUnitOutputFile);
+ outputter.write();
+ }
+ else {
+ std::cerr << "Failed to overwrite " << cppunitOutputFilename << " output file." << std::endl;
+ return 1;
+ }
+ }
+ else {
+ CppUnit::TextOutputter outputter(&result, std::cerr);
+ outputter.write();
+ }
+
+ auto googleTestWasSuccessful = false;
+ try {
+ if (!verbose) {
+ testing::UnitTest& unitTest = *testing::UnitTest::GetInstance();
+ testing::TestEventListeners& listeners = unitTest.listeners();
+ delete listeners.Release(listeners.default_result_printer());
+ listeners.Append(new testing::CppUnitTestResultPrinter);
+ }
+ googleTestWasSuccessful = RUN_ALL_TESTS() == 0 ? true : false;
+ } catch (const ::testing::internal::GoogleTestFailureException& e) {
+ googleTestWasSuccessful = false;
+ SWIFT_LOG(error) << "GoogleTestFailureException was thrown: " << e.what();
+ }
+
+ auto cppUnitWasSuccessful = result.wasSuccessful() ? true : false;
+
+ return (googleTestWasSuccessful && cppUnitWasSuccessful) ? 0 : 1;
}