| Index: chrome/browser/diagnostics/diagnostics_controller_unittest.cc
 | 
| diff --git a/chrome/browser/diagnostics/diagnostics_controller_unittest.cc b/chrome/browser/diagnostics/diagnostics_controller_unittest.cc
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..ae7d5c3c9890a0ba142a2b7d63ff3ab85d95e477
 | 
| --- /dev/null
 | 
| +++ b/chrome/browser/diagnostics/diagnostics_controller_unittest.cc
 | 
| @@ -0,0 +1,167 @@
 | 
| +// Copyright (c) 2013 The Chromium Authors. All rights reserved.
 | 
| +// Use of this source code is governed by a BSD-style license that can be
 | 
| +// found in the LICENSE file.
 | 
| +
 | 
| +#include "chrome/browser/diagnostics/diagnostics_controller.h"
 | 
| +
 | 
| +#include "base/command_line.h"
 | 
| +#include "base/file_util.h"
 | 
| +#include "base/files/scoped_temp_dir.h"
 | 
| +#include "base/memory/scoped_ptr.h"
 | 
| +#include "base/path_service.h"
 | 
| +#include "chrome/browser/diagnostics/diagnostics_model.h"
 | 
| +#include "chrome/browser/diagnostics/diagnostics_writer.h"
 | 
| +#include "chrome/browser/diagnostics/sqlite_diagnostics.h"
 | 
| +#include "chrome/common/chrome_paths.h"
 | 
| +#include "chrome/common/chrome_switches.h"
 | 
| +#include "chromeos/chromeos_constants.h"
 | 
| +#include "testing/gtest/include/gtest/gtest.h"
 | 
| +
 | 
| +namespace diagnostics {
 | 
| +
 | 
| +// Basic harness to acquire and release the required temporary environment to
 | 
| +// run a test in.
 | 
| +class DiagnosticsControllerTest : public testing::Test {
 | 
| + protected:
 | 
| +  DiagnosticsControllerTest() : cmdline_(CommandLine::NO_PROGRAM) {}
 | 
| +
 | 
| +  virtual ~DiagnosticsControllerTest() {}
 | 
| +
 | 
| +  virtual void SetUp() {
 | 
| +    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
 | 
| +    base::FilePath test_data;
 | 
| +    PathService::Get(chrome::DIR_TEST_DATA, &test_data);
 | 
| +    test_data = test_data.Append(FILE_PATH_LITERAL("diagnostics"));
 | 
| +    test_data = test_data.Append(FILE_PATH_LITERAL("user"));
 | 
| +    base::CopyDirectory(test_data, temp_dir_.path(), true);
 | 
| +    profile_dir_ = temp_dir_.path().Append(FILE_PATH_LITERAL("user"));
 | 
| +
 | 
| +#if defined(OS_CHROMEOS)
 | 
| +    // Redirect the home dir to the profile directory. We have to do this
 | 
| +    // because NSS uses the HOME directory to find where to store it's database,
 | 
| +    // so that's where the diagnostics and recovery code looks for it.
 | 
| +
 | 
| +    // Preserve existing home directory setting, if any.
 | 
| +    const char* old_home_dir = ::getenv("HOME");
 | 
| +    if (old_home_dir)
 | 
| +      old_home_dir_ = old_home_dir;
 | 
| +    else
 | 
| +      old_home_dir_.clear();
 | 
| +    ::setenv("HOME", profile_dir_.value().c_str(), 1);
 | 
| +#endif
 | 
| +
 | 
| +    cmdline_ = CommandLine(CommandLine::NO_PROGRAM);
 | 
| +    cmdline_.AppendSwitchPath(switches::kUserDataDir, profile_dir_);
 | 
| +    cmdline_.AppendSwitch(switches::kDiagnostics);
 | 
| +    cmdline_.AppendSwitch(switches::kDiagnosticsRecovery);
 | 
| +    writer_.reset();
 | 
| +    // Use this writer instead, if you want to see the diagnostics output.
 | 
| +    // writer_.reset(new DiagnosticsWriter(DiagnosticsWriter::MACHINE));
 | 
| +  }
 | 
| +
 | 
| +  virtual void TearDown() {
 | 
| +    DiagnosticsController::GetInstance()->ClearResults();
 | 
| +#if defined(OS_CHROMEOS)
 | 
| +    if (!old_home_dir_.empty()) {
 | 
| +      ::setenv("HOME", old_home_dir_.c_str(), 1);
 | 
| +    } else {
 | 
| +      ::unsetenv("HOME");
 | 
| +    }
 | 
| +    old_home_dir_.clear();
 | 
| +#endif
 | 
| +  }
 | 
| +
 | 
| +  void CorruptDataFile(const base::FilePath& path) {
 | 
| +    // Just write some random characters into the file tInvaludUsero "corrupt"
 | 
| +    // it.
 | 
| +    const char bogus_data[] = "wwZ2uNYNuyUVzFbDm3DL";
 | 
| +    file_util::WriteFile(path, bogus_data, arraysize(bogus_data));
 | 
| +  }
 | 
| +
 | 
| +  scoped_ptr<DiagnosticsModel> model_;
 | 
| +  CommandLine cmdline_;
 | 
| +  base::ScopedTempDir temp_dir_;
 | 
| +  scoped_ptr<DiagnosticsWriter> writer_;
 | 
| +  base::FilePath profile_dir_;
 | 
| +
 | 
| +#if defined(OS_CHROMEOS)
 | 
| +  std::string old_home_dir_;
 | 
| +#endif
 | 
| +
 | 
| +  DISALLOW_COPY_AND_ASSIGN(DiagnosticsControllerTest);
 | 
| +};
 | 
| +
 | 
| +TEST_F(DiagnosticsControllerTest, Diagnostics) {
 | 
| +  DiagnosticsController::GetInstance()->Run(cmdline_, writer_.get());
 | 
| +  EXPECT_TRUE(DiagnosticsController::GetInstance()->HasResults());
 | 
| +  const DiagnosticsModel& results =
 | 
| +      DiagnosticsController::GetInstance()->GetResults();
 | 
| +  EXPECT_EQ(results.GetTestRunCount(), results.GetTestAvailableCount());
 | 
| +  EXPECT_EQ(DiagnosticsModel::kDiagnosticsTestCount, results.GetTestRunCount());
 | 
| +  for (int i = 0; i < results.GetTestRunCount(); ++i) {
 | 
| +    const DiagnosticsModel::TestInfo& info(results.GetTest(i));
 | 
| +    EXPECT_EQ(DiagnosticsModel::TEST_OK, info.GetResult()) << "Test: "
 | 
| +                                                           << info.GetId();
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +TEST_F(DiagnosticsControllerTest, RecoverAllOK) {
 | 
| +  DiagnosticsController::GetInstance()->Run(cmdline_, writer_.get());
 | 
| +  DiagnosticsController::GetInstance()->RunRecovery(cmdline_, writer_.get());
 | 
| +  EXPECT_TRUE(DiagnosticsController::GetInstance()->HasResults());
 | 
| +  const DiagnosticsModel& results =
 | 
| +      DiagnosticsController::GetInstance()->GetResults();
 | 
| +  EXPECT_EQ(results.GetTestRunCount(), results.GetTestAvailableCount());
 | 
| +  EXPECT_EQ(DiagnosticsModel::kDiagnosticsTestCount, results.GetTestRunCount());
 | 
| +  for (int i = 0; i < results.GetTestRunCount(); ++i) {
 | 
| +    const DiagnosticsModel::TestInfo& info(results.GetTest(i));
 | 
| +    EXPECT_EQ(DiagnosticsModel::RECOVERY_OK, info.GetResult()) << "Test: "
 | 
| +                                                               << info.GetId();
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +#if defined(OS_CHROMEOS)
 | 
| +TEST_F(DiagnosticsControllerTest, RecoverFromNssCertDbFailure) {
 | 
| +  base::FilePath db_path = profile_dir_.Append(chromeos::kNssCertDbPath);
 | 
| +  EXPECT_TRUE(base::PathExists(db_path));
 | 
| +  CorruptDataFile(db_path);
 | 
| +  DiagnosticsController::GetInstance()->Run(cmdline_, writer_.get());
 | 
| +  ASSERT_TRUE(DiagnosticsController::GetInstance()->HasResults());
 | 
| +  const DiagnosticsModel& results =
 | 
| +      DiagnosticsController::GetInstance()->GetResults();
 | 
| +  EXPECT_EQ(results.GetTestRunCount(), results.GetTestAvailableCount());
 | 
| +  EXPECT_EQ(DiagnosticsModel::kDiagnosticsTestCount, results.GetTestRunCount());
 | 
| +
 | 
| +  const DiagnosticsModel::TestInfo* info = NULL;
 | 
| +  EXPECT_TRUE(results.GetTestInfo(kSQLiteIntegrityNSSCertTest, &info));
 | 
| +  EXPECT_EQ(DiagnosticsModel::TEST_FAIL_CONTINUE, info->GetResult());
 | 
| +  EXPECT_EQ(DIAG_SQLITE_ERROR_HANDLER_CALLED, info->GetOutcomeCode());
 | 
| +
 | 
| +  DiagnosticsController::GetInstance()->RunRecovery(cmdline_, writer_.get());
 | 
| +  EXPECT_EQ(DiagnosticsModel::RECOVERY_OK, info->GetResult());
 | 
| +  EXPECT_FALSE(base::PathExists(db_path));
 | 
| +}
 | 
| +
 | 
| +TEST_F(DiagnosticsControllerTest, RecoverFromNssKeyDbFailure) {
 | 
| +  base::FilePath db_path = profile_dir_.Append(chromeos::kNssKeyDbPath);
 | 
| +  EXPECT_TRUE(base::PathExists(db_path));
 | 
| +  CorruptDataFile(db_path);
 | 
| +  DiagnosticsController::GetInstance()->Run(cmdline_, writer_.get());
 | 
| +  ASSERT_TRUE(DiagnosticsController::GetInstance()->HasResults());
 | 
| +  const DiagnosticsModel& results =
 | 
| +      DiagnosticsController::GetInstance()->GetResults();
 | 
| +  EXPECT_EQ(results.GetTestRunCount(), results.GetTestAvailableCount());
 | 
| +  EXPECT_EQ(DiagnosticsModel::kDiagnosticsTestCount, results.GetTestRunCount());
 | 
| +
 | 
| +  const DiagnosticsModel::TestInfo* info = NULL;
 | 
| +  EXPECT_TRUE(results.GetTestInfo(kSQLiteIntegrityNSSKeyTest, &info));
 | 
| +  EXPECT_EQ(DiagnosticsModel::TEST_FAIL_CONTINUE, info->GetResult());
 | 
| +  EXPECT_EQ(DIAG_SQLITE_ERROR_HANDLER_CALLED, info->GetOutcomeCode());
 | 
| +
 | 
| +  DiagnosticsController::GetInstance()->RunRecovery(cmdline_, writer_.get());
 | 
| +  EXPECT_EQ(DiagnosticsModel::RECOVERY_OK, info->GetResult());
 | 
| +  EXPECT_FALSE(base::PathExists(db_path));
 | 
| +}
 | 
| +#endif
 | 
| +
 | 
| +}  // namespace diagnostics
 | 
| 
 |