Index: base/test/gtest_xml_unittest_result_printer.cc |
diff --git a/base/test/gtest_xml_unittest_result_printer.cc b/base/test/gtest_xml_unittest_result_printer.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..192c228e2dd28a602dbe54f81dd4e28d487df40e |
--- /dev/null |
+++ b/base/test/gtest_xml_unittest_result_printer.cc |
@@ -0,0 +1,77 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/test/gtest_xml_unittest_result_printer.h" |
+ |
+#include "base/files/file_util.h" |
+#include "base/logging.h" |
+#include "base/time/time.h" |
+ |
+namespace base { |
+ |
+XmlUnitTestResultPrinter::XmlUnitTestResultPrinter() : output_file_(NULL) { |
+} |
+ |
+XmlUnitTestResultPrinter::~XmlUnitTestResultPrinter() { |
+ if (output_file_) { |
+ fprintf(output_file_, "</testsuites>\n"); |
+ fflush(output_file_); |
+ CloseFile(output_file_); |
+ } |
+} |
+ |
+bool XmlUnitTestResultPrinter::Initialize(const FilePath& output_file_path) { |
+ DCHECK(!output_file_); |
+ output_file_ = OpenFile(output_file_path, "w"); |
+ if (!output_file_) |
+ return false; |
+ |
+ fprintf(output_file_, |
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<testsuites>\n"); |
+ fflush(output_file_); |
+ |
+ return true; |
+} |
+ |
+void XmlUnitTestResultPrinter::OnTestCaseStart( |
+ const testing::TestCase& test_case) { |
+ fprintf(output_file_, " <testsuite>\n"); |
+ fflush(output_file_); |
+} |
+ |
+void XmlUnitTestResultPrinter::OnTestStart( |
+ const testing::TestInfo& test_info) { |
+ // This is our custom extension - it helps to recognize which test was |
+ // running when the test binary crashed. Note that we cannot even open the |
+ // <testcase> tag here - it requires e.g. run time of the test to be known. |
+ fprintf(output_file_, |
+ " <x-teststart name=\"%s\" classname=\"%s\" />\n", |
+ test_info.name(), |
+ test_info.test_case_name()); |
+ fflush(output_file_); |
+} |
+ |
+void XmlUnitTestResultPrinter::OnTestEnd(const testing::TestInfo& test_info) { |
+ fprintf(output_file_, |
+ " <testcase name=\"%s\" status=\"run\" time=\"%.3f\"" |
+ " classname=\"%s\">\n", |
+ test_info.name(), |
+ static_cast<double>(test_info.result()->elapsed_time()) / |
+ Time::kMillisecondsPerSecond, |
+ test_info.test_case_name()); |
+ if (test_info.result()->Failed()) { |
+ fprintf(output_file_, |
+ " <failure message=\"\" type=\"\"></failure>\n"); |
+ } |
+ fprintf(output_file_, " </testcase>\n"); |
+ fflush(output_file_); |
+} |
+ |
+void XmlUnitTestResultPrinter::OnTestCaseEnd( |
+ const testing::TestCase& test_case) { |
+ fprintf(output_file_, " </testsuite>\n"); |
+ fflush(output_file_); |
+} |
+ |
+} // namespace base |