7 #import <OCMock/OCMock.h>
8 #import <XCTest/XCTest.h>
16 @property(nonatomic, copy) NSString*
channel;
17 @property(nonatomic, strong) NSData*
message;
18 @property(nonatomic, strong) NSMutableDictionary<NSString*, FlutterBinaryMessageHandler>*
handlers;
21 - (instancetype)init {
24 _handlers = [[NSMutableDictionary<NSString*, FlutterBinaryMessageHandler> alloc] init];
29 - (void)sendOnChannel:(NSString*)channel message:(NSData* _Nullable)message {
30 [
self sendOnChannel:channel message:message binaryReply:nil];
33 - (void)sendOnChannel:(NSString*)channel
34 message:(NSData* _Nullable)message
43 [
self.handlers setObject:handler forKey:channel];
57 - (void)testMethodInvoke {
58 NSString* channelName =
@"foo";
60 id codec = OCMProtocolMock(
@protocol(FlutterMethodCodec));
62 binaryMessenger:binaryMessenger
65 NSData* encodedMethodCall = [@"hey" dataUsingEncoding:NSUTF8StringEncoding];
66 OCMStub([codec encodeMethodCall:[OCMArg any]]).andReturn(encodedMethodCall);
68 OCMVerify([binaryMessenger sendOnChannel:channelName
message:encodedMethodCall]);
71 - (void)testMethodInvokeWithReply {
72 NSString* channelName =
@"foo";
74 id codec = OCMProtocolMock(
@protocol(FlutterMethodCodec));
76 binaryMessenger:binaryMessenger
79 NSData* encodedMethodCall = [@"hey" dataUsingEncoding:NSUTF8StringEncoding];
80 OCMStub([codec encodeMethodCall:[OCMArg any]]).andReturn(encodedMethodCall);
81 XCTestExpectation* didCallReply = [
self expectationWithDescription:@"didCallReply"];
82 OCMExpect([binaryMessenger sendOnChannel:channelName
84 binaryReply:[OCMArg checkWithBlock:^BOOL(
id obj) {
91 result:^(id _Nullable result) {
92 [didCallReply fulfill];
93 XCTAssertEqual(FlutterMethodNotImplemented, result);
95 OCMVerifyAll(binaryMessenger);
96 [
self waitForExpectationsWithTimeout:1.0 handler:nil];
99 - (void)testMethodMessageHandler {
100 NSString* channelName =
@"foo";
102 id codec = OCMProtocolMock(
@protocol(FlutterMethodCodec));
104 binaryMessenger:binaryMessenger
108 NSData* encodedMethodCall = [@"hey" dataUsingEncoding:NSUTF8StringEncoding];
109 OCMStub([codec encodeMethodCall:[OCMArg any]]).andReturn(encodedMethodCall);
114 OCMVerify([binaryMessenger setMessageHandlerOnChannel:channelName
115 binaryMessageHandler:[OCMArg isNotNil]]);
118 - (void)testCallMethodHandler {
119 NSString* channelName =
@"foo";
121 id codec = OCMProtocolMock(
@protocol(FlutterMethodCodec));
123 binaryMessenger:binaryMessenger
127 NSData* encodedMethodCall = [@"encoded" dataUsingEncoding:NSUTF8StringEncoding];
128 NSData* replyData = [@"reply" dataUsingEncoding:NSUTF8StringEncoding];
129 NSData* replyEnvelopeData = [@"reply-envelope" dataUsingEncoding:NSUTF8StringEncoding];
131 OCMStub([codec decodeMethodCall:encodedMethodCall]).andReturn(methodCall);
132 OCMStub([codec encodeSuccessEnvelope:replyData]).andReturn(replyEnvelopeData);
133 XCTestExpectation* didCallHandler = [
self expectationWithDescription:@"didCallHandler"];
134 XCTestExpectation* didCallReply = [
self expectationWithDescription:@"didCallReply"];
137 XCTAssertEqual(methodCall, call);
138 [didCallHandler fulfill];
142 binaryMessenger.
handlers[channelName](encodedMethodCall, ^(NSData* reply) {
143 [didCallReply fulfill];
144 XCTAssertEqual(replyEnvelopeData, reply);
146 [
self waitForExpectationsWithTimeout:1.0 handler:nil];
150 NSString* channelName =
@"flutter/test";
152 id codec = OCMProtocolMock(
@protocol(FlutterMethodCodec));
155 binaryMessenger:binaryMessenger
162 const unsigned char bytes[] = {7, 6, 114, 101, 115, 105, 122, 101, 12, 2,
163 7, 12, 102, 108, 117, 116, 116, 101, 114, 47,
164 116, 101, 115, 116, 3, 3, 0, 0, 0};
165 NSData* expectedMessage = [NSData dataWithBytes:bytes length:sizeof(bytes)];
167 OCMExpect([binaryMessenger sendOnChannel:
@"dev.flutter/channel-buffers" message:expectedMessage]);
169 OCMVerifyAll(binaryMessenger);
170 [binaryMessenger stopMocking];
173 - (bool)testSetWarnsOnOverflow {
174 NSString* channelName =
@"flutter/test";
176 id codec = OCMProtocolMock(
@protocol(FlutterMethodCodec));
179 binaryMessenger:binaryMessenger
186 const unsigned char bytes[] = {7, 8, 111, 118, 101, 114, 102, 108, 111, 119, 12, 2, 7, 12,
187 102, 108, 117, 116, 116, 101, 114, 47, 116, 101, 115, 116, 1};
188 NSData* expectedMessage = [NSData dataWithBytes:bytes length:sizeof(bytes)];
190 OCMExpect([binaryMessenger sendOnChannel:
@"dev.flutter/channel-buffers" message:expectedMessage]);
192 OCMVerifyAll(binaryMessenger);
193 [binaryMessenger stopMocking];
196 - (void)testBasicMessageChannelCleanup {
197 NSString* channelName =
@"foo";
200 id codec = OCMProtocolMock(
@protocol(FlutterMethodCodec));
203 binaryMessenger:binaryMessenger
207 OCMStub([binaryMessenger setMessageHandlerOnChannel:channelName
208 binaryMessageHandler:[OCMArg any]])
209 .andReturn(connection);
211 OCMVerify([binaryMessenger setMessageHandlerOnChannel:channelName
212 binaryMessageHandler:[OCMArg isNotNil]]);
214 OCMVerify([binaryMessenger cleanUpConnection:connection]);
217 - (void)testMethodChannelCleanup {
218 NSString* channelName =
@"foo";
221 id codec = OCMProtocolMock(
@protocol(FlutterMethodCodec));
223 binaryMessenger:binaryMessenger
227 OCMStub([binaryMessenger setMessageHandlerOnChannel:channelName
228 binaryMessageHandler:[OCMArg any]])
229 .andReturn(connection);
235 OCMVerify([binaryMessenger setMessageHandlerOnChannel:channelName
236 binaryMessageHandler:[OCMArg isNotNil]]);
238 OCMVerify([binaryMessenger cleanUpConnection:connection]);
241 - (void)testBasicMessageChannelTaskQueue {
242 NSString* channelName =
@"foo";
245 id codec = OCMProtocolMock(
@protocol(FlutterMethodCodec));
249 binaryMessenger:binaryMessenger
251 taskQueue:taskQueue];
254 OCMStub([binaryMessenger setMessageHandlerOnChannel:channelName
255 binaryMessageHandler:[OCMArg any]
256 taskQueue:taskQueue])
257 .andReturn(connection);
259 OCMVerify([binaryMessenger setMessageHandlerOnChannel:channelName
260 binaryMessageHandler:[OCMArg isNotNil]
261 taskQueue:taskQueue]);
263 OCMVerify([binaryMessenger cleanUpConnection:connection]);
266 - (void)testBasicMessageChannelInvokeHandlerAfterChannelReleased {
267 NSString* channelName =
@"foo";
268 __block NSString* handlerMessage;
277 binaryMessenger:binaryMessenger
279 taskQueue:taskQueue];
284 OCMStub([binaryMessenger
285 setMessageHandlerOnChannel:channelName
286 binaryMessageHandler:[OCMArg checkWithBlock:^BOOL(
288 messageHandler = handler;
291 taskQueue:taskQueue])
292 .andReturn(connection);
293 OCMStub([codec decode:[OCMArg any]]).andReturn(
@"decoded message");
298 messageHandler([NSData data], ^(NSData* data){
300 XCTAssertEqualObjects(handlerMessage,
@"decoded message");
303 - (void)testMethodChannelInvokeHandlerAfterChannelReleased {
304 NSString* channelName =
@"foo";
310 id codec = OCMProtocolMock(
@protocol(FlutterMethodCodec));
313 binaryMessenger:binaryMessenger
315 taskQueue:taskQueue];
317 decodedMethodCall = call;
319 OCMStub([binaryMessenger
320 setMessageHandlerOnChannel:channelName
321 binaryMessageHandler:[OCMArg checkWithBlock:^BOOL(
323 messageHandler = handler;
326 taskQueue:taskQueue])
327 .andReturn(connection);
328 OCMStub([codec decodeMethodCall:[OCMArg any]])
333 messageHandler([NSData data], ^(NSData* data){
335 XCTAssertEqualObjects(decodedMethodCall.method,
@"decoded method call");
338 - (void)testMethodChannelTaskQueue {
339 NSString* channelName =
@"foo";
342 id codec = OCMProtocolMock(
@protocol(FlutterMethodCodec));
345 binaryMessenger:binaryMessenger
347 taskQueue:taskQueue];
351 OCMStub([binaryMessenger setMessageHandlerOnChannel:channelName
352 binaryMessageHandler:[OCMArg any]
353 taskQueue:taskQueue])
354 .andReturn(connection);
356 OCMVerify([binaryMessenger setMessageHandlerOnChannel:channelName
357 binaryMessageHandler:[OCMArg isNotNil]
358 taskQueue:taskQueue]);
360 OCMVerify([binaryMessenger cleanUpConnection:connection]);
363 - (void)testEventChannelTaskQueue {
364 NSString* channelName =
@"foo";
367 id codec = OCMProtocolMock(
@protocol(FlutterMethodCodec));
371 binaryMessenger:binaryMessenger
373 taskQueue:taskQueue];
375 OCMStub([binaryMessenger setMessageHandlerOnChannel:channelName
376 binaryMessageHandler:[OCMArg any]
377 taskQueue:taskQueue])
378 .andReturn(connection);
380 OCMVerify([binaryMessenger setMessageHandlerOnChannel:channelName
381 binaryMessageHandler:[OCMArg isNotNil]
382 taskQueue:taskQueue]);
384 OCMVerify([binaryMessenger cleanUpConnection:connection]);