OLD | NEW |
| (Empty) |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "gpu/command_buffer/common/command_buffer_mock.h" | |
6 #include "gpu/gpu_plugin/gpu_plugin_object.h" | |
7 #include "gpu/command_buffer/service/gpu_processor_mock.h" | |
8 #include "gpu/np_utils/np_browser_mock.h" | |
9 #include "gpu/np_utils/dynamic_np_object.h" | |
10 #include "gpu/np_utils/np_object_mock.h" | |
11 #include "gpu/np_utils/np_object_pointer.h" | |
12 #include "testing/gtest/include/gtest/gtest.h" | |
13 #include "testing/gmock/include/gmock/gmock.h" | |
14 #include "webkit/glue/plugins/nphostapi.h" | |
15 | |
16 using ::base::SharedMemory; | |
17 using command_buffer::GPUProcessor; | |
18 using command_buffer::MockCommandBuffer; | |
19 using command_buffer::MockGPUProcessor; | |
20 using np_utils::MockNPBrowser; | |
21 using np_utils::NPBrowser; | |
22 using np_utils::NPObjectPointer; | |
23 using testing::_; | |
24 using testing::DoAll; | |
25 using testing::Invoke; | |
26 using testing::NotNull; | |
27 using testing::Return; | |
28 using testing::SetArgumentPointee; | |
29 using testing::StrictMock; | |
30 | |
31 namespace gpu_plugin { | |
32 | |
33 class GPUPluginObjectTest : public testing::Test { | |
34 protected: | |
35 virtual void SetUp() { | |
36 plugin_object_ = np_utils::NPCreateObject<GPUPluginObject>(NULL); | |
37 | |
38 command_buffer_ = new MockCommandBuffer; | |
39 | |
40 // Takes ownership. | |
41 plugin_object_->set_command_buffer(command_buffer_); | |
42 | |
43 processor_ = new MockGPUProcessor(command_buffer_); | |
44 plugin_object_->set_gpu_processor(processor_.get()); | |
45 } | |
46 | |
47 MockNPBrowser mock_browser_; | |
48 NPObjectPointer<GPUPluginObject> plugin_object_; | |
49 MockCommandBuffer* command_buffer_; | |
50 scoped_refptr<MockGPUProcessor> processor_; | |
51 }; | |
52 | |
53 namespace { | |
54 template <typename T> | |
55 void DeleteObject(T* object) { | |
56 delete object; | |
57 } | |
58 } // namespace anonymous | |
59 | |
60 | |
61 TEST_F(GPUPluginObjectTest, CanInstantiateAndDestroyPluginObject) { | |
62 EXPECT_EQ(GPUPluginObject::kWaitingForNew, plugin_object_->GetStatus()); | |
63 | |
64 EXPECT_EQ(NPERR_NO_ERROR, plugin_object_->New("application/foo", | |
65 0, | |
66 NULL, | |
67 NULL, | |
68 NULL)); | |
69 | |
70 EXPECT_EQ(GPUPluginObject::kWaitingForSetWindow, plugin_object_->GetStatus()); | |
71 | |
72 EXPECT_EQ(NPERR_NO_ERROR, plugin_object_->Destroy(NULL)); | |
73 | |
74 EXPECT_EQ(GPUPluginObject::kDestroyed, plugin_object_->GetStatus()); | |
75 } | |
76 | |
77 TEST_F(GPUPluginObjectTest, DestroyFailsIfNotInitialized) { | |
78 EXPECT_EQ(NPERR_GENERIC_ERROR, plugin_object_->Destroy(NULL)); | |
79 } | |
80 | |
81 TEST_F(GPUPluginObjectTest, NewFailsIfAlreadyInitialized) { | |
82 EXPECT_EQ(NPERR_NO_ERROR, plugin_object_->New("application/foo", | |
83 0, | |
84 NULL, | |
85 NULL, | |
86 NULL)); | |
87 | |
88 EXPECT_EQ(NPERR_GENERIC_ERROR, plugin_object_->New("application/foo", | |
89 0, | |
90 NULL, | |
91 NULL, | |
92 NULL)); | |
93 | |
94 EXPECT_EQ(GPUPluginObject::kWaitingForSetWindow, plugin_object_->GetStatus()); | |
95 | |
96 EXPECT_EQ(NPERR_NO_ERROR, plugin_object_->Destroy(NULL)); | |
97 | |
98 EXPECT_EQ(GPUPluginObject::kDestroyed, plugin_object_->GetStatus()); | |
99 } | |
100 | |
101 TEST_F(GPUPluginObjectTest, NewFailsIfObjectHasPreviouslyBeenDestroyed) { | |
102 EXPECT_EQ(NPERR_NO_ERROR, plugin_object_->New("application/foo", | |
103 0, | |
104 NULL, | |
105 NULL, | |
106 NULL)); | |
107 | |
108 EXPECT_EQ(NPERR_NO_ERROR, plugin_object_->Destroy(NULL)); | |
109 | |
110 EXPECT_EQ(NPERR_GENERIC_ERROR, plugin_object_->New("application/foo", | |
111 0, | |
112 NULL, | |
113 NULL, | |
114 NULL)); | |
115 | |
116 EXPECT_EQ(GPUPluginObject::kDestroyed, plugin_object_->GetStatus()); | |
117 } | |
118 | |
119 TEST_F(GPUPluginObjectTest, WindowIsNullBeforeSetWindowCalled) { | |
120 NPWindow window = plugin_object_->GetWindow(); | |
121 EXPECT_EQ(NULL, window.window); | |
122 } | |
123 | |
124 TEST_F(GPUPluginObjectTest, CanSetWindow) { | |
125 EXPECT_EQ(NPERR_NO_ERROR, plugin_object_->New("application/foo", | |
126 0, | |
127 NULL, | |
128 NULL, | |
129 NULL)); | |
130 | |
131 NPWindow window = {0}; | |
132 window.window = &window; | |
133 window.x = 7; | |
134 | |
135 EXPECT_EQ(NPERR_NO_ERROR, plugin_object_->SetWindow(&window)); | |
136 EXPECT_EQ(0, memcmp(&window, &plugin_object_->GetWindow(), sizeof(window))); | |
137 EXPECT_EQ(GPUPluginObject::kWaitingForOpenCommandBuffer, | |
138 plugin_object_->GetStatus()); | |
139 | |
140 EXPECT_EQ(NPERR_NO_ERROR, plugin_object_->Destroy(NULL)); | |
141 } | |
142 | |
143 TEST_F(GPUPluginObjectTest, CanGetWindowSize) { | |
144 EXPECT_EQ(NPERR_NO_ERROR, plugin_object_->New("application/foo", | |
145 0, | |
146 NULL, | |
147 NULL, | |
148 NULL)); | |
149 | |
150 NPWindow window = {0}; | |
151 window.window = &window; | |
152 window.x = 10; | |
153 window.y = 10; | |
154 window.width = 100; | |
155 window.height = 200; | |
156 | |
157 EXPECT_EQ(0, plugin_object_->GetWidth()); | |
158 EXPECT_EQ(0, plugin_object_->GetHeight()); | |
159 EXPECT_EQ(NPERR_NO_ERROR, plugin_object_->SetWindow(&window)); | |
160 EXPECT_EQ(100, plugin_object_->GetWidth()); | |
161 EXPECT_EQ(200, plugin_object_->GetHeight()); | |
162 | |
163 EXPECT_EQ(NPERR_NO_ERROR, plugin_object_->Destroy(NULL)); | |
164 } | |
165 | |
166 TEST_F(GPUPluginObjectTest, SetWindowFailsIfNotInitialized) { | |
167 NPWindow window = {0}; | |
168 EXPECT_EQ(NPERR_GENERIC_ERROR, plugin_object_->SetWindow(&window)); | |
169 EXPECT_EQ(GPUPluginObject::kWaitingForNew, plugin_object_->GetStatus()); | |
170 } | |
171 | |
172 TEST_F(GPUPluginObjectTest, CanGetScriptableNPObject) { | |
173 NPObject* scriptable_object = plugin_object_->GetScriptableNPObject(); | |
174 EXPECT_EQ(plugin_object_.Get(), scriptable_object); | |
175 NPBrowser::get()->ReleaseObject(scriptable_object); | |
176 } | |
177 | |
178 TEST_F(GPUPluginObjectTest, OpenCommandBufferReturnsInitializedCommandBuffer) { | |
179 EXPECT_CALL(*command_buffer_, Initialize(NotNull())) | |
180 .WillOnce(DoAll(Invoke(DeleteObject<SharedMemory>), | |
181 Return(true))); | |
182 | |
183 EXPECT_CALL(*processor_.get(), Initialize(NULL)) | |
184 .WillOnce(Return(true)); | |
185 | |
186 EXPECT_CALL(*command_buffer_, SetPutOffsetChangeCallback(NotNull())) | |
187 .WillOnce(Invoke(DeleteObject<Callback0::Type>)); | |
188 | |
189 EXPECT_EQ(NPERR_NO_ERROR, plugin_object_->New("application/foo", | |
190 0, | |
191 NULL, | |
192 NULL, | |
193 NULL)); | |
194 | |
195 // Set status as though SetWindow has been called. Avoids having to create a | |
196 // valid window handle to pass to SetWindow in tests. | |
197 plugin_object_->set_status(GPUPluginObject::kWaitingForOpenCommandBuffer); | |
198 | |
199 EXPECT_EQ(command_buffer_, plugin_object_->OpenCommandBuffer()); | |
200 | |
201 // Calling OpenCommandBuffer again just returns the existing command buffer. | |
202 EXPECT_EQ(command_buffer_, plugin_object_->OpenCommandBuffer()); | |
203 | |
204 EXPECT_EQ(GPUPluginObject::kInitializationSuccessful, | |
205 plugin_object_->GetStatus()); | |
206 | |
207 EXPECT_CALL(*command_buffer_, SetPutOffsetChangeCallback(NULL)); | |
208 | |
209 EXPECT_EQ(NPERR_NO_ERROR, plugin_object_->Destroy(NULL)); | |
210 } | |
211 | |
212 TEST_F(GPUPluginObjectTest, OpenCommandBufferReturnsNullIfWindowNotReady) { | |
213 EXPECT_EQ(NPERR_NO_ERROR, plugin_object_->New("application/foo", | |
214 0, | |
215 NULL, | |
216 NULL, | |
217 NULL)); | |
218 | |
219 // Set status as though SetWindow has not been called. | |
220 plugin_object_->set_status(GPUPluginObject::kWaitingForSetWindow); | |
221 | |
222 EXPECT_TRUE(NULL == plugin_object_->OpenCommandBuffer()); | |
223 | |
224 EXPECT_EQ(GPUPluginObject::kWaitingForSetWindow, plugin_object_->GetStatus()); | |
225 } | |
226 | |
227 | |
228 TEST_F(GPUPluginObjectTest, | |
229 OpenCommandBufferReturnsNullIfCommandBufferCannotInitialize) { | |
230 EXPECT_CALL(*command_buffer_, Initialize(NotNull())) | |
231 .WillOnce(DoAll(Invoke(DeleteObject<SharedMemory>), | |
232 Return(false))); | |
233 | |
234 EXPECT_EQ(NPERR_NO_ERROR, plugin_object_->New("application/foo", | |
235 0, | |
236 NULL, | |
237 NULL, | |
238 NULL)); | |
239 | |
240 // Set status as though SetWindow has been called. Avoids having to create a | |
241 // valid window handle to pass to SetWindow in tests. | |
242 plugin_object_->set_status(GPUPluginObject::kWaitingForOpenCommandBuffer); | |
243 | |
244 EXPECT_TRUE(NULL == plugin_object_->OpenCommandBuffer()); | |
245 | |
246 EXPECT_EQ(GPUPluginObject::kWaitingForOpenCommandBuffer, | |
247 plugin_object_->GetStatus()); | |
248 | |
249 EXPECT_EQ(NPERR_NO_ERROR, plugin_object_->Destroy(NULL)); | |
250 } | |
251 | |
252 TEST_F(GPUPluginObjectTest, | |
253 OpenCommandBufferReturnsNullIGPUProcessorCannotInitialize) { | |
254 EXPECT_CALL(*command_buffer_, Initialize(NotNull())) | |
255 .WillOnce(DoAll(Invoke(DeleteObject<SharedMemory>), | |
256 Return(true))); | |
257 | |
258 EXPECT_CALL(*processor_.get(), Initialize(NULL)) | |
259 .WillOnce(Return(false)); | |
260 | |
261 EXPECT_EQ(NPERR_NO_ERROR, plugin_object_->New("application/foo", | |
262 0, | |
263 NULL, | |
264 NULL, | |
265 NULL)); | |
266 | |
267 // Set status as though SetWindow has been called. Avoids having to create a | |
268 // valid window handle to pass to SetWindow in tests. | |
269 plugin_object_->set_status(GPUPluginObject::kWaitingForOpenCommandBuffer); | |
270 | |
271 EXPECT_TRUE(NULL == plugin_object_->OpenCommandBuffer()); | |
272 | |
273 EXPECT_EQ(GPUPluginObject::kWaitingForOpenCommandBuffer, | |
274 plugin_object_->GetStatus()); | |
275 | |
276 EXPECT_EQ(NPERR_NO_ERROR, plugin_object_->Destroy(NULL)); | |
277 } | |
278 | |
279 class MockEventSync : public np_utils::DefaultNPObject<NPObject> { | |
280 public: | |
281 explicit MockEventSync(NPP npp) { | |
282 } | |
283 | |
284 MOCK_METHOD2(Resize, void(int32 width, int32 height)); | |
285 | |
286 NP_UTILS_BEGIN_DISPATCHER_CHAIN(MockEventSync, DefaultNPObject<NPObject>) | |
287 NP_UTILS_DISPATCHER(Resize, void(int32 width, int32 height)) | |
288 NP_UTILS_END_DISPATCHER_CHAIN | |
289 | |
290 private: | |
291 DISALLOW_COPY_AND_ASSIGN(MockEventSync); | |
292 }; | |
293 | |
294 TEST_F(GPUPluginObjectTest, SendsResizeEventOnSetWindow) { | |
295 EXPECT_EQ(NPERR_NO_ERROR, plugin_object_->New("application/foo", | |
296 0, | |
297 NULL, | |
298 NULL, | |
299 NULL)); | |
300 | |
301 NPObjectPointer<MockEventSync> event_sync = | |
302 np_utils::NPCreateObject<MockEventSync>(NULL); | |
303 plugin_object_->SetEventSync(event_sync); | |
304 | |
305 EXPECT_CALL(*event_sync.Get(), Resize(100, 200)); | |
306 | |
307 NPWindow window = {0}; | |
308 window.window = &window; | |
309 window.x = 10; | |
310 window.y = 10; | |
311 window.width = 100; | |
312 window.height = 200; | |
313 | |
314 plugin_object_->SetWindow(&window); | |
315 | |
316 EXPECT_EQ(NPERR_NO_ERROR, plugin_object_->Destroy(NULL)); | |
317 } | |
318 | |
319 } // namespace gpu_plugin | |
OLD | NEW |