| Index: chrome/browser/chromeos/power/renderer_freezer_unittest.cc
|
| diff --git a/chrome/browser/chromeos/power/renderer_freezer_unittest.cc b/chrome/browser/chromeos/power/renderer_freezer_unittest.cc
|
| index 557768b6eadf89d6d1e3a621cea3f34c5601d7d9..ec809caa930fbfd7946148b9707d530a67a181a2 100644
|
| --- a/chrome/browser/chromeos/power/renderer_freezer_unittest.cc
|
| +++ b/chrome/browser/chromeos/power/renderer_freezer_unittest.cc
|
| @@ -6,33 +6,10 @@
|
|
|
| #include <string>
|
|
|
| -#include "base/command_line.h"
|
| -#include "base/memory/ref_counted.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| #include "base/message_loop/message_loop.h"
|
| #include "base/run_loop.h"
|
| -#include "chrome/browser/chromeos/login/users/scoped_test_user_manager.h"
|
| -#include "chrome/browser/chromeos/settings/cros_settings.h"
|
| -#include "chrome/browser/chromeos/settings/device_settings_service.h"
|
| -#include "chrome/browser/extensions/extension_service.h"
|
| -#include "chrome/browser/extensions/test_extension_system.h"
|
| -#include "chrome/test/base/testing_browser_process.h"
|
| -#include "chrome/test/base/testing_profile.h"
|
| -#include "chrome/test/base/testing_profile_manager.h"
|
| #include "chromeos/dbus/dbus_thread_manager.h"
|
| #include "chromeos/dbus/fake_power_manager_client.h"
|
| -#include "content/public/browser/notification_service.h"
|
| -#include "content/public/browser/notification_source.h"
|
| -#include "content/public/browser/notification_types.h"
|
| -#include "content/public/browser/site_instance.h"
|
| -#include "content/public/test/mock_render_process_host.h"
|
| -#include "content/public/test/test_browser_thread_bundle.h"
|
| -#include "extensions/browser/notification_types.h"
|
| -#include "extensions/browser/process_manager.h"
|
| -#include "extensions/browser/process_map.h"
|
| -#include "extensions/common/extension_builder.h"
|
| -#include "extensions/common/manifest_handlers/background_info.h"
|
| -#include "extensions/common/value_builder.h"
|
| #include "testing/gtest/include/gtest/gtest-death-test.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| @@ -72,8 +49,6 @@
|
| };
|
|
|
| // Actions that can be returned by TestDelegate::GetActions().
|
| -const char kSetShouldFreezeRenderer[] = "set_should_freeze_renderer";
|
| -const char kSetShouldNotFreezeRenderer[] = "set_should_not_freeze_renderer";
|
| const char kFreezeRenderers[] = "freeze_renderers";
|
| const char kThawRenderers[] = "thaw_renderers";
|
| const char kNoActions[] = "";
|
| @@ -87,25 +62,20 @@
|
| freeze_renderers_result_(true),
|
| thaw_renderers_result_(true) {}
|
|
|
| - ~TestDelegate() override {}
|
| + virtual ~TestDelegate() {}
|
|
|
| // RendererFreezer::Delegate overrides.
|
| - void SetShouldFreezeRenderer(base::ProcessHandle handle,
|
| - bool frozen) override {
|
| - AppendAction(frozen ? kSetShouldFreezeRenderer
|
| - : kSetShouldNotFreezeRenderer);
|
| - }
|
| - bool FreezeRenderers() override {
|
| + virtual bool FreezeRenderers() override {
|
| AppendAction(kFreezeRenderers);
|
|
|
| return freeze_renderers_result_;
|
| }
|
| - bool ThawRenderers() override {
|
| + virtual bool ThawRenderers() override {
|
| AppendAction(kThawRenderers);
|
|
|
| return thaw_renderers_result_;
|
| }
|
| - bool CanFreezeRenderers() override { return can_freeze_renderers_; }
|
| + virtual bool CanFreezeRenderers() override { return can_freeze_renderers_; }
|
|
|
| void set_freeze_renderers_result(bool result) {
|
| freeze_renderers_result_ = result;
|
| @@ -145,28 +115,25 @@
|
| scoped_ptr<PowerManagerClient>(power_manager_client_));
|
| }
|
|
|
| - ~RendererFreezerTest() override {
|
| + virtual ~RendererFreezerTest() {
|
| renderer_freezer_.reset();
|
|
|
| DBusThreadManager::Shutdown();
|
| }
|
|
|
| - protected:
|
| void Init() {
|
| renderer_freezer_.reset(new RendererFreezer(
|
| scoped_ptr<RendererFreezer::Delegate>(test_delegate_)));
|
| }
|
|
|
| - // Owned by DBusThreadManager.
|
| + protected:
|
| FakePowerManagerClient* power_manager_client_;
|
| -
|
| - // Owned by |renderer_freezer_|.
|
| TestDelegate* test_delegate_;
|
| +
|
| scoped_ptr<RendererFreezer> renderer_freezer_;
|
|
|
| private:
|
| - content::TestBrowserThreadBundle browser_thread_bundle_;
|
| -
|
| + base::MessageLoop message_loop_;
|
| DISALLOW_COPY_AND_ASSIGN(RendererFreezerTest);
|
| };
|
|
|
| @@ -176,11 +143,38 @@
|
| Init();
|
|
|
| power_manager_client_->SendSuspendImminent();
|
| +
|
| + // The RendererFreezer should have grabbed an asynchronous callback and done
|
| + // nothing else.
|
| + EXPECT_EQ(1, power_manager_client_->GetNumPendingSuspendReadinessCallbacks());
|
| + EXPECT_EQ(kNoActions, test_delegate_->GetActions());
|
| +
|
| + // The RendererFreezer should eventually freeze the renderers and run the
|
| + // callback.
|
| + base::RunLoop().RunUntilIdle();
|
| + EXPECT_EQ(0, power_manager_client_->GetNumPendingSuspendReadinessCallbacks());
|
| EXPECT_EQ(kFreezeRenderers, test_delegate_->GetActions());
|
|
|
| // The renderers should be thawed when we resume.
|
| power_manager_client_->SendSuspendDone();
|
| EXPECT_EQ(kThawRenderers, test_delegate_->GetActions());
|
| +}
|
| +
|
| +// Tests that the RendereFreezer doesn't freeze renderers if the suspend attempt
|
| +// was canceled before it had a chance to complete.
|
| +TEST_F(RendererFreezerTest, SuspendCanceled) {
|
| + Init();
|
| +
|
| + // We shouldn't do anything yet.
|
| + power_manager_client_->SendSuspendImminent();
|
| + EXPECT_EQ(kNoActions, test_delegate_->GetActions());
|
| +
|
| + // If a suspend gets canceled for any reason, we should see a SuspendDone().
|
| + power_manager_client_->SendSuspendDone();
|
| +
|
| + // We shouldn't try to freeze the renderers now.
|
| + base::RunLoop().RunUntilIdle();
|
| + EXPECT_EQ(kNoActions, test_delegate_->GetActions());
|
| }
|
|
|
| // Tests that the renderer freezer does nothing if the delegate cannot freeze
|
| @@ -189,8 +183,15 @@
|
| test_delegate_->set_can_freeze_renderers(false);
|
| Init();
|
|
|
| - // Nothing happens on suspend.
|
| - power_manager_client_->SendSuspendImminent();
|
| + power_manager_client_->SendSuspendImminent();
|
| +
|
| + // The RendererFreezer should not have grabbed a callback or done anything
|
| + // else.
|
| + EXPECT_EQ(0, power_manager_client_->GetNumPendingSuspendReadinessCallbacks());
|
| + EXPECT_EQ(kNoActions, test_delegate_->GetActions());
|
| +
|
| + // There should be nothing in the message loop.
|
| + base::RunLoop().RunUntilIdle();
|
| EXPECT_EQ(kNoActions, test_delegate_->GetActions());
|
|
|
| // Nothing happens on resume.
|
| @@ -204,9 +205,13 @@
|
| Init();
|
| test_delegate_->set_freeze_renderers_result(false);
|
|
|
| - // The freezing operation will fail.
|
| - power_manager_client_->SendSuspendImminent();
|
| + power_manager_client_->SendSuspendImminent();
|
| + EXPECT_EQ(1, power_manager_client_->GetNumPendingSuspendReadinessCallbacks());
|
| +
|
| + // The freezing operation should fail, but we should still report readiness.
|
| + base::RunLoop().RunUntilIdle();
|
| EXPECT_EQ(kFreezeRenderers, test_delegate_->GetActions());
|
| + EXPECT_EQ(0, power_manager_client_->GetNumPendingSuspendReadinessCallbacks());
|
|
|
| // Since the delegate reported that the freezing was unsuccessful, don't do
|
| // anything on resume.
|
| @@ -218,176 +223,15 @@
|
| // Tests that the RendererFreezer crashes the browser if the freezing operation
|
| // was successful but the thawing operation failed.
|
| TEST_F(RendererFreezerTest, ErrorThawingRenderers) {
|
| - // The "threadsafe" style of death test re-executes the unit test binary,
|
| - // which in turn re-initializes some global state leading to failed CHECKs.
|
| - // Instead, we use the "fast" style here to prevent re-initialization.
|
| - ::testing::FLAGS_gtest_death_test_style = "fast";
|
| Init();
|
| test_delegate_->set_thaw_renderers_result(false);
|
|
|
| power_manager_client_->SendSuspendImminent();
|
| + base::RunLoop().RunUntilIdle();
|
| EXPECT_EQ(kFreezeRenderers, test_delegate_->GetActions());
|
|
|
| EXPECT_DEATH(power_manager_client_->SendSuspendDone(), "Unable to thaw");
|
| }
|
| #endif // GTEST_HAS_DEATH_TEST
|
|
|
| -class RendererFreezerTestWithExtensions : public RendererFreezerTest {
|
| - public:
|
| - RendererFreezerTestWithExtensions() {}
|
| - ~RendererFreezerTestWithExtensions() override {}
|
| -
|
| - // testing::Test overrides.
|
| - void SetUp() override {
|
| - RendererFreezerTest::SetUp();
|
| -
|
| - profile_manager_.reset(
|
| - new TestingProfileManager(TestingBrowserProcess::GetGlobal()));
|
| -
|
| - // Must be called from testing::Test::SetUp.
|
| - EXPECT_TRUE(profile_manager_->SetUp());
|
| -
|
| - profile_ = profile_manager_->CreateTestingProfile("RendererFreezerTest");
|
| -
|
| - extensions::TestExtensionSystem* extension_system =
|
| - static_cast<extensions::TestExtensionSystem*>(
|
| - extensions::ExtensionSystem::Get(profile_));
|
| - extension_system->CreateExtensionService(
|
| - base::CommandLine::ForCurrentProcess(),
|
| - base::FilePath() /* install_directory */,
|
| - false /* autoupdate_enabled*/);
|
| - }
|
| - void TearDown() override {
|
| - extensions::ExtensionSystem::Get(profile_)->Shutdown();
|
| -
|
| - profile_ = NULL;
|
| -
|
| - profile_manager_->DeleteAllTestingProfiles();
|
| -
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - profile_manager_.reset();
|
| -
|
| - RendererFreezerTest::TearDown();
|
| - }
|
| -
|
| - protected:
|
| - void CreateRenderProcessForExtension(extensions::Extension* extension) {
|
| - scoped_ptr<content::MockRenderProcessHostFactory> rph_factory(
|
| - new content::MockRenderProcessHostFactory());
|
| - scoped_refptr<content::SiteInstance> site_instance(
|
| - extensions::ProcessManager::Get(profile_)->GetSiteInstanceForURL(
|
| - extensions::BackgroundInfo::GetBackgroundURL(extension)));
|
| - scoped_ptr<content::RenderProcessHost> rph(
|
| - rph_factory->CreateRenderProcessHost(profile_, site_instance.get()));
|
| -
|
| - // Fake that the RenderProcessHost is hosting the gcm app.
|
| - extensions::ProcessMap::Get(profile_)
|
| - ->Insert(extension->id(), rph->GetID(), site_instance->GetId());
|
| -
|
| - // Send the notification that the RenderProcessHost has been created.
|
| - content::NotificationService::current()->Notify(
|
| - content::NOTIFICATION_RENDERER_PROCESS_CREATED,
|
| - content::Source<content::RenderProcessHost>(rph.get()),
|
| - content::NotificationService::NoDetails());
|
| - }
|
| -
|
| - // Owned by |profile_manager_|.
|
| - TestingProfile* profile_;
|
| - scoped_ptr<TestingProfileManager> profile_manager_;
|
| -
|
| - private:
|
| - // Chrome OS needs extra services to run in the following order.
|
| - chromeos::ScopedTestDeviceSettingsService test_device_settings_service_;
|
| - chromeos::ScopedTestCrosSettings test_cros_settings_;
|
| - chromeos::ScopedTestUserManager test_user_manager_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(RendererFreezerTestWithExtensions);
|
| -};
|
| -
|
| -// Tests that the RendererFreezer freezes renderers that are not hosting
|
| -// GCM extensions.
|
| -TEST_F(RendererFreezerTestWithExtensions, FreezesNonExtensionRenderers) {
|
| - Init();
|
| -
|
| - // Create the mock RenderProcessHost.
|
| - scoped_ptr<content::MockRenderProcessHostFactory> rph_factory(
|
| - new content::MockRenderProcessHostFactory());
|
| - scoped_refptr<content::SiteInstance> site_instance(
|
| - content::SiteInstance::Create(profile_));
|
| - scoped_ptr<content::RenderProcessHost> rph(
|
| - rph_factory->CreateRenderProcessHost(profile_, site_instance.get()));
|
| -
|
| - // Send the notification that the RenderProcessHost has been created.
|
| - content::NotificationService::current()->Notify(
|
| - content::NOTIFICATION_RENDERER_PROCESS_CREATED,
|
| - content::Source<content::RenderProcessHost>(rph.get()),
|
| - content::NotificationService::NoDetails());
|
| -
|
| - EXPECT_EQ(kSetShouldFreezeRenderer, test_delegate_->GetActions());
|
| -}
|
| -
|
| -// Tests that the RendererFreezer does not freeze renderers that are hosting
|
| -// extensions that use GCM.
|
| -TEST_F(RendererFreezerTestWithExtensions, DoesNotFreezeGcmExtensionRenderers) {
|
| - Init();
|
| -
|
| - // First build the GCM extension.
|
| - scoped_refptr<extensions::Extension> gcm_app =
|
| - extensions::ExtensionBuilder()
|
| - .SetManifest(extensions::DictionaryBuilder()
|
| - .Set("name", "GCM App")
|
| - .Set("version", "1.0.0")
|
| - .Set("manifest_version", 2)
|
| - .Set("app",
|
| - extensions::DictionaryBuilder()
|
| - .Set("background",
|
| - extensions::DictionaryBuilder()
|
| - .Set("scripts",
|
| - extensions::ListBuilder()
|
| - .Append("background.js"))))
|
| - .Set("permissions",
|
| - extensions::ListBuilder()
|
| - .Append("gcm")))
|
| - .Build();
|
| -
|
| - // Now install it and give it a renderer.
|
| - extensions::ExtensionSystem::Get(profile_)
|
| - ->extension_service()
|
| - ->AddExtension(gcm_app.get());
|
| - CreateRenderProcessForExtension(gcm_app.get());
|
| -
|
| - EXPECT_EQ(kSetShouldNotFreezeRenderer, test_delegate_->GetActions());
|
| -}
|
| -
|
| -// Tests that the RendererFreezer freezes renderers that are hosting extensions
|
| -// that do not use GCM.
|
| -TEST_F(RendererFreezerTestWithExtensions, FreezesNonGcmExtensionRenderers) {
|
| - Init();
|
| -
|
| - // First build the extension.
|
| - scoped_refptr<extensions::Extension> background_app =
|
| - extensions::ExtensionBuilder()
|
| - .SetManifest(extensions::DictionaryBuilder()
|
| - .Set("name", "Background App")
|
| - .Set("version", "1.0.0")
|
| - .Set("manifest_version", 2)
|
| - .Set("app",
|
| - extensions::DictionaryBuilder()
|
| - .Set("background",
|
| - extensions::DictionaryBuilder()
|
| - .Set("scripts",
|
| - extensions::ListBuilder()
|
| - .Append("background.js")))))
|
| - .Build();
|
| -
|
| - // Now install it and give it a renderer.
|
| - extensions::ExtensionSystem::Get(profile_)
|
| - ->extension_service()
|
| - ->AddExtension(background_app.get());
|
| - CreateRenderProcessForExtension(background_app.get());
|
| -
|
| - EXPECT_EQ(kSetShouldFreezeRenderer, test_delegate_->GetActions());
|
| -}
|
| -
|
| } // namespace chromeos
|
|
|