• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)167 DiagnosticsModel* 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