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