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 |