Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2086)

Unified Diff: ppapi/shared_impl/tracked_callback_unittest.cc

Issue 923263003: PPAPI: Make TrackedCallback more threadsafe (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: review comments Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ppapi/shared_impl/tracked_callback.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ppapi/shared_impl/tracked_callback_unittest.cc
diff --git a/ppapi/shared_impl/tracked_callback_unittest.cc b/ppapi/shared_impl/tracked_callback_unittest.cc
deleted file mode 100644
index 12ad4235bdb66341e0c82a7b922e4864d38caf8b..0000000000000000000000000000000000000000
--- a/ppapi/shared_impl/tracked_callback_unittest.cc
+++ /dev/null
@@ -1,341 +0,0 @@
-// Copyright (c) 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 "base/bind.h"
-#include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
-#include "ppapi/c/pp_completion_callback.h"
-#include "ppapi/c/pp_errors.h"
-#include "ppapi/shared_impl/callback_tracker.h"
-#include "ppapi/shared_impl/proxy_lock.h"
-#include "ppapi/shared_impl/resource.h"
-#include "ppapi/shared_impl/resource_tracker.h"
-#include "ppapi/shared_impl/test_globals.h"
-#include "ppapi/shared_impl/tracked_callback.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace ppapi {
-
-namespace {
-
-class TrackedCallbackTest : public testing::Test {
- public:
- TrackedCallbackTest() : pp_instance_(1234) {}
-
- PP_Instance pp_instance() const { return pp_instance_; }
-
- virtual void SetUp() override {
- ProxyAutoLock lock;
- globals_.GetResourceTracker()->DidCreateInstance(pp_instance_);
- }
- virtual void TearDown() override {
- ProxyAutoLock lock;
- globals_.GetResourceTracker()->DidDeleteInstance(pp_instance_);
- }
-
- private:
- base::MessageLoop message_loop_;
- TestGlobals globals_;
- PP_Instance pp_instance_;
-};
-
-// All valid results (PP_OK, PP_ERROR_...) are nonpositive.
-const int32_t kInitializedResultValue = 1;
-const int32_t kOverrideResultValue = 2;
-
-struct CallbackRunInfo {
- CallbackRunInfo()
- : run_count(0),
- result(kInitializedResultValue),
- completion_task_run_count(0),
- completion_task_result(kInitializedResultValue) {}
- unsigned run_count;
- int32_t result;
- unsigned completion_task_run_count;
- int32_t completion_task_result;
-};
-
-void TestCallback(void* user_data, int32_t result) {
- CallbackRunInfo* info = reinterpret_cast<CallbackRunInfo*>(user_data);
- info->run_count++;
- if (info->run_count == 1)
- info->result = result;
-}
-
-} // namespace
-
-// CallbackShutdownTest --------------------------------------------------------
-
-namespace {
-
-class CallbackShutdownTest : public TrackedCallbackTest {
- public:
- CallbackShutdownTest() {}
-
- // Cases:
- // (1) A callback which is run (so shouldn't be aborted on shutdown).
- // (2) A callback which is aborted (so shouldn't be aborted on shutdown).
- // (3) A callback which isn't run (so should be aborted on shutdown).
- CallbackRunInfo& info_did_run() { return info_did_run_; } // (1)
- CallbackRunInfo& info_did_abort() { return info_did_abort_; } // (2)
- CallbackRunInfo& info_didnt_run() { return info_didnt_run_; } // (3)
-
- private:
- CallbackRunInfo info_did_run_;
- CallbackRunInfo info_did_abort_;
- CallbackRunInfo info_didnt_run_;
-};
-
-} // namespace
-
-// Tests that callbacks are properly aborted on module shutdown.
-TEST_F(CallbackShutdownTest, AbortOnShutdown) {
- ProxyAutoLock lock;
- scoped_refptr<Resource> resource(new Resource(OBJECT_IS_IMPL, pp_instance()));
-
- // Set up case (1) (see above).
- EXPECT_EQ(0U, info_did_run().run_count);
- scoped_refptr<TrackedCallback> callback_did_run = new TrackedCallback(
- resource.get(),
- PP_MakeCompletionCallback(&TestCallback, &info_did_run()));
- EXPECT_EQ(0U, info_did_run().run_count);
- callback_did_run->Run(PP_OK);
- EXPECT_EQ(1U, info_did_run().run_count);
- EXPECT_EQ(PP_OK, info_did_run().result);
-
- // Set up case (2).
- EXPECT_EQ(0U, info_did_abort().run_count);
- scoped_refptr<TrackedCallback> callback_did_abort = new TrackedCallback(
- resource.get(),
- PP_MakeCompletionCallback(&TestCallback, &info_did_abort()));
- EXPECT_EQ(0U, info_did_abort().run_count);
- callback_did_abort->Abort();
- EXPECT_EQ(1U, info_did_abort().run_count);
- EXPECT_EQ(PP_ERROR_ABORTED, info_did_abort().result);
-
- // Set up case (3).
- EXPECT_EQ(0U, info_didnt_run().run_count);
- scoped_refptr<TrackedCallback> callback_didnt_run = new TrackedCallback(
- resource.get(),
- PP_MakeCompletionCallback(&TestCallback, &info_didnt_run()));
- EXPECT_EQ(0U, info_didnt_run().run_count);
-
- PpapiGlobals::Get()->GetCallbackTrackerForInstance(pp_instance())->AbortAll();
-
- // Check case (1).
- EXPECT_EQ(1U, info_did_run().run_count);
-
- // Check case (2).
- EXPECT_EQ(1U, info_did_abort().run_count);
-
- // Check case (3).
- EXPECT_EQ(1U, info_didnt_run().run_count);
- EXPECT_EQ(PP_ERROR_ABORTED, info_didnt_run().result);
-}
-
-// CallbackResourceTest --------------------------------------------------------
-
-namespace {
-
-class CallbackResourceTest : public TrackedCallbackTest {
- public:
- CallbackResourceTest() {}
-};
-
-class CallbackMockResource : public Resource {
- public:
- CallbackMockResource(PP_Instance instance)
- : Resource(OBJECT_IS_IMPL, instance) {}
- ~CallbackMockResource() {}
-
- PP_Resource SetupForTest() {
- PP_Resource resource_id = GetReference();
- EXPECT_NE(0, resource_id);
-
- callback_did_run_ = new TrackedCallback(
- this, PP_MakeCompletionCallback(&TestCallback, &info_did_run_));
- EXPECT_EQ(0U, info_did_run_.run_count);
- EXPECT_EQ(0U, info_did_run_.completion_task_run_count);
-
- // In order to test that the completion task can override the callback
- // result, we need to test callbacks with and without a completion task.
- callback_did_run_with_completion_task_ = new TrackedCallback(
- this,
- PP_MakeCompletionCallback(&TestCallback,
- &info_did_run_with_completion_task_));
- callback_did_run_with_completion_task_->set_completion_task(
- Bind(&CallbackMockResource::CompletionTask,
- this,
- &info_did_run_with_completion_task_));
- EXPECT_EQ(0U, info_did_run_with_completion_task_.run_count);
- EXPECT_EQ(0U, info_did_run_with_completion_task_.completion_task_run_count);
-
- callback_did_abort_ = new TrackedCallback(
- this, PP_MakeCompletionCallback(&TestCallback, &info_did_abort_));
- callback_did_abort_->set_completion_task(
- Bind(&CallbackMockResource::CompletionTask, this, &info_did_abort_));
- EXPECT_EQ(0U, info_did_abort_.run_count);
- EXPECT_EQ(0U, info_did_abort_.completion_task_run_count);
-
- callback_didnt_run_ = new TrackedCallback(
- this, PP_MakeCompletionCallback(&TestCallback, &info_didnt_run_));
- callback_didnt_run_->set_completion_task(
- Bind(&CallbackMockResource::CompletionTask, this, &info_didnt_run_));
- EXPECT_EQ(0U, info_didnt_run_.run_count);
- EXPECT_EQ(0U, info_didnt_run_.completion_task_run_count);
-
- callback_did_run_->Run(PP_OK);
- callback_did_run_with_completion_task_->Run(PP_OK);
- callback_did_abort_->Abort();
-
- CheckIntermediateState();
-
- return resource_id;
- }
-
- int32_t CompletionTask(CallbackRunInfo* info, int32_t result) {
- // We should run before the callback.
- EXPECT_EQ(0U, info->run_count);
- info->completion_task_run_count++;
- if (info->completion_task_run_count == 1)
- info->completion_task_result = result;
- return kOverrideResultValue;
- }
-
- void CheckIntermediateState() {
- EXPECT_EQ(1U, info_did_run_.run_count);
- EXPECT_EQ(PP_OK, info_did_run_.result);
- EXPECT_EQ(0U, info_did_run_.completion_task_run_count);
-
- EXPECT_EQ(1U, info_did_run_with_completion_task_.run_count);
- // completion task should override the result.
- EXPECT_EQ(kOverrideResultValue, info_did_run_with_completion_task_.result);
- EXPECT_EQ(1U, info_did_run_with_completion_task_.completion_task_run_count);
- EXPECT_EQ(PP_OK, info_did_run_with_completion_task_.completion_task_result);
-
- EXPECT_EQ(1U, info_did_abort_.run_count);
- // completion task shouldn't override an abort.
- EXPECT_EQ(PP_ERROR_ABORTED, info_did_abort_.result);
- EXPECT_EQ(1U, info_did_abort_.completion_task_run_count);
- EXPECT_EQ(PP_ERROR_ABORTED, info_did_abort_.completion_task_result);
-
- EXPECT_EQ(0U, info_didnt_run_.completion_task_run_count);
- EXPECT_EQ(0U, info_didnt_run_.run_count);
- }
-
- void CheckFinalState() {
- EXPECT_EQ(1U, info_did_run_.run_count);
- EXPECT_EQ(PP_OK, info_did_run_.result);
- EXPECT_EQ(1U, info_did_abort_.run_count);
- EXPECT_EQ(PP_ERROR_ABORTED, info_did_abort_.result);
- EXPECT_EQ(1U, info_didnt_run_.run_count);
- EXPECT_EQ(PP_ERROR_ABORTED, info_didnt_run_.result);
- }
-
- scoped_refptr<TrackedCallback> callback_did_run_;
- CallbackRunInfo info_did_run_;
-
- scoped_refptr<TrackedCallback> callback_did_run_with_completion_task_;
- CallbackRunInfo info_did_run_with_completion_task_;
-
- scoped_refptr<TrackedCallback> callback_did_abort_;
- CallbackRunInfo info_did_abort_;
-
- scoped_refptr<TrackedCallback> callback_didnt_run_;
- CallbackRunInfo info_didnt_run_;
-};
-
-} // namespace
-
-// Test that callbacks get aborted on the last resource unref.
-TEST_F(CallbackResourceTest, AbortOnNoRef) {
- ProxyAutoLock lock;
- ResourceTracker* resource_tracker = PpapiGlobals::Get()->GetResourceTracker();
-
- // Test several things: Unref-ing a resource (to zero refs) with callbacks
- // which (1) have been run, (2) have been aborted, (3) haven't been completed.
- // Check that the uncompleted one gets aborted, and that the others don't get
- // called again.
- scoped_refptr<CallbackMockResource> resource_1(
- new CallbackMockResource(pp_instance()));
- PP_Resource resource_1_id = resource_1->SetupForTest();
-
- // Also do the same for a second resource, and make sure that unref-ing the
- // first resource doesn't much up the second resource.
- scoped_refptr<CallbackMockResource> resource_2(
- new CallbackMockResource(pp_instance()));
- PP_Resource resource_2_id = resource_2->SetupForTest();
-
- // Double-check that resource #1 is still okay.
- resource_1->CheckIntermediateState();
-
- // Kill resource #1, spin the message loop to run posted calls, and check that
- // things are in the expected states.
- resource_tracker->ReleaseResource(resource_1_id);
- {
- ProxyAutoUnlock unlock;
- base::MessageLoop::current()->RunUntilIdle();
- }
- resource_1->CheckFinalState();
- resource_2->CheckIntermediateState();
-
- // Kill resource #2.
- resource_tracker->ReleaseResource(resource_2_id);
- {
- ProxyAutoUnlock unlock;
- base::MessageLoop::current()->RunUntilIdle();
- }
- resource_1->CheckFinalState();
- resource_2->CheckFinalState();
-
- // This shouldn't be needed, but make sure there are no stranded tasks.
- {
- ProxyAutoUnlock unlock;
- base::MessageLoop::current()->RunUntilIdle();
- }
-}
-
-// Test that "resurrecting" a resource (getting a new ID for a |Resource|)
-// doesn't resurrect callbacks.
-TEST_F(CallbackResourceTest, Resurrection) {
- ProxyAutoLock lock;
- ResourceTracker* resource_tracker = PpapiGlobals::Get()->GetResourceTracker();
-
- scoped_refptr<CallbackMockResource> resource(
- new CallbackMockResource(pp_instance()));
- PP_Resource resource_id = resource->SetupForTest();
-
- // Unref it, spin the message loop to run posted calls, and check that things
- // are in the expected states.
- resource_tracker->ReleaseResource(resource_id);
- {
- ProxyAutoUnlock unlock;
- base::MessageLoop::current()->RunUntilIdle();
- }
- resource->CheckFinalState();
-
- // "Resurrect" it and check that the callbacks are still dead.
- PP_Resource new_resource_id = resource->GetReference();
- {
- ProxyAutoUnlock unlock;
- base::MessageLoop::current()->RunUntilIdle();
- }
- resource->CheckFinalState();
-
- // Unref it again and do the same.
- resource_tracker->ReleaseResource(new_resource_id);
- {
- ProxyAutoUnlock unlock;
- base::MessageLoop::current()->RunUntilIdle();
- }
- resource->CheckFinalState();
-
- // This shouldn't be needed, but make sure there are no stranded tasks.
- {
- ProxyAutoUnlock unlock;
- base::MessageLoop::current()->RunUntilIdle();
- }
-}
-
-} // namespace ppapi
« no previous file with comments | « ppapi/shared_impl/tracked_callback.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698