[Windows] Refactor surface manager mocking (flutter/engine#48953)

See: https://github.com/flutter/engine/pull/48849#discussion_r1424535869
This commit is contained in:
Loïc Sharma 2023-12-13 09:42:52 -08:00 committed by GitHub
parent 49e808ec80
commit 5139925e3b
5 changed files with 55 additions and 35 deletions

View File

@ -199,6 +199,7 @@ executable("flutter_windows_unittests") {
"testing/flutter_window_test.h",
"testing/flutter_windows_engine_builder.cc",
"testing/flutter_windows_engine_builder.h",
"testing/mock_angle_surface_manager.h",
"testing/mock_direct_manipulation.h",
"testing/mock_gl_proc_table.h",
"testing/mock_text_input_manager.cc",

View File

@ -11,6 +11,7 @@
#include "flutter/shell/platform/windows/public/flutter_windows.h"
#include "flutter/shell/platform/windows/testing/engine_modifier.h"
#include "flutter/shell/platform/windows/testing/flutter_windows_engine_builder.h"
#include "flutter/shell/platform/windows/testing/mock_angle_surface_manager.h"
#include "flutter/shell/platform/windows/testing/mock_window_binding_handler.h"
#include "flutter/shell/platform/windows/testing/mock_windows_proc_table.h"
#include "flutter/shell/platform/windows/testing/test_keyboard.h"
@ -131,7 +132,7 @@ TEST_F(FlutterWindowsEngineTest, RunDoesExpectedInitialization) {
}));
// Set the AngleSurfaceManager to !nullptr to test ANGLE rendering.
modifier.SetSurfaceManager(reinterpret_cast<AngleSurfaceManager*>(1));
modifier.SetSurfaceManager(std::make_unique<MockAngleSurfaceManager>());
engine->Run();

View File

@ -19,6 +19,7 @@
#include "flutter/shell/platform/windows/flutter_windows_engine.h"
#include "flutter/shell/platform/windows/flutter_windows_texture_registrar.h"
#include "flutter/shell/platform/windows/testing/engine_modifier.h"
#include "flutter/shell/platform/windows/testing/mock_angle_surface_manager.h"
#include "flutter/shell/platform/windows/testing/mock_window_binding_handler.h"
#include "flutter/shell/platform/windows/testing/test_keyboard.h"
@ -118,28 +119,6 @@ class MockFlutterWindowsEngine : public FlutterWindowsEngine {
FML_DISALLOW_COPY_AND_ASSIGN(MockFlutterWindowsEngine);
};
class MockAngleSurfaceManager : public AngleSurfaceManager {
public:
MockAngleSurfaceManager() : AngleSurfaceManager(false) {}
MOCK_METHOD(bool,
CreateSurface,
(WindowsRenderTarget*, EGLint, EGLint),
(override));
MOCK_METHOD(void,
ResizeSurface,
(WindowsRenderTarget*, EGLint, EGLint, bool),
(override));
MOCK_METHOD(void, DestroySurface, (), (override));
MOCK_METHOD(bool, MakeCurrent, (), (override));
MOCK_METHOD(bool, ClearCurrent, (), (override));
MOCK_METHOD(void, SetVSyncEnabled, (bool), (override));
private:
FML_DISALLOW_COPY_AND_ASSIGN(MockAngleSurfaceManager);
};
} // namespace
// Ensure that submenu buttons have their expanded/collapsed status set
@ -264,7 +243,7 @@ TEST(FlutterWindowsViewTest, Shutdown) {
EXPECT_CALL(*engine.get(), Stop).Times(1);
EXPECT_CALL(*surface_manager.get(), DestroySurface).Times(1);
modifier.SetSurfaceManager(surface_manager.release());
modifier.SetSurfaceManager(std::move(surface_manager));
view.SetEngine(engine.get());
}
@ -847,7 +826,7 @@ TEST(FlutterWindowsViewTest, WindowResizeTests) {
EXPECT_CALL(*surface_manager.get(), DestroySurface).Times(1);
FlutterWindowsView view(std::move(window_binding_handler));
modifier.SetSurfaceManager(surface_manager.release());
modifier.SetSurfaceManager(std::move(surface_manager));
view.SetEngine(engine.get());
fml::AutoResetWaitableEvent metrics_sent_latch;
@ -1250,7 +1229,7 @@ TEST(FlutterWindowsViewTest, DisablesVSyncAtStartup) {
EXPECT_CALL(*engine.get(), Stop).Times(1);
EXPECT_CALL(*surface_manager.get(), DestroySurface).Times(1);
modifier.SetSurfaceManager(surface_manager.release());
modifier.SetSurfaceManager(std::move(surface_manager));
view.SetEngine(engine.get());
view.CreateRenderSurface();
@ -1283,7 +1262,7 @@ TEST(FlutterWindowsViewTest, EnablesVSyncAtStartup) {
EXPECT_CALL(*engine.get(), Stop).Times(1);
EXPECT_CALL(*surface_manager.get(), DestroySurface).Times(1);
modifier.SetSurfaceManager(surface_manager.release());
modifier.SetSurfaceManager(std::move(surface_manager));
view.SetEngine(engine.get());
view.CreateRenderSurface();
@ -1320,7 +1299,7 @@ TEST(FlutterWindowsViewTest, DisablesVSyncAfterStartup) {
EXPECT_CALL(*engine.get(), Stop).Times(1);
EXPECT_CALL(*surface_manager.get(), DestroySurface).Times(1);
modifier.SetSurfaceManager(surface_manager.release());
modifier.SetSurfaceManager(std::move(surface_manager));
view.SetEngine(engine.get());
view.CreateRenderSurface();
@ -1358,7 +1337,7 @@ TEST(FlutterWindowsViewTest, EnablesVSyncAfterStartup) {
EXPECT_CALL(*engine.get(), Stop).Times(1);
EXPECT_CALL(*surface_manager.get(), DestroySurface).Times(1);
modifier.SetSurfaceManager(surface_manager.release());
modifier.SetSurfaceManager(std::move(surface_manager));
view.SetEngine(engine.get());
view.CreateRenderSurface();
@ -1399,7 +1378,7 @@ TEST(FlutterWindowsViewTest, UpdatesVSyncOnDwmUpdates) {
EXPECT_CALL(*engine.get(), Stop).Times(1);
EXPECT_CALL(*surface_manager.get(), DestroySurface).Times(1);
modifier.SetSurfaceManager(surface_manager.release());
modifier.SetSurfaceManager(std::move(surface_manager));
view.SetEngine(engine.get());
view.GetEngine()->OnDwmCompositionChanged();

View File

@ -29,14 +29,12 @@ class EngineModifier {
// engine unless overwritten again.
FlutterEngineProcTable& embedder_api() { return engine_->embedder_api_; }
// Explicitly sets the SurfaceManager being used by the FlutterWindowsEngine
// instance. This allows us to test fallback paths when a SurfaceManager fails
// to initialize for whatever reason.
// Override the surface manager used by the engine.
//
// Modifications are to the engine, and will last for the lifetime of the
// engine unless overwritten again.
void SetSurfaceManager(AngleSurfaceManager* surface_manager) {
engine_->surface_manager_.reset(surface_manager);
void SetSurfaceManager(std::unique_ptr<AngleSurfaceManager> surface_manager) {
engine_->surface_manager_ = std::move(surface_manager);
}
/// Reset the start_time field that is used to align vsync events.

View File

@ -0,0 +1,41 @@
// 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.
#ifndef FLUTTER_SHELL_PLATFORM_WINDOWS_TESTING_MOCK_ANGLE_SURFACE_MANAGER_H_
#define FLUTTER_SHELL_PLATFORM_WINDOWS_TESTING_MOCK_ANGLE_SURFACE_MANAGER_H_
#include "flutter/fml/macros.h"
#include "flutter/shell/platform/windows/angle_surface_manager.h"
#include "gmock/gmock.h"
namespace flutter {
namespace testing {
/// Mock for the |AngleSurfaceManager| base class.
class MockAngleSurfaceManager : public AngleSurfaceManager {
public:
MockAngleSurfaceManager() : AngleSurfaceManager(false) {}
MOCK_METHOD(bool,
CreateSurface,
(WindowsRenderTarget*, EGLint, EGLint),
(override));
MOCK_METHOD(void,
ResizeSurface,
(WindowsRenderTarget*, EGLint, EGLint, bool),
(override));
MOCK_METHOD(void, DestroySurface, (), (override));
MOCK_METHOD(bool, MakeCurrent, (), (override));
MOCK_METHOD(bool, ClearCurrent, (), (override));
MOCK_METHOD(void, SetVSyncEnabled, (bool), (override));
private:
FML_DISALLOW_COPY_AND_ASSIGN(MockAngleSurfaceManager);
};
} // namespace testing
} // namespace flutter
#endif // FLUTTER_SHELL_PLATFORM_WINDOWS_TESTING_MOCK_ANGLE_SURFACE_MANAGER_H_