blob: 2aad7e3de9ddef062d3f58eb71b50c01d1a64f71 [file] [log] [blame]
// 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.
@import camera_avfoundation;
@import XCTest;
#import <OCMock/OCMock.h>
@interface ThreadSafeEventChannelTests : XCTestCase
@end
@implementation ThreadSafeEventChannelTests
- (void)testSetStreamHandler_shouldStayOnMainThreadIfCalledFromMainThread {
FlutterEventChannel *mockEventChannel = OCMClassMock([FlutterEventChannel class]);
FLTThreadSafeEventChannel *threadSafeEventChannel =
[[FLTThreadSafeEventChannel alloc] initWithEventChannel:mockEventChannel];
XCTestExpectation *mainThreadExpectation =
[self expectationWithDescription:@"setStreamHandler must be called on the main thread"];
XCTestExpectation *mainThreadCompletionExpectation =
[self expectationWithDescription:
@"setStreamHandler's completion block must be called on the main thread"];
OCMStub([mockEventChannel setStreamHandler:[OCMArg any]]).andDo(^(NSInvocation *invocation) {
if (NSThread.isMainThread) {
[mainThreadExpectation fulfill];
}
});
[threadSafeEventChannel setStreamHandler:nil
completion:^{
if (NSThread.isMainThread) {
[mainThreadCompletionExpectation fulfill];
}
}];
[self waitForExpectationsWithTimeout:1 handler:nil];
}
- (void)testSetStreamHandler_shouldDispatchToMainThreadIfCalledFromBackgroundThread {
FlutterEventChannel *mockEventChannel = OCMClassMock([FlutterEventChannel class]);
FLTThreadSafeEventChannel *threadSafeEventChannel =
[[FLTThreadSafeEventChannel alloc] initWithEventChannel:mockEventChannel];
XCTestExpectation *mainThreadExpectation =
[self expectationWithDescription:@"setStreamHandler must be called on the main thread"];
XCTestExpectation *mainThreadCompletionExpectation =
[self expectationWithDescription:
@"setStreamHandler's completion block must be called on the main thread"];
OCMStub([mockEventChannel setStreamHandler:[OCMArg any]]).andDo(^(NSInvocation *invocation) {
if (NSThread.isMainThread) {
[mainThreadExpectation fulfill];
}
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[threadSafeEventChannel setStreamHandler:nil
completion:^{
if (NSThread.isMainThread) {
[mainThreadCompletionExpectation fulfill];
}
}];
});
[self waitForExpectationsWithTimeout:1 handler:nil];
}
- (void)testEventChannel_shouldBeKeptAliveWhenDispatchingBackToMainThread {
XCTestExpectation *expectation =
[self expectationWithDescription:@"Completion should be called."];
dispatch_async(dispatch_queue_create("test", NULL), ^{
FLTThreadSafeEventChannel *channel = [[FLTThreadSafeEventChannel alloc]
initWithEventChannel:OCMClassMock([FlutterEventChannel class])];
[channel setStreamHandler:OCMOCK_ANY
completion:^{
[expectation fulfill];
}];
});
[self waitForExpectationsWithTimeout:1 handler:nil];
}
@end