// Copyright 2011 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. #ifndef CC_TEST_SCHEDULER_TEST_COMMON_H_ #define CC_TEST_SCHEDULER_TEST_COMMON_H_ #include #include "base/basictypes.h" #include "base/memory/scoped_ptr.h" #include "base/time/time.h" #include "cc/scheduler/delay_based_time_source.h" #include "cc/scheduler/scheduler.h" #include "cc/test/ordered_simple_task_runner.h" #include "testing/gtest/include/gtest/gtest.h" namespace cc { class FakeTimeSourceClient : public TimeSourceClient { public: FakeTimeSourceClient() : tick_called_(false) {} void Reset() { tick_called_ = false; } bool TickCalled() const { return tick_called_; } // TimeSourceClient implementation. void OnTimerTick() override; protected: bool tick_called_; }; class FakeDelayBasedTimeSource : public DelayBasedTimeSource { public: static scoped_refptr Create( base::TimeDelta interval, base::SingleThreadTaskRunner* task_runner) { return make_scoped_refptr(new FakeDelayBasedTimeSource(interval, task_runner)); } void SetNow(base::TimeTicks time) { now_ = time; } base::TimeTicks Now() const override; protected: FakeDelayBasedTimeSource(base::TimeDelta interval, base::SingleThreadTaskRunner* task_runner) : DelayBasedTimeSource(interval, task_runner) {} ~FakeDelayBasedTimeSource() override {} base::TimeTicks now_; }; class TestDelayBasedTimeSource : public DelayBasedTimeSource { public: static scoped_refptr Create( scoped_refptr now_src, base::TimeDelta interval, OrderedSimpleTaskRunner* task_runner) { return make_scoped_refptr( new TestDelayBasedTimeSource(now_src, interval, task_runner)); } protected: TestDelayBasedTimeSource(scoped_refptr now_src, base::TimeDelta interval, OrderedSimpleTaskRunner* task_runner); // Overridden from DelayBasedTimeSource ~TestDelayBasedTimeSource() override; base::TimeTicks Now() const override; std::string TypeString() const override; scoped_refptr now_src_; }; struct FakeBeginFrameSource : public BeginFrameSourceMixIn { bool remaining_frames_ = false; BeginFrameObserver* GetObserver() { return observer_; } BeginFrameArgs TestLastUsedBeginFrameArgs() { if (observer_) { return observer_->LastUsedBeginFrameArgs(); } return BeginFrameArgs(); } void TestOnBeginFrame(const BeginFrameArgs& args) { return CallOnBeginFrame(args); } // BeginFrameSource void DidFinishFrame(size_t remaining_frames) override; void AsValueInto(base::debug::TracedValue* dict) const override; ~FakeBeginFrameSource() override {} }; class TestBackToBackBeginFrameSource : public BackToBackBeginFrameSource { public: ~TestBackToBackBeginFrameSource() override; static scoped_ptr Create( scoped_refptr now_src, base::SingleThreadTaskRunner* task_runner) { return make_scoped_ptr( new TestBackToBackBeginFrameSource(now_src, task_runner)); } protected: TestBackToBackBeginFrameSource(scoped_refptr now_src, base::SingleThreadTaskRunner* task_runner); base::TimeTicks Now() override; scoped_refptr now_src_; }; class TestSyntheticBeginFrameSource : public SyntheticBeginFrameSource { public: ~TestSyntheticBeginFrameSource() override; static scoped_ptr Create( scoped_refptr now_src, OrderedSimpleTaskRunner* task_runner, base::TimeDelta initial_interval) { return make_scoped_ptr( new TestSyntheticBeginFrameSource(TestDelayBasedTimeSource::Create( now_src, initial_interval, task_runner))); } protected: TestSyntheticBeginFrameSource( scoped_refptr time_source); }; class TestScheduler; class TestSchedulerFrameSourcesConstructor : public SchedulerFrameSourcesConstructor { public: ~TestSchedulerFrameSourcesConstructor() override; protected: BeginFrameSource* ConstructPrimaryFrameSource(Scheduler* scheduler) override; BeginFrameSource* ConstructBackgroundFrameSource( Scheduler* scheduler) override; OrderedSimpleTaskRunner* test_task_runner_; TestNowSource* now_src_; protected: explicit TestSchedulerFrameSourcesConstructor( OrderedSimpleTaskRunner* test_task_runner, TestNowSource* now_src); friend class TestScheduler; }; class TestScheduler : public Scheduler { public: static scoped_ptr Create( scoped_refptr now_src, SchedulerClient* client, const SchedulerSettings& scheduler_settings, int layer_tree_host_id, const scoped_refptr& task_runner, base::PowerMonitor* power_monitor, scoped_ptr external_begin_frame_source) { TestSchedulerFrameSourcesConstructor frame_sources_constructor( task_runner.get(), now_src.get()); return make_scoped_ptr(new TestScheduler( now_src, client, scheduler_settings, layer_tree_host_id, task_runner, power_monitor, &frame_sources_constructor, external_begin_frame_source.Pass())); } // Extra test helper functionality bool IsBeginRetroFrameArgsEmpty() const { return begin_retro_frame_args_.empty(); } BeginFrameSource& frame_source() { return *frame_source_; } ~TestScheduler() override; protected: // Overridden from Scheduler. base::TimeTicks Now() const override; private: TestScheduler( scoped_refptr now_src, SchedulerClient* client, const SchedulerSettings& scheduler_settings, int layer_tree_host_id, const scoped_refptr& test_task_runner, base::PowerMonitor* power_monitor, TestSchedulerFrameSourcesConstructor* frame_sources_constructor, scoped_ptr external_begin_frame_source); scoped_refptr now_src_; }; } // namespace cc #endif // CC_TEST_SCHEDULER_TEST_COMMON_H_