17dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 27dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 37dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// found in the LICENSE file. 47dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/diagnostics/diagnostics_writer.h" 67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "build/build_config.h" 87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(OS_POSIX) 107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include <stdio.h> 117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include <unistd.h> 127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include <string> 157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/basictypes.h" 177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/command_line.h" 187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/logging.h" 197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/logging.h" 207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/strings/string16.h" 217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/strings/stringprintf.h" 227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/strings/utf_string_conversions.h" 237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/common/chrome_switches.h" 247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "ui/base/resource/resource_bundle.h" 257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "ui/base/ui_base_paths.h" 267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace diagnostics { 287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// This is a minimalistic interface to wrap the platform console. 307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass SimpleConsole { 317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public: 327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch enum Color { 337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DEFAULT, 347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch RED, 357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GREEN, 367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch }; 377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual ~SimpleConsole() {} 397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Init must be called before using any other method. If it returns 417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // false there will be no console output. 427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual bool Init() = 0; 437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Writes a string to the console with the current color. 45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual bool Write(const base::string16& text) = 0; 467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Called when the program is about to exit. 487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void OnQuit() = 0; 497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Sets the foreground text color. 517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual bool SetColor(Color color) = 0; 527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Create an appropriate SimpleConsole instance. May return NULL if there is 547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // no implementation for the current platform. 557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch static SimpleConsole* Create(); 567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(OS_WIN) 597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace { 607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Wrapper for the windows console operating in high-level IO mode. 627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass WinConsole : public SimpleConsole { 637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public: 647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // The ctor allocates a console. This avoids having to ask the user to start 657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // chrome from a command prompt. 667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch WinConsole() 677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : std_out_(INVALID_HANDLE_VALUE), 687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std_in_(INVALID_HANDLE_VALUE) { 697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ::AllocConsole(); 707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual ~WinConsole() { 737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ::FreeConsole(); 747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual bool Init() { 777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return SetIOHandles(); 787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual bool Write(const base::string16& txt) { 817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DWORD sz = txt.size(); 827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return (TRUE == ::WriteConsoleW(std_out_, txt.c_str(), sz, &sz, NULL)); 837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Reads a string from the console. Internally it is limited to 256 867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // characters. 877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void OnQuit() { 887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Block here so the user can see the results. 897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetColor(SimpleConsole::DEFAULT); 907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Write(L"Press [enter] to continue\n"); 917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch wchar_t buf[256]; 927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DWORD read = arraysize(buf); 937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ::ReadConsoleW(std_in_, buf, read, &read, NULL); 947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Sets the foreground and background color. 977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual bool SetColor(Color color) { 987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch uint16 color_combo = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | 997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FOREGROUND_INTENSITY; 1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switch (color) { 1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case RED: 1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch color_combo = FOREGROUND_RED | FOREGROUND_INTENSITY; 1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case GREEN: 1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch color_combo = FOREGROUND_GREEN | FOREGROUND_INTENSITY; 1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case DEFAULT: 1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch default: 1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NOTREACHED(); 1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return (TRUE == ::SetConsoleTextAttribute(std_out_, color_combo)); 1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private: 1167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool SetIOHandles() { 1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std_out_ = ::GetStdHandle(STD_OUTPUT_HANDLE); 1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std_in_ = ::GetStdHandle(STD_INPUT_HANDLE); 1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return ((std_out_ != INVALID_HANDLE_VALUE) && 1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch (std_in_ != INVALID_HANDLE_VALUE)); 1217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // The input and output handles to the screen. They seem to be 1247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // implemented as pipes but they have non-documented protocol. 1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch HANDLE std_out_; 1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch HANDLE std_in_; 1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DISALLOW_COPY_AND_ASSIGN(WinConsole); 1297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 1307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} // namespace 1327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1337dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochSimpleConsole* SimpleConsole::Create() { return new WinConsole(); } 1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#elif defined(OS_POSIX) 1367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace { 1377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass PosixConsole : public SimpleConsole { 1397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public: 1407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PosixConsole() : use_color_(false) {} 1417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual bool Init() OVERRIDE { 1437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Technically, we should also check the terminal capabilities before using 1447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // color, but in practice this is unlikely to be an issue. 1457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch use_color_ = isatty(STDOUT_FILENO); 1467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return true; 1477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual bool Write(const base::string16& text) OVERRIDE { 1507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // We're assuming that the terminal is using UTF-8 encoding. 1517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch printf("%s", UTF16ToUTF8(text).c_str()); 1527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return true; 1537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void OnQuit() OVERRIDE { 1567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // The "press enter to continue" prompt isn't very unixy, so only do that on 1577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Windows. 1587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual bool SetColor(Color color) OVERRIDE { 1617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!use_color_) 1627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 1637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const char* code = "\033[m"; 1657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switch (color) { 1667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case RED: 1677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch code = "\033[1;31m"; 1687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 1697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case GREEN: 1707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch code = "\033[1;32m"; 1717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 1727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case DEFAULT: 1737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 1747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch default: 1757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NOTREACHED(); 1767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch printf("%s", code); 1787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return true; 1797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private: 1827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool use_color_; 1837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DISALLOW_COPY_AND_ASSIGN(PosixConsole); 1857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 1867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} // namespace 1887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1897dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochSimpleConsole* SimpleConsole::Create() { return new PosixConsole(); } 1907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#else // !defined(OS_WIN) && !defined(OS_POSIX) 1927dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochSimpleConsole* SimpleConsole::Create() { return NULL; } 1937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 1947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch/////////////////////////////////////////////////////////// 1967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// DiagnosticsWriter 1977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1987dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochDiagnosticsWriter::DiagnosticsWriter(FormatType format) 1997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : failures_(0), format_(format) { 2007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Only create consoles for non-log output. 2017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (format_ != LOG) { 2027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch console_.reset(SimpleConsole::Create()); 2037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch console_->Init(); 2047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 2067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2077dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochDiagnosticsWriter::~DiagnosticsWriter() { 2087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (console_.get()) 2097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch console_->OnQuit(); 2107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 2117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool DiagnosticsWriter::WriteInfoLine(const std::string& info_text) { 2137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (format_ == LOG) { 2147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LOG(WARNING) << info_text; 2157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return true; 2167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else { 2177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (console_.get()) { 2187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch console_->SetColor(SimpleConsole::DEFAULT); 2197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch console_->Write(UTF8ToUTF16(info_text + "\n")); 2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return true; 2237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 2247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2253240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid DiagnosticsWriter::OnTestFinished(int index, DiagnosticsModel* model) { 2267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const DiagnosticsModel::TestInfo& test_info = model->GetTest(index); 2277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool success = (DiagnosticsModel::TEST_OK == test_info.GetResult()); 2287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch WriteResult(success, 229424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) test_info.GetName(), 2307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch test_info.GetTitle(), 2317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch test_info.GetOutcomeCode(), 2327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch test_info.GetAdditionalInfo()); 2337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 2347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2353240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid DiagnosticsWriter::OnAllTestsDone(DiagnosticsModel* model) { 2367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch WriteInfoLine( 2377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::StringPrintf("Finished %d tests.", model->GetTestRunCount())); 2387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 2397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2403240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid DiagnosticsWriter::OnRecoveryFinished(int index, DiagnosticsModel* model) { 2413240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch const DiagnosticsModel::TestInfo& test_info = model->GetTest(index); 2423240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch WriteInfoLine("Finished Recovery for: " + test_info.GetTitle()); 2433240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch} 2443240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 2453240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid DiagnosticsWriter::OnAllRecoveryDone(DiagnosticsModel* model) { 2463240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch WriteInfoLine("Finished All Recovery operations."); 2473240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch} 2483240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 2497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool DiagnosticsWriter::WriteResult(bool success, 2507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string& id, 2517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string& name, 2527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int outcome_code, 2537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string& extra) { 2547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::string result; 2557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SimpleConsole::Color color; 2567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (success) { 2587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch result = "[PASS] "; 2597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch color = SimpleConsole::GREEN; 2607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else { 2617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch color = SimpleConsole::RED; 2627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch result = "[FAIL] "; 2637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch failures_++; 2647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (format_ != LOG) { 2677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (console_.get()) { 2687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch console_->SetColor(color); 2697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch console_->Write(ASCIIToUTF16(result)); 2707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (format_ == MACHINE) { 2727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return WriteInfoLine(base::StringPrintf( 2737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "%03d %s (%s)", outcome_code, id.c_str(), extra.c_str())); 2747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else { 2757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return WriteInfoLine(name + "\n " + extra + "\n"); 2767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else { 2787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!success) { 2797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // For log output, we only care about the tests that failed. 2807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return WriteInfoLine(base::StringPrintf("%s%03d %s (%s)", 2817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch result.c_str(), 2827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch outcome_code, 2837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch id.c_str(), 2847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch extra.c_str())); 2857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return true; 2887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 2897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} // namespace diagnostics 291