| // Copyright 2021 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <cstdlib> |
| #include <memory> |
| #include <optional> |
| #include <string> |
| |
| #include "base/files/file_path.h" |
| #include "base/files/file_util.h" |
| #include "base/memory/scoped_refptr.h" |
| #include "base/notreached.h" |
| #include "base/time/time.h" |
| #include "base/values.h" |
| #include "base/version.h" |
| #include "build/build_config.h" |
| #include "chrome/updater/external_constants.h" |
| #include "chrome/updater/test/integration_test_commands.h" |
| #include "chrome/updater/test/integration_tests_impl.h" |
| #include "chrome/updater/test/server.h" |
| #include "chrome/updater/update_service.h" |
| #include "chrome/updater/updater_scope.h" |
| #include "chrome/updater/util/util.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "url/gurl.h" |
| |
| namespace updater::test { |
| |
| class IntegrationTestCommandsUser : public IntegrationTestCommands { |
| public: |
| explicit IntegrationTestCommandsUser(UpdaterScope scope) |
| : updater_scope_(scope) {} |
| |
| void ExpectNoCrashes() const override { |
| updater::test::ExpectNoCrashes(updater_scope_); |
| } |
| |
| void PrintLog() const override { updater::test::PrintLog(updater_scope_); } |
| |
| void CopyLog(const std::string& infix) const override { |
| std::optional<base::FilePath> path = GetInstallDirectory(updater_scope_); |
| EXPECT_TRUE(path); |
| if (path) { |
| updater::test::CopyLog(*path, infix); |
| } |
| } |
| |
| void Clean() const override { updater::test::Clean(updater_scope_); } |
| |
| void ExpectClean() const override { |
| updater::test::ExpectClean(updater_scope_); |
| } |
| |
| void Install(const base::Value::List& switches) const override { |
| updater::test::Install(updater_scope_, switches); |
| } |
| |
| void InstallUpdaterAndApp(const std::string& app_id, |
| const bool is_silent_install, |
| const std::string& tag, |
| const std::string& child_window_text_to_find, |
| const bool always_launch_cmd, |
| const bool verify_app_logo_loaded, |
| const bool expect_success, |
| const bool wait_for_the_installer, |
| const int expected_exit_code, |
| const base::Value::List& additional_switches, |
| const base::FilePath& updater_path) const override { |
| updater::test::InstallUpdaterAndApp( |
| updater_scope_, app_id, is_silent_install, tag, |
| child_window_text_to_find, always_launch_cmd, verify_app_logo_loaded, |
| expect_success, wait_for_the_installer, expected_exit_code, |
| additional_switches, updater_path); |
| } |
| |
| void ExpectInstalled() const override { |
| updater::test::ExpectInstalled(updater_scope_); |
| } |
| |
| void Uninstall() const override { updater::test::Uninstall(updater_scope_); } |
| |
| void ExpectCandidateUninstalled() const override { |
| updater::test::ExpectCandidateUninstalled(updater_scope_); |
| } |
| |
| void EnterTestMode(const GURL& update_url, |
| const GURL& crash_upload_url, |
| const GURL& app_logo_url, |
| const GURL& event_logging_url, |
| base::TimeDelta idle_timeout, |
| base::TimeDelta server_keep_alive_time, |
| base::TimeDelta ceca_connection_timeout, |
| std::optional<EventLoggingPermissionProvider> |
| event_logging_permission_provider) const override { |
| updater::test::EnterTestMode( |
| update_url, crash_upload_url, app_logo_url, event_logging_url, |
| idle_timeout, server_keep_alive_time, ceca_connection_timeout, |
| std::move(event_logging_permission_provider)); |
| } |
| |
| void ExitTestMode() const override { |
| updater::test::ExitTestMode(updater_scope_); |
| } |
| |
| void ExpectSelfUpdateSequence(ScopedServer* test_server) const override { |
| updater::test::ExpectSelfUpdateSequence(updater_scope_, test_server); |
| } |
| |
| void SetDictPolicies(const base::Value::Dict& values) const override { |
| updater::test::SetDictPolicies(values); |
| } |
| |
| void SetPlatformPolicies(const base::Value::Dict& values) const override { |
| updater::test::SetPlatformPolicies(values); |
| } |
| |
| void SetMachineManaged(bool is_managed_device) const override { |
| updater::test::SetMachineManaged(is_managed_device); |
| } |
| |
| void ExpectPing(ScopedServer* test_server, |
| int event_type, |
| std::optional<GURL> target_url) const override { |
| updater::test::ExpectPing(updater_scope_, test_server, event_type, |
| target_url); |
| } |
| |
| void ExpectAppCommandPing( |
| ScopedServer* test_server, |
| const std::string& appid, |
| const std::string& appcommandid, |
| int errorcode, |
| int eventresult, |
| int event_type, |
| const base::Version& version, |
| const base::Version& updater_version) const override { |
| updater::test::ExpectAppCommandPing(updater_scope_, test_server, appid, |
| appcommandid, errorcode, eventresult, |
| event_type, version, updater_version); |
| } |
| |
| void ExpectUpdateCheckRequest(ScopedServer* test_server) const override { |
| updater::test::ExpectUpdateCheckRequest(updater_scope_, test_server); |
| } |
| |
| void ExpectUpdateCheckSequence( |
| ScopedServer* test_server, |
| const std::string& app_id, |
| UpdateService::Priority priority, |
| const base::Version& from_version, |
| const base::Version& to_version, |
| const base::Version& updater_version) const override { |
| updater::test::ExpectUpdateCheckSequence(updater_scope_, test_server, |
| app_id, priority, from_version, |
| to_version, updater_version); |
| } |
| |
| void ExpectUpdateSequence(ScopedServer* test_server, |
| const std::string& app_id, |
| const std::string& install_data_index, |
| UpdateService::Priority priority, |
| const base::Version& from_version, |
| const base::Version& to_version, |
| bool do_fault_injection, |
| bool skip_download, |
| const base::Version& updater_version, |
| const std::string& event_regex) const override { |
| updater::test::ExpectUpdateSequence( |
| updater_scope_, test_server, app_id, install_data_index, priority, |
| from_version, to_version, do_fault_injection, skip_download, |
| updater_version); |
| } |
| |
| void ExpectUpdateSequenceBadHash( |
| ScopedServer* test_server, |
| const std::string& app_id, |
| const std::string& install_data_index, |
| UpdateService::Priority priority, |
| const base::Version& from_version, |
| const base::Version& to_version) const override { |
| updater::test::ExpectUpdateSequenceBadHash( |
| updater_scope_, test_server, app_id, install_data_index, priority, |
| from_version, to_version); |
| } |
| |
| void ExpectInstallSequence(ScopedServer* test_server, |
| const std::string& app_id, |
| const std::string& install_data_index, |
| UpdateService::Priority priority, |
| const base::Version& from_version, |
| const base::Version& to_version, |
| bool do_fault_injection, |
| bool skip_download, |
| const base::Version& updater_version, |
| const std::string& event_regex) const override { |
| updater::test::ExpectInstallSequence( |
| updater_scope_, test_server, app_id, install_data_index, priority, |
| from_version, to_version, do_fault_injection, skip_download, |
| updater_version, event_regex); |
| } |
| |
| void ExpectEnterpriseCompanionAppOTAInstallSequence( |
| ScopedServer* test_server) const override { |
| updater::test::ExpectEnterpriseCompanionAppOTAInstallSequence(test_server); |
| } |
| |
| void ExpectVersionActive(const std::string& version) const override { |
| updater::test::ExpectVersionActive(updater_scope_, version); |
| } |
| |
| void ExpectVersionNotActive(const std::string& version) const override { |
| updater::test::ExpectVersionNotActive(updater_scope_, version); |
| } |
| |
| void SetupFakeUpdaterHigherVersion() const override { |
| updater::test::SetupFakeUpdaterHigherVersion(updater_scope_); |
| } |
| |
| void SetupFakeUpdaterLowerVersion() const override { |
| updater::test::SetupFakeUpdaterLowerVersion(updater_scope_); |
| } |
| |
| void SetupRealUpdater(const base::FilePath& updater_path, |
| const base::Value::List& switches) const override { |
| updater::test::SetupRealUpdater(updater_scope_, updater_path, switches); |
| } |
| |
| void SetExistenceCheckerPath(const std::string& app_id, |
| const base::FilePath& path) const override { |
| updater::test::SetExistenceCheckerPath(updater_scope_, app_id, path); |
| } |
| |
| void SetServerStarts(int value) const override { |
| updater::test::SetServerStarts(updater_scope_, value); |
| } |
| |
| void FillLog() const override { updater::test::FillLog(updater_scope_); } |
| |
| void ExpectLogRotated() const override { |
| updater::test::ExpectLogRotated(updater_scope_); |
| } |
| |
| void ExpectRegistered(const std::string& app_id) const override { |
| updater::test::ExpectRegistered(updater_scope_, app_id); |
| } |
| |
| void ExpectNotRegistered(const std::string& app_id) const override { |
| updater::test::ExpectNotRegistered(updater_scope_, app_id); |
| } |
| |
| void ExpectAppTag(const std::string& app_id, |
| const std::string& tag) const override { |
| updater::test::ExpectAppTag(updater_scope_, app_id, tag); |
| } |
| |
| void SetAppTag(const std::string& app_id, |
| const std::string& tag) const override { |
| updater::test::SetAppTag(updater_scope_, app_id, tag); |
| } |
| |
| void ExpectAppVersion(const std::string& app_id, |
| const base::Version& version) const override { |
| updater::test::ExpectAppVersion(updater_scope_, app_id, version); |
| } |
| |
| void SetActive(const std::string& app_id) const override { |
| updater::test::SetActive(updater_scope_, app_id); |
| } |
| |
| void ExpectActive(const std::string& app_id) const override { |
| updater::test::ExpectActive(updater_scope_, app_id); |
| } |
| |
| void ExpectNotActive(const std::string& app_id) const override { |
| updater::test::ExpectNotActive(updater_scope_, app_id); |
| } |
| |
| void RunWake(int exit_code, const base::Version& version) const override { |
| updater::test::RunWake(updater_scope_, exit_code, version); |
| } |
| |
| void RunWakeAll() const override { |
| updater::test::RunWakeAll(updater_scope_); |
| } |
| |
| void RunCrashMe() const override { |
| updater::test::RunCrashMe(updater_scope_); |
| } |
| |
| void RunWakeActive(int exit_code) const override { |
| updater::test::RunWakeActive(updater_scope_, exit_code); |
| } |
| |
| void RunServer(int exit_code, bool internal) const override { |
| updater::test::RunServer(updater_scope_, exit_code, internal); |
| } |
| |
| void RegisterApp(const RegistrationRequest& registration) const override { |
| updater::test::RegisterApp(updater_scope_, registration); |
| } |
| |
| void CheckForUpdate(const std::string& app_id) const override { |
| updater::test::CheckForUpdate(updater_scope_, app_id); |
| } |
| |
| void ExpectCheckForUpdateOppositeScopeFails( |
| const std::string& app_id) const override { |
| updater::test::ExpectCheckForUpdateOppositeScopeFails(updater_scope_, |
| app_id); |
| } |
| |
| void Update(const std::string& app_id, |
| const std::string& install_data_index) const override { |
| updater::test::Update(updater_scope_, app_id, install_data_index); |
| } |
| |
| void UpdateAll() const override { updater::test::UpdateAll(updater_scope_); } |
| |
| void GetAppStates( |
| const base::Value::Dict& expected_app_states) const override { |
| updater::test::GetAppStates(updater_scope_, expected_app_states); |
| } |
| |
| void DeleteUpdaterDirectory() const override { |
| updater::test::DeleteUpdaterDirectory(updater_scope_); |
| } |
| |
| void DeleteActiveUpdaterExecutable() const override { |
| updater::test::DeleteActiveUpdaterExecutable(updater_scope_); |
| } |
| |
| void DeleteFile(const base::FilePath& path) const override { |
| updater::test::DeleteFile(updater_scope_, path); |
| } |
| |
| void InstallApp(const std::string& app_id, |
| const base::Version& version) const override { |
| updater::test::InstallApp(updater_scope_, app_id, version); |
| } |
| |
| #if BUILDFLAG(IS_WIN) |
| void ExpectInterfacesRegistered() const override { |
| updater::test::ExpectInterfacesRegistered(updater_scope_); |
| } |
| |
| void ExpectMarshalInterfaceSucceeds() const override { |
| updater::test::ExpectMarshalInterfaceSucceeds(updater_scope_); |
| } |
| |
| void ExpectLegacyUpdate3WebSucceeds( |
| const std::string& app_id, |
| AppBundleWebCreateMode app_bundle_web_create_mode, |
| int expected_final_state, |
| int expected_error_code, |
| bool cancel_when_downloading) const override { |
| updater::test::ExpectLegacyUpdate3WebSucceeds( |
| updater_scope_, app_id, app_bundle_web_create_mode, |
| expected_final_state, expected_error_code, cancel_when_downloading); |
| } |
| |
| void ExpectLegacyProcessLauncherSucceeds() const override { |
| updater::test::ExpectLegacyProcessLauncherSucceeds(updater_scope_); |
| } |
| |
| void ExpectLegacyAppCommandWebSucceeds( |
| const std::string& app_id, |
| const std::string& command_id, |
| const base::Value::List& parameters, |
| int expected_exit_code) const override { |
| updater::test::ExpectLegacyAppCommandWebSucceeds( |
| updater_scope_, app_id, command_id, parameters, expected_exit_code); |
| } |
| |
| void ExpectLegacyPolicyStatusSucceeds( |
| const base::Version& updater_version) const override { |
| updater::test::ExpectLegacyPolicyStatusSucceeds(updater_scope_, |
| updater_version); |
| } |
| |
| void LegacyInstallApp(const std::string& app_id, |
| const base::Version& version) const override { |
| updater::test::LegacyInstallApp(updater_scope_, app_id, version); |
| } |
| |
| void RunUninstallCmdLine() const override { |
| updater::test::RunUninstallCmdLine(updater_scope_); |
| } |
| |
| void RunHandoff(const std::string& app_id) const override { |
| updater::test::RunHandoff(updater_scope_, app_id); |
| } |
| #endif // BUILDFLAG(IS_WIN) |
| |
| void InstallAppViaService( |
| const std::string& app_id, |
| const base::Value::Dict& expected_final_values) const override { |
| updater::test::InstallAppViaService(updater_scope_, app_id, |
| expected_final_values); |
| } |
| |
| base::FilePath GetDifferentUserPath() const override { |
| #if BUILDFLAG(IS_MAC) |
| // /Library is owned by root. |
| return base::FilePath(FILE_PATH_LITERAL("/Library")); |
| #else |
| NOTREACHED() << __func__ << ": not implemented."; |
| #endif |
| } |
| |
| void StressUpdateService() const override { |
| updater::test::StressUpdateService(updater_scope_); |
| } |
| |
| void CallServiceUpdate(const std::string& app_id, |
| const std::string& install_data_index, |
| UpdateService::PolicySameVersionUpdate |
| policy_same_version_update) const override { |
| updater::test::CallServiceUpdate( |
| updater_scope_, app_id, install_data_index, |
| policy_same_version_update == |
| UpdateService::PolicySameVersionUpdate::kAllowed); |
| } |
| |
| void SetupFakeLegacyUpdater() const override { |
| updater::test::SetupFakeLegacyUpdater(updater_scope_); |
| } |
| |
| #if BUILDFLAG(IS_WIN) |
| void RunFakeLegacyUpdater() const override { |
| updater::test::RunFakeLegacyUpdater(updater_scope_); |
| } |
| #endif // BUILDFLAG(IS_WIN) |
| |
| #if BUILDFLAG(IS_MAC) |
| void PrivilegedHelperInstall() const override { |
| updater::test::PrivilegedHelperInstall(updater_scope_); |
| } |
| |
| void DeleteLegacyUpdater() const override { |
| updater::test::DeleteLegacyUpdater(updater_scope_); |
| } |
| |
| void ExpectPrepareToRunBundleSuccess( |
| const base::FilePath& bundle_path) const override { |
| updater::test::ExpectPrepareToRunBundleSuccess(bundle_path); |
| } |
| |
| void ExpectKSAdminFetchTag( |
| bool elevate, |
| const std::string& product_id, |
| const base::FilePath& xc_path, |
| std::optional<UpdaterScope> store_flag, |
| std::optional<std::string> want_tag) const override { |
| updater::test::ExpectKSAdminFetchTag(updater_scope_, elevate, product_id, |
| xc_path, store_flag, |
| std::move(want_tag)); |
| } |
| |
| void ExpectKSAdminXattrBrand( |
| bool elevate, |
| const base::FilePath& path, |
| std::optional<std::string> want_brand) const override { |
| updater::test::ExpectKSAdminXattrBrand(updater_scope_, elevate, path, |
| std::move(want_brand)); |
| } |
| #endif // BUILDFLAG(IS_MAC) |
| |
| void ExpectLegacyUpdaterMigrated() const override { |
| updater::test::ExpectLegacyUpdaterMigrated(updater_scope_); |
| } |
| |
| void RunRecoveryComponent(const std::string& app_id, |
| const base::Version& version) const override { |
| updater::test::RunRecoveryComponent(updater_scope_, app_id, version); |
| } |
| |
| void SetLastChecked(base::Time time) const override { |
| updater::test::SetLastChecked(updater_scope_, time); |
| } |
| |
| void ExpectLastChecked() const override { |
| updater::test::ExpectLastChecked(updater_scope_); |
| } |
| |
| void ExpectLastStarted() const override { |
| updater::test::ExpectLastStarted(updater_scope_); |
| } |
| |
| void UninstallApp(const std::string& app_id) const override { |
| updater::test::UninstallApp(updater_scope_, app_id); |
| } |
| |
| void RunOfflineInstall(bool is_legacy_install, |
| bool is_silent_install, |
| int installer_result, |
| int installer_error) override { |
| updater::test::RunOfflineInstall(updater_scope_, is_legacy_install, |
| is_silent_install, installer_result, |
| installer_error); |
| } |
| |
| void RunOfflineInstallOsNotSupported(bool is_legacy_install, |
| bool is_silent_install, |
| const std::string& language) override { |
| updater::test::RunOfflineInstallOsNotSupported( |
| updater_scope_, is_legacy_install, is_silent_install, language); |
| } |
| |
| void RunMockOfflineMetaInstall(const std::string& app_id, |
| const base::Version& version, |
| const std::string& tag, |
| const base::FilePath& installer_path, |
| const std::string& arguments, |
| bool is_silent_install, |
| const std::string& platform, |
| const std::string& installer_text, |
| const bool always_launch_cmd, |
| const int expected_exit_code, |
| bool expect_success) override { |
| updater::test::RunMockOfflineMetaInstall( |
| updater_scope_, app_id, version, tag, installer_path, arguments, |
| is_silent_install, platform, installer_text, always_launch_cmd, |
| expected_exit_code, expect_success); |
| } |
| |
| void DMPushEnrollmentToken(const std::string& enrollment_token) override { |
| FAIL() << __func__ << ": requires system scope."; |
| } |
| |
| void DMDeregisterDevice() override { |
| updater::test::DMDeregisterDevice(updater_scope_); |
| } |
| |
| void DMCleanup() override { updater::test::DMCleanup(updater_scope_); } |
| |
| void InstallEnterpriseCompanionApp() override { |
| updater::test::InstallEnterpriseCompanionApp(); |
| } |
| |
| void InstallEnterpriseCompanionAppOverrides( |
| const base::Value::Dict& external_overrides) override { |
| updater::test::InstallEnterpriseCompanionAppOverrides(external_overrides); |
| } |
| |
| void ExpectEnterpriseCompanionAppNotInstalled() override { |
| updater::test::ExpectEnterpriseCompanionAppNotInstalled(); |
| } |
| |
| void UninstallEnterpriseCompanionApp() override { |
| updater::test::UninstallEnterpriseCompanionApp(); |
| } |
| |
| void SetAppAllowsUsageStats(const std::string& identifier, |
| bool allowed) override { |
| updater::test::SetAppAllowsUsageStats(UpdaterScope::kUser, identifier, |
| allowed); |
| } |
| |
| void ClearAppAllowsUsageStats(const std::string& identifier) override { |
| updater::test::ClearAppAllowsUsageStats(UpdaterScope::kUser, identifier); |
| } |
| |
| private: |
| ~IntegrationTestCommandsUser() override = default; |
| |
| const UpdaterScope updater_scope_; |
| }; |
| |
| scoped_refptr<IntegrationTestCommands> CreateIntegrationTestCommandsUser( |
| UpdaterScope scope) { |
| return base::MakeRefCounted<IntegrationTestCommandsUser>(scope); |
| } |
| |
| } // namespace updater::test |