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