| // Copyright 2022 The Chromium Authors |
| // 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_command_scheduler.h" |
| |
| #include "base/functional/callback_helpers.h" |
| #include "base/memory/raw_ptr.h" |
| #include "base/test/test_future.h" |
| #include "chrome/browser/web_applications/test/fake_web_app_provider.h" |
| #include "chrome/browser/web_applications/test/web_app_install_test_utils.h" |
| #include "chrome/browser/web_applications/test/web_app_test.h" |
| #include "chrome/browser/web_applications/web_app_command_manager.h" |
| #include "chrome/browser/web_applications/web_app_provider.h" |
| #include "components/webapps/browser/installable/installable_metrics.h" |
| #include "content/public/browser/web_contents.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace web_app { |
| namespace { |
| |
| class WebAppCommandSchedulerTest : public WebAppTest { |
| public: |
| void SetUp() override { |
| WebAppTest::SetUp(); |
| provider_ = FakeWebAppProvider::Get(profile()); |
| } |
| |
| FakeWebAppProvider* provider() { return provider_; } |
| |
| bool IsCommandQueued(std::string_view command_name) { |
| // Note: Accessing & using the debug value for tests is poor practice and |
| // should not be done, given how easily the format can be changed. |
| // TODO(b/318858671): Update logic to not read command errors from debug |
| // log. |
| base::Value::Dict log = |
| provider()->command_manager().ToDebugValue().TakeDict(); |
| for (const base::Value& command : *log.FindList("command_queue")) { |
| if (*command.GetDict().FindDict("!metadata")->FindString("name") == |
| command_name) { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| private: |
| raw_ptr<FakeWebAppProvider, DanglingUntriaged> provider_ = nullptr; |
| }; |
| |
| TEST_F(WebAppCommandSchedulerTest, FetchManifestAndInstall) { |
| EXPECT_FALSE(provider()->is_registry_ready()); |
| provider()->scheduler().FetchManifestAndInstall( |
| webapps::WebappInstallSource::OMNIBOX_INSTALL_ICON, |
| web_contents()->GetWeakPtr(), base::DoNothing(), base::DoNothing(), |
| /*use_fallback=*/true); |
| |
| provider()->StartWithSubsystems(); |
| EXPECT_EQ(provider()->command_manager().GetStartedCommandCountForTesting(), |
| 0); |
| EXPECT_EQ(provider()->command_manager().GetCommandCountForTesting(), 1u); |
| |
| EXPECT_TRUE(IsCommandQueued("FetchManifestAndInstallCommand")); |
| } |
| |
| TEST_F(WebAppCommandSchedulerTest, PersistFileHandlersUserChoice) { |
| EXPECT_FALSE(provider()->is_registry_ready()); |
| provider()->scheduler().PersistFileHandlersUserChoice( |
| "app id", /*allowed=*/true, base::DoNothing()); |
| |
| provider()->StartWithSubsystems(); |
| EXPECT_EQ(provider()->command_manager().GetStartedCommandCountForTesting(), |
| 0); |
| EXPECT_EQ(provider()->command_manager().GetCommandCountForTesting(), 1u); |
| |
| EXPECT_TRUE(IsCommandQueued("UpdateFileHandlerCommand")); |
| |
| test::WaitUntilReady(provider()); |
| provider()->command_manager().AwaitAllCommandsCompleteForTesting(); |
| EXPECT_FALSE(IsCommandQueued("UpdateFileHandlerCommand")); |
| |
| provider()->Shutdown(); |
| base::test::TestFuture<void> after_shutdown; |
| provider()->scheduler().PersistFileHandlersUserChoice( |
| "app id", /*allowed=*/true, after_shutdown.GetCallback()); |
| EXPECT_EQ(provider()->command_manager().GetCommandCountForTesting(), 0u); |
| ASSERT_TRUE(after_shutdown.Wait()); |
| } |
| |
| } // namespace |
| } // namespace web_app |