| Index: cc/resources/resource_update_controller_unittest.cc
|
| diff --git a/cc/resources/resource_update_controller_unittest.cc b/cc/resources/resource_update_controller_unittest.cc
|
| deleted file mode 100644
|
| index 1aa0902d469932c0ea6eb4c2598574c4c40ae666..0000000000000000000000000000000000000000
|
| --- a/cc/resources/resource_update_controller_unittest.cc
|
| +++ /dev/null
|
| @@ -1,516 +0,0 @@
|
| -// Copyright 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 "cc/resources/resource_update_controller.h"
|
| -
|
| -#include "base/test/test_simple_task_runner.h"
|
| -#include "cc/resources/prioritized_resource_manager.h"
|
| -#include "cc/test/fake_output_surface.h"
|
| -#include "cc/test/fake_output_surface_client.h"
|
| -#include "cc/test/fake_proxy.h"
|
| -#include "cc/test/scheduler_test_common.h"
|
| -#include "cc/test/test_shared_bitmap_manager.h"
|
| -#include "cc/test/test_web_graphics_context_3d.h"
|
| -#include "cc/test/tiled_layer_test_common.h"
|
| -#include "cc/trees/single_thread_proxy.h" // For DebugScopedSetImplThread
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -#include "third_party/khronos/GLES2/gl2ext.h"
|
| -
|
| -using testing::Test;
|
| -
|
| -namespace cc {
|
| -namespace {
|
| -
|
| -const int kFlushPeriodFull = 4;
|
| -const int kFlushPeriodPartial = kFlushPeriodFull;
|
| -
|
| -class ResourceUpdateControllerTest;
|
| -
|
| -class WebGraphicsContext3DForUploadTest : public TestWebGraphicsContext3D {
|
| - public:
|
| - explicit WebGraphicsContext3DForUploadTest(ResourceUpdateControllerTest* test)
|
| - : test_(test) {}
|
| -
|
| - void flush() override;
|
| - void shallowFlushCHROMIUM() override;
|
| - void texSubImage2D(GLenum target,
|
| - GLint level,
|
| - GLint xoffset,
|
| - GLint yoffset,
|
| - GLsizei width,
|
| - GLsizei height,
|
| - GLenum format,
|
| - GLenum type,
|
| - const void* pixels) override;
|
| -
|
| - void getQueryObjectuivEXT(GLuint id, GLenum pname, GLuint* value) override;
|
| -
|
| - private:
|
| - ResourceUpdateControllerTest* test_;
|
| -};
|
| -
|
| -class ResourceUpdateControllerTest : public Test {
|
| - public:
|
| - ResourceUpdateControllerTest()
|
| - : proxy_(),
|
| - queue_(make_scoped_ptr(new ResourceUpdateQueue)),
|
| - resource_manager_(PrioritizedResourceManager::Create(&proxy_)),
|
| - query_results_available_(0),
|
| - full_upload_count_expected_(0),
|
| - partial_count_expected_(0),
|
| - total_upload_count_expected_(0),
|
| - max_upload_count_per_update_(0),
|
| - num_consecutive_flushes_(0),
|
| - num_dangling_uploads_(0),
|
| - num_total_uploads_(0),
|
| - num_total_flushes_(0) {}
|
| -
|
| - ~ResourceUpdateControllerTest() override {
|
| - DebugScopedSetImplThreadAndMainThreadBlocked
|
| - impl_thread_and_main_thread_blocked(&proxy_);
|
| - resource_manager_->ClearAllMemory(resource_provider_.get());
|
| - }
|
| -
|
| - public:
|
| - void OnFlush() {
|
| - // Check for back-to-back flushes.
|
| - EXPECT_EQ(0, num_consecutive_flushes_) << "Back-to-back flushes detected.";
|
| -
|
| - num_dangling_uploads_ = 0;
|
| - num_consecutive_flushes_++;
|
| - num_total_flushes_++;
|
| - }
|
| -
|
| - void OnUpload() {
|
| - // Check for too many consecutive uploads
|
| - if (num_total_uploads_ < full_upload_count_expected_) {
|
| - EXPECT_LT(num_dangling_uploads_, kFlushPeriodFull)
|
| - << "Too many consecutive full uploads detected.";
|
| - } else {
|
| - EXPECT_LT(num_dangling_uploads_, kFlushPeriodPartial)
|
| - << "Too many consecutive partial uploads detected.";
|
| - }
|
| -
|
| - num_consecutive_flushes_ = 0;
|
| - num_dangling_uploads_++;
|
| - num_total_uploads_++;
|
| - }
|
| -
|
| - bool IsQueryResultAvailable() {
|
| - if (!query_results_available_)
|
| - return false;
|
| -
|
| - query_results_available_--;
|
| - return true;
|
| - }
|
| -
|
| - protected:
|
| - void SetUp() override {
|
| - bitmap_.allocN32Pixels(300, 150);
|
| -
|
| - for (int i = 0; i < 4; i++) {
|
| - textures_[i] = PrioritizedResource::Create(resource_manager_.get(),
|
| - gfx::Size(300, 150),
|
| - RGBA_8888);
|
| - textures_[i]->
|
| - set_request_priority(PriorityCalculator::VisiblePriority(true));
|
| - }
|
| - resource_manager_->PrioritizeTextures();
|
| -
|
| - output_surface_ = FakeOutputSurface::Create3d(
|
| - scoped_ptr<TestWebGraphicsContext3D>(
|
| - new WebGraphicsContext3DForUploadTest(this)));
|
| - CHECK(output_surface_->BindToClient(&output_surface_client_));
|
| -
|
| - shared_bitmap_manager_.reset(new TestSharedBitmapManager());
|
| - resource_provider_ = ResourceProvider::Create(output_surface_.get(),
|
| - shared_bitmap_manager_.get(),
|
| - NULL,
|
| - NULL,
|
| - 0,
|
| - false,
|
| - 1);
|
| - }
|
| -
|
| - void AppendFullUploadsOfIndexedTextureToUpdateQueue(int count,
|
| - int texture_index) {
|
| - full_upload_count_expected_ += count;
|
| - total_upload_count_expected_ += count;
|
| -
|
| - const gfx::Rect rect(0, 0, 300, 150);
|
| - const ResourceUpdate upload = ResourceUpdate::Create(
|
| - textures_[texture_index].get(), &bitmap_, rect, rect, gfx::Vector2d());
|
| - for (int i = 0; i < count; i++)
|
| - queue_->AppendFullUpload(upload);
|
| - }
|
| -
|
| - void AppendFullUploadsToUpdateQueue(int count) {
|
| - AppendFullUploadsOfIndexedTextureToUpdateQueue(count, 0);
|
| - }
|
| -
|
| - void AppendPartialUploadsOfIndexedTextureToUpdateQueue(int count,
|
| - int texture_index) {
|
| - partial_count_expected_ += count;
|
| - total_upload_count_expected_ += count;
|
| -
|
| - const gfx::Rect rect(0, 0, 100, 100);
|
| - const ResourceUpdate upload = ResourceUpdate::Create(
|
| - textures_[texture_index].get(), &bitmap_, rect, rect, gfx::Vector2d());
|
| - for (int i = 0; i < count; i++)
|
| - queue_->AppendPartialUpload(upload);
|
| - }
|
| -
|
| - void AppendPartialUploadsToUpdateQueue(int count) {
|
| - AppendPartialUploadsOfIndexedTextureToUpdateQueue(count, 0);
|
| - }
|
| -
|
| - void SetMaxUploadCountPerUpdate(int count) {
|
| - max_upload_count_per_update_ = count;
|
| - }
|
| -
|
| - void UpdateTextures() {
|
| - DebugScopedSetImplThreadAndMainThreadBlocked
|
| - impl_thread_and_main_thread_blocked(&proxy_);
|
| - scoped_ptr<ResourceUpdateController> update_controller =
|
| - ResourceUpdateController::Create(NULL,
|
| - proxy_.ImplThreadTaskRunner(),
|
| - queue_.Pass(),
|
| - resource_provider_.get());
|
| - update_controller->Finalize();
|
| - }
|
| -
|
| - void MakeQueryResultAvailable() { query_results_available_++; }
|
| -
|
| - protected:
|
| - // Classes required to interact and test the ResourceUpdateController
|
| - FakeProxy proxy_;
|
| - FakeOutputSurfaceClient output_surface_client_;
|
| - scoped_ptr<OutputSurface> output_surface_;
|
| - scoped_ptr<SharedBitmapManager> shared_bitmap_manager_;
|
| - scoped_ptr<ResourceProvider> resource_provider_;
|
| - scoped_ptr<ResourceUpdateQueue> queue_;
|
| - scoped_ptr<PrioritizedResource> textures_[4];
|
| - scoped_ptr<PrioritizedResourceManager> resource_manager_;
|
| - SkBitmap bitmap_;
|
| - int query_results_available_;
|
| -
|
| - // Properties / expectations of this test
|
| - int full_upload_count_expected_;
|
| - int partial_count_expected_;
|
| - int total_upload_count_expected_;
|
| - int max_upload_count_per_update_;
|
| -
|
| - // Dynamic properties of this test
|
| - int num_consecutive_flushes_;
|
| - int num_dangling_uploads_;
|
| - int num_total_uploads_;
|
| - int num_total_flushes_;
|
| -};
|
| -
|
| -void WebGraphicsContext3DForUploadTest::flush() { test_->OnFlush(); }
|
| -
|
| -void WebGraphicsContext3DForUploadTest::shallowFlushCHROMIUM() {
|
| - test_->OnFlush();
|
| -}
|
| -
|
| -void WebGraphicsContext3DForUploadTest::texSubImage2D(GLenum target,
|
| - GLint level,
|
| - GLint xoffset,
|
| - GLint yoffset,
|
| - GLsizei width,
|
| - GLsizei height,
|
| - GLenum format,
|
| - GLenum type,
|
| - const void* pixels) {
|
| - test_->OnUpload();
|
| -}
|
| -
|
| -void WebGraphicsContext3DForUploadTest::getQueryObjectuivEXT(GLuint id,
|
| - GLenum pname,
|
| - GLuint* params) {
|
| - if (pname == GL_QUERY_RESULT_AVAILABLE_EXT)
|
| - *params = test_->IsQueryResultAvailable();
|
| -}
|
| -
|
| -// ZERO UPLOADS TESTS
|
| -TEST_F(ResourceUpdateControllerTest, ZeroUploads) {
|
| - AppendFullUploadsToUpdateQueue(0);
|
| - AppendPartialUploadsToUpdateQueue(0);
|
| - UpdateTextures();
|
| -
|
| - EXPECT_EQ(0, num_total_flushes_);
|
| - EXPECT_EQ(0, num_total_uploads_);
|
| -}
|
| -
|
| -// ONE UPLOAD TESTS
|
| -TEST_F(ResourceUpdateControllerTest, OneFullUpload) {
|
| - AppendFullUploadsToUpdateQueue(1);
|
| - AppendPartialUploadsToUpdateQueue(0);
|
| - UpdateTextures();
|
| -
|
| - EXPECT_EQ(1, num_total_flushes_);
|
| - EXPECT_EQ(1, num_total_uploads_);
|
| - EXPECT_EQ(0, num_dangling_uploads_)
|
| - << "Last upload wasn't followed by a flush.";
|
| -}
|
| -
|
| -TEST_F(ResourceUpdateControllerTest, OnePartialUpload) {
|
| - AppendFullUploadsToUpdateQueue(0);
|
| - AppendPartialUploadsToUpdateQueue(1);
|
| - UpdateTextures();
|
| -
|
| - EXPECT_EQ(1, num_total_flushes_);
|
| - EXPECT_EQ(1, num_total_uploads_);
|
| - EXPECT_EQ(0, num_dangling_uploads_)
|
| - << "Last upload wasn't followed by a flush.";
|
| -}
|
| -
|
| -TEST_F(ResourceUpdateControllerTest, OneFullOnePartialUpload) {
|
| - AppendFullUploadsToUpdateQueue(1);
|
| - AppendPartialUploadsToUpdateQueue(1);
|
| - UpdateTextures();
|
| -
|
| - EXPECT_EQ(1, num_total_flushes_);
|
| - EXPECT_EQ(2, num_total_uploads_);
|
| - EXPECT_EQ(0, num_dangling_uploads_)
|
| - << "Last upload wasn't followed by a flush.";
|
| -}
|
| -
|
| -// This class of tests upload a number of textures that is a multiple
|
| -// of the flush period.
|
| -const int full_upload_flush_multipler = 7;
|
| -const int full_count = full_upload_flush_multipler * kFlushPeriodFull;
|
| -
|
| -const int partial_upload_flush_multipler = 11;
|
| -const int partial_count =
|
| - partial_upload_flush_multipler * kFlushPeriodPartial;
|
| -
|
| -TEST_F(ResourceUpdateControllerTest, ManyFullUploads) {
|
| - AppendFullUploadsToUpdateQueue(full_count);
|
| - AppendPartialUploadsToUpdateQueue(0);
|
| - UpdateTextures();
|
| -
|
| - EXPECT_EQ(full_upload_flush_multipler, num_total_flushes_);
|
| - EXPECT_EQ(full_count, num_total_uploads_);
|
| - EXPECT_EQ(0, num_dangling_uploads_)
|
| - << "Last upload wasn't followed by a flush.";
|
| -}
|
| -
|
| -TEST_F(ResourceUpdateControllerTest, ManyPartialUploads) {
|
| - AppendFullUploadsToUpdateQueue(0);
|
| - AppendPartialUploadsToUpdateQueue(partial_count);
|
| - UpdateTextures();
|
| -
|
| - EXPECT_EQ(partial_upload_flush_multipler, num_total_flushes_);
|
| - EXPECT_EQ(partial_count, num_total_uploads_);
|
| - EXPECT_EQ(0, num_dangling_uploads_)
|
| - << "Last upload wasn't followed by a flush.";
|
| -}
|
| -
|
| -TEST_F(ResourceUpdateControllerTest, ManyFullManyPartialUploads) {
|
| - AppendFullUploadsToUpdateQueue(full_count);
|
| - AppendPartialUploadsToUpdateQueue(partial_count);
|
| - UpdateTextures();
|
| -
|
| - EXPECT_EQ(full_upload_flush_multipler + partial_upload_flush_multipler,
|
| - num_total_flushes_);
|
| - EXPECT_EQ(full_count + partial_count, num_total_uploads_);
|
| - EXPECT_EQ(0, num_dangling_uploads_)
|
| - << "Last upload wasn't followed by a flush.";
|
| -}
|
| -
|
| -class FakeResourceUpdateControllerClient
|
| - : public ResourceUpdateControllerClient {
|
| - public:
|
| - FakeResourceUpdateControllerClient() { Reset(); }
|
| - void Reset() { ready_to_finalize_called_ = false; }
|
| - bool ReadyToFinalizeCalled() const { return ready_to_finalize_called_; }
|
| -
|
| - void ReadyToFinalizeTextureUpdates() override {
|
| - ready_to_finalize_called_ = true;
|
| - }
|
| -
|
| - protected:
|
| - bool ready_to_finalize_called_;
|
| -};
|
| -
|
| -class FakeResourceUpdateController : public ResourceUpdateController {
|
| - public:
|
| - static scoped_ptr<FakeResourceUpdateController> Create(
|
| - ResourceUpdateControllerClient* client,
|
| - base::TestSimpleTaskRunner* task_runner,
|
| - scoped_ptr<ResourceUpdateQueue> queue,
|
| - ResourceProvider* resource_provider) {
|
| - return make_scoped_ptr(new FakeResourceUpdateController(
|
| - client, task_runner, queue.Pass(), resource_provider));
|
| - }
|
| -
|
| - void SetNow(base::TimeTicks time) { now_ = time; }
|
| - base::TimeTicks Now() const { return now_; }
|
| - void SetUpdateTextureTime(base::TimeDelta time) {
|
| - update_textures_time_ = time;
|
| - }
|
| - base::TimeTicks UpdateMoreTexturesCompletionTime() override {
|
| - size_t total_updates =
|
| - resource_provider_->NumBlockingUploads() + update_more_textures_size_;
|
| - return now_ + total_updates * update_textures_time_;
|
| - }
|
| - void SetUpdateMoreTexturesSize(size_t size) {
|
| - update_more_textures_size_ = size;
|
| - }
|
| - size_t UpdateMoreTexturesSize() const override {
|
| - return update_more_textures_size_;
|
| - }
|
| -
|
| - protected:
|
| - FakeResourceUpdateController(ResourceUpdateControllerClient* client,
|
| - base::TestSimpleTaskRunner* task_runner,
|
| - scoped_ptr<ResourceUpdateQueue> queue,
|
| - ResourceProvider* resource_provider)
|
| - : ResourceUpdateController(
|
| - client, task_runner, queue.Pass(), resource_provider),
|
| - resource_provider_(resource_provider),
|
| - update_more_textures_size_(0) {}
|
| -
|
| - ResourceProvider* resource_provider_;
|
| - base::TimeTicks now_;
|
| - base::TimeDelta update_textures_time_;
|
| - size_t update_more_textures_size_;
|
| -};
|
| -
|
| -static void RunPendingTask(base::TestSimpleTaskRunner* task_runner,
|
| - FakeResourceUpdateController* controller) {
|
| - EXPECT_TRUE(task_runner->HasPendingTask());
|
| - controller->SetNow(controller->Now() + task_runner->NextPendingTaskDelay());
|
| - task_runner->RunPendingTasks();
|
| -}
|
| -
|
| -TEST_F(ResourceUpdateControllerTest, UpdateMoreTextures) {
|
| - FakeResourceUpdateControllerClient client;
|
| - scoped_refptr<base::TestSimpleTaskRunner> task_runner =
|
| - new base::TestSimpleTaskRunner;
|
| -
|
| - SetMaxUploadCountPerUpdate(1);
|
| - AppendFullUploadsToUpdateQueue(3);
|
| - AppendPartialUploadsToUpdateQueue(0);
|
| -
|
| - DebugScopedSetImplThreadAndMainThreadBlocked
|
| - impl_thread_and_main_thread_blocked(&proxy_);
|
| - scoped_ptr<FakeResourceUpdateController> controller(
|
| - FakeResourceUpdateController::Create(&client,
|
| - task_runner.get(),
|
| - queue_.Pass(),
|
| - resource_provider_.get()));
|
| -
|
| - controller->SetNow(controller->Now() + base::TimeDelta::FromMilliseconds(1));
|
| - controller->SetUpdateTextureTime(base::TimeDelta::FromMilliseconds(100));
|
| - controller->SetUpdateMoreTexturesSize(1);
|
| - // Not enough time for any updates.
|
| - controller->PerformMoreUpdates(controller->Now() +
|
| - base::TimeDelta::FromMilliseconds(90));
|
| - EXPECT_FALSE(task_runner->HasPendingTask());
|
| -
|
| - controller->SetUpdateTextureTime(base::TimeDelta::FromMilliseconds(100));
|
| - controller->SetUpdateMoreTexturesSize(1);
|
| - // Only enough time for 1 update.
|
| - controller->PerformMoreUpdates(controller->Now() +
|
| - base::TimeDelta::FromMilliseconds(120));
|
| - EXPECT_FALSE(task_runner->HasPendingTask());
|
| - EXPECT_EQ(1, num_total_uploads_);
|
| -
|
| - // Complete one upload.
|
| - MakeQueryResultAvailable();
|
| -
|
| - controller->SetUpdateTextureTime(base::TimeDelta::FromMilliseconds(100));
|
| - controller->SetUpdateMoreTexturesSize(1);
|
| - // Enough time for 2 updates.
|
| - controller->PerformMoreUpdates(controller->Now() +
|
| - base::TimeDelta::FromMilliseconds(220));
|
| - RunPendingTask(task_runner.get(), controller.get());
|
| - EXPECT_FALSE(task_runner->HasPendingTask());
|
| - EXPECT_TRUE(client.ReadyToFinalizeCalled());
|
| - EXPECT_EQ(3, num_total_uploads_);
|
| -}
|
| -
|
| -TEST_F(ResourceUpdateControllerTest, NoMoreUpdates) {
|
| - FakeResourceUpdateControllerClient client;
|
| - scoped_refptr<base::TestSimpleTaskRunner> task_runner =
|
| - new base::TestSimpleTaskRunner;
|
| -
|
| - SetMaxUploadCountPerUpdate(1);
|
| - AppendFullUploadsToUpdateQueue(2);
|
| - AppendPartialUploadsToUpdateQueue(0);
|
| -
|
| - DebugScopedSetImplThreadAndMainThreadBlocked
|
| - impl_thread_and_main_thread_blocked(&proxy_);
|
| - scoped_ptr<FakeResourceUpdateController> controller(
|
| - FakeResourceUpdateController::Create(&client,
|
| - task_runner.get(),
|
| - queue_.Pass(),
|
| - resource_provider_.get()));
|
| -
|
| - controller->SetNow(controller->Now() + base::TimeDelta::FromMilliseconds(1));
|
| - controller->SetUpdateTextureTime(base::TimeDelta::FromMilliseconds(100));
|
| - controller->SetUpdateMoreTexturesSize(1);
|
| - // Enough time for 3 updates but only 2 necessary.
|
| - controller->PerformMoreUpdates(controller->Now() +
|
| - base::TimeDelta::FromMilliseconds(310));
|
| - RunPendingTask(task_runner.get(), controller.get());
|
| - EXPECT_FALSE(task_runner->HasPendingTask());
|
| - EXPECT_TRUE(client.ReadyToFinalizeCalled());
|
| - EXPECT_EQ(2, num_total_uploads_);
|
| -
|
| - client.Reset();
|
| - controller->SetUpdateTextureTime(base::TimeDelta::FromMilliseconds(100));
|
| - controller->SetUpdateMoreTexturesSize(1);
|
| - // Enough time for updates but no more updates left.
|
| - controller->PerformMoreUpdates(controller->Now() +
|
| - base::TimeDelta::FromMilliseconds(310));
|
| -
|
| - // ReadyToFinalizeTextureUpdates should only be called once.
|
| - EXPECT_FALSE(task_runner->HasPendingTask());
|
| - EXPECT_FALSE(client.ReadyToFinalizeCalled());
|
| - EXPECT_EQ(2, num_total_uploads_);
|
| -}
|
| -
|
| -TEST_F(ResourceUpdateControllerTest, UpdatesCompleteInFiniteTime) {
|
| - FakeResourceUpdateControllerClient client;
|
| - scoped_refptr<base::TestSimpleTaskRunner> task_runner =
|
| - new base::TestSimpleTaskRunner;
|
| -
|
| - SetMaxUploadCountPerUpdate(1);
|
| - AppendFullUploadsToUpdateQueue(2);
|
| - AppendPartialUploadsToUpdateQueue(0);
|
| -
|
| - DebugScopedSetImplThreadAndMainThreadBlocked
|
| - impl_thread_and_main_thread_blocked(&proxy_);
|
| - scoped_ptr<FakeResourceUpdateController> controller(
|
| - FakeResourceUpdateController::Create(&client,
|
| - task_runner.get(),
|
| - queue_.Pass(),
|
| - resource_provider_.get()));
|
| -
|
| - controller->SetNow(controller->Now() + base::TimeDelta::FromMilliseconds(1));
|
| - controller->SetUpdateTextureTime(base::TimeDelta::FromMilliseconds(500));
|
| - controller->SetUpdateMoreTexturesSize(1);
|
| -
|
| - for (int i = 0; i < 100; i++) {
|
| - if (client.ReadyToFinalizeCalled())
|
| - break;
|
| -
|
| - // Not enough time for any updates.
|
| - controller->PerformMoreUpdates(controller->Now() +
|
| - base::TimeDelta::FromMilliseconds(400));
|
| -
|
| - if (task_runner->HasPendingTask())
|
| - RunPendingTask(task_runner.get(), controller.get());
|
| - }
|
| -
|
| - EXPECT_FALSE(task_runner->HasPendingTask());
|
| - EXPECT_TRUE(client.ReadyToFinalizeCalled());
|
| - EXPECT_EQ(2, num_total_uploads_);
|
| -}
|
| -
|
| -} // namespace
|
| -} // namespace cc
|
|
|