15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/logging/win/test_log_collector.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <ios> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/lazy_instance.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/test_switches.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/logging/win/file_logger.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/logging/win/log_file_printer.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace logging_win { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTraceLogExtension[] = ".etl"; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestLogCollector { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestLogCollector(); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~TestLogCollector(); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Initialize(testing::UnitTest* unit_test); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetUp(); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartSessionForTest(const testing::TestInfo& test_info); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool LogTestPartResult(const testing::TestPartResult& test_part_result); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ProcessSessionForTest(const testing::TestInfo& test_info); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void TearDown(); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An EventListener that generally delegates to a given default result 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // printer with a few exceptions; see individual method comments for details. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class EventListener : public testing::TestEventListener { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ownership of |default_result_printer| is taken by the new instance. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EventListener(TestLogCollector* test_log_collector, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::TestEventListener* default_result_printer); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~EventListener(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets up the log collector. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnTestProgramStart( 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const testing::UnitTest& unit_test) OVERRIDE { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_log_collector_->SetUp(); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_result_printer_->OnTestProgramStart(unit_test); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnTestIterationStart(const testing::UnitTest& unit_test, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iteration) OVERRIDE { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_result_printer_->OnTestIterationStart(unit_test, iteration); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnEnvironmentsSetUpStart( 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const testing::UnitTest& unit_test) OVERRIDE { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_result_printer_->OnEnvironmentsSetUpStart(unit_test); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnEnvironmentsSetUpEnd( 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const testing::UnitTest& unit_test) OVERRIDE { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_result_printer_->OnEnvironmentsSetUpEnd(unit_test); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnTestCaseStart(const testing::TestCase& test_case) OVERRIDE { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_result_printer_->OnTestCaseStart(test_case); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calls back to the collector to start collecting logs for this test. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnTestStart(const testing::TestInfo& test_info) OVERRIDE { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_result_printer_->OnTestStart(test_info); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_log_collector_->StartSessionForTest(test_info); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calls back to the collector with the partial result. If the collector 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // does not handle it, it is given to the default result printer. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnTestPartResult( 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const testing::TestPartResult& test_part_result) OVERRIDE { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!test_log_collector_->LogTestPartResult(test_part_result)) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_result_printer_->OnTestPartResult(test_part_result); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calls back to the collector to handle the collected log for the test that 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // has just ended. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnTestEnd(const testing::TestInfo& test_info) OVERRIDE { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_log_collector_->ProcessSessionForTest(test_info); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_result_printer_->OnTestEnd(test_info); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnTestCaseEnd(const testing::TestCase& test_case) OVERRIDE { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_result_printer_->OnTestCaseEnd(test_case); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnEnvironmentsTearDownStart( 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const testing::UnitTest& unit_test) OVERRIDE { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_result_printer_->OnEnvironmentsTearDownStart(unit_test); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnEnvironmentsTearDownEnd( 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const testing::UnitTest& unit_test) OVERRIDE { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_result_printer_->OnEnvironmentsTearDownEnd(unit_test); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnTestIterationEnd(const testing::UnitTest& unit_test, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iteration) OVERRIDE { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_result_printer_->OnTestIterationEnd(unit_test, iteration); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tears down the log collector. 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnTestProgramEnd(const testing::UnitTest& unit_test) OVERRIDE { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_result_printer_->OnTestProgramEnd(unit_test); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_log_collector_->TearDown(); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestLogCollector* test_log_collector_; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<testing::TestEventListener> default_result_printer_; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(EventListener); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The Google Test unit test into which the collector has been installed. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::UnitTest* unit_test_; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A temporary directory into which a log file is placed for the duration of 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // each test. Created/destroyed at collector SetUp and TearDown. 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir log_temp_dir_; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The test logger. Initialized/Unintitialized at collector SetUp and 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TearDown. 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<FileLogger> file_logger_; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The current log file. Valid only during a test. 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath log_file_; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if --also-emit-success-logs was specified on the command line. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool also_emit_success_logs_; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestLogCollector); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::LazyInstance<TestLogCollector> g_test_log_collector = 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LAZY_INSTANCE_INITIALIZER; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TestLogCollector::EventListener implementation 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestLogCollector::EventListener::EventListener( 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestLogCollector* test_log_collector, 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::TestEventListener* default_result_printer) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : test_log_collector_(test_log_collector), 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_result_printer_(default_result_printer) { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestLogCollector::EventListener::~EventListener() { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TestLogCollector implementation 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestLogCollector::TestLogCollector() 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : unit_test_(NULL), also_emit_success_logs_(false) { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestLogCollector::~TestLogCollector() { 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestLogCollector::Initialize(testing::UnitTest* unit_test) { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unit_test_ != NULL) { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK_EQ(unit_test, unit_test_) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "Cannot install the test log collector in multiple unit tests."; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; // Already initialized. 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove the default result printer and install the collector's listener 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which delegates to the printer. If the default result printer has already 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // been released, log an error and move on. 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::TestEventListeners& listeners = unit_test->listeners(); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::TestEventListener* default_result_printer = 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) listeners.default_result_printer(); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (default_result_printer == NULL) { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Failed to initialize the test log collector on account of " 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "another component having released the default result " 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "printer."; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ownership of |default_release_printer| is passed to the new listener, and 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ownership of the new listener is passed to the unit test. 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) listeners.Append( 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new EventListener(this, listeners.Release(default_result_printer))); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) also_emit_success_logs_ = CommandLine::ForCurrentProcess()->HasSwitch( 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kAlsoEmitSuccessLogs); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unit_test_ = unit_test; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Invoked by the listener at test program start to create the temporary log 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// directory and initialize the logger. 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestLogCollector::SetUp() { 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!log_temp_dir_.CreateUniqueTempDir()) { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Failed to create temporary directory to hold log files."; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_logger_.reset(new FileLogger()); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_logger_->Initialize(); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Invoked by the listener at test start to begin collecting logs in a file. 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestLogCollector::StartSessionForTest(const testing::TestInfo& test_info) { 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (log_temp_dir_.IsValid()) { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string log_file_name(test_info.name()); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::replace(log_file_name.begin(), log_file_name.end(), '/', '_'); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_file_name.append(kTraceLogExtension); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_file_ = log_temp_dir_.path().AppendASCII(log_file_name); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_logger_->StartLogging(log_file_); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Invoked by the listener when a test result is produced to log an event for 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the result. 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestLogCollector::LogTestPartResult( 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const testing::TestPartResult& test_part_result) { 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Can't handle the event if no trace session. 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!file_logger_.get() || !file_logger_->is_logging()) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (test_part_result.type() != testing::TestPartResult::kSuccess) { 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Approximate Google Test's message formatting. 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << base::StringPrintf("%s(%d): error: %s", test_part_result.file_name(), 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_part_result.line_number(), 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_part_result.message()); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Invoked by the listener at test end to dump the collected log in case of 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// error. 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestLogCollector::ProcessSessionForTest( 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const testing::TestInfo& test_info) { 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file_logger_.get() != NULL && file_logger_->is_logging()) { 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_logger_->StopLogging(); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (also_emit_success_logs_ || test_info.result()->Failed()) { 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::cerr << "----- log messages for " 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << test_info.test_case_name() << "." << test_info.name() 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " above this line are repeated below -----" << std::endl; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Dump the log to stderr. 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) logging_win::PrintLogFile(log_file_, &std::cerr); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::cerr.flush(); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!base::DeleteFile(log_file_, false)) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Failed to delete log file " << log_file_.value(); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_file_.clear(); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Invoked by the listener at test program end to shut down the logger and 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// delete the temporary log directory. 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestLogCollector::TearDown() { 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_logger_.reset(); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ignore_result(log_temp_dir_.Delete()); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InstallTestLogCollector(testing::UnitTest* unit_test) { 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must be called before running any tests. 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(unit_test); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!unit_test->current_test_case()); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_test_log_collector.Get().Initialize(unit_test); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace logging_win 291