| // Copyright (c) 2011 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. |
| |
| // This file declares helper functions for use in tests that expect a valid |
| // installation, possibly of a specific type. Validation violations result in |
| // test failures. |
| |
| #include "chrome/installer/util/installation_validation_helper.h" |
| |
| #include "base/logging.h" |
| #include "base/strings/string_piece.h" |
| #include "chrome/installer/util/installation_state.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace installer { |
| |
| namespace { |
| |
| // A helper class that installs a log message handler to add a test failure for |
| // each ERROR message. Only one instance of this class may be live at a time. |
| class FailureLogHelper { |
| public: |
| FailureLogHelper(); |
| ~FailureLogHelper(); |
| |
| private: |
| static bool AddFailureForLogMessage(int severity, |
| const char* file, |
| int line, |
| size_t message_start, |
| const std::string& str); |
| |
| static const logging::LogSeverity kViolationSeverity_; |
| static logging::LogMessageHandlerFunction old_message_handler_; |
| static int old_min_log_level_; |
| }; |
| |
| // InstallationValidator logs all violations at ERROR level. |
| // static |
| const logging::LogSeverity |
| FailureLogHelper::kViolationSeverity_ = logging::LOG_ERROR; |
| |
| // static |
| logging::LogMessageHandlerFunction |
| FailureLogHelper::old_message_handler_ = NULL; |
| |
| // static |
| int FailureLogHelper::old_min_log_level_ = |
| FailureLogHelper::kViolationSeverity_; |
| |
| FailureLogHelper::FailureLogHelper() { |
| LOG_ASSERT(old_message_handler_ == NULL); |
| |
| // The validator logs at ERROR level. Ensure that it generates messages so we |
| // can transform them into test failures. |
| old_min_log_level_ = logging::GetMinLogLevel(); |
| if (old_min_log_level_ > kViolationSeverity_) |
| logging::SetMinLogLevel(kViolationSeverity_); |
| |
| old_message_handler_ = logging::GetLogMessageHandler(); |
| logging::SetLogMessageHandler(&AddFailureForLogMessage); |
| } |
| |
| FailureLogHelper::~FailureLogHelper() { |
| logging::SetLogMessageHandler(old_message_handler_); |
| old_message_handler_ = NULL; |
| |
| if (old_min_log_level_ > kViolationSeverity_) |
| logging::SetMinLogLevel(old_min_log_level_); |
| } |
| |
| // A logging::LogMessageHandlerFunction that adds a non-fatal test failure |
| // (i.e., similar to an unmet EXPECT_FOO) for each non-empty message logged at |
| // the severity of validation violations. All other messages are sent through |
| // the default logging pipeline. |
| // static |
| bool FailureLogHelper::AddFailureForLogMessage(int severity, |
| const char* file, |
| int line, |
| size_t message_start, |
| const std::string& str) { |
| if (severity == kViolationSeverity_ && !str.empty()) { |
| // Remove the trailing newline, if present. |
| size_t message_length = str.size() - message_start; |
| if (*str.rbegin() == '\n') |
| --message_length; |
| ADD_FAILURE_AT(file, line) |
| << base::StringPiece(str.c_str() + message_start, message_length); |
| return true; |
| } |
| |
| if (old_message_handler_ != NULL) |
| return (old_message_handler_)(severity, file, line, message_start, str); |
| |
| return false; |
| } |
| |
| } // namespace |
| |
| InstallationValidator::InstallationType ExpectValidInstallation( |
| bool system_level) { |
| FailureLogHelper log_helper; |
| InstallationValidator::InstallationType found_type = |
| InstallationValidator::NO_PRODUCTS; |
| |
| EXPECT_TRUE(InstallationValidator::ValidateInstallationType(system_level, |
| &found_type)); |
| return found_type; |
| } |
| |
| InstallationValidator::InstallationType ExpectValidInstallationForState( |
| const InstallationState& machine_state, |
| bool system_level) { |
| FailureLogHelper log_helper; |
| InstallationValidator::InstallationType found_type = |
| InstallationValidator::NO_PRODUCTS; |
| |
| EXPECT_TRUE(InstallationValidator::ValidateInstallationTypeForState( |
| machine_state, system_level, &found_type)); |
| return found_type; |
| } |
| |
| void ExpectInstallationOfType(bool system_level, |
| InstallationValidator::InstallationType type) { |
| EXPECT_EQ(type, ExpectValidInstallation(system_level)); |
| } |
| |
| void ExpectInstallationOfTypeForState( |
| const InstallationState& machine_state, |
| bool system_level, |
| InstallationValidator::InstallationType type) { |
| EXPECT_EQ(type, ExpectValidInstallationForState(machine_state, system_level)); |
| } |
| |
| } // namespace installer |