installation_validation_helper.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
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// This file declares helper functions for use in tests that expect a valid
6// installation, possibly of a specific type.  Validation violations result in
7// test failures.
8
9#include "chrome/installer/util/installation_validation_helper.h"
10
11#include "base/logging.h"
12#include "base/string_piece.h"
13#include "chrome/installer/util/installation_state.h"
14#include "testing/gtest/include/gtest/gtest.h"
15
16namespace installer {
17
18namespace {
19
20// A helper class that installs a log message handler to add a test failure for
21// each ERROR message.  Only one instance of this class may be live at a time.
22class FailureLogHelper {
23 public:
24  FailureLogHelper();
25  ~FailureLogHelper();
26
27 private:
28  static bool AddFailureForLogMessage(int severity,
29                                      const char* file,
30                                      int line,
31                                      size_t message_start,
32                                      const std::string& str);
33
34  static const logging::LogSeverity kViolationSeverity_;
35  static logging::LogMessageHandlerFunction old_message_handler_;
36  static int old_min_log_level_;
37};
38
39// InstallationValidator logs all violations at ERROR level.
40// static
41const logging::LogSeverity
42    FailureLogHelper::kViolationSeverity_ = logging::LOG_ERROR;
43
44// static
45logging::LogMessageHandlerFunction
46    FailureLogHelper::old_message_handler_ = NULL;
47
48// static
49int FailureLogHelper::old_min_log_level_ =
50    FailureLogHelper::kViolationSeverity_;
51
52FailureLogHelper::FailureLogHelper() {
53  LOG_ASSERT(old_message_handler_ == NULL);
54
55  // The validator logs at ERROR level.  Ensure that it generates messages so we
56  // can transform them into test failures.
57  old_min_log_level_ = logging::GetMinLogLevel();
58  if (old_min_log_level_ > kViolationSeverity_)
59    logging::SetMinLogLevel(kViolationSeverity_);
60
61  old_message_handler_ = logging::GetLogMessageHandler();
62  logging::SetLogMessageHandler(&AddFailureForLogMessage);
63}
64
65FailureLogHelper::~FailureLogHelper() {
66  logging::SetLogMessageHandler(old_message_handler_);
67  old_message_handler_ = NULL;
68
69  if (old_min_log_level_ > kViolationSeverity_)
70    logging::SetMinLogLevel(old_min_log_level_);
71}
72
73// A logging::LogMessageHandlerFunction that adds a non-fatal test failure
74// (i.e., similar to an unmet EXPECT_FOO) for each non-empty message logged at
75// the severity of validation violations.  All other messages are sent through
76// the default logging pipeline.
77// static
78bool FailureLogHelper::AddFailureForLogMessage(int severity,
79                                               const char* file,
80                                               int line,
81                                               size_t message_start,
82                                               const std::string& str) {
83  if (severity == kViolationSeverity_ && !str.empty()) {
84    // Remove the trailing newline, if present.
85    size_t message_length = str.size() - message_start;
86    if (*str.rbegin() == '\n')
87      --message_length;
88    ADD_FAILURE_AT(file, line)
89        << base::StringPiece(str.c_str() + message_start, message_length);
90    return true;
91  }
92
93  if (old_message_handler_ != NULL)
94    return (old_message_handler_)(severity, file, line, message_start, str);
95
96  return false;
97}
98
99}  // namespace
100
101InstallationValidator::InstallationType ExpectValidInstallation(
102    bool system_level) {
103  FailureLogHelper log_helper;
104  InstallationValidator::InstallationType found_type =
105      InstallationValidator::NO_PRODUCTS;
106
107  EXPECT_TRUE(InstallationValidator::ValidateInstallationType(system_level,
108                                                              &found_type));
109  return found_type;
110}
111
112InstallationValidator::InstallationType ExpectValidInstallationForState(
113    const InstallationState& machine_state,
114    bool system_level) {
115  FailureLogHelper log_helper;
116  InstallationValidator::InstallationType found_type =
117      InstallationValidator::NO_PRODUCTS;
118
119  EXPECT_TRUE(InstallationValidator::ValidateInstallationTypeForState(
120      machine_state, system_level, &found_type));
121  return found_type;
122}
123
124void ExpectInstallationOfType(bool system_level,
125                              InstallationValidator::InstallationType type) {
126  EXPECT_EQ(type, ExpectValidInstallation(system_level));
127}
128
129void ExpectInstallationOfTypeForState(
130    const InstallationState& machine_state,
131    bool system_level,
132    InstallationValidator::InstallationType type) {
133  EXPECT_EQ(type, ExpectValidInstallationForState(machine_state, system_level));
134}
135
136}  // namespace installer
137