summaryrefslogtreecommitdiffstats
path: root/content/browser/gpu/gpu_ipc_browsertests.cc
diff options
context:
space:
mode:
Diffstat (limited to 'content/browser/gpu/gpu_ipc_browsertests.cc')
-rw-r--r--content/browser/gpu/gpu_ipc_browsertests.cc147
1 files changed, 144 insertions, 3 deletions
diff --git a/content/browser/gpu/gpu_ipc_browsertests.cc b/content/browser/gpu/gpu_ipc_browsertests.cc
index 0ee93db..3fda855 100644
--- a/content/browser/gpu/gpu_ipc_browsertests.cc
+++ b/content/browser/gpu/gpu_ipc_browsertests.cc
@@ -3,8 +3,13 @@
// found in the LICENSE file.
#include "base/command_line.h"
+#include "base/run_loop.h"
#include "content/browser/gpu/browser_gpu_channel_host_factory.h"
+#include "content/browser/gpu/gpu_process_host_ui_shim.h"
+#include "content/common/gpu/client/context_provider_command_buffer.h"
#include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h"
+#include "content/common/gpu/gpu_process_launch_causes.h"
+#include "content/public/browser/browser_thread.h"
#include "content/public/common/content_switches.h"
#include "content/test/content_browser_test.h"
#include "ui/gl/gl_switches.h"
@@ -15,10 +20,19 @@ namespace {
class ContextTestBase : public content::ContentBrowserTest {
public:
virtual void SetUpOnMainThread() OVERRIDE {
- CHECK(content::BrowserGpuChannelHostFactory::instance());
+ if (!content::BrowserGpuChannelHostFactory::instance())
+ content::BrowserGpuChannelHostFactory::Initialize(true);
+
+ content::BrowserGpuChannelHostFactory* factory =
+ content::BrowserGpuChannelHostFactory::instance();
+ CHECK(factory);
+ scoped_refptr<content::GpuChannelHost> gpu_channel_host(
+ factory->EstablishGpuChannelSync(
+ content::
+ CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE));
context_.reset(
content::WebGraphicsContext3DCommandBufferImpl::CreateOffscreenContext(
- content::BrowserGpuChannelHostFactory::instance(),
+ gpu_channel_host.get(),
WebKit::WebGraphicsContext3D::Attributes(),
GURL()));
CHECK(context_.get());
@@ -38,6 +52,133 @@ class ContextTestBase : public content::ContentBrowserTest {
} // namespace
-// Include the actual tests.
+// Include the shared tests.
#define CONTEXT_TEST_F IN_PROC_BROWSER_TEST_F
#include "content/common/gpu/client/gpu_context_tests.h"
+
+namespace content {
+
+class BrowserGpuChannelHostFactoryTest : public ContextTestBase {
+ public:
+ virtual void SetUpOnMainThread() OVERRIDE {
+ // Start all tests without a gpu channel so that the tests exercise a
+ // consistent codepath.
+ if (!content::BrowserGpuChannelHostFactory::instance())
+ content::BrowserGpuChannelHostFactory::Initialize(false);
+
+ CHECK(GetFactory());
+
+ ContentBrowserTest::SetUpOnMainThread();
+ }
+
+ virtual void TearDownOnMainThread() OVERRIDE {
+ ContextTestBase::TearDownOnMainThread();
+ }
+
+ virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
+ // Start all tests without a gpu channel so that the tests exercise a
+ // consistent codepath.
+ command_line->AppendSwitch(switches::kDisableGpuProcessPrelaunch);
+ }
+
+ void OnContextLost(const base::Closure callback, int* counter) {
+ (*counter)++;
+ callback.Run();
+ }
+
+ protected:
+ BrowserGpuChannelHostFactory* GetFactory() {
+ return BrowserGpuChannelHostFactory::instance();
+ }
+
+ bool IsChannelEstablished() {
+ return GetFactory()->GetGpuChannel() != NULL;
+ }
+
+ void EstablishAndWait() {
+ base::RunLoop run_loop;
+ GetFactory()->EstablishGpuChannel(
+ CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE,
+ run_loop.QuitClosure());
+ run_loop.Run();
+ }
+
+ GpuChannelHost* GetGpuChannel() {
+ return GetFactory()->GetGpuChannel();
+ }
+
+ static void Signal(bool *event) {
+ CHECK_EQ(*event, false);
+ *event = true;
+ }
+
+ scoped_ptr<WebGraphicsContext3DCommandBufferImpl> CreateContext() {
+ return make_scoped_ptr(
+ WebGraphicsContext3DCommandBufferImpl::CreateOffscreenContext(
+ GetGpuChannel(),
+ WebKit::WebGraphicsContext3D::Attributes(),
+ GURL()));
+ }
+};
+
+IN_PROC_BROWSER_TEST_F(BrowserGpuChannelHostFactoryTest, Basic) {
+ DCHECK(!IsChannelEstablished());
+ EstablishAndWait();
+ EXPECT_TRUE(GetGpuChannel() != NULL);
+}
+
+IN_PROC_BROWSER_TEST_F(BrowserGpuChannelHostFactoryTest,
+ EstablishAndTerminate) {
+ DCHECK(!IsChannelEstablished());
+ base::RunLoop run_loop;
+ GetFactory()->EstablishGpuChannel(
+ CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE,
+ run_loop.QuitClosure());
+ GetFactory()->Terminate();
+
+ // The callback should still trigger.
+ run_loop.Run();
+}
+
+IN_PROC_BROWSER_TEST_F(BrowserGpuChannelHostFactoryTest, AlreadyEstablished) {
+ DCHECK(!IsChannelEstablished());
+ scoped_refptr<GpuChannelHost> gpu_channel =
+ GetFactory()->EstablishGpuChannelSync(
+ CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE);
+
+ // Expect established callback immediately.
+ bool event = false;
+ GetFactory()->EstablishGpuChannel(
+ CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE,
+ base::Bind(&BrowserGpuChannelHostFactoryTest::Signal, &event));
+ EXPECT_TRUE(event);
+ EXPECT_EQ(gpu_channel, GetGpuChannel());
+}
+
+IN_PROC_BROWSER_TEST_F(BrowserGpuChannelHostFactoryTest, CrashAndRecover) {
+ DCHECK(!IsChannelEstablished());
+ EstablishAndWait();
+ scoped_refptr<GpuChannelHost> host = GetGpuChannel();
+
+ scoped_refptr<ContextProviderCommandBuffer> provider =
+ ContextProviderCommandBuffer::Create(CreateContext(),
+ "BrowserGpuChannelHostFactoryTest");
+ base::RunLoop run_loop;
+ int counter = 0;
+ provider->SetLostContextCallback(
+ base::Bind(&BrowserGpuChannelHostFactoryTest::OnContextLost,
+ base::Unretained(this), run_loop.QuitClosure(), &counter));
+ EXPECT_TRUE(provider->BindToCurrentThread());
+ GpuProcessHostUIShim* shim =
+ GpuProcessHostUIShim::FromID(GetFactory()->GpuProcessHostId());
+ EXPECT_TRUE(shim != NULL);
+ shim->SimulateCrash();
+ run_loop.Run();
+
+ EXPECT_EQ(1, counter);
+ EXPECT_FALSE(IsChannelEstablished());
+ EstablishAndWait();
+ EXPECT_TRUE(IsChannelEstablished());
+}
+
+} // namespace content