| 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
|
|
|