mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
b1ec698dc4
Summary: Fix entails using non-synthesized getter, such that underlying backing is an std::atomic<RCTNetworkTaskStatus>. In the greater scheme of things, I believe `RCTNetworkTask` should be improved as it has several `nonatomic` properties that are read and written to on different threads. Thread safety of this class seems to have been addressed on a per property basis, judging from the employment of `std::mutex` elsewhere in the implementation. This is an attempt at fixing https://github.com/facebook/react-native/issues/44687. ## Changelog: [iOS][FIXED] - Fix data race related to access on `RCTNetworkTask.status`. Pull Request resolved: https://github.com/facebook/react-native/pull/44694 Test Plan: Added unit test in class `RCTNetworkTaskTests`. Reviewed By: cortinico Differential Revision: D59217353 Pulled By: javache fbshipit-source-id: 1af77238ddd99db21e2e53f174a81e207d5832b2
50 lines
1.5 KiB
Objective-C
50 lines
1.5 KiB
Objective-C
/*
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
#import <React/RCTNetworkTask.h>
|
|
#import <React/RCTURLRequestHandler.h>
|
|
#import <XCTest/XCTest.h>
|
|
|
|
@interface TestHandler<RCTURLRequestHandler> : NSObject
|
|
@end
|
|
|
|
@implementation TestHandler
|
|
- (BOOL)canHandleRequest:(NSURLRequest *)request
|
|
{
|
|
return YES;
|
|
}
|
|
- (id)sendRequest:(NSURLRequest *)request withDelegate:(id<RCTURLRequestDelegate>)delegate
|
|
{
|
|
return [[NSUUID UUID] UUIDString];
|
|
}
|
|
@end
|
|
|
|
@interface RCTNetworkTaskTests : XCTestCase
|
|
|
|
@end
|
|
|
|
@implementation RCTNetworkTaskTests
|
|
|
|
- (void)testCanReadTaskStatus
|
|
{
|
|
NSURL *url = [[NSURL alloc] initWithString:@"https://developers.facebook.com"];
|
|
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
|
|
dispatch_queue_t callbackQueue =
|
|
dispatch_queue_create("RCTNetworkTaskTests-testCanReadTaskStatus", DISPATCH_QUEUE_SERIAL);
|
|
id<RCTURLRequestHandler> testHandler = (id<RCTURLRequestHandler>)[[TestHandler alloc] init];
|
|
RCTNetworkTask *task = [[RCTNetworkTask alloc] initWithRequest:request
|
|
handler:testHandler
|
|
callbackQueue:callbackQueue];
|
|
XCTAssertEqual(task.status, RCTNetworkTaskPending);
|
|
[task start];
|
|
XCTAssertEqual(task.status, RCTNetworkTaskInProgress);
|
|
[task cancel];
|
|
XCTAssertEqual(task.status, RCTNetworkTaskFinished);
|
|
}
|
|
|
|
@end
|