15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CC_TEST_SCHEDULER_TEST_COMMON_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CC_TEST_SCHEDULER_TEST_COMMON_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <string>
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/basictypes.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/scheduler/delay_based_time_source.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "cc/scheduler/scheduler.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "cc/test/ordered_simple_task_runner.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class FakeTimeSourceClient : public TimeSourceClient {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeTimeSourceClient() { Reset(); }
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Reset() { tick_called_ = false; }
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool TickCalled() const { return tick_called_; }
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TimeSourceClient implementation.
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnTimerTick() OVERRIDE;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool tick_called_;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class FakeDelayBasedTimeSource : public DelayBasedTimeSource {
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static scoped_refptr<FakeDelayBasedTimeSource> Create(
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::TimeDelta interval, base::SingleThreadTaskRunner* task_runner) {
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return make_scoped_refptr(new FakeDelayBasedTimeSource(interval,
387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                                           task_runner));
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetNow(base::TimeTicks time) { now_ = time; }
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual base::TimeTicks Now() const OVERRIDE;
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  FakeDelayBasedTimeSource(base::TimeDelta interval,
467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           base::SingleThreadTaskRunner* task_runner)
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      : DelayBasedTimeSource(interval, task_runner) {}
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~FakeDelayBasedTimeSource() {}
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeTicks now_;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass TestDelayBasedTimeSource : public DelayBasedTimeSource {
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static scoped_refptr<TestDelayBasedTimeSource> Create(
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      scoped_refptr<TestNowSource> now_src,
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::TimeDelta interval,
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      OrderedSimpleTaskRunner* task_runner) {
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return make_scoped_refptr(
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        new TestDelayBasedTimeSource(now_src, interval, task_runner));
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected:
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TestDelayBasedTimeSource(scoped_refptr<TestNowSource> now_src,
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           base::TimeDelta interval,
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           OrderedSimpleTaskRunner* task_runner);
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Overridden from DelayBasedTimeSource
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~TestDelayBasedTimeSource();
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual base::TimeTicks Now() const OVERRIDE;
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual std::string TypeString() const OVERRIDE;
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<TestNowSource> now_src_;
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass TestScheduler : public Scheduler {
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static scoped_ptr<TestScheduler> Create(
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      scoped_refptr<TestNowSource> now_src,
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      SchedulerClient* client,
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const SchedulerSettings& scheduler_settings,
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      int layer_tree_host_id) {
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // A bunch of tests require Now() to be > BeginFrameArgs::DefaultInterval()
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    now_src->AdvanceNow(base::TimeDelta::FromMilliseconds(100));
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    scoped_refptr<OrderedSimpleTaskRunner> test_task_runner =
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        new OrderedSimpleTaskRunner(now_src, true);
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return make_scoped_ptr(new TestScheduler(now_src,
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             client,
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             scheduler_settings,
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             layer_tree_host_id,
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             test_task_runner));
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Extra test helper functionality
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool IsBeginRetroFrameArgsEmpty() const {
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return begin_retro_frame_args_.empty();
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool IsSyntheticBeginFrameSourceActive() const {
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return synthetic_begin_frame_source_->IsActive();
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  OrderedSimpleTaskRunner& task_runner() { return *test_task_runner_; }
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~TestScheduler();
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected:
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Overridden from Scheduler.
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual base::TimeTicks Now() const OVERRIDE;
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TestScheduler(scoped_refptr<TestNowSource> now_src,
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                SchedulerClient* client,
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                const SchedulerSettings& scheduler_settings,
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                int layer_tree_host_id,
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                const scoped_refptr<OrderedSimpleTaskRunner>& test_task_runner);
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<TestNowSource> now_src_;
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  OrderedSimpleTaskRunner* test_task_runner_;
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CC_TEST_SCHEDULER_TEST_COMMON_H_
126