12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/resource_update_controller.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/test/test_simple_task_runner.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/prioritized_resource_manager.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_output_surface.h"
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cc/test/fake_output_surface_client.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_proxy.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/scheduler_test_common.h"
1323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/test/test_shared_bitmap_manager.h"
140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "cc/test/test_web_graphics_context_3d.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/tiled_layer_test_common.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/single_thread_proxy.h"  // For DebugScopedSetImplThread
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/khronos/GLES2/gl2ext.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::Test;
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kFlushPeriodFull = 4;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kFlushPeriodPartial = kFlushPeriodFull;
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ResourceUpdateControllerTest;
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebGraphicsContext3DForUploadTest : public TestWebGraphicsContext3D {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit WebGraphicsContext3DForUploadTest(ResourceUpdateControllerTest* test)
33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      : test_(test) {}
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  virtual void flush() OVERRIDE;
368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  virtual void shallowFlushCHROMIUM() OVERRIDE;
37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void texSubImage2D(GLenum target,
38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             GLint level,
39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             GLint xoffset,
40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             GLint yoffset,
41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             GLsizei width,
42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             GLsizei height,
43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             GLenum format,
44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             GLenum type,
45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             const void* pixels) OVERRIDE;
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void getQueryObjectuivEXT(GLuint id, GLenum pname, GLuint* value)
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      OVERRIDE;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResourceUpdateControllerTest* test_;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ResourceUpdateControllerTest : public Test {
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResourceUpdateControllerTest()
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      : proxy_(),
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        queue_(make_scoped_ptr(new ResourceUpdateQueue)),
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        resource_manager_(PrioritizedResourceManager::Create(&proxy_)),
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        query_results_available_(0),
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        full_upload_count_expected_(0),
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        partial_count_expected_(0),
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        total_upload_count_expected_(0),
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        max_upload_count_per_update_(0),
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        num_consecutive_flushes_(0),
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        num_dangling_uploads_(0),
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        num_total_uploads_(0),
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        num_total_flushes_(0) {}
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~ResourceUpdateControllerTest() {
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DebugScopedSetImplThreadAndMainThreadBlocked
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    impl_thread_and_main_thread_blocked(&proxy_);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    resource_manager_->ClearAllMemory(resource_provider_.get());
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnFlush() {
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Check for back-to-back flushes.
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(0, num_consecutive_flushes_) << "Back-to-back flushes detected.";
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    num_dangling_uploads_ = 0;
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    num_consecutive_flushes_++;
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    num_total_flushes_++;
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnUpload() {
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Check for too many consecutive uploads
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (num_total_uploads_ < full_upload_count_expected_) {
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_LT(num_dangling_uploads_, kFlushPeriodFull)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          << "Too many consecutive full uploads detected.";
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_LT(num_dangling_uploads_, kFlushPeriodPartial)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          << "Too many consecutive partial uploads detected.";
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    num_consecutive_flushes_ = 0;
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    num_dangling_uploads_++;
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    num_total_uploads_++;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsQueryResultAvailable() {
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!query_results_available_)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    query_results_available_--;
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() {
111effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    bitmap_.allocN32Pixels(300, 150);
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (int i = 0; i < 4; i++) {
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      textures_[i] = PrioritizedResource::Create(resource_manager_.get(),
115d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                                 gfx::Size(300, 150),
116d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                                 RGBA_8888);
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      textures_[i]->
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          set_request_priority(PriorityCalculator::VisiblePriority(true));
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    resource_manager_->PrioritizeTextures();
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    output_surface_ = FakeOutputSurface::Create3d(
1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        scoped_ptr<TestWebGraphicsContext3D>(
1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            new WebGraphicsContext3DForUploadTest(this)));
1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    CHECK(output_surface_->BindToClient(&output_surface_client_));
1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
12723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    shared_bitmap_manager_.reset(new TestSharedBitmapManager());
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    resource_provider_ = ResourceProvider::Create(output_surface_.get(),
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  shared_bitmap_manager_.get(),
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  NULL,
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  0,
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  false,
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  1,
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  false);
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AppendFullUploadsOfIndexedTextureToUpdateQueue(int count,
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                      int texture_index) {
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    full_upload_count_expected_ += count;
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    total_upload_count_expected_ += count;
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Rect rect(0, 0, 300, 150);
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ResourceUpdate upload = ResourceUpdate::Create(
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        textures_[texture_index].get(), &bitmap_, rect, rect, gfx::Vector2d());
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (int i = 0; i < count; i++)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      queue_->AppendFullUpload(upload);
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AppendFullUploadsToUpdateQueue(int count) {
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AppendFullUploadsOfIndexedTextureToUpdateQueue(count, 0);
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AppendPartialUploadsOfIndexedTextureToUpdateQueue(int count,
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                         int texture_index) {
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    partial_count_expected_ += count;
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    total_upload_count_expected_ += count;
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Rect rect(0, 0, 100, 100);
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ResourceUpdate upload = ResourceUpdate::Create(
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        textures_[texture_index].get(), &bitmap_, rect, rect, gfx::Vector2d());
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (int i = 0; i < count; i++)
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      queue_->AppendPartialUpload(upload);
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AppendPartialUploadsToUpdateQueue(int count) {
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AppendPartialUploadsOfIndexedTextureToUpdateQueue(count, 0);
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetMaxUploadCountPerUpdate(int count) {
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    max_upload_count_per_update_ = count;
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpdateTextures() {
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DebugScopedSetImplThreadAndMainThreadBlocked
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    impl_thread_and_main_thread_blocked(&proxy_);
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<ResourceUpdateController> update_controller =
1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        ResourceUpdateController::Create(NULL,
178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                         proxy_.ImplThreadTaskRunner(),
1797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                         queue_.Pass(),
1807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                         resource_provider_.get());
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    update_controller->Finalize();
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void MakeQueryResultAvailable() { query_results_available_++; }
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Classes required to interact and test the ResourceUpdateController
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeProxy proxy_;
1893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeOutputSurfaceClient output_surface_client_;
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<OutputSurface> output_surface_;
19123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<SharedBitmapManager> shared_bitmap_manager_;
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ResourceProvider> resource_provider_;
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ResourceUpdateQueue> queue_;
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<PrioritizedResource> textures_[4];
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<PrioritizedResourceManager> resource_manager_;
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkBitmap bitmap_;
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int query_results_available_;
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Properties / expectations of this test
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int full_upload_count_expected_;
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int partial_count_expected_;
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int total_upload_count_expected_;
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int max_upload_count_per_update_;
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Dynamic properties of this test
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_consecutive_flushes_;
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_dangling_uploads_;
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_total_uploads_;
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_total_flushes_;
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void WebGraphicsContext3DForUploadTest::flush() { test_->OnFlush(); }
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void WebGraphicsContext3DForUploadTest::shallowFlushCHROMIUM() {
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_->OnFlush();
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebGraphicsContext3DForUploadTest::texSubImage2D(GLenum target,
219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                      GLint level,
220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                      GLint xoffset,
221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                      GLint yoffset,
222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                      GLsizei width,
223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                      GLsizei height,
224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                      GLenum format,
225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                      GLenum type,
226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                      const void* pixels) {
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_->OnUpload();
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebGraphicsContext3DForUploadTest::getQueryObjectuivEXT(GLuint id,
231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                             GLenum pname,
232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                             GLuint* params) {
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (pname == GL_QUERY_RESULT_AVAILABLE_EXT)
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *params = test_->IsQueryResultAvailable();
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ZERO UPLOADS TESTS
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceUpdateControllerTest, ZeroUploads) {
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppendFullUploadsToUpdateQueue(0);
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppendPartialUploadsToUpdateQueue(0);
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateTextures();
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, num_total_flushes_);
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, num_total_uploads_);
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ONE UPLOAD TESTS
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceUpdateControllerTest, OneFullUpload) {
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppendFullUploadsToUpdateQueue(1);
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppendPartialUploadsToUpdateQueue(0);
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateTextures();
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, num_total_flushes_);
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, num_total_uploads_);
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, num_dangling_uploads_)
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      << "Last upload wasn't followed by a flush.";
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceUpdateControllerTest, OnePartialUpload) {
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppendFullUploadsToUpdateQueue(0);
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppendPartialUploadsToUpdateQueue(1);
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateTextures();
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, num_total_flushes_);
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, num_total_uploads_);
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, num_dangling_uploads_)
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      << "Last upload wasn't followed by a flush.";
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceUpdateControllerTest, OneFullOnePartialUpload) {
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppendFullUploadsToUpdateQueue(1);
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppendPartialUploadsToUpdateQueue(1);
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateTextures();
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, num_total_flushes_);
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, num_total_uploads_);
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, num_dangling_uploads_)
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      << "Last upload wasn't followed by a flush.";
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class of tests upload a number of textures that is a multiple
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// of the flush period.
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int full_upload_flush_multipler = 7;
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int full_count = full_upload_flush_multipler * kFlushPeriodFull;
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int partial_upload_flush_multipler = 11;
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int partial_count =
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    partial_upload_flush_multipler * kFlushPeriodPartial;
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceUpdateControllerTest, ManyFullUploads) {
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppendFullUploadsToUpdateQueue(full_count);
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppendPartialUploadsToUpdateQueue(0);
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateTextures();
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(full_upload_flush_multipler, num_total_flushes_);
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(full_count, num_total_uploads_);
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, num_dangling_uploads_)
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      << "Last upload wasn't followed by a flush.";
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceUpdateControllerTest, ManyPartialUploads) {
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppendFullUploadsToUpdateQueue(0);
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppendPartialUploadsToUpdateQueue(partial_count);
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateTextures();
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(partial_upload_flush_multipler, num_total_flushes_);
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(partial_count, num_total_uploads_);
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, num_dangling_uploads_)
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      << "Last upload wasn't followed by a flush.";
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceUpdateControllerTest, ManyFullManyPartialUploads) {
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppendFullUploadsToUpdateQueue(full_count);
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppendPartialUploadsToUpdateQueue(partial_count);
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateTextures();
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(full_upload_flush_multipler + partial_upload_flush_multipler,
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            num_total_flushes_);
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(full_count + partial_count, num_total_uploads_);
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, num_dangling_uploads_)
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      << "Last upload wasn't followed by a flush.";
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class FakeResourceUpdateControllerClient
3257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : public ResourceUpdateControllerClient {
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeResourceUpdateControllerClient() { Reset(); }
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Reset() { ready_to_finalize_called_ = false; }
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool ReadyToFinalizeCalled() const { return ready_to_finalize_called_; }
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ReadyToFinalizeTextureUpdates() OVERRIDE {
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ready_to_finalize_called_ = true;
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool ready_to_finalize_called_;
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class FakeResourceUpdateController : public ResourceUpdateController {
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static scoped_ptr<FakeResourceUpdateController> Create(
3427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      ResourceUpdateControllerClient* client,
3437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::TestSimpleTaskRunner* task_runner,
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_ptr<ResourceUpdateQueue> queue,
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ResourceProvider* resource_provider) {
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return make_scoped_ptr(new FakeResourceUpdateController(
3477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        client, task_runner, queue.Pass(), resource_provider));
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetNow(base::TimeTicks time) { now_ = time; }
351a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::TimeTicks Now() const { return now_; }
352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void SetUpdateTextureTime(base::TimeDelta time) {
353a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    update_textures_time_ = time;
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
355a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual base::TimeTicks UpdateMoreTexturesCompletionTime() OVERRIDE {
356a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    size_t total_updates =
357a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        resource_provider_->NumBlockingUploads() + update_more_textures_size_;
358a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return now_ + total_updates * update_textures_time_;
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetUpdateMoreTexturesSize(size_t size) {
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    update_more_textures_size_ = size;
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual size_t UpdateMoreTexturesSize() const OVERRIDE {
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return update_more_textures_size_;
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
3687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  FakeResourceUpdateController(ResourceUpdateControllerClient* client,
3697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                               base::TestSimpleTaskRunner* task_runner,
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               scoped_ptr<ResourceUpdateQueue> queue,
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               ResourceProvider* resource_provider)
3727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      : ResourceUpdateController(
3737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          client, task_runner, queue.Pass(), resource_provider),
374a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        resource_provider_(resource_provider),
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        update_more_textures_size_(0) {}
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
377a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ResourceProvider* resource_provider_;
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeTicks now_;
379a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::TimeDelta update_textures_time_;
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t update_more_textures_size_;
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)static void RunPendingTask(base::TestSimpleTaskRunner* task_runner,
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           FakeResourceUpdateController* controller) {
3857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(task_runner->HasPendingTask());
3867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  controller->SetNow(controller->Now() + task_runner->NextPendingTaskDelay());
3877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  task_runner->RunPendingTasks();
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceUpdateControllerTest, UpdateMoreTextures) {
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeResourceUpdateControllerClient client;
3927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_refptr<base::TestSimpleTaskRunner> task_runner =
3937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      new base::TestSimpleTaskRunner;
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetMaxUploadCountPerUpdate(1);
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppendFullUploadsToUpdateQueue(3);
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppendPartialUploadsToUpdateQueue(0);
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DebugScopedSetImplThreadAndMainThreadBlocked
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  impl_thread_and_main_thread_blocked(&proxy_);
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<FakeResourceUpdateController> controller(
4027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      FakeResourceUpdateController::Create(&client,
4037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                           task_runner.get(),
4047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                           queue_.Pass(),
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           resource_provider_.get()));
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  controller->SetNow(controller->Now() + base::TimeDelta::FromMilliseconds(1));
408a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  controller->SetUpdateTextureTime(base::TimeDelta::FromMilliseconds(100));
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  controller->SetUpdateMoreTexturesSize(1);
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Not enough time for any updates.
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  controller->PerformMoreUpdates(controller->Now() +
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 base::TimeDelta::FromMilliseconds(90));
4137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(task_runner->HasPendingTask());
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
415a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  controller->SetUpdateTextureTime(base::TimeDelta::FromMilliseconds(100));
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  controller->SetUpdateMoreTexturesSize(1);
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Only enough time for 1 update.
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  controller->PerformMoreUpdates(controller->Now() +
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 base::TimeDelta::FromMilliseconds(120));
4207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(task_runner->HasPendingTask());
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, num_total_uploads_);
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Complete one upload.
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MakeQueryResultAvailable();
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
426a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  controller->SetUpdateTextureTime(base::TimeDelta::FromMilliseconds(100));
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  controller->SetUpdateMoreTexturesSize(1);
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Enough time for 2 updates.
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  controller->PerformMoreUpdates(controller->Now() +
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 base::TimeDelta::FromMilliseconds(220));
4317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  RunPendingTask(task_runner.get(), controller.get());
4327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(task_runner->HasPendingTask());
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(client.ReadyToFinalizeCalled());
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3, num_total_uploads_);
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceUpdateControllerTest, NoMoreUpdates) {
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeResourceUpdateControllerClient client;
4397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_refptr<base::TestSimpleTaskRunner> task_runner =
4407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      new base::TestSimpleTaskRunner;
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetMaxUploadCountPerUpdate(1);
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppendFullUploadsToUpdateQueue(2);
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppendPartialUploadsToUpdateQueue(0);
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DebugScopedSetImplThreadAndMainThreadBlocked
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  impl_thread_and_main_thread_blocked(&proxy_);
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<FakeResourceUpdateController> controller(
4497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      FakeResourceUpdateController::Create(&client,
4507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                           task_runner.get(),
4517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                           queue_.Pass(),
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           resource_provider_.get()));
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  controller->SetNow(controller->Now() + base::TimeDelta::FromMilliseconds(1));
455a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  controller->SetUpdateTextureTime(base::TimeDelta::FromMilliseconds(100));
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  controller->SetUpdateMoreTexturesSize(1);
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Enough time for 3 updates but only 2 necessary.
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  controller->PerformMoreUpdates(controller->Now() +
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 base::TimeDelta::FromMilliseconds(310));
4607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  RunPendingTask(task_runner.get(), controller.get());
4617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(task_runner->HasPendingTask());
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(client.ReadyToFinalizeCalled());
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, num_total_uploads_);
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
465a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  client.Reset();
466a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  controller->SetUpdateTextureTime(base::TimeDelta::FromMilliseconds(100));
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  controller->SetUpdateMoreTexturesSize(1);
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Enough time for updates but no more updates left.
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  controller->PerformMoreUpdates(controller->Now() +
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 base::TimeDelta::FromMilliseconds(310));
471a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
472a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // ReadyToFinalizeTextureUpdates should only be called once.
4737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(task_runner->HasPendingTask());
474a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(client.ReadyToFinalizeCalled());
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, num_total_uploads_);
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceUpdateControllerTest, UpdatesCompleteInFiniteTime) {
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeResourceUpdateControllerClient client;
4807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_refptr<base::TestSimpleTaskRunner> task_runner =
4817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      new base::TestSimpleTaskRunner;
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetMaxUploadCountPerUpdate(1);
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppendFullUploadsToUpdateQueue(2);
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppendPartialUploadsToUpdateQueue(0);
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DebugScopedSetImplThreadAndMainThreadBlocked
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  impl_thread_and_main_thread_blocked(&proxy_);
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<FakeResourceUpdateController> controller(
4907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      FakeResourceUpdateController::Create(&client,
4917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                           task_runner.get(),
4927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                           queue_.Pass(),
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           resource_provider_.get()));
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  controller->SetNow(controller->Now() + base::TimeDelta::FromMilliseconds(1));
496a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  controller->SetUpdateTextureTime(base::TimeDelta::FromMilliseconds(500));
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  controller->SetUpdateMoreTexturesSize(1);
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 0; i < 100; i++) {
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (client.ReadyToFinalizeCalled())
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Not enough time for any updates.
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    controller->PerformMoreUpdates(controller->Now() +
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   base::TimeDelta::FromMilliseconds(400));
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (task_runner->HasPendingTask())
5087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      RunPendingTask(task_runner.get(), controller.get());
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(task_runner->HasPendingTask());
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(client.ReadyToFinalizeCalled());
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, num_total_uploads_);
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
518