Use futures to images used for comparison with fixtures in embedder unit-tests. (#14465)

This earlier pattern was to use callbacks with latching.
This commit is contained in:
Chinmay Garde 2019-12-12 14:07:53 -08:00 committed by GitHub
parent 18c89f1cf6
commit 181ad4e18f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 47 additions and 141 deletions

View File

@ -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<sk_sp<SkImage>> EmbedderTestContext::GetNextSceneImage() {
std::promise<sk_sp<SkImage>> 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<SkImage> image) {
software_surface_present_count_++;

View File

@ -5,6 +5,7 @@
#ifndef FLUTTER_SHELL_PLATFORM_EMBEDDER_TESTS_EMBEDDER_CONTEXT_H_
#define FLUTTER_SHELL_PLATFORM_EMBEDDER_TESTS_EMBEDDER_CONTEXT_H_
#include <future>
#include <map>
#include <memory>
#include <string>
@ -60,8 +61,7 @@ class EmbedderTestContext {
EmbedderTestCompositor& GetCompositor();
using NextSceneCallback = std::function<void(sk_sp<SkImage> image)>;
void SetNextSceneCallback(const NextSceneCallback& next_scene_callback);
std::future<sk_sp<SkImage>> 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<void(sk_sp<SkImage> 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<sk_sp<SkImage>(void)>& image_callback);
void SetNextSceneCallback(const NextSceneCallback& next_scene_callback);
FML_DISALLOW_COPY_AND_ASSIGN(EmbedderTestContext);
};

View File

@ -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<sk_sp<SkImage>>& 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<SkImage> scene_image;
context.SetNextSceneCallback([&](sk_sp<SkImage> 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<SkImage> scene_image;
context.SetNextSceneCallback([&](sk_sp<SkImage> 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<SkImage> scene_image;
context.SetNextSceneCallback([&](sk_sp<SkImage> 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<SkImage> scene_image;
context.SetNextSceneCallback([&](sk_sp<SkImage> 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<SkImage> scene_image;
context.SetNextSceneCallback([&](sk_sp<SkImage> 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<SkImage> 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<SkImage> 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<SkImage> 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<SkImage> 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<SkImage> 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<SkImage> 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<SkImage> 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<SkImage> 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<SkImage> 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<SkImage> 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<SkImage> 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<SkImage> scene_image;
context.SetNextSceneCallback([&](sk_sp<SkImage> 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));
}