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)#include "chrome/browser/diagnostics/diagnostics_model.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/path_service.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/diagnostics/diagnostics_test.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/diagnostics/recon_diagnostics.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/diagnostics/sqlite_diagnostics.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace diagnostics {
237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
243240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch// This is the count of diagnostic tests on each platform.  This should
253240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch// only be used by testing code.
263240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(OS_WIN)
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst int DiagnosticsModel::kDiagnosticsTestCount = 17;
283240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#elif defined(OS_MACOSX)
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst int DiagnosticsModel::kDiagnosticsTestCount = 13;
303240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#elif defined(OS_POSIX)
313240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(OS_CHROMEOS)
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst int DiagnosticsModel::kDiagnosticsTestCount = 17;
333240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#else
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst int DiagnosticsModel::kDiagnosticsTestCount = 15;
353240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif
363240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif
373240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Embodies the commonalities of the model across platforms. It manages the
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// list of tests and can loop over them. The main job of the platform specific
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// code becomes:
437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// 1- Inserting the appropriate tests into |tests_|
447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// 2- Overriding RunTest() to wrap it with the appropriate fatal exception
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    handler for the OS.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class owns the all the tests and will only delete them upon
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// destruction.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DiagnosticsModelImpl : public DiagnosticsModel {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DiagnosticsModelImpl() : tests_run_(0) {}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual ~DiagnosticsModelImpl() { STLDeleteElements(&tests_); }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual int GetTestRunCount() const OVERRIDE { return tests_run_; }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual int GetTestAvailableCount() const OVERRIDE { return tests_.size(); }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void RunAll(DiagnosticsModel::Observer* observer) OVERRIDE {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t test_count = tests_.size();
60424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    bool continue_running = true;
61424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    for (size_t i = 0; i != test_count; ++i) {
62424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      // If one of the diagnostic steps returns false, we want to
63424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      // mark the rest of them as "skipped" in the UMA stats.
64424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      if (continue_running) {
65424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        continue_running = RunTest(tests_[i], observer, i);
66424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        ++tests_run_;
67424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      } else {
68424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#if defined(OS_CHROMEOS)  // Only collecting UMA stats on ChromeOS
69424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        RecordUMATestResult(static_cast<DiagnosticsTestId>(tests_[i]->GetId()),
70424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                            RESULT_SKIPPED);
71424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#else
72424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        // On other platforms, we can just bail out if a diagnostic step returns
73424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        // false.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
75424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#endif
76424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (observer)
793240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      observer->OnAllTestsDone(this);
803240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  }
813240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
823240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  virtual void RecoverAll(DiagnosticsModel::Observer* observer) OVERRIDE {
833240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    size_t test_count = tests_.size();
84424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    bool continue_running = true;
853240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    for (size_t i = 0; i != test_count; ++i) {
86424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      // If one of the recovery steps returns false, we want to
87424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      // mark the rest of them as "skipped" in the UMA stats.
88424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      if (continue_running) {
89424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        continue_running = RunRecovery(tests_[i], observer, i);
90424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      } else {
91424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#if defined(OS_CHROMEOS)  // Only collecting UMA stats on ChromeOS
92424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        RecordUMARecoveryResult(
93424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            static_cast<DiagnosticsTestId>(tests_[i]->GetId()), RESULT_SKIPPED);
94424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#else
95424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        // On other platforms, we can just bail out if a recovery step returns
96424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        // false.
973240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        break;
98424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#endif
99424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      }
1003240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    }
1013240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    if (observer)
1023240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      observer->OnAllRecoveryDone(this);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1053240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  virtual const TestInfo& GetTest(size_t index) const OVERRIDE {
1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return *tests_[index];
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
109424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual bool GetTestInfo(int id, const TestInfo** result) const OVERRIDE {
110424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    DCHECK(id < DIAGNOSTICS_TEST_ID_COUNT);
111424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    DCHECK(id >= 0);
1123240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    for (size_t i = 0; i < tests_.size(); i++) {
1133240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      if (tests_[i]->GetId() == id) {
1143240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        *result = tests_[i];
1153240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        return true;
1163240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      }
1173240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    }
1183240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    return false;
1193240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  }
1203240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1223240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // Run a particular diagnostic test. Return false if no other tests should be
1233240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // run.
1247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual bool RunTest(DiagnosticsTest* test,
1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                       Observer* observer,
1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                       size_t index) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return test->Execute(observer, this, index);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1303240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // Recover from a particular diagnostic test. Return false if no further
1313240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // recovery should be run.
1323240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  virtual bool RunRecovery(DiagnosticsTest* test,
1333240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                           Observer* observer,
1343240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                           size_t index) {
1353240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    return test->Recover(observer, this, index);
1363240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  }
1373240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
1387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  typedef std::vector<DiagnosticsTest*> TestArray;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestArray tests_;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int tests_run_;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DiagnosticsModelImpl);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Each platform can have their own tests. For the time being there is only
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// one test that works on all platforms.
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DiagnosticsModelWin : public DiagnosticsModelImpl {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DiagnosticsModelWin() {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeOperatingSystemTest());
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeConflictingDllsTest());
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeInstallTypeTest());
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeVersionTest());
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeUserDirTest());
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeLocalStateFileTest());
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeDictonaryDirTest());
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeResourcesFileTest());
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeDiskSpaceTest());
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakePreferencesTest());
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeLocalStateTest());
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeBookMarksTest());
164424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    tests_.push_back(MakeSqliteWebDataDbTest());
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeSqliteCookiesDbTest());
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeSqliteHistoryDbTest());
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeSqliteThumbnailsDbTest());
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeSqliteWebDatabaseTrackerDbTest());
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DiagnosticsModelWin);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DiagnosticsModelMac : public DiagnosticsModelImpl {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DiagnosticsModelMac() {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeInstallTypeTest());
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeUserDirTest());
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeLocalStateFileTest());
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeDictonaryDirTest());
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeDiskSpaceTest());
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakePreferencesTest());
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeLocalStateTest());
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeBookMarksTest());
187424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    tests_.push_back(MakeSqliteWebDataDbTest());
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeSqliteCookiesDbTest());
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeSqliteHistoryDbTest());
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeSqliteThumbnailsDbTest());
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeSqliteWebDatabaseTrackerDbTest());
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DiagnosticsModelMac);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DiagnosticsModelPosix : public DiagnosticsModelImpl {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DiagnosticsModelPosix() {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeInstallTypeTest());
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeVersionTest());
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeUserDirTest());
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeLocalStateFileTest());
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeDictonaryDirTest());
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeResourcesFileTest());
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeDiskSpaceTest());
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakePreferencesTest());
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeLocalStateTest());
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeBookMarksTest());
212424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    tests_.push_back(MakeSqliteWebDataDbTest());
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeSqliteCookiesDbTest());
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeSqliteHistoryDbTest());
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeSqliteThumbnailsDbTest());
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tests_.push_back(MakeSqliteWebDatabaseTrackerDbTest());
2177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(OS_CHROMEOS)
2187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    tests_.push_back(MakeSqliteNssCertDbTest());
2197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    tests_.push_back(MakeSqliteNssKeyDbTest());
2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DiagnosticsModelPosix);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DiagnosticsModel* MakeDiagnosticsModel(const CommandLine& cmdline) {
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath user_data_dir =
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      cmdline.GetSwitchValuePath(switches::kUserDataDir);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!user_data_dir.empty())
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PathService::Override(chrome::DIR_USER_DATA, user_data_dir);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new DiagnosticsModelWin();
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new DiagnosticsModelMac();
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new DiagnosticsModelPosix();
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}  // namespace diagnostics
246