Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(481)

Unified Diff: cc/scheduler/frame_source_unittest.cc

Issue 267783004: Refactoring the way begin frame sources inside scheduler work. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Scheduler now uses frame sources, working on scheduler_unittests. Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: cc/scheduler/frame_source_unittest.cc
diff --git a/cc/scheduler/frame_source_unittest.cc b/cc/scheduler/frame_source_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..affcd1fa4115f1cff2b6e5f16a8de51b0082899f
--- /dev/null
+++ b/cc/scheduler/frame_source_unittest.cc
@@ -0,0 +1,183 @@
+// 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.
+
+#include <deque>
+
+#include "base/basictypes.h"
+#include "base/test/test_simple_task_runner.h"
+#include "cc/scheduler/frame_source.h"
+#include "cc/test/output_test_common.h"
+#include "cc/test/scheduler_test_common.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace cc {
+namespace {
+
+/*
+base::TimeDelta Interval() {
+ return base::TimeDelta::FromMicroseconds(base::Time::kMicrosecondsPerSecond /
+ 60);
+}
+*/
+
+class FakeFrameSink : public FrameSink {
+ public:
+ void Expect(BeginFrameArgs args) { expected_.push_back(args); }
+
+ virtual void BeginFrame(const BeginFrameArgs& args) OVERRIDE {
+ ASSERT_GT(expected_.size(), 0U) << "Unexpected BeginFrame("
+ << ::testing::PrintToString(args)
+ << ") call!";
+ EXPECT_EQ(expected_[0], args);
+ expected_.pop_front();
+ }
+
+ virtual void Reset() {
+ EXPECT_EQ(expected_.size(), 0U) << "Missing " << expected_.size()
+ << " BeginFrame calls!";
+ expected_.clear();
+ }
+
+ virtual ~FakeFrameSink() { Reset(); }
+
+ private:
+ std::deque<BeginFrameArgs> expected_;
+};
+
+class FakeFrameSource : public BaseFrameSource {
+ public:
+ FakeFrameSource() : BaseFrameSource(0) {}
+
+ bool needs_begin_frame_;
+ base::TimeTicks timebase_;
+ base::TimeDelta interval_;
+
+ virtual void SetNeedsBeginFrame(bool needs_begin_frame) OVERRIDE {
+ needs_begin_frame_ = needs_begin_frame;
+ }
+ virtual void SetTimeBaseAndInterval(base::TimeTicks timebase,
+ base::TimeDelta interval) OVERRIDE {
+ timebase_ = timebase;
+ interval_ = interval;
+ }
+ virtual scoped_ptr<base::Value> FrameSourceAsValue() const OVERRIDE {
+ return make_scoped_ptr(base::Value::CreateNullValue());
+ }
+ virtual std::string FrameSourceType() const OVERRIDE {
+ return "FakeFrameSource";
+ }
+
+ void SendTestBeginFrame(const BeginFrameArgs& args) { SendBeginFrame(args); }
+};
+
+TEST(ProxyFrameSourceTest, Works) {
+ FakeFrameSink sink;
+ FakeFrameSource source;
+
+ // BeginFrame
+ sink.Expect(BeginFrameArgsCreate(100, 200, 300));
+ sink.Expect(BeginFrameArgsCreate(400, 600, 300));
+ ProxyFrameSource proxy(&sink, &source);
+ proxy.BeginFrame(BeginFrameArgsCreate(100, 200, 300));
+ proxy.BeginFrame(BeginFrameArgsCreate(400, 600, 300));
+
+ // SetNeedsBeginFrame
+ source.needs_begin_frame_ = false;
+ proxy.SetNeedsBeginFrame(true);
+ EXPECT_EQ(source.needs_begin_frame_, true);
+ proxy.SetNeedsBeginFrame(false);
+ EXPECT_EQ(source.needs_begin_frame_, false);
+
+ // SetTimeBaseAndInterval
+ source.timebase_ = base::TimeTicks();
+ source.interval_ = base::TimeDelta();
+ proxy.SetTimeBaseAndInterval(base::TimeTicks::FromInternalValue(123),
+ base::TimeDelta::FromInternalValue(456));
+ EXPECT_EQ(source.timebase_.ToInternalValue(), 123);
+ EXPECT_EQ(source.interval_.ToInternalValue(), 456);
+}
+
+TEST(ThrottledFrameSource, Works) {
+ FakeFrameSink sink;
+ sink.Expect(BeginFrameArgsCreate(100, 200, 300));
+ sink.Expect(BeginFrameArgsCreate(700, 900, 300));
+
+ FakeFrameSource* fake_source = new FakeFrameSource();
+ ThrottledFrameSource source(&sink,
+ scoped_ptr<FrameSource>(fake_source),
+ base::TimeDelta::FromInternalValue(600));
+ fake_source->SendTestBeginFrame(BeginFrameArgsCreate(100, 200, 300));
+ fake_source->SendTestBeginFrame(BeginFrameArgsCreate(400, 600, 300));
+ fake_source->SendTestBeginFrame(BeginFrameArgsCreate(700, 900, 300));
+}
+
+TEST(BackToBackFrameSource, TickNotCalledWithTaskPosted) {
+ FakeFrameSink sink;
+
+ // BackToBackFrameSource source();
+}
+
+TEST(SyntheticFrameSource, Works) {
+ FakeFrameSink sink;
+}
+
+TEST(DualFrameSource, Works) {
+ FakeFrameSink sink;
+
+ FakeFrameSource* fake_primary = new FakeFrameSource();
+ fake_primary->needs_begin_frame_ = false;
+ FakeFrameSource* fake_secondary = new FakeFrameSource();
+ fake_secondary->needs_begin_frame_ = false;
+
+ DualFrameSource source(&sink,
+ scoped_ptr<FrameSource>(fake_primary),
+ scoped_ptr<FrameSource>(fake_secondary));
+ source.SwitchSource(source.SourcePrimary());
+
+ // Check SetNeedsBeginFrame works
+ source.SetNeedsBeginFrame(true);
+ EXPECT_EQ(fake_primary->needs_begin_frame_, true);
+ EXPECT_EQ(fake_secondary->needs_begin_frame_, false);
+ source.SetNeedsBeginFrame(false);
+ EXPECT_EQ(fake_primary->needs_begin_frame_, false);
+ EXPECT_EQ(fake_secondary->needs_begin_frame_, false);
+
+ // Checking that switching the source makes SetNeedsBeginFrame on the
+ // subsources correctly.
+ source.SetNeedsBeginFrame(true);
+ source.SwitchSource(source.SourceSecondary());
+ EXPECT_EQ(fake_primary->needs_begin_frame_, false);
+ EXPECT_EQ(fake_secondary->needs_begin_frame_, true);
+ source.SwitchSource(source.SourcePrimary());
+ EXPECT_EQ(fake_primary->needs_begin_frame_, true);
+ EXPECT_EQ(fake_secondary->needs_begin_frame_, false);
+
+ sink.Reset();
+
+ // Check that BeginFrame calls end up at the sink
+ {
+ SCOPED_TRACE("First test");
+ sink.Expect(BeginFrameArgsCreate(100, 200, 300));
+ sink.Expect(BeginFrameArgsCreate(400, 600, 300));
+ fake_primary->SendTestBeginFrame(BeginFrameArgsCreate(100, 200, 300));
+ fake_secondary->SendTestBeginFrame(BeginFrameArgsCreate(400, 600, 300));
+ sink.Reset();
+ }
+
+ // Check that BeginFrames can't go backwards
+ {
+ SCOPED_TRACE("Backwards test");
+ sink.Expect(BeginFrameArgsCreate(400, 600, 300));
+ sink.Expect(BeginFrameArgsCreate(700, 900, 300));
+ sink.Expect(BeginFrameArgsCreate(1000, 1200, 300));
+ fake_primary->SendTestBeginFrame(BeginFrameArgsCreate(400, 600, 300));
+ fake_primary->SendTestBeginFrame(BeginFrameArgsCreate(700, 900, 300));
+ fake_secondary->SendTestBeginFrame(BeginFrameArgsCreate(699, 899, 300));
+ fake_primary->SendTestBeginFrame(BeginFrameArgsCreate(1000, 1200, 300));
+ sink.Reset();
+ }
+}
+
+} // namespace
+} // namespace cc

Powered by Google App Engine
This is Rietveld 408576698