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