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..6b7d7736d4a98c58121aa89eb2d7bb2e338253f7 |
| --- /dev/null |
| +++ b/services/ui/ws/frame_generator_unittest.cc |
| @@ -0,0 +1,159 @@ |
| +// 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/begin_frame_args_test.cc" |
| +#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 "services/ui/ws/server_window_delegate.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; } |
| +}; |
| + |
| +class TestServerWindowDelegate : public ServerWindowDelegate { |
| + public: |
| + TestServerWindowDelegate() {} |
| + ~TestServerWindowDelegate() override {} |
| + |
| + // ServerWindowDelegate implementation: |
| + cc::mojom::DisplayCompositor* GetDisplayCompositor() override { |
| + return nullptr; |
| + } |
| + |
| + ServerWindow* GetRootWindow(const ServerWindow* window) override { |
| + return nullptr; |
| + } |
| +}; |
| + |
| +// FakeCompositorFrameSink observes a FakeExternalBeginFrameSource and receives |
| +// CompositorFrame from a FrameGenerator. |
| +class FakeCompositorFrameSink : public cc::CompositorFrameSink, |
| + public cc::BeginFrameObserver, |
| + public cc::ExternalBeginFrameSourceClient { |
| + public: |
| + FakeCompositorFrameSink() |
| + : cc::CompositorFrameSink(nullptr, nullptr, nullptr, nullptr) {} |
| + |
| + // cc::CompositorFrameSink implementation: |
| + bool BindToClient(cc::CompositorFrameSinkClient* client) override { |
| + if (!cc::CompositorFrameSink::BindToClient(client)) |
| + return false; |
| + |
| + begin_frame_source_ = base::MakeUnique<cc::ExternalBeginFrameSource>(this); |
| + client_->SetBeginFrameSource(begin_frame_source_.get()); |
| + return true; |
| + } |
| + |
| + void DetachFromClient() override { |
| + cc::CompositorFrameSink::DetachFromClient(); |
| + } |
| + |
| + void SubmitCompositorFrame(cc::CompositorFrame frame) override { |
| + ++number_frames_received_; |
| + } |
| + |
| + // cc::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 {} |
| + |
| + // cc::ExternalBeginFrameSourceClient implementation: |
| + void OnNeedsBeginFrames(bool needs_begin_frames) override {} |
| + |
| + void OnDidFinishFrame(const cc::BeginFrameAck& ack) 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 {} |
| + |
| + // testing::Test overrides: |
| + void SetUp() override { |
| + testing::Test::SetUp(); |
| + |
| + std::unique_ptr<FakeCompositorFrameSink> compositor_frame_sink = |
| + base::MakeUnique<FakeCompositorFrameSink>(); |
| + compositor_frame_sink_ = compositor_frame_sink.get(); |
| + |
| + constexpr float kRefreshRate = 0.f; |
| + constexpr bool kTickAutomatically = false; |
| + begin_frame_source_ = base::MakeUnique<cc::FakeExternalBeginFrameSource>( |
| + kRefreshRate, kTickAutomatically); |
| + begin_frame_source_->AddObserver(compositor_frame_sink_); |
| + delegate_ = base::MakeUnique<TestFrameGeneratorDelegate>(); |
| + server_window_delegate_ = base::MakeUnique<TestServerWindowDelegate>(); |
| + root_window_ = base::MakeUnique<ServerWindow>(server_window_delegate_.get(), |
| + WindowId()); |
| + root_window_->SetVisible(true); |
| + frame_generator_ = base::MakeUnique<FrameGenerator>( |
| + delegate_.get(), root_window_.get(), std::move(compositor_frame_sink)); |
| + }; |
| + |
| + void TearDown() override { testing::Test::TearDown(); } |
| + |
| + int NumberOfFramesRecieved() { |
| + return compositor_frame_sink_->number_frames_received(); |
| + } |
| + |
| + void IssueBeginFrame(const cc::BeginFrameArgs& args) { |
| + begin_frame_source_->TestOnBeginFrame(args); |
| + } |
| + |
| + private: |
| + FakeCompositorFrameSink* compositor_frame_sink_ = nullptr; |
| + std::unique_ptr<cc::FakeExternalBeginFrameSource> begin_frame_source_; |
| + std::unique_ptr<TestFrameGeneratorDelegate> delegate_; |
| + std::unique_ptr<TestServerWindowDelegate> server_window_delegate_; |
| + std::unique_ptr<ServerWindow> root_window_; |
| + std::unique_ptr<FrameGenerator> frame_generator_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(FrameGeneratorTest); |
| +}; |
| + |
| +TEST_F(FrameGeneratorTest, Creation) { |
| + DCHECK_EQ(0, NumberOfFramesRecieved()); |
| + |
| + // FrameGenerator does not request BeginFrames upon creation. |
| + cc::BeginFrameArgs args = |
| + cc::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1); |
| + IssueBeginFrame(args); |
| + EXPECT_EQ(0, NumberOfFramesRecieved()); |
|
Fady Samuel
2017/03/15 17:47:00
I'd like to see this do a bit more:
EXPECT_EQ(0,
Alex Z.
2017/03/15 20:37:12
Done.
|
| +} |
| + |
| +// TODO(staraz): Add OnSurfaceCreated test and SetDeviceScaleFactor test. |
| + |
| +} // namespace test |
| +} // namespace ws |
| +} // namespace ui |