From 252fac6f9a3fccf1773c401292a63b19fbee1c0c Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Tue, 3 Nov 2020 16:34:46 -0800 Subject: [PATCH 1/6] added unit tests to the rasterizer --- shell/common/BUILD.gn | 1 + shell/common/rasterizer_unittests.cc | 117 +++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 shell/common/rasterizer_unittests.cc diff --git a/shell/common/BUILD.gn b/shell/common/BUILD.gn index 2cc266712c2a7..13fc319f9f27e 100644 --- a/shell/common/BUILD.gn +++ b/shell/common/BUILD.gn @@ -244,6 +244,7 @@ if (enable_unittests) { "input_events_unittests.cc", "persistent_cache_unittests.cc", "pipeline_unittests.cc", + "rasterizer_unittests.cc", "shell_unittests.cc", "skp_shader_warmup_unittests.cc", ] diff --git a/shell/common/rasterizer_unittests.cc b/shell/common/rasterizer_unittests.cc new file mode 100644 index 0000000000000..ea5e3d0a69ff7 --- /dev/null +++ b/shell/common/rasterizer_unittests.cc @@ -0,0 +1,117 @@ +#include "flutter/shell/common/rasterizer.h" + +#include "flutter/shell/common/thread_host.h" +#include "flutter/testing/testing.h" +#include "gmock/gmock.h" + +using testing::Return; +using testing::ReturnRef; + +namespace flutter { +namespace { +class MockDelegate : public Rasterizer::Delegate { + public: + MOCK_METHOD(void, + OnFrameRasterized, + (const FrameTiming& frame_timing), + (override)); + MOCK_METHOD(fml::Milliseconds, GetFrameBudget, (), (override)); + MOCK_METHOD(fml::TimePoint, GetLatestFrameTargetTime, (), (const, override)); + MOCK_METHOD(const TaskRunners&, GetTaskRunners, (), (const, override)); + MOCK_METHOD(std::shared_ptr, + GetIsGpuDisabledSyncSwitch, + (), + (const, override)); +}; + +class MockSurface : public Surface { + public: + MOCK_METHOD(bool, IsValid, (), (override)); + MOCK_METHOD(std::unique_ptr, + AcquireFrame, + (const SkISize& size), + (override)); + MOCK_METHOD(SkMatrix, GetRootTransformation, (), (const, override)); + MOCK_METHOD(GrDirectContext*, GetContext, (), (override)); + MOCK_METHOD(flutter::ExternalViewEmbedder*, + GetExternalViewEmbedder, + (), + (override)); + MOCK_METHOD(std::unique_ptr, + MakeRenderContextCurrent, + (), + (override)); + MOCK_METHOD(bool, ClearRenderContext, (), (override)); +}; + +class MockExternalViewEmbedder : public ExternalViewEmbedder { + public: + MOCK_METHOD(SkCanvas*, GetRootCanvas, (), (override)); + MOCK_METHOD(void, CancelFrame, (), (override)); + MOCK_METHOD(void, + BeginFrame, + (SkISize frame_size, + GrDirectContext* context, + double device_pixel_ratio, + fml::RefPtr raster_thread_merger), + (override)); + MOCK_METHOD(void, + PrerollCompositeEmbeddedView, + (int view_id, std::unique_ptr params), + (override)); + MOCK_METHOD(PostPrerollResult, + PostPrerollAction, + (fml::RefPtr raster_thread_merger), + (override)); + MOCK_METHOD(std::vector, GetCurrentCanvases, (), (override)); + MOCK_METHOD(SkCanvas*, CompositeEmbeddedView, (int view_id), (override)); + MOCK_METHOD(void, + SubmitFrame, + (GrDirectContext * context, std::unique_ptr frame), + (override)); + MOCK_METHOD(void, + EndFrame, + (bool should_resubmit_frame, + fml::RefPtr raster_thread_merger), + (override)); + MOCK_METHOD(bool, SupportsDynamicThreadMerging, (), (override)); +}; +} // namespace + +TEST(RasterizerTest, create) { + MockDelegate delegate; + auto rasterizer = std::make_unique(delegate); + EXPECT_TRUE(rasterizer != nullptr); +} + +TEST(RasterizerTest, drawEmptyPipeline) { + std::string test_name = + ::testing::UnitTest::GetInstance()->current_test_info()->name(); + ThreadHost thread_host("io.flutter.test." + test_name + ".", + ThreadHost::Type::Platform | ThreadHost::Type::GPU | + ThreadHost::Type::IO | ThreadHost::Type::UI); + TaskRunners task_runners("test", thread_host.platform_thread->GetTaskRunner(), + thread_host.raster_thread->GetTaskRunner(), + thread_host.ui_thread->GetTaskRunner(), + thread_host.io_thread->GetTaskRunner()); + MockDelegate delegate; + EXPECT_CALL(delegate, GetTaskRunners()).WillOnce(ReturnRef(task_runners)); + auto rasterizer = std::make_unique(delegate); + auto surface = std::make_unique(); + MockExternalViewEmbedder external_view_embedder; + EXPECT_CALL(*surface, GetExternalViewEmbedder()) + .WillRepeatedly(Return(&external_view_embedder)); + EXPECT_CALL(external_view_embedder, + EndFrame(false, fml::RefPtr(nullptr))); + rasterizer->Setup(std::move(surface)); + fml::AutoResetWaitableEvent latch; + thread_host.raster_thread->GetTaskRunner()->PostTask([&] { + auto pipeline = + fml::AdoptRef(new Pipeline(/*depth=*/10)); + rasterizer->Draw(pipeline, nullptr); + latch.Signal(); + }); + latch.Wait(); +} + +} // namespace flutter From 1c205d3d7ab4b1e57d2ad1cd48cb52779322bebc Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Tue, 3 Nov 2020 17:17:43 -0800 Subject: [PATCH 2/6] added call that goes through DrawToSurface --- shell/common/rasterizer_unittests.cc | 48 +++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/shell/common/rasterizer_unittests.cc b/shell/common/rasterizer_unittests.cc index ea5e3d0a69ff7..2daed125f9bd0 100644 --- a/shell/common/rasterizer_unittests.cc +++ b/shell/common/rasterizer_unittests.cc @@ -4,6 +4,7 @@ #include "flutter/testing/testing.h" #include "gmock/gmock.h" +using testing::_; using testing::Return; using testing::ReturnRef; @@ -33,10 +34,7 @@ class MockSurface : public Surface { (override)); MOCK_METHOD(SkMatrix, GetRootTransformation, (), (const, override)); MOCK_METHOD(GrDirectContext*, GetContext, (), (override)); - MOCK_METHOD(flutter::ExternalViewEmbedder*, - GetExternalViewEmbedder, - (), - (override)); + MOCK_METHOD(ExternalViewEmbedder*, GetExternalViewEmbedder, (), (override)); MOCK_METHOD(std::unique_ptr, MakeRenderContextCurrent, (), @@ -98,20 +96,54 @@ TEST(RasterizerTest, drawEmptyPipeline) { EXPECT_CALL(delegate, GetTaskRunners()).WillOnce(ReturnRef(task_runners)); auto rasterizer = std::make_unique(delegate); auto surface = std::make_unique(); + rasterizer->Setup(std::move(surface)); + fml::AutoResetWaitableEvent latch; + thread_host.raster_thread->GetTaskRunner()->PostTask([&] { + auto pipeline = fml::AdoptRef(new Pipeline(/*depth=*/10)); + rasterizer->Draw(pipeline, nullptr); + latch.Signal(); + }); + latch.Wait(); +} + +TEST(RasterizerTest, drawWithExternalViewEmbedder) { + std::string test_name = + ::testing::UnitTest::GetInstance()->current_test_info()->name(); + ThreadHost thread_host("io.flutter.test." + test_name + ".", + ThreadHost::Type::Platform | ThreadHost::Type::GPU | + ThreadHost::Type::IO | ThreadHost::Type::UI); + TaskRunners task_runners("test", thread_host.platform_thread->GetTaskRunner(), + thread_host.raster_thread->GetTaskRunner(), + thread_host.ui_thread->GetTaskRunner(), + thread_host.io_thread->GetTaskRunner()); + MockDelegate delegate; + EXPECT_CALL(delegate, GetTaskRunners()) + .WillRepeatedly(ReturnRef(task_runners)); + EXPECT_CALL(delegate, OnFrameRasterized(_)); + auto rasterizer = std::make_unique(delegate); + auto surface = std::make_unique(); MockExternalViewEmbedder external_view_embedder; EXPECT_CALL(*surface, GetExternalViewEmbedder()) .WillRepeatedly(Return(&external_view_embedder)); + EXPECT_CALL(external_view_embedder, + BeginFrame(SkISize(), nullptr, 2.0, + fml::RefPtr(nullptr))); EXPECT_CALL(external_view_embedder, EndFrame(false, fml::RefPtr(nullptr))); rasterizer->Setup(std::move(surface)); fml::AutoResetWaitableEvent latch; thread_host.raster_thread->GetTaskRunner()->PostTask([&] { - auto pipeline = - fml::AdoptRef(new Pipeline(/*depth=*/10)); - rasterizer->Draw(pipeline, nullptr); + auto pipeline = fml::AdoptRef(new Pipeline(/*depth=*/10)); + auto layer_tree = std::make_unique(/*frame_size=*/SkISize(), + /*device_pixel_ratio=*/2.0f); + bool result = pipeline->Produce().Complete(std::move(layer_tree)); + EXPECT_TRUE(result); + std::function no_discard = [](LayerTree&) { + return false; + }; + rasterizer->Draw(pipeline, no_discard); latch.Signal(); }); latch.Wait(); } - } // namespace flutter From 94e11797e24f635992c69cc4bb47c5596b3687af Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Tue, 3 Nov 2020 17:19:09 -0800 Subject: [PATCH 3/6] updated licenses file --- ci/licenses_golden/licenses_flutter | 1 + shell/common/rasterizer_unittests.cc | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index f00657c21589b..8ae7d75900785 100755 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -629,6 +629,7 @@ FILE: ../../../flutter/shell/common/platform_view.cc FILE: ../../../flutter/shell/common/platform_view.h FILE: ../../../flutter/shell/common/pointer_data_dispatcher.cc FILE: ../../../flutter/shell/common/pointer_data_dispatcher.h +FILE: ../../../flutter/shell/common/rasterizer_unittests.cc FILE: ../../../flutter/shell/common/rasterizer.cc FILE: ../../../flutter/shell/common/rasterizer.h FILE: ../../../flutter/shell/common/run_configuration.cc diff --git a/shell/common/rasterizer_unittests.cc b/shell/common/rasterizer_unittests.cc index 2daed125f9bd0..32085c71a249b 100644 --- a/shell/common/rasterizer_unittests.cc +++ b/shell/common/rasterizer_unittests.cc @@ -1,3 +1,7 @@ +// Copyright 2013 The Flutter 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 "flutter/shell/common/rasterizer.h" #include "flutter/shell/common/thread_host.h" From dda5d10ffa42e80c304f57462904877ac9d81834 Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Tue, 3 Nov 2020 17:28:26 -0800 Subject: [PATCH 4/6] reordered licenses --- ci/licenses_golden/licenses_flutter | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index 8ae7d75900785..614550389f00d 100755 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -629,9 +629,9 @@ FILE: ../../../flutter/shell/common/platform_view.cc FILE: ../../../flutter/shell/common/platform_view.h FILE: ../../../flutter/shell/common/pointer_data_dispatcher.cc FILE: ../../../flutter/shell/common/pointer_data_dispatcher.h -FILE: ../../../flutter/shell/common/rasterizer_unittests.cc FILE: ../../../flutter/shell/common/rasterizer.cc FILE: ../../../flutter/shell/common/rasterizer.h +FILE: ../../../flutter/shell/common/rasterizer_unittests.cc FILE: ../../../flutter/shell/common/run_configuration.cc FILE: ../../../flutter/shell/common/run_configuration.h FILE: ../../../flutter/shell/common/serialization_callbacks.cc From 5ffc8eebc1c7c1b83b319fb1cc6c5ad691f01eda Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Tue, 3 Nov 2020 17:51:14 -0800 Subject: [PATCH 5/6] fixed test in profile mode --- shell/common/rasterizer_unittests.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell/common/rasterizer_unittests.cc b/shell/common/rasterizer_unittests.cc index 32085c71a249b..6092082c6ec37 100644 --- a/shell/common/rasterizer_unittests.cc +++ b/shell/common/rasterizer_unittests.cc @@ -97,7 +97,7 @@ TEST(RasterizerTest, drawEmptyPipeline) { thread_host.ui_thread->GetTaskRunner(), thread_host.io_thread->GetTaskRunner()); MockDelegate delegate; - EXPECT_CALL(delegate, GetTaskRunners()).WillOnce(ReturnRef(task_runners)); + ON_CALL(delegate, GetTaskRunners()).WillByDefault(ReturnRef(task_runners)); auto rasterizer = std::make_unique(delegate); auto surface = std::make_unique(); rasterizer->Setup(std::move(surface)); From a50802dba22d00891c5c78376d0388dd17b7beda Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Wed, 4 Nov 2020 10:02:37 -0800 Subject: [PATCH 6/6] switched to old style mocks to fix windows builds --- shell/common/rasterizer_unittests.cc | 88 +++++++++++----------------- 1 file changed, 35 insertions(+), 53 deletions(-) diff --git a/shell/common/rasterizer_unittests.cc b/shell/common/rasterizer_unittests.cc index 6092082c6ec37..47a1f700fc843 100644 --- a/shell/common/rasterizer_unittests.cc +++ b/shell/common/rasterizer_unittests.cc @@ -16,67 +16,49 @@ namespace flutter { namespace { class MockDelegate : public Rasterizer::Delegate { public: - MOCK_METHOD(void, - OnFrameRasterized, - (const FrameTiming& frame_timing), - (override)); - MOCK_METHOD(fml::Milliseconds, GetFrameBudget, (), (override)); - MOCK_METHOD(fml::TimePoint, GetLatestFrameTargetTime, (), (const, override)); - MOCK_METHOD(const TaskRunners&, GetTaskRunners, (), (const, override)); - MOCK_METHOD(std::shared_ptr, - GetIsGpuDisabledSyncSwitch, - (), - (const, override)); + MOCK_METHOD1(OnFrameRasterized, void(const FrameTiming& frame_timing)); + MOCK_METHOD0(GetFrameBudget, fml::Milliseconds()); + MOCK_CONST_METHOD0(GetLatestFrameTargetTime, fml::TimePoint()); + MOCK_CONST_METHOD0(GetTaskRunners, const TaskRunners&()); + MOCK_CONST_METHOD0(GetIsGpuDisabledSyncSwitch, + std::shared_ptr()); }; class MockSurface : public Surface { public: - MOCK_METHOD(bool, IsValid, (), (override)); - MOCK_METHOD(std::unique_ptr, - AcquireFrame, - (const SkISize& size), - (override)); - MOCK_METHOD(SkMatrix, GetRootTransformation, (), (const, override)); - MOCK_METHOD(GrDirectContext*, GetContext, (), (override)); - MOCK_METHOD(ExternalViewEmbedder*, GetExternalViewEmbedder, (), (override)); - MOCK_METHOD(std::unique_ptr, - MakeRenderContextCurrent, - (), - (override)); - MOCK_METHOD(bool, ClearRenderContext, (), (override)); + MOCK_METHOD0(IsValid, bool()); + MOCK_METHOD1(AcquireFrame, + std::unique_ptr(const SkISize& size)); + MOCK_CONST_METHOD0(GetRootTransformation, SkMatrix()); + MOCK_METHOD0(GetContext, GrDirectContext*()); + MOCK_METHOD0(GetExternalViewEmbedder, ExternalViewEmbedder*()); + MOCK_METHOD0(MakeRenderContextCurrent, std::unique_ptr()); + MOCK_METHOD0(ClearRenderContext, bool()); }; class MockExternalViewEmbedder : public ExternalViewEmbedder { public: - MOCK_METHOD(SkCanvas*, GetRootCanvas, (), (override)); - MOCK_METHOD(void, CancelFrame, (), (override)); - MOCK_METHOD(void, - BeginFrame, - (SkISize frame_size, - GrDirectContext* context, - double device_pixel_ratio, - fml::RefPtr raster_thread_merger), - (override)); - MOCK_METHOD(void, - PrerollCompositeEmbeddedView, - (int view_id, std::unique_ptr params), - (override)); - MOCK_METHOD(PostPrerollResult, - PostPrerollAction, - (fml::RefPtr raster_thread_merger), - (override)); - MOCK_METHOD(std::vector, GetCurrentCanvases, (), (override)); - MOCK_METHOD(SkCanvas*, CompositeEmbeddedView, (int view_id), (override)); - MOCK_METHOD(void, - SubmitFrame, - (GrDirectContext * context, std::unique_ptr frame), - (override)); - MOCK_METHOD(void, - EndFrame, - (bool should_resubmit_frame, - fml::RefPtr raster_thread_merger), - (override)); - MOCK_METHOD(bool, SupportsDynamicThreadMerging, (), (override)); + MOCK_METHOD0(GetRootCanvas, SkCanvas*()); + MOCK_METHOD0(CancelFrame, void()); + MOCK_METHOD4(BeginFrame, + void(SkISize frame_size, + GrDirectContext* context, + double device_pixel_ratio, + fml::RefPtr raster_thread_merger)); + MOCK_METHOD2(PrerollCompositeEmbeddedView, + void(int view_id, std::unique_ptr params)); + MOCK_METHOD1(PostPrerollAction, + PostPrerollResult( + fml::RefPtr raster_thread_merger)); + MOCK_METHOD0(GetCurrentCanvases, std::vector()); + MOCK_METHOD1(CompositeEmbeddedView, SkCanvas*(int view_id)); + MOCK_METHOD2(SubmitFrame, + void(GrDirectContext* context, + std::unique_ptr frame)); + MOCK_METHOD2(EndFrame, + void(bool should_resubmit_frame, + fml::RefPtr raster_thread_merger)); + MOCK_METHOD0(SupportsDynamicThreadMerging, bool()); }; } // namespace