OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/bind.h" | 5 #include "base/bind.h" |
6 #include "base/memory/ref_counted.h" | 6 #include "base/memory/ref_counted.h" |
7 #include "base/message_loop/message_loop.h" | 7 #include "base/message_loop/message_loop.h" |
8 #include "ppapi/c/pp_completion_callback.h" | 8 #include "ppapi/c/pp_completion_callback.h" |
9 #include "ppapi/c/pp_errors.h" | 9 #include "ppapi/c/pp_errors.h" |
10 #include "ppapi/shared_impl/callback_tracker.h" | 10 #include "ppapi/shared_impl/callback_tracker.h" |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
71 namespace { | 71 namespace { |
72 | 72 |
73 class CallbackShutdownTest : public TrackedCallbackTest { | 73 class CallbackShutdownTest : public TrackedCallbackTest { |
74 public: | 74 public: |
75 CallbackShutdownTest() {} | 75 CallbackShutdownTest() {} |
76 | 76 |
77 // Cases: | 77 // Cases: |
78 // (1) A callback which is run (so shouldn't be aborted on shutdown). | 78 // (1) A callback which is run (so shouldn't be aborted on shutdown). |
79 // (2) A callback which is aborted (so shouldn't be aborted on shutdown). | 79 // (2) A callback which is aborted (so shouldn't be aborted on shutdown). |
80 // (3) A callback which isn't run (so should be aborted on shutdown). | 80 // (3) A callback which isn't run (so should be aborted on shutdown). |
81 CallbackRunInfo& info_did_run() { return info_did_run_; } // (1) | 81 CallbackRunInfo& info_did_run() { return info_did_run_; } // (1) |
82 CallbackRunInfo& info_did_abort() { return info_did_abort_; } // (2) | 82 CallbackRunInfo& info_did_abort() { return info_did_abort_; } // (2) |
83 CallbackRunInfo& info_didnt_run() { return info_didnt_run_; } // (3) | 83 CallbackRunInfo& info_didnt_run() { return info_didnt_run_; } // (3) |
84 | 84 |
85 private: | 85 private: |
86 CallbackRunInfo info_did_run_; | 86 CallbackRunInfo info_did_run_; |
87 CallbackRunInfo info_did_abort_; | 87 CallbackRunInfo info_did_abort_; |
88 CallbackRunInfo info_didnt_run_; | 88 CallbackRunInfo info_didnt_run_; |
89 }; | 89 }; |
90 | 90 |
91 } // namespace | 91 } // namespace |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
148 public: | 148 public: |
149 CallbackMockResource(PP_Instance instance) | 149 CallbackMockResource(PP_Instance instance) |
150 : Resource(OBJECT_IS_IMPL, instance) {} | 150 : Resource(OBJECT_IS_IMPL, instance) {} |
151 ~CallbackMockResource() {} | 151 ~CallbackMockResource() {} |
152 | 152 |
153 PP_Resource SetupForTest() { | 153 PP_Resource SetupForTest() { |
154 PP_Resource resource_id = GetReference(); | 154 PP_Resource resource_id = GetReference(); |
155 EXPECT_NE(0, resource_id); | 155 EXPECT_NE(0, resource_id); |
156 | 156 |
157 callback_did_run_ = new TrackedCallback( | 157 callback_did_run_ = new TrackedCallback( |
158 this, | 158 this, PP_MakeCompletionCallback(&TestCallback, &info_did_run_)); |
159 PP_MakeCompletionCallback(&TestCallback, &info_did_run_)); | |
160 EXPECT_EQ(0U, info_did_run_.run_count); | 159 EXPECT_EQ(0U, info_did_run_.run_count); |
161 EXPECT_EQ(0U, info_did_run_.completion_task_run_count); | 160 EXPECT_EQ(0U, info_did_run_.completion_task_run_count); |
162 | 161 |
163 // In order to test that the completion task can override the callback | 162 // In order to test that the completion task can override the callback |
164 // result, we need to test callbacks with and without a completion task. | 163 // result, we need to test callbacks with and without a completion task. |
165 callback_did_run_with_completion_task_ = new TrackedCallback( | 164 callback_did_run_with_completion_task_ = new TrackedCallback( |
166 this, | 165 this, |
167 PP_MakeCompletionCallback(&TestCallback, | 166 PP_MakeCompletionCallback(&TestCallback, |
168 &info_did_run_with_completion_task_)); | 167 &info_did_run_with_completion_task_)); |
169 callback_did_run_with_completion_task_->set_completion_task( | 168 callback_did_run_with_completion_task_->set_completion_task( |
170 Bind(&CallbackMockResource::CompletionTask, this, | 169 Bind(&CallbackMockResource::CompletionTask, |
| 170 this, |
171 &info_did_run_with_completion_task_)); | 171 &info_did_run_with_completion_task_)); |
172 EXPECT_EQ(0U, info_did_run_with_completion_task_.run_count); | 172 EXPECT_EQ(0U, info_did_run_with_completion_task_.run_count); |
173 EXPECT_EQ(0U, info_did_run_with_completion_task_.completion_task_run_count); | 173 EXPECT_EQ(0U, info_did_run_with_completion_task_.completion_task_run_count); |
174 | 174 |
175 callback_did_abort_ = new TrackedCallback( | 175 callback_did_abort_ = new TrackedCallback( |
176 this, | 176 this, PP_MakeCompletionCallback(&TestCallback, &info_did_abort_)); |
177 PP_MakeCompletionCallback(&TestCallback, &info_did_abort_)); | |
178 callback_did_abort_->set_completion_task( | 177 callback_did_abort_->set_completion_task( |
179 Bind(&CallbackMockResource::CompletionTask, this, &info_did_abort_)); | 178 Bind(&CallbackMockResource::CompletionTask, this, &info_did_abort_)); |
180 EXPECT_EQ(0U, info_did_abort_.run_count); | 179 EXPECT_EQ(0U, info_did_abort_.run_count); |
181 EXPECT_EQ(0U, info_did_abort_.completion_task_run_count); | 180 EXPECT_EQ(0U, info_did_abort_.completion_task_run_count); |
182 | 181 |
183 callback_didnt_run_ = new TrackedCallback( | 182 callback_didnt_run_ = new TrackedCallback( |
184 this, | 183 this, PP_MakeCompletionCallback(&TestCallback, &info_didnt_run_)); |
185 PP_MakeCompletionCallback(&TestCallback, &info_didnt_run_)); | |
186 callback_didnt_run_->set_completion_task( | 184 callback_didnt_run_->set_completion_task( |
187 Bind(&CallbackMockResource::CompletionTask, this, &info_didnt_run_)); | 185 Bind(&CallbackMockResource::CompletionTask, this, &info_didnt_run_)); |
188 EXPECT_EQ(0U, info_didnt_run_.run_count); | 186 EXPECT_EQ(0U, info_didnt_run_.run_count); |
189 EXPECT_EQ(0U, info_didnt_run_.completion_task_run_count); | 187 EXPECT_EQ(0U, info_didnt_run_.completion_task_run_count); |
190 | 188 |
191 callback_did_run_->Run(PP_OK); | 189 callback_did_run_->Run(PP_OK); |
192 callback_did_run_with_completion_task_->Run(PP_OK); | 190 callback_did_run_with_completion_task_->Run(PP_OK); |
193 callback_did_abort_->Abort(); | 191 callback_did_abort_->Abort(); |
194 | 192 |
195 CheckIntermediateState(); | 193 CheckIntermediateState(); |
(...skipping 12 matching lines...) Expand all Loading... |
208 | 206 |
209 void CheckIntermediateState() { | 207 void CheckIntermediateState() { |
210 EXPECT_EQ(1U, info_did_run_.run_count); | 208 EXPECT_EQ(1U, info_did_run_.run_count); |
211 EXPECT_EQ(PP_OK, info_did_run_.result); | 209 EXPECT_EQ(PP_OK, info_did_run_.result); |
212 EXPECT_EQ(0U, info_did_run_.completion_task_run_count); | 210 EXPECT_EQ(0U, info_did_run_.completion_task_run_count); |
213 | 211 |
214 EXPECT_EQ(1U, info_did_run_with_completion_task_.run_count); | 212 EXPECT_EQ(1U, info_did_run_with_completion_task_.run_count); |
215 // completion task should override the result. | 213 // completion task should override the result. |
216 EXPECT_EQ(kOverrideResultValue, info_did_run_with_completion_task_.result); | 214 EXPECT_EQ(kOverrideResultValue, info_did_run_with_completion_task_.result); |
217 EXPECT_EQ(1U, info_did_run_with_completion_task_.completion_task_run_count); | 215 EXPECT_EQ(1U, info_did_run_with_completion_task_.completion_task_run_count); |
218 EXPECT_EQ(PP_OK, | 216 EXPECT_EQ(PP_OK, info_did_run_with_completion_task_.completion_task_result); |
219 info_did_run_with_completion_task_.completion_task_result); | |
220 | 217 |
221 EXPECT_EQ(1U, info_did_abort_.run_count); | 218 EXPECT_EQ(1U, info_did_abort_.run_count); |
222 // completion task shouldn't override an abort. | 219 // completion task shouldn't override an abort. |
223 EXPECT_EQ(PP_ERROR_ABORTED, info_did_abort_.result); | 220 EXPECT_EQ(PP_ERROR_ABORTED, info_did_abort_.result); |
224 EXPECT_EQ(1U, info_did_abort_.completion_task_run_count); | 221 EXPECT_EQ(1U, info_did_abort_.completion_task_run_count); |
225 EXPECT_EQ(PP_ERROR_ABORTED, info_did_abort_.completion_task_result); | 222 EXPECT_EQ(PP_ERROR_ABORTED, info_did_abort_.completion_task_result); |
226 | 223 |
227 EXPECT_EQ(0U, info_didnt_run_.completion_task_run_count); | 224 EXPECT_EQ(0U, info_didnt_run_.completion_task_run_count); |
228 EXPECT_EQ(0U, info_didnt_run_.run_count); | 225 EXPECT_EQ(0U, info_didnt_run_.run_count); |
229 } | 226 } |
(...skipping 18 matching lines...) Expand all Loading... |
248 | 245 |
249 scoped_refptr<TrackedCallback> callback_didnt_run_; | 246 scoped_refptr<TrackedCallback> callback_didnt_run_; |
250 CallbackRunInfo info_didnt_run_; | 247 CallbackRunInfo info_didnt_run_; |
251 }; | 248 }; |
252 | 249 |
253 } // namespace | 250 } // namespace |
254 | 251 |
255 // Test that callbacks get aborted on the last resource unref. | 252 // Test that callbacks get aborted on the last resource unref. |
256 TEST_F(CallbackResourceTest, AbortOnNoRef) { | 253 TEST_F(CallbackResourceTest, AbortOnNoRef) { |
257 ProxyAutoLock lock; | 254 ProxyAutoLock lock; |
258 ResourceTracker* resource_tracker = | 255 ResourceTracker* resource_tracker = PpapiGlobals::Get()->GetResourceTracker(); |
259 PpapiGlobals::Get()->GetResourceTracker(); | |
260 | 256 |
261 // Test several things: Unref-ing a resource (to zero refs) with callbacks | 257 // Test several things: Unref-ing a resource (to zero refs) with callbacks |
262 // which (1) have been run, (2) have been aborted, (3) haven't been completed. | 258 // which (1) have been run, (2) have been aborted, (3) haven't been completed. |
263 // Check that the uncompleted one gets aborted, and that the others don't get | 259 // Check that the uncompleted one gets aborted, and that the others don't get |
264 // called again. | 260 // called again. |
265 scoped_refptr<CallbackMockResource> resource_1( | 261 scoped_refptr<CallbackMockResource> resource_1( |
266 new CallbackMockResource(pp_instance())); | 262 new CallbackMockResource(pp_instance())); |
267 PP_Resource resource_1_id = resource_1->SetupForTest(); | 263 PP_Resource resource_1_id = resource_1->SetupForTest(); |
268 | 264 |
269 // Also do the same for a second resource, and make sure that unref-ing the | 265 // Also do the same for a second resource, and make sure that unref-ing the |
(...skipping 28 matching lines...) Expand all Loading... |
298 { | 294 { |
299 ProxyAutoUnlock unlock; | 295 ProxyAutoUnlock unlock; |
300 base::MessageLoop::current()->RunUntilIdle(); | 296 base::MessageLoop::current()->RunUntilIdle(); |
301 } | 297 } |
302 } | 298 } |
303 | 299 |
304 // Test that "resurrecting" a resource (getting a new ID for a |Resource|) | 300 // Test that "resurrecting" a resource (getting a new ID for a |Resource|) |
305 // doesn't resurrect callbacks. | 301 // doesn't resurrect callbacks. |
306 TEST_F(CallbackResourceTest, Resurrection) { | 302 TEST_F(CallbackResourceTest, Resurrection) { |
307 ProxyAutoLock lock; | 303 ProxyAutoLock lock; |
308 ResourceTracker* resource_tracker = | 304 ResourceTracker* resource_tracker = PpapiGlobals::Get()->GetResourceTracker(); |
309 PpapiGlobals::Get()->GetResourceTracker(); | |
310 | 305 |
311 scoped_refptr<CallbackMockResource> resource( | 306 scoped_refptr<CallbackMockResource> resource( |
312 new CallbackMockResource(pp_instance())); | 307 new CallbackMockResource(pp_instance())); |
313 PP_Resource resource_id = resource->SetupForTest(); | 308 PP_Resource resource_id = resource->SetupForTest(); |
314 | 309 |
315 // Unref it, spin the message loop to run posted calls, and check that things | 310 // Unref it, spin the message loop to run posted calls, and check that things |
316 // are in the expected states. | 311 // are in the expected states. |
317 resource_tracker->ReleaseResource(resource_id); | 312 resource_tracker->ReleaseResource(resource_id); |
318 { | 313 { |
319 ProxyAutoUnlock unlock; | 314 ProxyAutoUnlock unlock; |
(...skipping 18 matching lines...) Expand all Loading... |
338 resource->CheckFinalState(); | 333 resource->CheckFinalState(); |
339 | 334 |
340 // This shouldn't be needed, but make sure there are no stranded tasks. | 335 // This shouldn't be needed, but make sure there are no stranded tasks. |
341 { | 336 { |
342 ProxyAutoUnlock unlock; | 337 ProxyAutoUnlock unlock; |
343 base::MessageLoop::current()->RunUntilIdle(); | 338 base::MessageLoop::current()->RunUntilIdle(); |
344 } | 339 } |
345 } | 340 } |
346 | 341 |
347 } // namespace ppapi | 342 } // namespace ppapi |
OLD | NEW |