Index: cc/layers/delegated_frame_resource_collection_unittest.cc |
diff --git a/cc/layers/delegated_frame_resource_collection_unittest.cc b/cc/layers/delegated_frame_resource_collection_unittest.cc |
deleted file mode 100644 |
index f91fe6308ec256740b612ce82c5d43fbd267f6d1..0000000000000000000000000000000000000000 |
--- a/cc/layers/delegated_frame_resource_collection_unittest.cc |
+++ /dev/null |
@@ -1,166 +0,0 @@ |
-// Copyright 2013 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/run_loop.h" |
-#include "base/synchronization/waitable_event.h" |
-#include "base/threading/thread.h" |
-#include "cc/layers/delegated_frame_resource_collection.h" |
-#include "cc/resources/returned_resource.h" |
-#include "cc/resources/transferable_resource.h" |
-#include "cc/trees/blocking_task_runner.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-namespace cc { |
-namespace { |
- |
-class DelegatedFrameResourceCollectionTest |
- : public testing::Test, |
- public DelegatedFrameResourceCollectionClient { |
- protected: |
- DelegatedFrameResourceCollectionTest() : resources_available_(false) {} |
- |
- void SetUp() override { CreateResourceCollection(); } |
- |
- void TearDown() override { DestroyResourceCollection(); } |
- |
- void CreateResourceCollection() { |
- DCHECK(!resource_collection_.get()); |
- resource_collection_ = new DelegatedFrameResourceCollection; |
- resource_collection_->SetClient(this); |
- } |
- |
- void DestroyResourceCollection() { |
- if (resource_collection_.get()) { |
- resource_collection_->SetClient(nullptr); |
- resource_collection_ = nullptr; |
- } |
- } |
- |
- TransferableResourceArray CreateResourceArray() { |
- TransferableResourceArray resources; |
- TransferableResource resource; |
- resource.id = 444; |
- resources.push_back(resource); |
- return resources; |
- } |
- |
- void UnusedResourcesAreAvailable() override { |
- resources_available_ = true; |
- resource_collection_->TakeUnusedResourcesForChildCompositor( |
- &returned_resources_); |
- if (!resources_available_closure_.is_null()) |
- resources_available_closure_.Run(); |
- } |
- |
- bool ReturnAndResetResourcesAvailable() { |
- bool r = resources_available_; |
- resources_available_ = false; |
- return r; |
- } |
- |
- scoped_refptr<DelegatedFrameResourceCollection> resource_collection_; |
- bool resources_available_; |
- ReturnedResourceArray returned_resources_; |
- base::Closure resources_available_closure_; |
-}; |
- |
-// This checks that taking the return callback doesn't take extra refcounts, |
-// since it's sent to other threads. |
-TEST_F(DelegatedFrameResourceCollectionTest, NoRef) { |
- // Start with one ref. |
- EXPECT_TRUE(resource_collection_->HasOneRef()); |
- |
- ReturnCallback return_callback = |
- resource_collection_->GetReturnResourcesCallbackForImplThread(); |
- |
- // Callback shouldn't take a ref since it's sent to other threads. |
- EXPECT_TRUE(resource_collection_->HasOneRef()); |
-} |
- |
-void ReturnResourcesOnThread(ReturnCallback callback, |
- const ReturnedResourceArray& resources, |
- base::WaitableEvent* event, |
- BlockingTaskRunner* main_thread_task_runner) { |
- callback.Run(resources, main_thread_task_runner); |
- if (event) |
- event->Wait(); |
-} |
- |
-// Tests that the ReturnCallback can run safely on threads even after the |
-// last references to the collection were dropped. |
-// Flaky: crbug.com/313441 |
-TEST_F(DelegatedFrameResourceCollectionTest, Thread) { |
- base::Thread thread("test thread"); |
- thread.Start(); |
- scoped_ptr<BlockingTaskRunner> main_thread_task_runner( |
- BlockingTaskRunner::Create(base::MessageLoopProxy::current())); |
- |
- TransferableResourceArray resources = CreateResourceArray(); |
- resource_collection_->ReceivedResources(resources); |
- resource_collection_->RefResources(resources); |
- |
- ReturnedResourceArray returned_resources; |
- TransferableResource::ReturnResources(resources, &returned_resources); |
- |
- base::WaitableEvent event(false, false); |
- |
- { |
- base::RunLoop run_loop; |
- resources_available_closure_ = run_loop.QuitClosure(); |
- |
- thread.message_loop()->PostTask( |
- FROM_HERE, |
- base::Bind( |
- &ReturnResourcesOnThread, |
- resource_collection_->GetReturnResourcesCallbackForImplThread(), |
- returned_resources, |
- &event, |
- main_thread_task_runner.get())); |
- |
- run_loop.Run(); |
- } |
- EXPECT_TRUE(ReturnAndResetResourcesAvailable()); |
- EXPECT_EQ(1u, returned_resources_.size()); |
- EXPECT_EQ(444u, returned_resources_[0].id); |
- EXPECT_EQ(1, returned_resources_[0].count); |
- returned_resources_.clear(); |
- |
- // The event prevents the return resources callback from being deleted. |
- // Destroy the last reference from this thread to the collection before |
- // signaling the event, to ensure any reference taken by the callback, if any, |
- // would be the last one. |
- DestroyResourceCollection(); |
- event.Signal(); |
- |
- CreateResourceCollection(); |
- resource_collection_->ReceivedResources(resources); |
- resource_collection_->RefResources(resources); |
- |
- // Destroy the collection before we have a chance to run the return callback. |
- ReturnCallback return_callback = |
- resource_collection_->GetReturnResourcesCallbackForImplThread(); |
- resource_collection_->LoseAllResources(); |
- DestroyResourceCollection(); |
- |
- EXPECT_TRUE(ReturnAndResetResourcesAvailable()); |
- EXPECT_EQ(1u, returned_resources_.size()); |
- EXPECT_EQ(444u, returned_resources_[0].id); |
- EXPECT_EQ(1, returned_resources_[0].count); |
- EXPECT_TRUE(returned_resources_[0].lost); |
- returned_resources_.clear(); |
- |
- base::WaitableEvent* null_event = nullptr; |
- thread.message_loop()->PostTask(FROM_HERE, |
- base::Bind(&ReturnResourcesOnThread, |
- return_callback, |
- returned_resources, |
- null_event, |
- main_thread_task_runner.get())); |
- |
- thread.Stop(); |
-} |
- |
-} // namespace |
-} // namespace cc |