15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 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)#ifndef CHROME_BROWSER_DIAGNOSTICS_DIAGNOSTICS_TEST_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_DIAGNOSTICS_DIAGNOSTICS_TEST_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
9424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chrome/browser/diagnostics/diagnostics_metrics.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/diagnostics/diagnostics_model.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FilePath;
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace diagnostics {
177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Represents a single diagnostic test and encapsulates the common
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// functionality across platforms as well.
207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// It also implements the TestInfo interface providing the storage
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for the outcome of the test.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Specific tests need (minimally) only to:
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1- override ExecuteImpl() to implement the test.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2- call RecordStopFailure() or RecordFailure() or RecordSuccess()
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    at the end of the test.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3- Optionally call observer->OnProgress() if the test is long.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 4- Optionally call observer->OnSkipped() if the test cannot be run.
287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass DiagnosticsTest : public DiagnosticsModel::TestInfo {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
30424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  explicit DiagnosticsTest(DiagnosticsTestId id);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual ~DiagnosticsTest();
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Runs the test. Returning false signals that no more tests should be run.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The actual outcome of the test should be set using the RecordXX functions.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Execute(DiagnosticsModel::Observer* observer, DiagnosticsModel* model,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               size_t index);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
393240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // Runs any recovery steps for the test. Returning false signals that no more
403240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // recovery should be attempted.
413240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  bool Recover(DiagnosticsModel::Observer* observer, DiagnosticsModel* model,
423240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch               size_t index);
433240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void RecordStopFailure(int outcome_code, const std::string& additional_info) {
457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    RecordOutcome(
467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        outcome_code, additional_info, DiagnosticsModel::TEST_FAIL_STOP);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void RecordFailure(int outcome_code, const std::string& additional_info) {
507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    RecordOutcome(
517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        outcome_code, additional_info, DiagnosticsModel::TEST_FAIL_CONTINUE);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void RecordSuccess(const std::string& additional_info) {
557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    RecordOutcome(0, additional_info, DiagnosticsModel::TEST_OK);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void RecordOutcome(int outcome_code,
597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                     const std::string& additional_info,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     DiagnosticsModel::TestResult result);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static base::FilePath GetUserDefaultProfileDir();
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // DiagnosticsModel::TestInfo overrides
65424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual int GetId() const OVERRIDE;
66424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual std::string GetName() const OVERRIDE;
677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual std::string GetTitle() const OVERRIDE;
687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual DiagnosticsModel::TestResult GetResult() const OVERRIDE;
697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual std::string GetAdditionalInfo() const OVERRIDE;
707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual int GetOutcomeCode() const OVERRIDE;
717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual base::Time GetStartTime() const OVERRIDE;
727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual base::Time GetEndTime() const OVERRIDE;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Derived classes override this method do perform the actual test.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool ExecuteImpl(DiagnosticsModel::Observer* observer) = 0;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
773240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // Derived classes may override this method to perform a recovery, if recovery
783240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // makes sense for the diagnostics test.
793240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  virtual bool RecoveryImpl(DiagnosticsModel::Observer* observer);
803240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
81424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const DiagnosticsTestId id_;
827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::string additional_info_;
837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int outcome_code_;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DiagnosticsModel::TestResult result_;
857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::Time start_time_;
867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::Time end_time_;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}  // namespace diagnostics
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_DIAGNOSTICS_DIAGNOSTICS_TEST_H_
91