diff --git a/include/reporters/catch_reporter_junit.hpp b/include/reporters/catch_reporter_junit.hpp index e656882f..6b2d6546 100644 --- a/include/reporters/catch_reporter_junit.hpp +++ b/include/reporters/catch_reporter_junit.hpp @@ -18,6 +18,35 @@ namespace Catch { + namespace { + std::string getCurrentTimestamp() { + // Beware, this is not reentrant because of backward compatibility issues + // Also, UTC only, again because of backward compatibility (%z is C++11) + time_t rawtime; + std::time(&rawtime); + const size_t timeStampSize = sizeof("2017-01-16T17:06:45Z"); + +#ifdef CATCH_PLATFORM_WINDOWS + std::tm timeInfo = {}; + gmtime_s(&timeInfo, &rawtime); +#else + std::tm* timeInfo; + timeInfo = std::gmtime(&rawtime); +#endif + + char timeStamp[timeStampSize]; + const char * const fmt = "%Y-%m-%dT%H:%M:%SZ"; + +#ifdef CATCH_PLATFORM_WINDOWS + std::strftime(timeStamp, timeStampSize, fmt, &timeInfo); +#else + std::strftime(timeStamp, timeStampSize, fmt, timeInfo); +#endif + return std::string(timeStamp); + } + + } + class JunitReporter : public CumulativeReporterBase { public: JunitReporter( ReporterConfig const& _config ) @@ -82,7 +111,7 @@ namespace Catch { xml.writeAttribute( "time", "" ); else xml.writeAttribute( "time", suiteTime ); - xml.writeAttribute( "timestamp", "tbd" ); // !TBD + xml.writeAttribute( "timestamp", getCurrentTimestamp() ); // Write test cases for( TestGroupNode::ChildNodes::const_iterator diff --git a/projects/SelfTest/Baselines/junit.sw.approved.txt b/projects/SelfTest/Baselines/junit.sw.approved.txt index a8b43453..3b7345ed 100644 --- a/projects/SelfTest/Baselines/junit.sw.approved.txt +++ b/projects/SelfTest/Baselines/junit.sw.approved.txt @@ -1,6 +1,6 @@ - + diff --git a/scripts/approvalTests.py b/scripts/approvalTests.py index 3e1b9a3b..d5bb6129 100644 --- a/scripts/approvalTests.py +++ b/scripts/approvalTests.py @@ -16,6 +16,7 @@ pathParser = re.compile(r'(.*?)/(.*\..pp)(.*)') lineNumberParser = re.compile(r'(.*)line="[0-9]*"(.*)') hexParser = re.compile(r'(.*)\b(0[xX][0-9a-fA-F]+)\b(.*)') durationsParser = re.compile(r'(.*)time="[0-9]*\.[0-9]*"(.*)') +timestampsParser = re.compile(r'(.*)timestamp="\d{4}-\d{2}-\d{2}T\d{2}\:\d{2}\:\d{2}Z"(.*)') versionParser = re.compile(r'(.*?)Catch v[0-9]*\.[0-9]*\.[0-9]*(.*)') devVersionParser = re.compile(r'(.*?)Catch v[0-9]*\.[0-9]*\.[0-9]*-develop\.[0-9]*(.*)') nullParser = re.compile(r'(.*?)\b(__null|nullptr)\b(.*)') @@ -73,6 +74,9 @@ def filterLine(line): m = durationsParser.match(line) if m: line = m.group(1) + 'time="{duration}"' + m.group(2) + m = timestampsParser.match(line) + if m: + line = m.group(1) + 'timestamp="{iso8601-timestamp}"' + m.group(2) return line