/** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * */ #import #import #import #import #import #import #import #import @interface RCTTestViewManager : RCTViewManager @end @implementation RCTTestViewManager RCT_EXPORT_MODULE() #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-implementations" - (NSArray *)customBubblingEventTypes { return @[@"foo"]; } #pragma clang diagnostic pop @end @interface RCTNotificationObserverModule : NSObject @property (nonatomic, assign) BOOL didDetectViewManagerInit; @end @implementation RCTNotificationObserverModule @synthesize bridge = _bridge; RCT_EXPORT_MODULE() - (void)setBridge:(RCTBridge *)bridge { _bridge = bridge; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didInitViewManager:) name:RCTDidInitializeModuleNotification object:nil]; } - (void)didInitViewManager:(NSNotification *)note { id module = note.userInfo[@"module"]; if ([module isKindOfClass:[RCTTestViewManager class]]) { _didDetectViewManagerInit = YES; } } - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; } @end @interface RCTModuleInitNotificationRaceTests : XCTestCase { RCTBridge *_bridge; RCTNotificationObserverModule *_notificationObserver; } @end @implementation RCTModuleInitNotificationRaceTests - (NSURL *)sourceURLForBridge:(__unused RCTBridge *)bridge { NSBundle *bundle = [NSBundle bundleForClass:[self class]]; return [bundle URLForResource:@"RNTesterUnitTestsBundle" withExtension:@"js"]; } - (NSArray *)extraModulesForBridge:(__unused RCTBridge *)bridge { return @[[RCTTestViewManager new], _notificationObserver]; } - (void)setUp { [super setUp]; _notificationObserver = [RCTNotificationObserverModule new]; _bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:nil]; dispatch_async(dispatch_get_main_queue(), ^{ [[self->_bridge uiManager] constantsToExport]; }); } - (void)tearDown { [super tearDown]; _notificationObserver = nil; [_bridge invalidate]; _bridge = nil; } - (void)testViewManagerNotInitializedBeforeSetBridgeModule { RCT_RUN_RUNLOOP_WHILE(!_notificationObserver.didDetectViewManagerInit); } @end