14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file. 44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/callback.h" 64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/debug/micro_benchmark.h" 84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/debug/micro_benchmark_controller.h" 94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/layers/layer.h" 104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/resources/resource_update_queue.h" 114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/test/fake_layer_tree_host.h" 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_impl.h" 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/test/fake_proxy.h" 144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace cc { 174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace { 184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class MicroBenchmarkControllerTest : public testing::Test { 204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public: 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MicroBenchmarkControllerTest() 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : layer_tree_host_client_(FakeLayerTreeHostClient::DIRECT_3D) {} 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void SetUp() OVERRIDE { 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) impl_proxy_ = make_scoped_ptr(new FakeImplProxy); 2623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) shared_bitmap_manager_.reset(new TestSharedBitmapManager()); 2723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) layer_tree_host_impl_ = make_scoped_ptr(new FakeLayerTreeHostImpl( 2823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) impl_proxy_.get(), shared_bitmap_manager_.get())); 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci layer_tree_host_ = FakeLayerTreeHost::Create(&layer_tree_host_client_); 314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host_->SetRootLayer(Layer::Create()); 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) layer_tree_host_->InitializeForTesting(scoped_ptr<Proxy>(new FakeProxy)); 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void TearDown() OVERRIDE { 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) layer_tree_host_impl_.reset(); 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) layer_tree_host_.reset(); 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) impl_proxy_.reset(); 394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FakeLayerTreeHostClient layer_tree_host_client_; 424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<FakeLayerTreeHost> layer_tree_host_; 4323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_ptr<SharedBitmapManager> shared_bitmap_manager_; 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<FakeLayerTreeHostImpl> layer_tree_host_impl_; 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<FakeImplProxy> impl_proxy_; 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void Noop(scoped_ptr<base::Value> value) { 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void IncrementCallCount(int* count, scoped_ptr<base::Value> value) { 524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ++(*count); 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(MicroBenchmarkControllerTest, ScheduleFail) { 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int id = layer_tree_host_->ScheduleMicroBenchmark( 578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) "non_existant_benchmark", scoped_ptr<base::Value>(), base::Bind(&Noop)); 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(id, 0); 594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(MicroBenchmarkControllerTest, CommitScheduled) { 624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(layer_tree_host_->needs_commit()); 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int id = layer_tree_host_->ScheduleMicroBenchmark( 648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) "unittest_only_benchmark", scoped_ptr<base::Value>(), base::Bind(&Noop)); 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_GT(id, 0); 664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(layer_tree_host_->needs_commit()); 674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(MicroBenchmarkControllerTest, BenchmarkRan) { 704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int run_count = 0; 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int id = layer_tree_host_->ScheduleMicroBenchmark( 724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "unittest_only_benchmark", 738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<base::Value>(), 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(&IncrementCallCount, base::Unretained(&run_count))); 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_GT(id, 0); 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<ResourceUpdateQueue> queue(new ResourceUpdateQueue); 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host_->SetOutputSurfaceLostForTesting(false); 794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host_->UpdateLayers(queue.get()); 804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1, run_count); 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(MicroBenchmarkControllerTest, MultipleBenchmarkRan) { 854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int run_count = 0; 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int id = layer_tree_host_->ScheduleMicroBenchmark( 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "unittest_only_benchmark", 888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<base::Value>(), 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(&IncrementCallCount, base::Unretained(&run_count))); 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_GT(id, 0); 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) id = layer_tree_host_->ScheduleMicroBenchmark( 924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "unittest_only_benchmark", 938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<base::Value>(), 944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(&IncrementCallCount, base::Unretained(&run_count))); 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_GT(id, 0); 964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<ResourceUpdateQueue> queue(new ResourceUpdateQueue); 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host_->SetOutputSurfaceLostForTesting(false); 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host_->UpdateLayers(queue.get()); 1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(2, run_count); 1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) id = layer_tree_host_->ScheduleMicroBenchmark( 1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "unittest_only_benchmark", 1058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<base::Value>(), 1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(&IncrementCallCount, base::Unretained(&run_count))); 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_GT(id, 0); 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) id = layer_tree_host_->ScheduleMicroBenchmark( 1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "unittest_only_benchmark", 1108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<base::Value>(), 1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(&IncrementCallCount, base::Unretained(&run_count))); 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_GT(id, 0); 1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host_->UpdateLayers(queue.get()); 1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(4, run_count); 1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host_->UpdateLayers(queue.get()); 1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(4, run_count); 1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(MicroBenchmarkControllerTest, BenchmarkImplRan) { 122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int run_count = 0; 123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<base::DictionaryValue> settings(new base::DictionaryValue); 124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) settings->SetBoolean("run_benchmark_impl", true); 125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Schedule a main thread benchmark. 127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int id = layer_tree_host_->ScheduleMicroBenchmark( 128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "unittest_only_benchmark", 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) settings.PassAs<base::Value>(), 130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Bind(&IncrementCallCount, base::Unretained(&run_count))); 131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_GT(id, 0); 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Schedule impl benchmarks. In production code, this is run in commit. 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) layer_tree_host_->GetMicroBenchmarkController()->ScheduleImplBenchmarks( 135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) layer_tree_host_impl_.get()); 136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Now complete the commit (as if on the impl thread). 138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) layer_tree_host_impl_->CommitComplete(); 139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Make sure all posted messages run. 141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1, run_count); 144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(MicroBenchmarkControllerTest, SendMessage) { 147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Send valid message to invalid benchmark (id = 0) 148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<base::DictionaryValue> message(new base::DictionaryValue); 149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) message->SetBoolean("can_handle", true); 150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool message_handled = layer_tree_host_->SendMessageToMicroBenchmark( 151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 0, message.PassAs<base::Value>()); 152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(message_handled); 153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Schedule a benchmark 155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int run_count = 0; 156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int id = layer_tree_host_->ScheduleMicroBenchmark( 157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "unittest_only_benchmark", 158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<base::Value>(), 159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(&IncrementCallCount, base::Unretained(&run_count))); 160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_GT(id, 0); 161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Send valid message to valid benchmark 163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) message = scoped_ptr<base::DictionaryValue>(new base::DictionaryValue); 164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) message->SetBoolean("can_handle", true); 165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) message_handled = layer_tree_host_->SendMessageToMicroBenchmark( 166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) id, message.PassAs<base::Value>()); 167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(message_handled); 168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Send invalid message to valid benchmark 170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) message = scoped_ptr<base::DictionaryValue>(new base::DictionaryValue); 171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) message->SetBoolean("can_handle", false); 172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) message_handled = layer_tree_host_->SendMessageToMicroBenchmark( 173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) id, message.PassAs<base::Value>()); 174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(message_handled); 175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace 1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace cc 179