5 #import <XCTest/XCTest.h>
9 #import "flutter/common/task_runners.h"
10 #import "flutter/fml/message_loop.h"
11 #import "flutter/fml/thread.h"
12 #import "flutter/lib/ui/window/platform_message.h"
13 #import "flutter/lib/ui/window/platform_message_response.h"
14 #import "flutter/shell/common/thread_host.h"
23 auto thread = std::make_unique<fml::Thread>(name);
24 auto runner = thread->GetTaskRunner();
29 fml::MessageLoop::EnsureInitializedForCurrentThread();
30 return fml::MessageLoop::GetCurrent().GetTaskRunner();
35 static fml::RefPtr<MockPlatformMessageResponse>
Create() {
38 void Complete(std::unique_ptr<fml::Mapping> data)
override { is_complete_ =
true; }
50 auto handler = std::make_unique<PlatformMessageHandlerIos>(task_runners.GetPlatformTaskRunner());
51 XCTAssertTrue(handler);
54 - (void)testSetAndCallHandler {
55 ThreadHost thread_host(
"io.flutter.test." + std::string(
self.name.UTF8String),
56 ThreadHost::Type::kRaster | ThreadHost::Type::kIo | ThreadHost::Type::kUi);
57 TaskRunners task_runners(
59 thread_host.ui_thread->GetTaskRunner(), thread_host.io_thread->GetTaskRunner());
61 auto handler = std::make_unique<PlatformMessageHandlerIos>(task_runners.GetPlatformTaskRunner());
62 std::string channel =
"foo";
63 XCTestExpectation* didCallReply = [
self expectationWithDescription:@"didCallReply"];
64 handler->SetMessageHandler(
68 [didCallReply fulfill];
71 auto response = MockPlatformMessageResponse::Create();
72 task_runners.GetUITaskRunner()->PostTask([channel, response, &handler] {
73 auto platform_message = std::make_unique<flutter::PlatformMessage>(channel, response);
74 handler->HandlePlatformMessage(std::move(platform_message));
76 [
self waitForExpectationsWithTimeout:1.0 handler:nil];
77 XCTAssertTrue(response->is_complete());
80 - (void)testSetClearAndCallHandler {
81 ThreadHost thread_host(
"io.flutter.test." + std::string(
self.name.UTF8String),
82 ThreadHost::Type::kRaster | ThreadHost::Type::kIo | ThreadHost::Type::kUi);
83 TaskRunners task_runners(
85 thread_host.ui_thread->GetTaskRunner(), thread_host.io_thread->GetTaskRunner());
87 auto handler = std::make_unique<PlatformMessageHandlerIos>(task_runners.GetPlatformTaskRunner());
88 std::string channel =
"foo";
89 XCTestExpectation* didCallMessage = [
self expectationWithDescription:@"didCallMessage"];
90 handler->SetMessageHandler(
93 XCTFail(
@"This shouldn't be called");
97 handler->SetMessageHandler(channel, nil, nil);
98 auto response = MockPlatformMessageResponse::Create();
99 task_runners.GetUITaskRunner()->PostTask([channel, response, &handler, &didCallMessage] {
100 auto platform_message = std::make_unique<flutter::PlatformMessage>(channel, response);
101 handler->HandlePlatformMessage(std::move(platform_message));
102 [didCallMessage fulfill];
104 [
self waitForExpectationsWithTimeout:1.0 handler:nil];
105 XCTAssertTrue(response->is_complete());
108 - (void)testSetAndCallHandlerTaskQueue {
109 ThreadHost thread_host(
"io.flutter.test." + std::string(
self.name.UTF8String),
110 ThreadHost::Type::kRaster | ThreadHost::Type::kIo | ThreadHost::Type::kUi);
111 TaskRunners task_runners(
113 thread_host.ui_thread->GetTaskRunner(), thread_host.io_thread->GetTaskRunner());
115 auto handler = std::make_unique<PlatformMessageHandlerIos>(task_runners.GetPlatformTaskRunner());
116 std::string channel =
"foo";
117 XCTestExpectation* didCallReply = [
self expectationWithDescription:@"didCallReply"];
118 NSObject<FlutterTaskQueue>* taskQueue = PlatformMessageHandlerIos::MakeBackgroundTaskQueue();
119 handler->SetMessageHandler(
122 XCTAssertFalse([NSThread isMainThread]);
124 [didCallReply fulfill];
127 auto response = MockPlatformMessageResponse::Create();
128 task_runners.GetUITaskRunner()->PostTask([channel, response, &handler] {
129 auto platform_message = std::make_unique<flutter::PlatformMessage>(channel, response);
130 handler->HandlePlatformMessage(std::move(platform_message));
132 [
self waitForExpectationsWithTimeout:1.0 handler:nil];
133 XCTAssertTrue(response->is_complete());
NS_ASSUME_NONNULL_BEGIN typedef void(^ FlutterBinaryReply)(NSData *_Nullable reply)
fml::RefPtr< fml::TaskRunner > CreateNewThread(const std::string &name)
fml::RefPtr< fml::TaskRunner > GetCurrentTaskRunner()