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#ifndef CHROME_BROWSER_DIAGNOSTICS_DIAGNOSTICS_WRITER_H_
67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define CHROME_BROWSER_DIAGNOSTICS_DIAGNOSTICS_WRITER_H_
77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/basictypes.h"
97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/memory/scoped_ptr.h"
107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/diagnostics/diagnostics_model.h"
117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace diagnostics {
137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Console base class used internally.
157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass SimpleConsole;
167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass DiagnosticsWriter : public DiagnosticsModel::Observer {
187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public:
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // The type of formatting done by this writer.
207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  enum FormatType {
217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    MACHINE,
227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LOG,
237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    HUMAN
247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  };
257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  explicit DiagnosticsWriter(FormatType format);
277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual ~DiagnosticsWriter();
287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // How many tests reported failure.
307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int failures() { return failures_; }
317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // What format are we writing things in.
337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FormatType format() const { return format_; }
347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Write an informational line of text in white over black. String must be
367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // UTF8 encoded. A newline will be added for non-LOG output formats.
377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool WriteInfoLine(const std::string& info_text);
387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // DiagnosticsModel::Observer overrides
403240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  virtual void OnTestFinished(int index, DiagnosticsModel* model) OVERRIDE;
413240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  virtual void OnAllTestsDone(DiagnosticsModel* model) OVERRIDE;
423240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  virtual void OnRecoveryFinished(int index, DiagnosticsModel* model) OVERRIDE;
433240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  virtual void OnAllRecoveryDone(DiagnosticsModel* model) OVERRIDE;
447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private:
467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Write a result block. For humans, it consists of two lines. The first line
477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // has [PASS] or [FAIL] with |name| and the second line has the text in
487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // |extra|. For machine and log formats, we just have [PASS] or [FAIL],
497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // followed by the exact error code and the id. Name and extra strings must be
507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // UTF8 encoded, as they are user-facing strings.
517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool WriteResult(bool success,
527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                   const std::string& id,
537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                   const std::string& name,
547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                   int outcome_code,
557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                   const std::string& extra);
567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<SimpleConsole> console_;
587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Keeps track of how many tests reported failure.
607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int failures_;
617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FormatType format_;
627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(DiagnosticsWriter);
647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}  // namespace diagnostics
677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif  // CHROME_BROWSER_DIAGNOSTICS_DIAGNOSTICS_WRITER_H_
69