blob: e63cf5368a5a831eb080b69e5cf5f6d3feb5da66 [file] [log] [blame]
// Copyright 2021 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/web_applications/web_app_uninstall_job.h"
#include <memory>
#include "base/memory/scoped_refptr.h"
#include "base/test/bind.h"
#include "base/test/gmock_callback_support.h"
#include "base/test/task_environment.h"
#include "chrome/browser/web_applications/test/fake_web_app_database_factory.h"
#include "chrome/browser/web_applications/test/fake_web_app_registry_controller.h"
#include "chrome/browser/web_applications/test/mock_file_utils_wrapper.h"
#include "chrome/browser/web_applications/test/mock_os_integration_manager.h"
#include "chrome/browser/web_applications/test/test_file_utils.h"
#include "chrome/browser/web_applications/test/web_app_test.h"
#include "chrome/browser/web_applications/test/web_app_test_utils.h"
#include "chrome/browser/web_applications/web_app.h"
#include "chrome/browser/web_applications/web_app_constants.h"
#include "chrome/browser/web_applications/web_app_icon_manager.h"
#include "chrome/browser/web_applications/web_app_install_finalizer.h"
#include "chrome/browser/web_applications/web_app_install_manager.h"
#include "chrome/browser/web_applications/web_app_utils.h"
#include "components/prefs/testing_pref_service.h"
#include "components/webapps/browser/installable/installable_metrics.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/origin.h"
namespace web_app {
namespace {
class WebAppUninstallJobTest : public WebAppTest {
public:
WebAppUninstallJobTest() = default;
void SetUp() override {
WebAppTest::SetUp();
fake_registry_controller_ =
std::make_unique<FakeWebAppRegistryController>();
controller().SetUp(profile());
install_manager_ = std::make_unique<WebAppInstallManager>(profile());
file_utils_wrapper_ =
base::MakeRefCounted<testing::StrictMock<MockFileUtilsWrapper>>();
icon_manager_ = std::make_unique<WebAppIconManager>(
profile(), controller().registrar(), install_manager(),
file_utils_wrapper_);
}
void TearDown() override {
file_utils_wrapper_ = nullptr;
WebAppTest::TearDown();
}
FakeWebAppRegistryController& controller() {
return *fake_registry_controller_;
}
WebAppInstallManager& install_manager() const { return *install_manager_; }
WebAppInstallFinalizer& install_finalizer() const {
return *install_finalizer_;
}
testing::StrictMock<MockOsIntegrationManager> os_integration_manager_;
std::unique_ptr<WebAppInstallManager> install_manager_;
std::unique_ptr<WebAppInstallFinalizer> install_finalizer_;
std::unique_ptr<FakeWebAppRegistryController> fake_registry_controller_;
std::unique_ptr<WebAppIconManager> icon_manager_;
scoped_refptr<testing::StrictMock<MockFileUtilsWrapper>> file_utils_wrapper_;
};
TEST_F(WebAppUninstallJobTest, SimpleUninstall) {
Registry registry;
auto web_app =
test::CreateWebApp(GURL("https://www.example.com"), Source::kSync);
AppId id = web_app->app_id();
registry.emplace(id, std::move(web_app));
controller().database_factory().WriteRegistry(registry);
controller().Init();
WebAppUninstallJob task(&os_integration_manager_, &controller().sync_bridge(),
icon_manager_.get(), &controller().registrar(),
&install_manager(), &install_finalizer(),
profile()->GetPrefs());
OsHooksErrors result;
EXPECT_CALL(os_integration_manager_, UninstallAllOsHooks(id, testing::_))
.WillOnce(base::test::RunOnceCallback<1>(result));
base::FilePath deletion_path = GetManifestResourcesDirectoryForApp(
GetWebAppsRootDirectory(profile()), id);
EXPECT_CALL(*file_utils_wrapper_, DeleteFileRecursively(deletion_path))
.WillOnce(testing::Return(true));
base::RunLoop loop;
task.Start(id, url::Origin(), webapps::WebappUninstallSource::kAppMenu,
WebAppUninstallJob::ModifyAppRegistry::kYes,
base::BindLambdaForTesting([&](WebAppUninstallJobResult result) {
EXPECT_EQ(WebAppUninstallJobResult::kSuccess, result);
loop.Quit();
}));
loop.Run();
EXPECT_EQ(controller().registrar().GetAppById(id), nullptr);
}
TEST_F(WebAppUninstallJobTest, FailedDataDelete) {
Registry registry;
auto web_app =
test::CreateWebApp(GURL("https://www.example.com"), Source::kSync);
AppId id = web_app->app_id();
registry.emplace(id, std::move(web_app));
controller().database_factory().WriteRegistry(registry);
controller().Init();
WebAppUninstallJob task(&os_integration_manager_, &controller().sync_bridge(),
icon_manager_.get(), &controller().registrar(),
&install_manager(), &install_finalizer(),
profile()->GetPrefs());
OsHooksErrors result;
EXPECT_CALL(os_integration_manager_, UninstallAllOsHooks(id, testing::_))
.WillOnce(base::test::RunOnceCallback<1>(result));
base::FilePath deletion_path = GetManifestResourcesDirectoryForApp(
GetWebAppsRootDirectory(profile()), id);
EXPECT_CALL(*file_utils_wrapper_, DeleteFileRecursively(deletion_path))
.WillOnce(testing::Return(false));
base::RunLoop loop;
task.Start(id, url::Origin(), webapps::WebappUninstallSource::kAppMenu,
WebAppUninstallJob::ModifyAppRegistry::kYes,
base::BindLambdaForTesting([&](WebAppUninstallJobResult result) {
EXPECT_EQ(WebAppUninstallJobResult::kError, result);
loop.Quit();
}));
loop.Run();
EXPECT_EQ(controller().registrar().GetAppById(id), nullptr);
}
TEST_F(WebAppUninstallJobTest, FailedOsHooks) {
Registry registry;
auto web_app =
test::CreateWebApp(GURL("https://www.example.com"), Source::kSync);
AppId id = web_app->app_id();
registry.emplace(id, std::move(web_app));
controller().database_factory().WriteRegistry(registry);
controller().Init();
WebAppUninstallJob task(&os_integration_manager_, &controller().sync_bridge(),
icon_manager_.get(), &controller().registrar(),
&install_manager(), &install_finalizer(),
profile()->GetPrefs());
OsHooksErrors result;
result.set(true);
EXPECT_CALL(os_integration_manager_, UninstallAllOsHooks(id, testing::_))
.WillOnce(base::test::RunOnceCallback<1>(result));
base::FilePath deletion_path = GetManifestResourcesDirectoryForApp(
GetWebAppsRootDirectory(profile()), id);
EXPECT_CALL(*file_utils_wrapper_, DeleteFileRecursively(deletion_path))
.WillOnce(testing::Return(true));
base::RunLoop loop;
task.Start(id, url::Origin(), webapps::WebappUninstallSource::kAppMenu,
WebAppUninstallJob::ModifyAppRegistry::kYes,
base::BindLambdaForTesting([&](WebAppUninstallJobResult result) {
EXPECT_EQ(WebAppUninstallJobResult::kError, result);
loop.Quit();
}));
loop.Run();
EXPECT_EQ(controller().registrar().GetAppById(id), nullptr);
}
} // namespace
} // namespace web_app