Unreviewed, rolling out r126169.
[WebKit-https.git] / Source / WebKit / chromium / tests / WebLayerTreeViewTest.cpp
1 /*
2  * Copyright (C) 2012 Google Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1.  Redistributions of source code must retain the above copyright
8  *     notice, this list of conditions and the following disclaimer.
9  * 2.  Redistributions in binary form must reproduce the above copyright
10  *     notice, this list of conditions and the following disclaimer in the
11  *     documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16  * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23  */
24
25 #include "config.h"
26
27 #include <public/WebLayerTreeView.h>
28
29 #include "CompositorFakeWebGraphicsContext3D.h"
30 #include "FakeWebCompositorOutputSurface.h"
31 #include "WebLayerTreeViewTestCommon.h"
32 #include <gmock/gmock.h>
33 #include <public/Platform.h>
34 #include <public/WebCompositor.h>
35 #include <public/WebLayer.h>
36 #include <public/WebLayerTreeViewClient.h>
37 #include <public/WebThread.h>
38
39 using namespace WebKit;
40 using testing::Mock;
41 using testing::Test;
42
43 namespace {
44
45 class MockWebLayerTreeViewClientForThreadedTests : public MockWebLayerTreeViewClient {
46 public:
47     virtual void didBeginFrame() OVERRIDE
48     {
49         WebKit::Platform::current()->currentThread()->exitRunLoop();
50         MockWebLayerTreeViewClient::didBeginFrame();
51     }
52 };
53
54 class WebLayerTreeViewTestBase : public Test {
55 protected:
56     virtual void initializeCompositor() = 0;
57     virtual WebLayerTreeViewClient* client() = 0;
58
59 public:
60     virtual void SetUp()
61     {
62         initializeCompositor();
63         m_rootLayer = adoptPtr(WebLayer::create());
64         EXPECT_TRUE(m_view.initialize(client(), *m_rootLayer, WebLayerTreeView::Settings()));
65         m_view.setSurfaceReady();
66     }
67
68     virtual void TearDown()
69     {
70         Mock::VerifyAndClearExpectations(client());
71
72         m_view.setRootLayer(0);
73         m_rootLayer.clear();
74         m_view.reset();
75         WebKit::WebCompositor::shutdown();
76     }
77
78 protected:
79     OwnPtr<WebLayer> m_rootLayer;
80     WebLayerTreeView m_view;
81 };
82
83 class WebLayerTreeViewSingleThreadTest : public WebLayerTreeViewTestBase {
84 protected:
85     void composite()
86     {
87         m_view.composite();
88     }
89
90     virtual void initializeCompositor() OVERRIDE
91     {
92         WebKit::WebCompositor::initialize(0);
93     }
94
95     virtual WebLayerTreeViewClient* client() OVERRIDE
96     {
97         return &m_client;
98     }
99
100     MockWebLayerTreeViewClient m_client;
101 };
102
103 class CancelableTaskWrapper : public RefCounted<CancelableTaskWrapper> {
104     class Task : public WebThread::Task {
105     public:
106         Task(CancelableTaskWrapper* cancelableTask)
107             : m_cancelableTask(cancelableTask)
108         {
109         }
110
111     private:
112         virtual void run() OVERRIDE
113         {
114             m_cancelableTask->runIfNotCanceled();
115         }
116
117         RefPtr<CancelableTaskWrapper> m_cancelableTask;
118     };
119
120 public:
121     CancelableTaskWrapper(PassOwnPtr<WebThread::Task> task)
122         : m_task(task)
123     {
124     }
125
126     void cancel()
127     {
128         m_task.clear();
129     }
130
131     WebThread::Task* createTask()
132     {
133         ASSERT(m_task);
134         return new Task(this);
135     }
136
137     void runIfNotCanceled()
138     {
139         if (!m_task)
140             return;
141         m_task->run();
142         m_task.clear();
143     }
144
145 private:
146     OwnPtr<WebThread::Task> m_task;
147 };
148
149 class WebLayerTreeViewThreadedTest : public WebLayerTreeViewTestBase {
150 protected:
151     class TimeoutTask : public WebThread::Task {
152         virtual void run() OVERRIDE
153         {
154             WebKit::Platform::current()->currentThread()->exitRunLoop();
155         }
156     };
157
158     void composite()
159     {
160         m_view.setNeedsRedraw();
161         RefPtr<CancelableTaskWrapper> timeoutTask = adoptRef(new CancelableTaskWrapper(adoptPtr(new TimeoutTask())));
162         WebKit::Platform::current()->currentThread()->postDelayedTask(timeoutTask->createTask(), 5000);
163         WebKit::Platform::current()->currentThread()->enterRunLoop();
164         timeoutTask->cancel();
165         m_view.finishAllRendering();
166     }
167
168     virtual void initializeCompositor() OVERRIDE
169     {
170         m_webThread = adoptPtr(WebKit::Platform::current()->createThread("WebLayerTreeViewTest"));
171         WebCompositor::initialize(m_webThread.get());
172     }
173
174     virtual WebLayerTreeViewClient* client() OVERRIDE
175     {
176         return &m_client;
177     }
178
179     MockWebLayerTreeViewClientForThreadedTests m_client;
180     OwnPtr<WebThread> m_webThread;
181 };
182
183 TEST_F(WebLayerTreeViewSingleThreadTest, InstrumentationCallbacks)
184 {
185     ::testing::InSequence dummy;
186
187     EXPECT_CALL(m_client, willCommit());
188     EXPECT_CALL(m_client, didCommit());
189     EXPECT_CALL(m_client, didBeginFrame());
190
191     composite();
192 }
193
194 TEST_F(WebLayerTreeViewThreadedTest, InstrumentationCallbacks)
195 {
196     ::testing::InSequence dummy;
197
198     EXPECT_CALL(m_client, willBeginFrame());
199     EXPECT_CALL(m_client, willCommit());
200     EXPECT_CALL(m_client, didCommit());
201     EXPECT_CALL(m_client, didBeginFrame());
202
203     composite();
204 }
205
206 } // namespace