1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/diagnostics/diagnostics_model.h" 6 7 #include <algorithm> 8 #include <vector> 9 10 #include "base/basictypes.h" 11 #include "base/command_line.h" 12 #include "base/file_path.h" 13 #include "base/file_util.h" 14 #include "base/stl_util-inl.h" 15 #include "base/string_util.h" 16 #include "base/path_service.h" 17 #include "chrome/browser/diagnostics/diagnostics_test.h" 18 #include "chrome/browser/diagnostics/recon_diagnostics.h" 19 #include "chrome/browser/diagnostics/sqlite_diagnostics.h" 20 #include "chrome/common/chrome_paths.h" 21 #include "chrome/common/chrome_switches.h" 22 23 namespace { 24 25 // Embodies the commonalities of the model across platforms. It manages the 26 // list of tests and can loop over them. The main job of the platform specific 27 // code becomes: 28 // 1- Inserting the appropiate tests into |tests_| 29 // 2- Overriding RunTest() to wrap it with the appropiate fatal exception 30 // handler for the OS. 31 // This class owns the all the tests and will only delete them upon 32 // destruction. 33 class DiagnosticsModelImpl : public DiagnosticsModel { 34 public: DiagnosticsModelImpl()35 DiagnosticsModelImpl() : tests_run_(0) { 36 } 37 ~DiagnosticsModelImpl()38 ~DiagnosticsModelImpl() { 39 STLDeleteElements(&tests_); 40 } 41 GetTestRunCount()42 virtual int GetTestRunCount() { 43 return tests_run_; 44 } 45 GetTestAvailableCount()46 virtual int GetTestAvailableCount() { 47 return tests_.size(); 48 } 49 RunAll(DiagnosticsModel::Observer * observer)50 virtual void RunAll(DiagnosticsModel::Observer* observer) { 51 size_t test_count = tests_.size(); 52 for (size_t ix = 0; ix != test_count; ++ix) { 53 bool do_next = RunTest(tests_[ix], observer, ix); 54 ++tests_run_; 55 if (!do_next) 56 break; 57 } 58 observer->OnDoneAll(this); 59 } 60 GetTest(size_t id)61 virtual TestInfo& GetTest(size_t id) { 62 return *tests_[id]; 63 } 64 65 protected: 66 // Run a particular test. Return false if no other tests should be run. RunTest(DiagnosticTest * test,Observer * observer,size_t index)67 virtual bool RunTest(DiagnosticTest* test, Observer* observer, size_t index) { 68 return test->Execute(observer, this, index); 69 } 70 71 typedef std::vector<DiagnosticTest*> TestArray; 72 TestArray tests_; 73 int tests_run_; 74 75 private: 76 DISALLOW_COPY_AND_ASSIGN(DiagnosticsModelImpl); 77 }; 78 79 // Each platform can have their own tests. For the time being there is only 80 // one test that works on all platforms. 81 #if defined(OS_WIN) 82 class DiagnosticsModelWin : public DiagnosticsModelImpl { 83 public: DiagnosticsModelWin()84 DiagnosticsModelWin() { 85 tests_.push_back(MakeOperatingSystemTest()); 86 tests_.push_back(MakeConflictingDllsTest()); 87 tests_.push_back(MakeInstallTypeTest()); 88 tests_.push_back(MakeVersionTest()); 89 tests_.push_back(MakeUserDirTest()); 90 tests_.push_back(MakeLocalStateFileTest()); 91 tests_.push_back(MakeDictonaryDirTest()); 92 tests_.push_back(MakeResourcesFileTest()); 93 tests_.push_back(MakeDiskSpaceTest()); 94 tests_.push_back(MakePreferencesTest()); 95 tests_.push_back(MakeLocalStateTest()); 96 tests_.push_back(MakeBookMarksTest()); 97 tests_.push_back(MakeSqliteWebDbTest()); 98 tests_.push_back(MakeSqliteCookiesDbTest()); 99 tests_.push_back(MakeSqliteHistoryDbTest()); 100 tests_.push_back(MakeSqliteArchivedHistoryDbTest()); 101 tests_.push_back(MakeSqliteThumbnailsDbTest()); 102 tests_.push_back(MakeSqliteAppCacheDbTest()); 103 tests_.push_back(MakeSqliteWebDatabaseTrackerDbTest()); 104 } 105 106 private: 107 DISALLOW_COPY_AND_ASSIGN(DiagnosticsModelWin); 108 }; 109 110 #elif defined(OS_MACOSX) 111 class DiagnosticsModelMac : public DiagnosticsModelImpl { 112 public: DiagnosticsModelMac()113 DiagnosticsModelMac() { 114 tests_.push_back(MakeInstallTypeTest()); 115 tests_.push_back(MakeUserDirTest()); 116 tests_.push_back(MakeLocalStateFileTest()); 117 tests_.push_back(MakeDictonaryDirTest()); 118 tests_.push_back(MakeResourcesFileTest()); 119 tests_.push_back(MakeDiskSpaceTest()); 120 tests_.push_back(MakePreferencesTest()); 121 tests_.push_back(MakeLocalStateTest()); 122 tests_.push_back(MakeBookMarksTest()); 123 tests_.push_back(MakeSqliteWebDbTest()); 124 tests_.push_back(MakeSqliteCookiesDbTest()); 125 tests_.push_back(MakeSqliteHistoryDbTest()); 126 tests_.push_back(MakeSqliteArchivedHistoryDbTest()); 127 tests_.push_back(MakeSqliteThumbnailsDbTest()); 128 tests_.push_back(MakeSqliteAppCacheDbTest()); 129 tests_.push_back(MakeSqliteWebDatabaseTrackerDbTest()); 130 } 131 132 private: 133 DISALLOW_COPY_AND_ASSIGN(DiagnosticsModelMac); 134 }; 135 136 #elif defined(OS_POSIX) 137 class DiagnosticsModelPosix : public DiagnosticsModelImpl { 138 public: DiagnosticsModelPosix()139 DiagnosticsModelPosix() { 140 tests_.push_back(MakeInstallTypeTest()); 141 tests_.push_back(MakeVersionTest()); 142 tests_.push_back(MakeUserDirTest()); 143 tests_.push_back(MakeLocalStateFileTest()); 144 tests_.push_back(MakeDictonaryDirTest()); 145 tests_.push_back(MakeResourcesFileTest()); 146 tests_.push_back(MakeDiskSpaceTest()); 147 tests_.push_back(MakePreferencesTest()); 148 tests_.push_back(MakeLocalStateTest()); 149 tests_.push_back(MakeBookMarksTest()); 150 tests_.push_back(MakeSqliteWebDbTest()); 151 tests_.push_back(MakeSqliteCookiesDbTest()); 152 tests_.push_back(MakeSqliteHistoryDbTest()); 153 tests_.push_back(MakeSqliteArchivedHistoryDbTest()); 154 tests_.push_back(MakeSqliteThumbnailsDbTest()); 155 tests_.push_back(MakeSqliteAppCacheDbTest()); 156 tests_.push_back(MakeSqliteWebDatabaseTrackerDbTest()); 157 } 158 159 private: 160 DISALLOW_COPY_AND_ASSIGN(DiagnosticsModelPosix); 161 }; 162 163 #endif 164 165 } // namespace 166 MakeDiagnosticsModel(const CommandLine & cmdline)167DiagnosticsModel* MakeDiagnosticsModel(const CommandLine& cmdline) { 168 FilePath user_data_dir = cmdline.GetSwitchValuePath(switches::kUserDataDir); 169 if (!user_data_dir.empty()) 170 PathService::Override(chrome::DIR_USER_DATA, user_data_dir); 171 #if defined(OS_WIN) 172 return new DiagnosticsModelWin(); 173 #elif defined(OS_MACOSX) 174 return new DiagnosticsModelMac(); 175 #elif defined(OS_POSIX) 176 return new DiagnosticsModelPosix(); 177 #endif 178 } 179