From 509a9a26fa90c9d3b00e275b680be1706bf265a9 Mon Sep 17 00:00:00 2001 From: Leo Natan Date: Wed, 17 Oct 2018 11:46:46 +0300 Subject: [PATCH] Add more sync points to await action results before sending done messages --- detox/ios/Detox/DetoxManager.m | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/detox/ios/Detox/DetoxManager.m b/detox/ios/Detox/DetoxManager.m index c0a851eecf..933f59cb47 100644 --- a/detox/ios/Detox/DetoxManager.m +++ b/detox/ios/Detox/DetoxManager.m @@ -122,15 +122,26 @@ - (void)websocketDidConnect if (![ReactNativeSupport isReactNativeApp]) { _isReady = YES; - [self.webSocket sendAction:@"ready" withParams:@{} withMessageId:@-1000]; + [self _safeSendAction:@"ready" params:@{} messageId:@-1000]; } } +- (void)_safeSendAction:(NSString*)action params:(NSDictionary*)params messageId:(NSNumber*)messageId +{ + [EarlGrey detox_safeExecuteSync:^{ + [self.webSocket sendAction:action withParams:params withMessageId:messageId]; + }]; +} + - (void)websocketDidReceiveAction:(NSString *)type withParams:(NSDictionary *)params withMessageId:(NSNumber *)messageId { NSAssert(messageId != nil, @"Got action with a null messageId"); - if([type isEqualToString:@"invoke"]) + if([type isEqualToString:@"waitForIdle"]) + { + [self _safeSendAction:@"waitForIdleDone" params:@{} messageId: messageId]; + } + else if([type isEqualToString:@"invoke"]) { [self.testRunner invoke:params withMessageId:messageId]; return; @@ -139,7 +150,7 @@ - (void)websocketDidReceiveAction:(NSString *)type withParams:(NSDictionary *)pa { if(_isReady) { - [self.webSocket sendAction:@"ready" withParams:@{} withMessageId:@-1000]; + [self _safeSendAction:@"ready" params:@{} messageId:@-1000]; } return; } @@ -156,7 +167,7 @@ - (void)websocketDidReceiveAction:(NSString *)type withParams:(NSDictionary *)pa void (^block)(void); //Send webSocket and messageId as params so the block is of global type, instead of being allocated on every message. void (^sendDoneAction)(WebSocket* webSocket, NSNumber* messageId) = ^ (WebSocket* webSocket, NSNumber* messageId) { - [webSocket sendAction:@"deliverPayloadDone" withParams:@{} withMessageId: messageId]; + [self _safeSendAction:@"deliverPayloadDone" params:@{} messageId: messageId]; }; if(params[@"url"]) @@ -221,7 +232,7 @@ - (void)websocketDidReceiveAction:(NSString *)type withParams:(NSDictionary *)pa [EarlGrey detox_safeExecuteSync:^{ [self _sendShakeNotification]; - [self.webSocket sendAction:@"shakeDeviceDone" withParams:@{} withMessageId: messageId]; + [self _safeSendAction:@"shakeDeviceDone" params:@{} messageId: messageId]; }]; } else if([type isEqualToString:@"reactNativeReload"]) @@ -260,19 +271,20 @@ - (void)testRunnerOnInvokeResult:(id)res withMessageId:(NSNumber *)messageId { res = [NSString stringWithFormat:@"(%@)", NSStringFromClass([res class])]; } - [self.webSocket sendAction:@"invokeResult" withParams:@{@"result": res} withMessageId:messageId]; + + [self _safeSendAction:@"invokeResult" params:@{@"result": res} messageId:messageId]; } - (void)testRunnerOnTestFailed:(NSString *)details withMessageId:(NSNumber *) messageId { if (details == nil) details = @""; - [self.webSocket sendAction:@"testFailed" withParams:@{@"details": details} withMessageId:messageId]; + [self _safeSendAction:@"testFailed" params:@{@"details": details} messageId:messageId]; } - (void)testRunnerOnError:(NSString *)error withMessageId:(NSNumber *) messageId { if (error == nil) error = @""; - [self.webSocket sendAction:@"error" withParams:@{@"error": error} withMessageId:messageId]; + [self _safeSendAction:@"error" params:@{@"error": error} messageId:messageId]; } - (void)notifyOnCrashWithDetails:(NSDictionary*)details