Index: content/browser/aura/software_browser_compositor_output_surface_unittest.cc |
diff --git a/content/browser/aura/software_browser_compositor_output_surface_unittest.cc b/content/browser/aura/software_browser_compositor_output_surface_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c400b08c30bb0b446e380a274c87fb08795360ec |
--- /dev/null |
+++ b/content/browser/aura/software_browser_compositor_output_surface_unittest.cc |
@@ -0,0 +1,144 @@ |
+// Copyright 2013 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 "base/message_loop/message_loop.h" |
+#include "cc/output/compositor_frame.h" |
+#include "content/browser/aura/browser_compositor_output_surface_proxy.h" |
+#include "content/browser/aura/software_browser_compositor_output_surface.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+#include "ui/compositor/test/context_factories_for_test.h" |
+#include "ui/gl/gl_implementation.h" |
+#include "ui/gl/vsync_provider.h" |
+ |
+namespace { |
+ |
+class FakeVSyncProvider : public gfx::VSyncProvider { |
+ public: |
+ FakeVSyncProvider() : call_count_(0) {} |
+ virtual ~FakeVSyncProvider() {} |
+ |
+ virtual void GetVSyncParameters(const UpdateVSyncCallback& callback) |
+ OVERRIDE { |
+ callback.Run(timebase_, interval_); |
+ call_count_++; |
+ } |
+ |
+ int get_call_count() const { return call_count_; } |
piman
2013/11/07 00:45:12
nit: call_count()
dnicoara
2013/11/07 15:17:41
Done.
|
+ |
+ void set_timebase(base::TimeTicks timebase) { timebase_ = timebase; } |
+ void set_interval(base::TimeDelta interval) { interval_ = interval; } |
+ |
+ private: |
+ base::TimeTicks timebase_; |
+ base::TimeDelta interval_; |
+ |
+ int call_count_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(FakeVSyncProvider); |
+}; |
+ |
+class FakeSoftwareOutputDevice : public cc::SoftwareOutputDevice { |
+ public: |
+ FakeSoftwareOutputDevice() : vsync_provider_(new FakeVSyncProvider()) {} |
+ virtual ~FakeSoftwareOutputDevice() {} |
+ |
+ virtual gfx::VSyncProvider* GetVSyncProvider() OVERRIDE { |
+ return vsync_provider_.get(); |
+ } |
+ |
+ private: |
+ scoped_ptr<gfx::VSyncProvider> vsync_provider_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(FakeSoftwareOutputDevice); |
+}; |
+ |
+} // namespace |
+ |
+class SoftwareBrowserCompositorOutputSurfaceTest : public testing::Test { |
+ public: |
+ SoftwareBrowserCompositorOutputSurfaceTest(); |
+ virtual ~SoftwareBrowserCompositorOutputSurfaceTest(); |
+ |
+ virtual void SetUp() OVERRIDE; |
+ virtual void TearDown() OVERRIDE; |
+ |
+ content::SoftwareBrowserCompositorOutputSurface* CreateSurface( |
+ scoped_ptr<cc::SoftwareOutputDevice> device); |
+ |
+ protected: |
+ scoped_ptr<content::SoftwareBrowserCompositorOutputSurface> output_surface_; |
+ |
+ scoped_ptr<base::MessageLoop> message_loop_; |
+ scoped_ptr<ui::Compositor> compositor_; |
+ |
+ IDMap<content::BrowserCompositorOutputSurface> surface_map_; |
+ scoped_refptr<content::BrowserCompositorOutputSurfaceProxy> surface_proxy_; |
+}; |
+ |
+SoftwareBrowserCompositorOutputSurfaceTest:: |
+ SoftwareBrowserCompositorOutputSurfaceTest() { |
+ CHECK(gfx::InitializeGLBindings(gfx::kGLImplementationOSMesaGL)); |
+ message_loop_.reset(new base::MessageLoop(base::MessageLoop::TYPE_UI)); |
+} |
+ |
+SoftwareBrowserCompositorOutputSurfaceTest:: |
+ ~SoftwareBrowserCompositorOutputSurfaceTest() {} |
+ |
+void SoftwareBrowserCompositorOutputSurfaceTest::SetUp() { |
+ ui::InitializeContextFactoryForTests(false); |
+ ui::Compositor::Initialize(); |
+ |
+ compositor_.reset(new ui::Compositor(1)); |
+ surface_proxy_ = |
+ new content::BrowserCompositorOutputSurfaceProxy(&surface_map_); |
+} |
+ |
+void SoftwareBrowserCompositorOutputSurfaceTest::TearDown() { |
+ output_surface_.reset(); |
+ compositor_.reset(); |
+ |
+ EXPECT_TRUE(surface_map_.IsEmpty()); |
+ |
+ surface_map_.Clear(); |
+ ui::TerminateContextFactoryForTests(); |
+ ui::Compositor::Terminate(); |
+} |
+ |
+content::SoftwareBrowserCompositorOutputSurface* |
piman
2013/11/07 00:45:12
nit: return a scoped_ptr<SoftwareBrowserCompositor
dnicoara
2013/11/07 15:17:41
Done.
|
+SoftwareBrowserCompositorOutputSurfaceTest::CreateSurface( |
+ scoped_ptr<cc::SoftwareOutputDevice> device) { |
+ return new content::SoftwareBrowserCompositorOutputSurface( |
+ surface_proxy_, |
+ device.Pass(), |
+ 1, |
+ &surface_map_, |
+ compositor_->GetCompositorMessageLoop(), |
+ compositor_->AsWeakPtr()); |
+} |
+ |
+TEST_F(SoftwareBrowserCompositorOutputSurfaceTest, NoVSyncProvider) { |
+ scoped_ptr<cc::SoftwareOutputDevice> software_device( |
+ new cc::SoftwareOutputDevice()); |
+ output_surface_.reset(CreateSurface(software_device.Pass())); |
+ |
+ cc::CompositorFrame frame; |
+ static_cast<cc::OutputSurface*>(output_surface_.get())->SwapBuffers(&frame); |
piman
2013/11/07 00:45:12
nit: you shouldn't need the static cast.
dnicoara
2013/11/07 15:17:41
Done.
|
+ |
+ EXPECT_EQ(NULL, output_surface_->software_device()->GetVSyncProvider()); |
+} |
+ |
+TEST_F(SoftwareBrowserCompositorOutputSurfaceTest, VSyncProviderUpdates) { |
+ scoped_ptr<cc::SoftwareOutputDevice> software_device( |
+ new FakeSoftwareOutputDevice()); |
+ output_surface_.reset(CreateSurface(software_device.Pass())); |
+ |
+ FakeVSyncProvider* vsync_provider = static_cast<FakeVSyncProvider*>( |
+ output_surface_->software_device()->GetVSyncProvider()); |
+ EXPECT_EQ(0, vsync_provider->get_call_count()); |
+ |
+ cc::CompositorFrame frame; |
+ static_cast<cc::OutputSurface*>(output_surface_.get())->SwapBuffers(&frame); |
piman
2013/11/07 00:45:12
nit: Shouldn't need the static_cast either
dnicoara
2013/11/07 15:17:41
Done.
|
+ |
+ EXPECT_EQ(1, vsync_provider->get_call_count()); |
+} |