| #include <memory> | |
| #include "flutter/shell/platform/android/android_shell_holder.h" | |
| #include "gmock/gmock.h" | |
| #include "gtest/gtest.h" | |
| namespace flutter { | |
| namespace testing { | |
| namespace { | |
| class MockPlatformViewAndroidJNI : public PlatformViewAndroidJNI { | |
| public: | |
| MOCK_METHOD2(FlutterViewHandlePlatformMessage, | |
| void(std::unique_ptr<flutter::PlatformMessage> message, | |
| int responseId)); | |
| MOCK_METHOD2(FlutterViewHandlePlatformMessageResponse, | |
| void(int responseId, std::unique_ptr<fml::Mapping> data)); | |
| MOCK_METHOD3(FlutterViewUpdateSemantics, | |
| void(std::vector<uint8_t> buffer, | |
| std::vector<std::string> strings, | |
| std::vector<std::vector<uint8_t>> string_attribute_args)); | |
| MOCK_METHOD2(FlutterViewUpdateCustomAccessibilityActions, | |
| void(std::vector<uint8_t> actions_buffer, | |
| std::vector<std::string> strings)); | |
| MOCK_METHOD0(FlutterViewOnFirstFrame, void()); | |
| MOCK_METHOD0(FlutterViewOnPreEngineRestart, void()); | |
| MOCK_METHOD2(SurfaceTextureAttachToGLContext, | |
| void(JavaLocalRef surface_texture, int textureId)); | |
| MOCK_METHOD1(SurfaceTextureUpdateTexImage, | |
| void(JavaLocalRef surface_texture)); | |
| MOCK_METHOD2(SurfaceTextureGetTransformMatrix, | |
| void(JavaLocalRef surface_texture, SkMatrix& transform)); | |
| MOCK_METHOD1(SurfaceTextureDetachFromGLContext, | |
| void(JavaLocalRef surface_texture)); | |
| MOCK_METHOD8(FlutterViewOnDisplayPlatformView, | |
| void(int view_id, | |
| int x, | |
| int y, | |
| int width, | |
| int height, | |
| int viewWidth, | |
| int viewHeight, | |
| MutatorsStack mutators_stack)); | |
| MOCK_METHOD5(FlutterViewDisplayOverlaySurface, | |
| void(int surface_id, int x, int y, int width, int height)); | |
| MOCK_METHOD0(FlutterViewBeginFrame, void()); | |
| MOCK_METHOD0(FlutterViewEndFrame, void()); | |
| MOCK_METHOD0(FlutterViewCreateOverlaySurface, | |
| std::unique_ptr<PlatformViewAndroidJNI::OverlayMetadata>()); | |
| MOCK_METHOD0(FlutterViewDestroyOverlaySurfaces, void()); | |
| MOCK_METHOD1(FlutterViewComputePlatformResolvedLocale, | |
| std::unique_ptr<std::vector<std::string>>( | |
| std::vector<std::string> supported_locales_data)); | |
| MOCK_METHOD0(GetDisplayRefreshRate, double()); | |
| MOCK_METHOD1(RequestDartDeferredLibrary, bool(int loading_unit_id)); | |
| }; | |
| class MockPlatformMessageResponse : public PlatformMessageResponse { | |
| public: | |
| static fml::RefPtr<MockPlatformMessageResponse> Create() { | |
| return fml::AdoptRef(new MockPlatformMessageResponse()); | |
| } | |
| MOCK_METHOD1(Complete, void(std::unique_ptr<fml::Mapping> data)); | |
| MOCK_METHOD0(CompleteEmpty, void()); | |
| }; | |
| } // namespace | |
| TEST(AndroidShellHolder, Create) { | |
| Settings settings; | |
| settings.enable_software_rendering = false; | |
| auto jni = std::make_shared<MockPlatformViewAndroidJNI>(); | |
| auto holder = std::make_unique<AndroidShellHolder>(settings, jni); | |
| EXPECT_NE(holder.get(), nullptr); | |
| EXPECT_TRUE(holder->IsValid()); | |
| EXPECT_NE(holder->GetPlatformView().get(), nullptr); | |
| auto window = fml::MakeRefCounted<AndroidNativeWindow>( | |
| nullptr, /*is_fake_window=*/true); | |
| holder->GetPlatformView()->NotifyCreated(window); | |
| } | |
| TEST(AndroidShellHolder, HandlePlatformMessage) { | |
| Settings settings; | |
| settings.enable_software_rendering = false; | |
| auto jni = std::make_shared<MockPlatformViewAndroidJNI>(); | |
| auto holder = std::make_unique<AndroidShellHolder>(settings, jni); | |
| EXPECT_NE(holder.get(), nullptr); | |
| EXPECT_TRUE(holder->IsValid()); | |
| EXPECT_NE(holder->GetPlatformView().get(), nullptr); | |
| auto window = fml::MakeRefCounted<AndroidNativeWindow>( | |
| nullptr, /*is_fake_window=*/true); | |
| holder->GetPlatformView()->NotifyCreated(window); | |
| EXPECT_TRUE(holder->GetPlatformMessageHandler()); | |
| size_t data_size = 4; | |
| fml::MallocMapping bytes = | |
| fml::MallocMapping(static_cast<uint8_t*>(malloc(data_size)), data_size); | |
| fml::RefPtr<MockPlatformMessageResponse> response = | |
| MockPlatformMessageResponse::Create(); | |
| auto message = std::make_unique<PlatformMessage>( | |
| /*channel=*/"foo", /*data=*/std::move(bytes), /*response=*/response); | |
| int response_id = 1; | |
| EXPECT_CALL(*jni, | |
| FlutterViewHandlePlatformMessage(::testing::_, response_id)); | |
| EXPECT_CALL(*response, CompleteEmpty()); | |
| holder->GetPlatformMessageHandler()->HandlePlatformMessage( | |
| std::move(message)); | |
| holder->GetPlatformMessageHandler() | |
| ->InvokePlatformMessageEmptyResponseCallback(response_id); | |
| } | |
| } // namespace testing | |
| } // namespace flutter |