Chromium Code Reviews| Index: services/ui/ws/frame_generator_unittest.cc |
| diff --git a/services/ui/ws/frame_generator_unittest.cc b/services/ui/ws/frame_generator_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..0405eed552782ce0ea5f9bdbfd8f0c11113920d4 |
| --- /dev/null |
| +++ b/services/ui/ws/frame_generator_unittest.cc |
| @@ -0,0 +1,112 @@ |
| +// Copyright 2017 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 "services/ui/ws/frame_generator.h" |
| + |
| +#include "base/macros.h" |
| +#include "cc/output/compositor_frame_sink.h" |
| +#include "cc/scheduler/begin_frame_source.h" |
| +#include "cc/test/fake_external_begin_frame_source.h" |
| +#include "services/ui/ws/frame_generator_delegate.h" |
| +#include "services/ui/ws/server_window.h" |
| +#include "testing/gtest/include/gtest/gtest.h" |
| + |
| +namespace ui { |
| +namespace ws { |
| +namespace test { |
| + |
| +class TestFrameGeneratorDelegate : public FrameGeneratorDelegate { |
| + public: |
| + TestFrameGeneratorDelegate() {} |
| + ~TestFrameGeneratorDelegate() override {} |
| + |
| + // FrameGeneratorDelegate implementation: |
| + bool IsInHighContrastMode() override { return false; } |
| +}; |
| + |
| +// FakeCompositorFrameSink observes a FakeExternalBeginFrameSource and receives |
| +// CompositorFrame from a FrameGenerator. |
| +class FakeCompositorFrameSink : public cc::CompositorFrameSink, |
| + public cc::BeginFrameObserver { |
| + public: |
| + FakeCompositorFrameSink() |
| + : cc::CompositorFrameSink(nullptr, nullptr, nullptr, nullptr) {} |
| + |
| + // cc::CompositorFrameSink implementation: |
| + bool BindToClient(cc::CompositorFrameSinkClient* client) override { |
| + if (!cc::CompositorFrameSink::BindToClient(client)) |
| + return false; |
| + |
| + return true; |
| + } |
| + |
| + void DetachFromClient() override { |
| + cc::CompositorFrameSink::DetachFromClient(); |
| + } |
| + |
| + void SubmitCompositorFrame(cc::CompositorFrame frame) override { |
| + ++number_frames_received_; |
| + } |
| + |
| + // BeginFrameObserver implementation. |
| + void OnBeginFrame(const cc::BeginFrameArgs& args) override { |
| + begin_frame_source_->OnBeginFrame(args); |
| + last_begin_frame_args_ = args; |
| + } |
| + |
| + const cc::BeginFrameArgs& LastUsedBeginFrameArgs() const override { |
| + return last_begin_frame_args_; |
| + } |
| + |
| + void OnBeginFrameSourcePausedChanged(bool paused) override {} |
| + |
| + int number_frames_received() { return number_frames_received_; } |
| + |
| + private: |
| + int number_frames_received_ = 0; |
| + std::unique_ptr<cc::ExternalBeginFrameSource> begin_frame_source_; |
| + cc::BeginFrameArgs last_begin_frame_args_; |
| +}; |
| + |
| +class FrameGeneratorTest : public testing::Test { |
| + public: |
| + FrameGeneratorTest() {} |
| + ~FrameGeneratorTest() override {} |
| + |
| + protected: |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(FrameGeneratorTest); |
| +}; |
| + |
| +TEST_F(FrameGeneratorTest, Creation) { |
| + // Create a FrameGenerator-FakeCompositorFrameSink pair |
| + // Tick FakeExternalBeginFrameSouce and verified if FakeCompositorFrameSink |
| + // receives a CompositorFrameSink based on FrameGenerator's state. |
| + constexpr float refresh_rate = 0.f; |
| + constexpr bool tick_automatically = false; |
| + const cc::BeginFrameArgs kArgs; |
| + |
| + // TODO(staraz): Put some of this in SetUp() |
| + std::unique_ptr<FakeCompositorFrameSink> compositor_frame_sink = |
| + base::MakeUnique<FakeCompositorFrameSink>(); |
| + cc::FakeExternalBeginFrameSource begin_frame_source(refresh_rate, |
| + tick_automatically); |
| + begin_frame_source.AddObserver(compositor_frame_sink.get()); |
| + TestFrameGeneratorDelegate delegate; |
| + ServerWindow root_window(nullptr, WindowId()); |
| + root_window.SetVisible(true); |
| + FrameGenerator frame_generator(&delegate, &root_window, |
| + std::move(compositor_frame_sink)); |
|
Fady Samuel
2017/03/15 00:06:07
I would move most of the above to a FrameGenerator
Alex Z.
2017/03/15 17:40:00
Done.
|
| + EXPECT_EQ(0, compositor_frame_sink->number_frames_received()); |
| + |
| + // FrameGenerator does not request BeginFrames upon creation. |
| + begin_frame_source.TestOnBeginFrame(kArgs); |
|
Fady Samuel
2017/03/15 00:06:07
Make this a public method "IssueBeginFrame" on Fra
Alex Z.
2017/03/15 17:40:00
Done.
|
| + EXPECT_EQ(0, compositor_frame_sink->number_frames_received()); |
| +} |
|
Fady Samuel
2017/03/15 00:06:07
This unit test can probably collapse to look like
Alex Z.
2017/03/15 17:40:01
Done.
|
| + |
| +// TODO(staraz): Add OnSurfaceCreated test and SetDeviceScaleFactor test. |
| + |
| +} // namespace test |
| +} // namespace ws |
| +} // namespace ui |