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