Index: cc/surfaces/direct_compositor_frame_sink_unittest.cc |
diff --git a/cc/surfaces/direct_compositor_frame_sink_unittest.cc b/cc/surfaces/direct_compositor_frame_sink_unittest.cc |
index 8ce6043c937f0c9bd3555898c8fbfa09c6f2603e..3bc52f1621a94e17fc062330e0baf5cf091090fe 100644 |
--- a/cc/surfaces/direct_compositor_frame_sink_unittest.cc |
+++ b/cc/surfaces/direct_compositor_frame_sink_unittest.cc |
@@ -16,6 +16,7 @@ |
#include "cc/surfaces/frame_sink_id.h" |
#include "cc/surfaces/local_surface_id_allocator.h" |
#include "cc/surfaces/surface_manager.h" |
+#include "cc/test/begin_frame_args_test.h" |
#include "cc/test/fake_compositor_frame_sink_client.h" |
#include "cc/test/fake_output_surface.h" |
#include "cc/test/ordered_simple_task_runner.h" |
@@ -29,6 +30,35 @@ namespace { |
static constexpr FrameSinkId kArbitraryFrameSinkId(1, 1); |
+class ObserverTrackingBeginFrameSource : public BackToBackBeginFrameSource { |
+ public: |
+ using BackToBackBeginFrameSource::BackToBackBeginFrameSource; |
+ |
+ void DidFinishFrame(BeginFrameObserver* obs, |
+ const BeginFrameAck& ack) override { |
+ BackToBackBeginFrameSource::DidFinishFrame(obs, ack); |
+ if (obs == tracked_observer_) |
+ last_ack_ = ack; |
+ } |
+ |
+ void set_tracked_observer(BeginFrameObserver* obs) { |
+ tracked_observer_ = obs; |
+ } |
+ |
+ const BeginFrameAck& last_ack() const { return last_ack_; } |
+ |
+ private: |
+ BeginFrameObserver* tracked_observer_ = nullptr; |
+ BeginFrameAck last_ack_; |
+}; |
+ |
+class TestDirectCompositorFrameSink : public DirectCompositorFrameSink { |
+ public: |
+ using DirectCompositorFrameSink::DirectCompositorFrameSink; |
+ |
+ CompositorFrameSinkSupport* support() const { return support_.get(); } |
+}; |
+ |
class DirectCompositorFrameSinkTest : public testing::Test { |
public: |
DirectCompositorFrameSinkTest() |
@@ -43,7 +73,7 @@ class DirectCompositorFrameSinkTest : public testing::Test { |
FakeOutputSurface::Create3d(); |
display_output_surface_ = display_output_surface.get(); |
- begin_frame_source_.reset(new BackToBackBeginFrameSource( |
+ begin_frame_source_.reset(new ObserverTrackingBeginFrameSource( |
base::MakeUnique<DelayBasedTimeSource>(task_runner_.get()))); |
int max_frames_pending = 2; |
@@ -55,12 +85,14 @@ class DirectCompositorFrameSinkTest : public testing::Test { |
kArbitraryFrameSinkId, begin_frame_source_.get(), |
std::move(display_output_surface), std::move(scheduler), |
base::MakeUnique<TextureMailboxDeleter>(task_runner_.get()))); |
- compositor_frame_sink_.reset(new DirectCompositorFrameSink( |
+ compositor_frame_sink_.reset(new TestDirectCompositorFrameSink( |
kArbitraryFrameSinkId, &surface_manager_, display_.get(), |
context_provider_, nullptr, &gpu_memory_buffer_manager_, |
&bitmap_manager_)); |
compositor_frame_sink_->BindToClient(&compositor_frame_sink_client_); |
+ begin_frame_source_->set_tracked_observer( |
+ compositor_frame_sink_->support()); |
display_->Resize(display_size_); |
display_->SetVisible(true); |
@@ -103,10 +135,10 @@ class DirectCompositorFrameSinkTest : public testing::Test { |
scoped_refptr<TestContextProvider> context_provider_; |
FakeOutputSurface* display_output_surface_ = nullptr; |
- std::unique_ptr<BeginFrameSource> begin_frame_source_; |
+ std::unique_ptr<ObserverTrackingBeginFrameSource> begin_frame_source_; |
std::unique_ptr<Display> display_; |
FakeCompositorFrameSinkClient compositor_frame_sink_client_; |
- std::unique_ptr<DirectCompositorFrameSink> compositor_frame_sink_; |
+ std::unique_ptr<TestDirectCompositorFrameSink> compositor_frame_sink_; |
}; |
TEST_F(DirectCompositorFrameSinkTest, DamageTriggersSwapBuffers) { |
@@ -151,5 +183,37 @@ TEST_F(DirectCompositorFrameSinkTest, |
EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); |
} |
+class TestBeginFrameObserver : public BeginFrameObserverBase { |
+ public: |
+ explicit TestBeginFrameObserver(BeginFrameSource* source) : source_(source) {} |
+ |
+ void FinishFrame() { source_->DidFinishFrame(this, ack()); } |
+ |
+ const BeginFrameAck& ack() const { return ack_; } |
+ |
+ private: |
+ bool OnBeginFrameDerivedImpl(const BeginFrameArgs& args) override { |
+ ack_ = BeginFrameAck(args.source_id, args.sequence_number, |
+ args.sequence_number, 0, true); |
+ return true; |
+ } |
+ |
+ void OnBeginFrameSourcePausedChanged(bool paused) override{}; |
+ |
+ BeginFrameSource* source_; |
+ BeginFrameAck ack_; |
+}; |
+ |
+TEST_F(DirectCompositorFrameSinkTest, AcknowledgesBeginFrames) { |
+ // Request a BeginFrame from the CompositorFrameSinkClient. |
+ TestBeginFrameObserver observer(begin_frame_source_.get()); |
+ compositor_frame_sink_client_.begin_frame_source()->AddObserver(&observer); |
+ observer.FinishFrame(); |
+ compositor_frame_sink_client_.begin_frame_source()->RemoveObserver(&observer); |
+ |
+ // Verify that the frame sink acknowledged the last BeginFrame. |
+ EXPECT_EQ(observer.ack(), begin_frame_source_->last_ack()); |
+} |
+ |
} // namespace |
} // namespace cc |