diff --git a/shell/platform/embedder/tests/embedder_test_context.cc b/shell/platform/embedder/tests/embedder_test_context.cc index e1de9acaaedd..24868a572a3d 100644 --- a/shell/platform/embedder/tests/embedder_test_context.cc +++ b/shell/platform/embedder/tests/embedder_test_context.cc @@ -4,6 +4,7 @@ #include "flutter/shell/platform/embedder/tests/embedder_test_context.h" +#include "flutter/fml/make_copyable.h" #include "flutter/runtime/dart_vm.h" #include "flutter/shell/platform/embedder/tests/embedder_assertions.h" #include "third_party/dart/runtime/bin/elf_loader.h" @@ -225,6 +226,16 @@ void EmbedderTestContext::SetNextSceneCallback( next_scene_callback_ = next_scene_callback; } +std::future> EmbedderTestContext::GetNextSceneImage() { + std::promise> promise; + auto future = promise.get_future(); + SetNextSceneCallback( + fml::MakeCopyable([promise = std::move(promise)](auto image) mutable { + promise.set_value(image); + })); + return future; +} + bool EmbedderTestContext::SofwarePresent(sk_sp image) { software_surface_present_count_++; diff --git a/shell/platform/embedder/tests/embedder_test_context.h b/shell/platform/embedder/tests/embedder_test_context.h index 69b2665da185..00017fa8721b 100644 --- a/shell/platform/embedder/tests/embedder_test_context.h +++ b/shell/platform/embedder/tests/embedder_test_context.h @@ -5,6 +5,7 @@ #ifndef FLUTTER_SHELL_PLATFORM_EMBEDDER_TESTS_EMBEDDER_CONTEXT_H_ #define FLUTTER_SHELL_PLATFORM_EMBEDDER_TESTS_EMBEDDER_CONTEXT_H_ +#include #include #include #include @@ -60,8 +61,7 @@ class EmbedderTestContext { EmbedderTestCompositor& GetCompositor(); - using NextSceneCallback = std::function image)>; - void SetNextSceneCallback(const NextSceneCallback& next_scene_callback); + std::future> GetNextSceneImage(); size_t GetGLSurfacePresentCount() const; @@ -71,6 +71,8 @@ class EmbedderTestContext { // This allows the builder to access the hooks. friend class EmbedderConfigBuilder; + using NextSceneCallback = std::function image)>; + std::string assets_path_; // Pieces of the Dart snapshot in ELF form, loaded by Dart's ELF library. @@ -129,6 +131,8 @@ class EmbedderTestContext { void FireRootSurfacePresentCallbackIfPresent( const std::function(void)>& image_callback); + void SetNextSceneCallback(const NextSceneCallback& next_scene_callback); + FML_DISALLOW_COPY_AND_ASSIGN(EmbedderTestContext); }; diff --git a/shell/platform/embedder/tests/embedder_unittests.cc b/shell/platform/embedder/tests/embedder_unittests.cc index f899d3f7b39e..2824345dcbe5 100644 --- a/shell/platform/embedder/tests/embedder_unittests.cc +++ b/shell/platform/embedder/tests/embedder_unittests.cc @@ -1144,6 +1144,11 @@ static bool ImageMatchesFixture(const std::string& fixture_file_name, return images_are_same; } +static bool ImageMatchesFixture(const std::string& fixture_file_name, + std::future>& scene_image) { + return ImageMatchesFixture(fixture_file_name, scene_image.get()); +} + //------------------------------------------------------------------------------ /// Test the layer structure and pixels rendered when using a custom compositor. /// @@ -1158,13 +1163,9 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderKnownScene) { context.GetCompositor().SetRenderTargetType( EmbedderTestCompositor::RenderTargetType::kOpenGLTexture); - fml::CountDownLatch latch(6); + fml::CountDownLatch latch(5); - sk_sp scene_image; - context.SetNextSceneCallback([&](sk_sp scene) { - scene_image = std::move(scene); - latch.CountDown(); - }); + auto scene_image = context.GetNextSceneImage(); context.GetCompositor().SetNextPresentCallback( [&](const FlutterLayer** layers, size_t layers_count) { @@ -1334,13 +1335,9 @@ TEST_F(EmbedderTest, context.GetCompositor().SetRenderTargetType( EmbedderTestCompositor::RenderTargetType::kSoftwareBuffer); - fml::CountDownLatch latch(6); + fml::CountDownLatch latch(5); - sk_sp scene_image; - context.SetNextSceneCallback([&](sk_sp scene) { - scene_image = std::move(scene); - latch.CountDown(); - }); + auto scene_image = context.GetNextSceneImage(); context.GetCompositor().SetNextPresentCallback( [&](const FlutterLayer** layers, size_t layers_count) { @@ -1637,13 +1634,9 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderWithRootLayerOnly) { context.GetCompositor().SetRenderTargetType( EmbedderTestCompositor::RenderTargetType::kOpenGLTexture); - fml::CountDownLatch latch(4); + fml::CountDownLatch latch(3); - sk_sp scene_image; - context.SetNextSceneCallback([&](sk_sp scene) { - scene_image = std::move(scene); - latch.CountDown(); - }); + auto scene_image = context.GetNextSceneImage(); context.GetCompositor().SetNextPresentCallback( [&](const FlutterLayer** layers, size_t layers_count) { @@ -1708,13 +1701,9 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderWithPlatformLayerOnBottom) { context.GetCompositor().SetRenderTargetType( EmbedderTestCompositor::RenderTargetType::kOpenGLTexture); - fml::CountDownLatch latch(4); + fml::CountDownLatch latch(3); - sk_sp scene_image; - context.SetNextSceneCallback([&](sk_sp scene) { - scene_image = std::move(scene); - latch.CountDown(); - }); + auto scene_image = context.GetNextSceneImage(); context.GetCompositor().SetNextPresentCallback( [&](const FlutterLayer** layers, size_t layers_count) { @@ -1831,13 +1820,9 @@ TEST_F(EmbedderTest, context.SetRootSurfaceTransformation(root_surface_transformation); - fml::CountDownLatch latch(6); + fml::CountDownLatch latch(5); - sk_sp scene_image; - context.SetNextSceneCallback([&](sk_sp scene) { - scene_image = std::move(scene); - latch.CountDown(); - }); + auto scene_image = context.GetNextSceneImage(); context.GetCompositor().SetNextPresentCallback( [&](const FlutterLayer** layers, size_t layers_count) { @@ -1997,13 +1982,7 @@ TEST_F(EmbedderTest, CanRenderSceneWithoutCustomCompositor) { builder.SetDartEntrypoint("can_render_scene_without_custom_compositor"); builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); - fml::CountDownLatch latch(1); - - sk_sp renderered_scene; - context.SetNextSceneCallback([&](auto image) { - renderered_scene = std::move(image); - latch.CountDown(); - }); + auto renderered_scene = context.GetNextSceneImage(); auto engine = builder.LaunchEngine(); ASSERT_TRUE(engine.is_valid()); @@ -2017,10 +1996,6 @@ TEST_F(EmbedderTest, CanRenderSceneWithoutCustomCompositor) { ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); - latch.Wait(); - - ASSERT_NE(renderered_scene, nullptr); - ASSERT_TRUE(ImageMatchesFixture("scene_without_custom_compositor.png", renderered_scene)); } @@ -2038,13 +2013,7 @@ TEST_F(EmbedderTest, CanRenderSceneWithoutCustomCompositorWithTransformation) { builder.SetDartEntrypoint("can_render_scene_without_custom_compositor"); builder.SetOpenGLRendererConfig(SkISize::Make(600, 800)); - fml::CountDownLatch latch(1); - - sk_sp renderered_scene; - context.SetNextSceneCallback([&](auto image) { - renderered_scene = std::move(image); - latch.CountDown(); - }); + auto renderered_scene = context.GetNextSceneImage(); auto engine = builder.LaunchEngine(); ASSERT_TRUE(engine.is_valid()); @@ -2060,10 +2029,6 @@ TEST_F(EmbedderTest, CanRenderSceneWithoutCustomCompositorWithTransformation) { ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); - latch.Wait(); - - ASSERT_NE(renderered_scene, nullptr); - ASSERT_TRUE(ImageMatchesFixture( "scene_without_custom_compositor_with_xform.png", renderered_scene)); } @@ -2075,13 +2040,8 @@ TEST_F(EmbedderTest, CanRenderGradientWithoutCompositor) { builder.SetDartEntrypoint("render_gradient"); builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); - fml::CountDownLatch latch(1); - sk_sp renderered_scene; - context.SetNextSceneCallback([&](auto image) { - renderered_scene = std::move(image); - latch.CountDown(); - }); + auto renderered_scene = context.GetNextSceneImage(); auto engine = builder.LaunchEngine(); ASSERT_TRUE(engine.is_valid()); @@ -2095,10 +2055,6 @@ TEST_F(EmbedderTest, CanRenderGradientWithoutCompositor) { ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); - latch.Wait(); - - ASSERT_NE(renderered_scene, nullptr); - ASSERT_TRUE(ImageMatchesFixture("gradient.png", renderered_scene)); } @@ -2117,13 +2073,7 @@ TEST_F(EmbedderTest, CanRenderGradientWithoutCompositorWithXform) { builder.SetDartEntrypoint("render_gradient"); builder.SetOpenGLRendererConfig(surface_size); - fml::CountDownLatch latch(1); - - sk_sp renderered_scene; - context.SetNextSceneCallback([&](auto image) { - renderered_scene = std::move(image); - latch.CountDown(); - }); + auto renderered_scene = context.GetNextSceneImage(); auto engine = builder.LaunchEngine(); ASSERT_TRUE(engine.is_valid()); @@ -2138,10 +2088,6 @@ TEST_F(EmbedderTest, CanRenderGradientWithoutCompositorWithXform) { ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); - latch.Wait(); - - ASSERT_NE(renderered_scene, nullptr); - ASSERT_TRUE(ImageMatchesFixture("gradient_xform.png", renderered_scene)); } @@ -2153,13 +2099,8 @@ TEST_F(EmbedderTest, CanRenderGradientWithCompositor) { builder.SetDartEntrypoint("render_gradient"); builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); builder.SetCompositor(); - fml::CountDownLatch latch(1); - sk_sp renderered_scene; - context.SetNextSceneCallback([&](auto image) { - renderered_scene = std::move(image); - latch.CountDown(); - }); + auto renderered_scene = context.GetNextSceneImage(); auto engine = builder.LaunchEngine(); ASSERT_TRUE(engine.is_valid()); @@ -2173,10 +2114,6 @@ TEST_F(EmbedderTest, CanRenderGradientWithCompositor) { ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); - latch.Wait(); - - ASSERT_NE(renderered_scene, nullptr); - ASSERT_TRUE(ImageMatchesFixture("gradient.png", renderered_scene)); } @@ -2196,13 +2133,8 @@ TEST_F(EmbedderTest, CanRenderGradientWithCompositorWithXform) { builder.SetDartEntrypoint("render_gradient"); builder.SetOpenGLRendererConfig(SkISize::Make(600, 800)); builder.SetCompositor(); - fml::CountDownLatch latch(1); - sk_sp renderered_scene; - context.SetNextSceneCallback([&](auto image) { - renderered_scene = std::move(image); - latch.CountDown(); - }); + auto renderered_scene = context.GetNextSceneImage(); auto engine = builder.LaunchEngine(); ASSERT_TRUE(engine.is_valid()); @@ -2217,10 +2149,6 @@ TEST_F(EmbedderTest, CanRenderGradientWithCompositorWithXform) { ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); - latch.Wait(); - - ASSERT_NE(renderered_scene, nullptr); - ASSERT_TRUE(ImageMatchesFixture("gradient_xform.png", renderered_scene)); } @@ -2232,7 +2160,6 @@ TEST_F(EmbedderTest, CanRenderGradientWithCompositorOnNonRootLayer) { builder.SetDartEntrypoint("render_gradient_on_non_root_backing_store"); builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); builder.SetCompositor(); - fml::CountDownLatch latch(1); context.GetCompositor().SetNextPresentCallback( [&](const FlutterLayer** layers, size_t layers_count) { @@ -2310,11 +2237,7 @@ TEST_F(EmbedderTest, CanRenderGradientWithCompositorOnNonRootLayer) { return surface->makeImageSnapshot(); }); - sk_sp renderered_scene; - context.SetNextSceneCallback([&](auto image) { - renderered_scene = std::move(image); - latch.CountDown(); - }); + auto renderered_scene = context.GetNextSceneImage(); auto engine = builder.LaunchEngine(); ASSERT_TRUE(engine.is_valid()); @@ -2328,10 +2251,6 @@ TEST_F(EmbedderTest, CanRenderGradientWithCompositorOnNonRootLayer) { ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); - latch.Wait(); - - ASSERT_NE(renderered_scene, nullptr); - ASSERT_TRUE(ImageMatchesFixture("gradient.png", renderered_scene)); } @@ -2351,7 +2270,6 @@ TEST_F(EmbedderTest, CanRenderGradientWithCompositorOnNonRootLayerWithXform) { builder.SetDartEntrypoint("render_gradient_on_non_root_backing_store"); builder.SetOpenGLRendererConfig(SkISize::Make(600, 800)); builder.SetCompositor(); - fml::CountDownLatch latch(1); context.GetCompositor().SetNextPresentCallback( [&](const FlutterLayer** layers, size_t layers_count) { @@ -2429,11 +2347,7 @@ TEST_F(EmbedderTest, CanRenderGradientWithCompositorOnNonRootLayerWithXform) { return surface->makeImageSnapshot(); }); - sk_sp renderered_scene; - context.SetNextSceneCallback([&](auto image) { - renderered_scene = std::move(image); - latch.CountDown(); - }); + auto renderered_scene = context.GetNextSceneImage(); auto engine = builder.LaunchEngine(); ASSERT_TRUE(engine.is_valid()); @@ -2448,10 +2362,6 @@ TEST_F(EmbedderTest, CanRenderGradientWithCompositorOnNonRootLayerWithXform) { ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); - latch.Wait(); - - ASSERT_NE(renderered_scene, nullptr); - ASSERT_TRUE(ImageMatchesFixture("gradient_xform.png", renderered_scene)); } @@ -2762,13 +2672,9 @@ TEST_F(EmbedderTest, context.GetCompositor().SetRenderTargetType( EmbedderTestCompositor::RenderTargetType::kOpenGLTexture); - sk_sp renderered_scene; - fml::CountDownLatch latch(2); + fml::CountDownLatch latch(1); - context.SetNextSceneCallback([&](auto image) { - renderered_scene = std::move(image); - latch.CountDown(); - }); + auto renderered_scene = context.GetNextSceneImage(); context.GetCompositor().SetNextPresentCallback( [&](const FlutterLayer** layers, size_t layers_count) { @@ -2861,13 +2767,9 @@ TEST_F( SkMatrix().preTranslate(0, 800).preRotate(-90, 0, 0); context.SetRootSurfaceTransformation(root_surface_transformation); - sk_sp renderered_scene; - fml::CountDownLatch latch(2); - context.SetNextSceneCallback([&](auto image) { - renderered_scene = std::move(image); - latch.CountDown(); - }); + auto renderered_scene = context.GetNextSceneImage(); + fml::CountDownLatch latch(1); context.GetCompositor().SetNextPresentCallback( [&](const FlutterLayer** layers, size_t layers_count) { @@ -3017,7 +2919,7 @@ TEST_F(EmbedderTest, VerifyB143464703WithSoftwareBackend) { context.GetCompositor().SetRenderTargetType( EmbedderTestCompositor::RenderTargetType::kSoftwareBuffer); - fml::CountDownLatch latch(2); + fml::CountDownLatch latch(1); context.GetCompositor().SetNextPresentCallback( [&](const FlutterLayer** layers, size_t layers_count) { ASSERT_EQ(layers_count, 3u); @@ -3111,11 +3013,7 @@ TEST_F(EmbedderTest, VerifyB143464703WithSoftwareBackend) { kSuccess); ASSERT_TRUE(engine.is_valid()); - sk_sp renderered_scene; - context.SetNextSceneCallback([&](auto image) { - renderered_scene = std::move(image); - latch.CountDown(); - }); + auto renderered_scene = context.GetNextSceneImage(); latch.Wait(); ASSERT_TRUE(ImageMatchesFixture("verifyb143464703_soft_noxform.png", @@ -3569,12 +3467,7 @@ TEST_F(EmbedderTest, ArcEndCapsAreDrawnCorrectly) { auto engine = builder.LaunchEngine(); - fml::AutoResetWaitableEvent latch; - sk_sp scene_image; - context.SetNextSceneCallback([&](sk_sp scene) { - scene_image = std::move(scene); - latch.Signal(); - }); + auto scene_image = context.GetNextSceneImage(); ASSERT_TRUE(engine.is_valid()); @@ -3586,8 +3479,6 @@ TEST_F(EmbedderTest, ArcEndCapsAreDrawnCorrectly) { ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); - latch.Wait(); - ASSERT_TRUE(ImageMatchesFixture("arc_end_caps.png", scene_image)); }