Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(883)

Unified Diff: content/browser/renderer_host/render_process_host_browsertest.cc

Issue 2929113002: Enable spare RenderProcessHost to be preinitialized. (Closed)
Patch Set: tweaks Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/renderer_host/render_process_host_browsertest.cc
diff --git a/content/browser/renderer_host/render_process_host_browsertest.cc b/content/browser/renderer_host/render_process_host_browsertest.cc
index 866e829d1b74c93dad22fc5b77ee71e84cf19598..78f95b58d58a8ff471e1c9725d760a3c945ec6e3 100644
--- a/content/browser/renderer_host/render_process_host_browsertest.cc
+++ b/content/browser/renderer_host/render_process_host_browsertest.cc
@@ -17,6 +17,9 @@
#include "content/public/test/content_browser_test_utils.h"
#include "content/public/test/test_service.mojom.h"
#include "content/shell/browser/shell.h"
+#include "content/shell/browser/shell_browser_context.h"
+#include "content/shell/browser/shell_browser_main_parts.h"
+#include "content/shell/browser/shell_content_browser_client.h"
#include "media/base/bind_to_current_loop.h"
#include "media/base/media_switches.h"
#include "media/base/test_data_util.h"
@@ -130,6 +133,116 @@ IN_PROC_BROWSER_TEST_F(RenderProcessHostTest,
EXPECT_EQ(2, RenderProcessHostCount());
}
+IN_PROC_BROWSER_TEST_F(RenderProcessHostTest, SpareRenderProcessHostTaken) {
+ ASSERT_TRUE(embedded_test_server()->Start());
+
+ RenderProcessHost::WarmupSpareRenderProcessHost(
+ ShellContentBrowserClient::Get()->browser_context());
+ RenderProcessHost* spare_renderer =
+ RenderProcessHostImpl::GetSpareRenderProcessHostForTesting();
+ EXPECT_NE(nullptr, spare_renderer);
+
+ GURL test_url = embedded_test_server()->GetURL("/simple_page.html");
+ Shell* window = CreateBrowser();
+ NavigateToURL(window, test_url);
+
+ EXPECT_EQ(spare_renderer,
+ window->web_contents()->GetMainFrame()->GetProcess());
+
+ // The spare render process host should no longer be available.
+ EXPECT_EQ(nullptr,
+ RenderProcessHostImpl::GetSpareRenderProcessHostForTesting());
+}
+
+IN_PROC_BROWSER_TEST_F(RenderProcessHostTest, SpareRenderProcessHostNotTaken) {
+ ASSERT_TRUE(embedded_test_server()->Start());
+
+ RenderProcessHost::WarmupSpareRenderProcessHost(
+ ShellContentBrowserClient::Get()->off_the_record_browser_context());
+ RenderProcessHost* spare_renderer =
+ RenderProcessHostImpl::GetSpareRenderProcessHostForTesting();
+ GURL test_url = embedded_test_server()->GetURL("/simple_page.html");
+ Shell* window = CreateBrowser();
+ NavigateToURL(window, test_url);
+
+ // There should have been another process created for the navigation.
+ EXPECT_NE(spare_renderer,
+ window->web_contents()->GetMainFrame()->GetProcess());
+
+ // The spare RenderProcessHost should have been cleaned up. Note this
+ // behavior is identical to what would have happened if the RenderProcessHost
+ // were taken.
+ EXPECT_EQ(nullptr,
+ RenderProcessHostImpl::GetSpareRenderProcessHostForTesting());
+}
+
+IN_PROC_BROWSER_TEST_F(RenderProcessHostTest, SpareRenderProcessHostKilled) {
+ RenderProcessHost::WarmupSpareRenderProcessHost(
+ ShellContentBrowserClient::Get()->browser_context());
+
+ RenderProcessHost* spare_renderer =
+ RenderProcessHostImpl::GetSpareRenderProcessHostForTesting();
+ mojom::TestServicePtr service;
+ ASSERT_NE(nullptr, spare_renderer);
+ BindInterface(spare_renderer, &service);
+
+ base::RunLoop run_loop;
+ set_process_exit_callback(run_loop.QuitClosure());
+ spare_renderer->AddObserver(this); // For process_exit_callback.
+
+ // Should reply with a bad message and cause process death.
+ service->DoSomething(base::Bind(&base::DoNothing));
+ run_loop.Run();
+
+ // The spare RenderProcessHost should disappear when its process dies.
+ EXPECT_EQ(nullptr,
+ RenderProcessHostImpl::GetSpareRenderProcessHostForTesting());
+}
+
+// Test that the spare renderer works correctly when the limit on the maximum
+// number of processes is small.
+IN_PROC_BROWSER_TEST_F(RenderProcessHostTest,
+ SpareRendererSurpressedMaxProcesses) {
+ ASSERT_TRUE(embedded_test_server()->Start());
+
+ RenderProcessHost::SetMaxRendererProcessCount(1);
+
+ // A process is created with shell startup, so with a maximum of one renderer
+ // process the spare RPH should not be created.
+ RenderProcessHost::WarmupSpareRenderProcessHost(
+ ShellContentBrowserClient::Get()->browser_context());
+ EXPECT_EQ(nullptr,
+ RenderProcessHostImpl::GetSpareRenderProcessHostForTesting());
+
+ // A spare RPH should be created with a max of 2 renderer process.
Charlie Reis 2017/06/29 21:09:16 nit: s/process/processes/
mattcary 2017/06/30 12:37:56 Done.
+ RenderProcessHost::SetMaxRendererProcessCount(2);
+ RenderProcessHost::WarmupSpareRenderProcessHost(
+ ShellContentBrowserClient::Get()->browser_context());
+ RenderProcessHost* spare_renderer =
+ RenderProcessHostImpl::GetSpareRenderProcessHostForTesting();
+ EXPECT_NE(nullptr, spare_renderer);
+
+ // Navigation will use the spare renderer half the time, choosing the spare
+ // renderer or the existing render for the new navigation at random.
Charlie Reis 2017/06/29 21:09:16 nit: s/render/renderer/
mattcary 2017/06/30 12:37:55 Done.
+ GURL test_url = embedded_test_server()->GetURL("/simple_page.html");
+ NavigateToURL(CreateBrowser(), test_url);
+
+ // Revert to the default process limit.
+ RenderProcessHost::SetMaxRendererProcessCount(0);
+
+ // If the spare renderer wasn't picked up for the naviation above, perform
Charlie Reis 2017/06/29 21:09:16 nit: navigation
mattcary 2017/06/30 12:37:56 Done.
+ // another navigation in a new shell, without a process limit, and confirm
+ // that the spare renderer is used correctly. Note this branch is entered
+ // randomly, depending on the choice of renderer used above, so the check
+ // below will only fail in a flaky manner (but will not flake at all if
+ // everything is working correctly, of course!).
+ if (RenderProcessHostImpl::GetSpareRenderProcessHostForTesting()) {
+ NavigateToURL(CreateBrowser(), test_url);
+ EXPECT_EQ(nullptr,
+ RenderProcessHostImpl::GetSpareRenderProcessHostForTesting());
Charlie Reis 2017/06/29 21:09:16 This doesn't look right to me, and it's never fail
mattcary 2017/06/30 12:37:55 Right, this is what I meant about not being able t
+ }
+}
+
class ShellCloser : public RenderProcessHostObserver {
public:
ShellCloser(Shell* shell, std::string* logging_string)

Powered by Google App Engine
This is Rietveld 408576698