Index: webkit/compositor/WebLayerTreeViewTest.cpp |
diff --git a/webkit/compositor/WebLayerTreeViewTest.cpp b/webkit/compositor/WebLayerTreeViewTest.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d09b8067c8937fa7c3e069b10a5b0da3488d0ee9 |
--- /dev/null |
+++ b/webkit/compositor/WebLayerTreeViewTest.cpp |
@@ -0,0 +1,187 @@ |
+// Copyright 2012 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 "config.h" |
+ |
+#include <public/WebLayerTreeView.h> |
+ |
+#include "CompositorFakeWebGraphicsContext3D.h" |
+#include "FakeWebCompositorOutputSurface.h" |
+#include "WebLayerTreeViewTestCommon.h" |
+#include <gmock/gmock.h> |
+#include <public/Platform.h> |
+#include <public/WebCompositor.h> |
+#include <public/WebLayer.h> |
+#include <public/WebLayerTreeViewClient.h> |
+#include <public/WebThread.h> |
+#include <wtf/RefCounted.h> |
+#include <wtf/RefPtr.h> |
+ |
+using namespace WebKit; |
+using testing::Mock; |
+using testing::Test; |
+ |
+namespace { |
+ |
+class MockWebLayerTreeViewClientForThreadedTests : public MockWebLayerTreeViewClient { |
+public: |
+ virtual void didBeginFrame() OVERRIDE |
+ { |
+ WebKit::Platform::current()->currentThread()->exitRunLoop(); |
+ MockWebLayerTreeViewClient::didBeginFrame(); |
+ } |
+}; |
+ |
+class WebLayerTreeViewTestBase : public Test { |
+protected: |
+ virtual void initializeCompositor() = 0; |
+ virtual WebLayerTreeViewClient* client() = 0; |
+ |
+public: |
+ virtual void SetUp() |
+ { |
+ initializeCompositor(); |
+ m_rootLayer = adoptPtr(WebLayer::create()); |
+ ASSERT_TRUE(m_view = adoptPtr(WebLayerTreeView::create(client(), *m_rootLayer, WebLayerTreeView::Settings()))); |
+ m_view->setSurfaceReady(); |
+ } |
+ |
+ virtual void TearDown() |
+ { |
+ Mock::VerifyAndClearExpectations(client()); |
+ |
+ m_rootLayer.clear(); |
+ m_view.clear(); |
+ WebKit::WebCompositor::shutdown(); |
+ } |
+ |
+protected: |
+ OwnPtr<WebLayer> m_rootLayer; |
+ OwnPtr<WebLayerTreeView> m_view; |
+}; |
+ |
+class WebLayerTreeViewSingleThreadTest : public WebLayerTreeViewTestBase { |
+protected: |
+ void composite() |
+ { |
+ m_view->composite(); |
+ } |
+ |
+ virtual void initializeCompositor() OVERRIDE |
+ { |
+ WebKit::WebCompositor::initialize(0); |
+ } |
+ |
+ virtual WebLayerTreeViewClient* client() OVERRIDE |
+ { |
+ return &m_client; |
+ } |
+ |
+ MockWebLayerTreeViewClient m_client; |
+}; |
+ |
+class CancelableTaskWrapper : public RefCounted<CancelableTaskWrapper> { |
+ class Task : public WebThread::Task { |
+ public: |
+ Task(CancelableTaskWrapper* cancelableTask) |
+ : m_cancelableTask(cancelableTask) |
+ { |
+ } |
+ |
+ private: |
+ virtual void run() OVERRIDE |
+ { |
+ m_cancelableTask->runIfNotCanceled(); |
+ } |
+ |
+ RefPtr<CancelableTaskWrapper> m_cancelableTask; |
+ }; |
+ |
+public: |
+ CancelableTaskWrapper(PassOwnPtr<WebThread::Task> task) |
+ : m_task(task) |
+ { |
+ } |
+ |
+ void cancel() |
+ { |
+ m_task.clear(); |
+ } |
+ |
+ WebThread::Task* createTask() |
+ { |
+ ASSERT(m_task); |
+ return new Task(this); |
+ } |
+ |
+ void runIfNotCanceled() |
+ { |
+ if (!m_task) |
+ return; |
+ m_task->run(); |
+ m_task.clear(); |
+ } |
+ |
+private: |
+ OwnPtr<WebThread::Task> m_task; |
+}; |
+ |
+class WebLayerTreeViewThreadedTest : public WebLayerTreeViewTestBase { |
+protected: |
+ class TimeoutTask : public WebThread::Task { |
+ virtual void run() OVERRIDE |
+ { |
+ WebKit::Platform::current()->currentThread()->exitRunLoop(); |
+ } |
+ }; |
+ |
+ void composite() |
+ { |
+ m_view->setNeedsRedraw(); |
+ RefPtr<CancelableTaskWrapper> timeoutTask = adoptRef(new CancelableTaskWrapper(adoptPtr(new TimeoutTask()))); |
+ WebKit::Platform::current()->currentThread()->postDelayedTask(timeoutTask->createTask(), 5000); |
+ WebKit::Platform::current()->currentThread()->enterRunLoop(); |
+ timeoutTask->cancel(); |
+ m_view->finishAllRendering(); |
+ } |
+ |
+ virtual void initializeCompositor() OVERRIDE |
+ { |
+ m_webThread = adoptPtr(WebKit::Platform::current()->createThread("WebLayerTreeViewTest")); |
+ WebCompositor::initialize(m_webThread.get()); |
+ } |
+ |
+ virtual WebLayerTreeViewClient* client() OVERRIDE |
+ { |
+ return &m_client; |
+ } |
+ |
+ MockWebLayerTreeViewClientForThreadedTests m_client; |
+ OwnPtr<WebThread> m_webThread; |
+}; |
+ |
+TEST_F(WebLayerTreeViewSingleThreadTest, InstrumentationCallbacks) |
+{ |
+ ::testing::InSequence dummy; |
+ |
+ EXPECT_CALL(m_client, willCommit()); |
+ EXPECT_CALL(m_client, didCommit()); |
+ EXPECT_CALL(m_client, didBeginFrame()); |
+ |
+ composite(); |
+} |
+ |
+TEST_F(WebLayerTreeViewThreadedTest, InstrumentationCallbacks) |
+{ |
+ ::testing::InSequence dummy; |
+ |
+ EXPECT_CALL(m_client, willBeginFrame()); |
+ EXPECT_CALL(m_client, willCommit()); |
+ EXPECT_CALL(m_client, didCommit()); |
+ EXPECT_CALL(m_client, didBeginFrame()); |
+ |
+ composite(); |
+} |
+ |
+} // namespace |