| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/component_updater/sw_reporter_installer_win.h" | 5 #include "chrome/browser/component_updater/sw_reporter_installer_win.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 #include <memory> | 8 #include <memory> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <utility> | 10 #include <utility> |
| 11 | 11 |
| 12 #include "base/bind.h" | 12 #include "base/bind.h" |
| 13 #include "base/bind_helpers.h" | 13 #include "base/bind_helpers.h" |
| 14 #include "base/command_line.h" | 14 #include "base/command_line.h" |
| 15 #include "base/feature_list.h" | 15 #include "base/feature_list.h" |
| 16 #include "base/files/file_path.h" | 16 #include "base/files/file_path.h" |
| 17 #include "base/json/json_reader.h" | 17 #include "base/json/json_reader.h" |
| 18 #include "base/macros.h" | 18 #include "base/macros.h" |
| 19 #include "base/metrics/field_trial.h" | 19 #include "base/metrics/field_trial.h" |
| 20 #include "base/strings/stringprintf.h" | 20 #include "base/strings/stringprintf.h" |
| 21 #include "base/test/histogram_tester.h" | 21 #include "base/test/histogram_tester.h" |
| 22 #include "base/test/scoped_feature_list.h" | 22 #include "base/test/scoped_feature_list.h" |
| 23 #include "base/values.h" | 23 #include "base/values.h" |
| 24 #include "base/version.h" | 24 #include "base/version.h" |
| 25 #include "chrome/browser/safe_browsing/srt_fetcher_win.h" | 25 #include "chrome/browser/safe_browsing/srt_fetcher_win.h" |
| 26 #include "components/chrome_cleaner/public/constants/constants.h" |
| 26 #include "components/variations/variations_params_manager.h" | 27 #include "components/variations/variations_params_manager.h" |
| 27 #include "content/public/test/test_browser_thread_bundle.h" | 28 #include "content/public/test/test_browser_thread_bundle.h" |
| 28 #include "testing/gtest/include/gtest/gtest.h" | 29 #include "testing/gtest/include/gtest/gtest.h" |
| 29 | 30 |
| 30 namespace component_updater { | 31 namespace component_updater { |
| 31 | 32 |
| 32 namespace { | 33 namespace { |
| 33 | 34 |
| 34 constexpr char kExperimentGroupName[] = "my_test_engine_group"; | 35 constexpr char kExperimentGroupName[] = "my_test_engine_group"; |
| 35 | 36 |
| 36 constexpr char kEngineExperimentGroupSwitch[] = "engine-experiment-group"; | |
| 37 constexpr char kRegistrySuffixSwitch[] = "registry-suffix"; | |
| 38 constexpr char kSessionIdSwitch[] = "session-id"; | |
| 39 | |
| 40 constexpr char kErrorHistogramName[] = "SoftwareReporter.ExperimentErrors"; | 37 constexpr char kErrorHistogramName[] = "SoftwareReporter.ExperimentErrors"; |
| 41 constexpr char kExperimentTag[] = "experiment_tag"; | 38 constexpr char kExperimentTag[] = "experiment_tag"; |
| 42 constexpr char kMissingTag[] = "missing_tag"; | 39 constexpr char kMissingTag[] = "missing_tag"; |
| 43 | 40 |
| 44 using safe_browsing::SwReporterInvocation; | 41 using safe_browsing::SwReporterInvocation; |
| 45 | 42 |
| 46 } // namespace | 43 } // namespace |
| 47 | 44 |
| 48 class SwReporterInstallerTest : public ::testing::Test { | 45 class SwReporterInstallerTest : public ::testing::Test { |
| 49 public: | 46 public: |
| (...skipping 28 matching lines...) Expand all Loading... |
| 78 // Expects that the SwReporter was launched exactly once, with a session-id | 75 // Expects that the SwReporter was launched exactly once, with a session-id |
| 79 // switch. | 76 // switch. |
| 80 void ExpectDefaultInvocation() const { | 77 void ExpectDefaultInvocation() const { |
| 81 EXPECT_EQ(default_version_, launched_version_); | 78 EXPECT_EQ(default_version_, launched_version_); |
| 82 ASSERT_EQ(1U, launched_invocations_.size()); | 79 ASSERT_EQ(1U, launched_invocations_.size()); |
| 83 | 80 |
| 84 const SwReporterInvocation& invocation = launched_invocations_.front(); | 81 const SwReporterInvocation& invocation = launched_invocations_.front(); |
| 85 EXPECT_EQ(MakeTestFilePath(default_path_), | 82 EXPECT_EQ(MakeTestFilePath(default_path_), |
| 86 invocation.command_line.GetProgram()); | 83 invocation.command_line.GetProgram()); |
| 87 EXPECT_EQ(1U, invocation.command_line.GetSwitches().size()); | 84 EXPECT_EQ(1U, invocation.command_line.GetSwitches().size()); |
| 88 EXPECT_EQ( | 85 EXPECT_EQ(40U, invocation.command_line |
| 89 40U, | 86 .GetSwitchValueASCII(chrome_cleaner::kSessionIdSwitch) |
| 90 invocation.command_line.GetSwitchValueASCII(kSessionIdSwitch).size()); | 87 .size()); |
| 91 EXPECT_TRUE(invocation.command_line.GetArgs().empty()); | 88 EXPECT_TRUE(invocation.command_line.GetArgs().empty()); |
| 92 EXPECT_TRUE(invocation.suffix.empty()); | 89 EXPECT_TRUE(invocation.suffix.empty()); |
| 93 EXPECT_EQ(SwReporterInvocation::BEHAVIOUR_LOG_EXIT_CODE_TO_PREFS | | 90 EXPECT_EQ(SwReporterInvocation::BEHAVIOUR_LOG_EXIT_CODE_TO_PREFS | |
| 94 SwReporterInvocation::BEHAVIOUR_TRIGGER_PROMPT | | 91 SwReporterInvocation::BEHAVIOUR_TRIGGER_PROMPT | |
| 95 SwReporterInvocation::BEHAVIOUR_ALLOW_SEND_REPORTER_LOGS, | 92 SwReporterInvocation::BEHAVIOUR_ALLOW_SEND_REPORTER_LOGS, |
| 96 invocation.supported_behaviours); | 93 invocation.supported_behaviours); |
| 97 } | 94 } |
| 98 | 95 |
| 99 // |ComponentReady| asserts that it is run on the UI thread, so we must | 96 // |ComponentReady| asserts that it is run on the UI thread, so we must |
| 100 // create test threads before calling it. | 97 // create test threads before calling it. |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 167 // arguments and switches in this function.) | 164 // arguments and switches in this function.) |
| 168 void ExpectExperimentalInvocation( | 165 void ExpectExperimentalInvocation( |
| 169 const std::string& expected_suffix, | 166 const std::string& expected_suffix, |
| 170 const base::string16& expected_additional_argument) { | 167 const base::string16& expected_additional_argument) { |
| 171 EXPECT_EQ(default_version_, launched_version_); | 168 EXPECT_EQ(default_version_, launched_version_); |
| 172 ASSERT_EQ(1U, launched_invocations_.size()); | 169 ASSERT_EQ(1U, launched_invocations_.size()); |
| 173 | 170 |
| 174 const SwReporterInvocation& invocation = launched_invocations_.front(); | 171 const SwReporterInvocation& invocation = launched_invocations_.front(); |
| 175 EXPECT_EQ(MakeTestFilePath(default_path_), | 172 EXPECT_EQ(MakeTestFilePath(default_path_), |
| 176 invocation.command_line.GetProgram()); | 173 invocation.command_line.GetProgram()); |
| 177 EXPECT_EQ( | 174 EXPECT_EQ(40U, invocation.command_line |
| 178 40U, | 175 .GetSwitchValueASCII(chrome_cleaner::kSessionIdSwitch) |
| 179 invocation.command_line.GetSwitchValueASCII(kSessionIdSwitch).size()); | 176 .size()); |
| 180 EXPECT_EQ(kExperimentGroupName, invocation.command_line.GetSwitchValueASCII( | 177 EXPECT_EQ(kExperimentGroupName, |
| 181 kEngineExperimentGroupSwitch)); | 178 invocation.command_line.GetSwitchValueASCII( |
| 179 chrome_cleaner::kEngineExperimentGroupSwitch)); |
| 182 | 180 |
| 183 if (expected_suffix.empty()) { | 181 if (expected_suffix.empty()) { |
| 184 EXPECT_EQ(2U, invocation.command_line.GetSwitches().size()); | 182 EXPECT_EQ(2U, invocation.command_line.GetSwitches().size()); |
| 185 EXPECT_TRUE(invocation.suffix.empty()); | 183 EXPECT_TRUE(invocation.suffix.empty()); |
| 186 } else { | 184 } else { |
| 187 EXPECT_EQ(3U, invocation.command_line.GetSwitches().size()); | 185 EXPECT_EQ(3U, invocation.command_line.GetSwitches().size()); |
| 188 EXPECT_EQ(expected_suffix, invocation.command_line.GetSwitchValueASCII( | 186 EXPECT_EQ(expected_suffix, invocation.command_line.GetSwitchValueASCII( |
| 189 kRegistrySuffixSwitch)); | 187 chrome_cleaner::kRegistrySuffixSwitch)); |
| 190 EXPECT_EQ(expected_suffix, invocation.suffix); | 188 EXPECT_EQ(expected_suffix, invocation.suffix); |
| 191 } | 189 } |
| 192 | 190 |
| 193 if (expected_additional_argument.empty()) { | 191 if (expected_additional_argument.empty()) { |
| 194 EXPECT_TRUE(invocation.command_line.GetArgs().empty()); | 192 EXPECT_TRUE(invocation.command_line.GetArgs().empty()); |
| 195 } else { | 193 } else { |
| 196 EXPECT_EQ(1U, invocation.command_line.GetArgs().size()); | 194 EXPECT_EQ(1U, invocation.command_line.GetArgs().size()); |
| 197 EXPECT_EQ(expected_additional_argument, | 195 EXPECT_EQ(expected_additional_argument, |
| 198 invocation.command_line.GetArgs()[0]); | 196 invocation.command_line.GetArgs()[0]); |
| 199 } | 197 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 214 SwReporterInvocation invocation = launched_invocations_.front(); | 212 SwReporterInvocation invocation = launched_invocations_.front(); |
| 215 launched_invocations_.pop(); | 213 launched_invocations_.pop(); |
| 216 EXPECT_EQ(MakeTestFilePath(default_path_), | 214 EXPECT_EQ(MakeTestFilePath(default_path_), |
| 217 invocation.command_line.GetProgram()); | 215 invocation.command_line.GetProgram()); |
| 218 // There should be one switch added from the manifest, plus registry-suffix | 216 // There should be one switch added from the manifest, plus registry-suffix |
| 219 // added automatically. | 217 // added automatically. |
| 220 EXPECT_EQ(4U, invocation.command_line.GetSwitches().size()); | 218 EXPECT_EQ(4U, invocation.command_line.GetSwitches().size()); |
| 221 EXPECT_EQ(expected_engine, | 219 EXPECT_EQ(expected_engine, |
| 222 invocation.command_line.GetSwitchValueASCII("engine")); | 220 invocation.command_line.GetSwitchValueASCII("engine")); |
| 223 EXPECT_EQ(expected_suffix, invocation.command_line.GetSwitchValueASCII( | 221 EXPECT_EQ(expected_suffix, invocation.command_line.GetSwitchValueASCII( |
| 224 kRegistrySuffixSwitch)); | 222 chrome_cleaner::kRegistrySuffixSwitch)); |
| 225 *out_session_id = | 223 *out_session_id = invocation.command_line.GetSwitchValueASCII( |
| 226 invocation.command_line.GetSwitchValueASCII(kSessionIdSwitch); | 224 chrome_cleaner::kSessionIdSwitch); |
| 227 EXPECT_EQ(40U, out_session_id->size()); | 225 EXPECT_EQ(40U, out_session_id->size()); |
| 228 EXPECT_EQ(kExperimentGroupName, invocation.command_line.GetSwitchValueASCII( | 226 EXPECT_EQ(kExperimentGroupName, |
| 229 kEngineExperimentGroupSwitch)); | 227 invocation.command_line.GetSwitchValueASCII( |
| 228 chrome_cleaner::kEngineExperimentGroupSwitch)); |
| 230 ASSERT_TRUE(invocation.command_line.GetArgs().empty()); | 229 ASSERT_TRUE(invocation.command_line.GetArgs().empty()); |
| 231 EXPECT_EQ(expected_suffix, invocation.suffix); | 230 EXPECT_EQ(expected_suffix, invocation.suffix); |
| 232 EXPECT_EQ(expected_behaviours, invocation.supported_behaviours); | 231 EXPECT_EQ(expected_behaviours, invocation.supported_behaviours); |
| 233 } | 232 } |
| 234 | 233 |
| 235 void ExpectLaunchError() { | 234 void ExpectLaunchError() { |
| 236 // The SwReporter should not be launched, and an error should be logged. | 235 // The SwReporter should not be launched, and an error should be logged. |
| 237 EXPECT_TRUE(launched_invocations_.empty()); | 236 EXPECT_TRUE(launched_invocations_.empty()); |
| 238 histograms_.ExpectUniqueSample(kErrorHistogramName, | 237 histograms_.ExpectUniqueSample(kErrorHistogramName, |
| 239 SW_REPORTER_EXPERIMENT_ERROR_BAD_PARAMS, 1); | 238 SW_REPORTER_EXPERIMENT_ERROR_BAD_PARAMS, 1); |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 329 // The SwReporter should be launched once with the given arguments. | 328 // The SwReporter should be launched once with the given arguments. |
| 330 EXPECT_EQ(default_version_, launched_version_); | 329 EXPECT_EQ(default_version_, launched_version_); |
| 331 ASSERT_EQ(1U, launched_invocations_.size()); | 330 ASSERT_EQ(1U, launched_invocations_.size()); |
| 332 | 331 |
| 333 const SwReporterInvocation& invocation = launched_invocations_.front(); | 332 const SwReporterInvocation& invocation = launched_invocations_.front(); |
| 334 EXPECT_EQ(MakeTestFilePath(default_path_), | 333 EXPECT_EQ(MakeTestFilePath(default_path_), |
| 335 invocation.command_line.GetProgram()); | 334 invocation.command_line.GetProgram()); |
| 336 EXPECT_EQ(4U, invocation.command_line.GetSwitches().size()); | 335 EXPECT_EQ(4U, invocation.command_line.GetSwitches().size()); |
| 337 EXPECT_EQ("experimental", | 336 EXPECT_EQ("experimental", |
| 338 invocation.command_line.GetSwitchValueASCII("engine")); | 337 invocation.command_line.GetSwitchValueASCII("engine")); |
| 339 EXPECT_EQ("TestSuffix", | 338 EXPECT_EQ("TestSuffix", invocation.command_line.GetSwitchValueASCII( |
| 340 invocation.command_line.GetSwitchValueASCII(kRegistrySuffixSwitch)); | 339 chrome_cleaner::kRegistrySuffixSwitch)); |
| 341 EXPECT_EQ( | 340 EXPECT_EQ(40U, invocation.command_line |
| 342 40U, | 341 .GetSwitchValueASCII(chrome_cleaner::kSessionIdSwitch) |
| 343 invocation.command_line.GetSwitchValueASCII(kSessionIdSwitch).size()); | 342 .size()); |
| 344 EXPECT_EQ(kExperimentGroupName, invocation.command_line.GetSwitchValueASCII( | 343 EXPECT_EQ(kExperimentGroupName, |
| 345 kEngineExperimentGroupSwitch)); | 344 invocation.command_line.GetSwitchValueASCII( |
| 345 chrome_cleaner::kEngineExperimentGroupSwitch)); |
| 346 ASSERT_EQ(1U, invocation.command_line.GetArgs().size()); | 346 ASSERT_EQ(1U, invocation.command_line.GetArgs().size()); |
| 347 EXPECT_EQ(L"random argument", invocation.command_line.GetArgs()[0]); | 347 EXPECT_EQ(L"random argument", invocation.command_line.GetArgs()[0]); |
| 348 EXPECT_EQ("TestSuffix", invocation.suffix); | 348 EXPECT_EQ("TestSuffix", invocation.suffix); |
| 349 EXPECT_EQ(0U, invocation.supported_behaviours); | 349 EXPECT_EQ(0U, invocation.supported_behaviours); |
| 350 histograms_.ExpectTotalCount(kErrorHistogramName, 0); | 350 histograms_.ExpectTotalCount(kErrorHistogramName, 0); |
| 351 } | 351 } |
| 352 | 352 |
| 353 TEST_F(ExperimentalSwReporterInstallerTest, MultipleInvocations) { | 353 TEST_F(ExperimentalSwReporterInstallerTest, MultipleInvocations) { |
| 354 SwReporterInstallerTraits traits(launched_callback_, true); | 354 SwReporterInstallerTraits traits(launched_callback_, true); |
| 355 CreateFeatureWithTag(kExperimentTag); | 355 CreateFeatureWithTag(kExperimentTag); |
| (...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 729 traits.ComponentReady( | 729 traits.ComponentReady( |
| 730 default_version_, default_path_, | 730 default_version_, default_path_, |
| 731 base::DictionaryValue::From(base::JSONReader::Read(kTestManifest))); | 731 base::DictionaryValue::From(base::JSONReader::Read(kTestManifest))); |
| 732 | 732 |
| 733 // The SwReporter should not be launched, and an error should be logged. | 733 // The SwReporter should not be launched, and an error should be logged. |
| 734 EXPECT_TRUE(launched_invocations_.empty()); | 734 EXPECT_TRUE(launched_invocations_.empty()); |
| 735 histograms_.ExpectUniqueSample(kErrorHistogramName, | 735 histograms_.ExpectUniqueSample(kErrorHistogramName, |
| 736 SW_REPORTER_EXPERIMENT_ERROR_BAD_PARAMS, 1); | 736 SW_REPORTER_EXPERIMENT_ERROR_BAD_PARAMS, 1); |
| 737 } | 737 } |
| 738 } // namespace component_updater | 738 } // namespace component_updater |
| OLD | NEW |