Skip to content

Commit 50b1e19

Browse files
committed
wip
1 parent 912d8c0 commit 50b1e19

9 files changed

+96
-72
lines changed

Crashlytics/Crashlytics/Components/FIRCLSContext.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ __BEGIN_DECLS
3939
@class FIRCLSInstallIdentifierModel;
4040
@class FIRCLSFileManager;
4141
@class FIRCLSContextInitData;
42+
@class FBLPromise;
4243
#endif
4344

4445
typedef struct {
@@ -82,7 +83,8 @@ typedef struct {
8283
FIRCLSAllocatorRef allocator;
8384
} FIRCLSContext;
8485
#ifdef __OBJC__
85-
bool FIRCLSContextInitialize(FIRCLSContextInitData* initData, FIRCLSFileManager* fileManager);
86+
FBLPromise* FIRCLSContextInitialize(FIRCLSContextInitData* initData,
87+
FIRCLSFileManager* fileManager);
8688
FIRCLSContextInitData* FIRCLSContextBuildInitData(FIRCLSInternalReport* report,
8789
FIRCLSSettings* settings,
8890
FIRCLSFileManager* fileManager,

Crashlytics/Crashlytics/Components/FIRCLSContext.m

+6-7
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@
7676
return initData;
7777
}
7878

79-
bool FIRCLSContextInitialize(FIRCLSContextInitData* initData, FIRCLSFileManager* fileManager) {
79+
FBLPromise* FIRCLSContextInitialize(FIRCLSContextInitData* initData,
80+
FIRCLSFileManager* fileManager) {
8081
if (!initData) {
8182
return false;
8283
}
@@ -102,6 +103,8 @@ bool FIRCLSContextInitialize(FIRCLSContextInitData* initData, FIRCLSFileManager*
102103
// some values that aren't tied to particular subsystem
103104
_firclsContext.readonly->debuggerAttached = FIRCLSProcessDebuggerAttached();
104105

106+
__block FBLPromise* initPromise = [FBLPromise pendingPromise];
107+
105108
dispatch_group_async(group, queue, ^{
106109
FIRCLSHostInitialize(&_firclsContext.readonly->host);
107110
});
@@ -220,14 +223,10 @@ bool FIRCLSContextInitialize(FIRCLSContextInitData* initData, FIRCLSFileManager*
220223
if (!FIRCLSAllocatorProtect(_firclsContext.allocator)) {
221224
FIRCLSSDKLog("Error: Memory protection failed\n");
222225
}
226+
[initPromise fulfill:nil];
223227
});
224228

225-
if (dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, FIRCLSContextInitWaitTime)) !=
226-
0) {
227-
FIRCLSSDKLog("Error: Delayed initialization\n");
228-
}
229-
230-
return true;
229+
return initPromise;
231230
}
232231

233232
void FIRCLSContextBaseInit(void) {

Crashlytics/Crashlytics/Controllers/FIRCLSContextManager.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ NS_ASSUME_NONNULL_BEGIN
3434
/// a new Session ID.
3535
@property(nonatomic, copy) NSString *appQualitySessionId;
3636

37-
- (BOOL)setupContextWithReport:(FIRCLSInternalReport *)report
38-
settings:(FIRCLSSettings *)settings
39-
fileManager:(FIRCLSFileManager *)fileManager;
37+
- (FBLPromise *)setupContextWithReport:(FIRCLSInternalReport *)report
38+
settings:(FIRCLSSettings *)settings
39+
fileManager:(FIRCLSFileManager *)fileManager;
4040

4141
@end
4242

Crashlytics/Crashlytics/Controllers/FIRCLSContextManager.m

+3-3
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,9 @@ - (instancetype)init {
4040
return self;
4141
}
4242

43-
- (BOOL)setupContextWithReport:(FIRCLSInternalReport *)report
44-
settings:(FIRCLSSettings *)settings
45-
fileManager:(FIRCLSFileManager *)fileManager {
43+
- (FBLPromise *)setupContextWithReport:(FIRCLSInternalReport *)report
44+
settings:(FIRCLSSettings *)settings
45+
fileManager:(FIRCLSFileManager *)fileManager {
4646
_report = report;
4747
_settings = settings;
4848
_fileManager = fileManager;

Crashlytics/Crashlytics/Controllers/FIRCLSReportManager.m

+53-41
Original file line numberDiff line numberDiff line change
@@ -289,15 +289,21 @@ - (FBLPromise *)deleteUnsentReports {
289289

290290
BOOL launchFailure = [self.launchMarker checkForAndCreateLaunchMarker];
291291

292-
FIRCLSInternalReport *report = [self setupCurrentReport:executionIdentifier];
292+
__block FIRCLSInternalReport *report = [self setupCurrentReport:executionIdentifier];
293293
if (!report) {
294294
FIRCLSErrorLog(@"Unable to setup a new report");
295295
}
296296

297-
if (![self startCrashReporterWithProfilingReport:report]) {
298-
FIRCLSErrorLog(@"Unable to start crash reporter");
299-
report = nil;
300-
}
297+
FBLPromise<NSNumber *> *reportProfilingPromise;
298+
reportProfilingPromise =
299+
[[self startCrashReporterWithProfilingReport:report] then:^id _Nullable(id _Nullable value) {
300+
if ([value isEqual:@NO]) {
301+
FIRCLSErrorLog(@"Unable to start crash reporter");
302+
report = nil;
303+
return [FBLPromise resolvedWith:@NO];
304+
}
305+
return [FBLPromise resolvedWith:@YES];
306+
}];
301307

302308
#if CLS_METRICKIT_SUPPORTED
303309
if (@available(iOS 15, *)) {
@@ -317,9 +323,12 @@ - (FBLPromise *)deleteUnsentReports {
317323
[self beginSettingsWithToken:dataCollectionToken];
318324

319325
// Wait for MetricKit data to be available, then continue to send reports and resolve promise.
320-
promise = [[self waitForMetricKitData]
326+
promise = [[reportProfilingPromise onQueue:_dispatchQueue
327+
then:^id _Nullable(id _Nullable value) {
328+
return [self waitForMetricKitData];
329+
}]
321330
onQueue:_dispatchQueue
322-
then:^id _Nullable(id _Nullable metricKitValue) {
331+
then:^id _Nullable(id _Nullable value) {
323332
[self beginReportUploadsWithToken:dataCollectionToken blockingSend:launchFailure];
324333

325334
// If data collection is enabled, the SDK will not notify the user
@@ -335,29 +344,33 @@ - (FBLPromise *)deleteUnsentReports {
335344

336345
// Wait for an action to get sent, either from processReports: or automatic data collection,
337346
// and for MetricKit data to be available.
338-
promise = [[FBLPromise all:@[ [self waitForReportAction], [self waitForMetricKitData] ]]
347+
promise = [[reportProfilingPromise
339348
onQueue:_dispatchQueue
340-
then:^id _Nullable(NSArray *_Nullable wrappedActionAndData) {
341-
// Process the actions for the reports on disk.
342-
FIRCLSReportAction action = [[wrappedActionAndData firstObject] reportActionValue];
343-
344-
if (action == FIRCLSReportActionSend) {
345-
FIRCLSDebugLog(@"Sending unsent reports.");
346-
FIRCLSDataCollectionToken *dataCollectionToken =
347-
[FIRCLSDataCollectionToken validToken];
348-
349-
[self beginSettingsWithToken:dataCollectionToken];
350-
351-
[self beginReportUploadsWithToken:dataCollectionToken blockingSend:NO];
352-
353-
} else if (action == FIRCLSReportActionDelete) {
354-
FIRCLSDebugLog(@"Deleting unsent reports.");
355-
[self.existingReportManager deleteUnsentReports];
356-
} else {
357-
FIRCLSErrorLog(@"Unknown report action: %d", action);
358-
}
359-
return @(report != nil);
360-
}];
349+
then:^id _Nullable(id _Nullable value) {
350+
return [FBLPromise all:@[ [self waitForReportAction], [self waitForMetricKitData] ]];
351+
}] onQueue:_dispatchQueue
352+
then:^id _Nullable(NSArray *_Nullable wrappedActionAndData) {
353+
// Process the actions for the reports on disk.
354+
FIRCLSReportAction action =
355+
[[wrappedActionAndData firstObject] reportActionValue];
356+
357+
if (action == FIRCLSReportActionSend) {
358+
FIRCLSDebugLog(@"Sending unsent reports.");
359+
FIRCLSDataCollectionToken *dataCollectionToken =
360+
[FIRCLSDataCollectionToken validToken];
361+
362+
[self beginSettingsWithToken:dataCollectionToken];
363+
364+
[self beginReportUploadsWithToken:dataCollectionToken blockingSend:NO];
365+
366+
} else if (action == FIRCLSReportActionDelete) {
367+
FIRCLSDebugLog(@"Deleting unsent reports.");
368+
[self.existingReportManager deleteUnsentReports];
369+
} else {
370+
FIRCLSErrorLog(@"Unknown report action: %d", action);
371+
}
372+
return @(report != nil);
373+
}];
361374
}
362375

363376
if (report != nil) {
@@ -412,24 +425,23 @@ - (void)beginReportUploadsWithToken:(FIRCLSDataCollectionToken *)token
412425
}
413426
}
414427

415-
- (BOOL)startCrashReporterWithProfilingReport:(FIRCLSInternalReport *)report {
428+
- (FBLPromise<NSNumber *> *)startCrashReporterWithProfilingReport:(FIRCLSInternalReport *)report {
416429
if (!report) {
417-
return NO;
418-
}
419-
420-
if (![self.contextManager setupContextWithReport:report
421-
settings:self.settings
422-
fileManager:_fileManager]) {
423-
return NO;
430+
return [FBLPromise resolvedWith:@NO];
424431
}
425432

426-
[self.notificationManager registerNotificationListener];
433+
return [[self.contextManager setupContextWithReport:report
434+
settings:self.settings
435+
fileManager:_fileManager]
436+
then:^id _Nullable(id _Nullable value) {
437+
[self.notificationManager registerNotificationListener];
427438

428-
[self.analyticsManager registerAnalyticsListener];
439+
[self.analyticsManager registerAnalyticsListener];
429440

430-
[self crashReportingSetupCompleted];
441+
[self crashReportingSetupCompleted];
431442

432-
return YES;
443+
return [FBLPromise resolvedWith:@YES];
444+
}];
433445
}
434446

435447
- (void)crashReportingSetupCompleted {

Crashlytics/UnitTests/FIRCLSContextManagerTests.m

+12-9
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,10 @@ - (void)tearDown {
6868
}
6969

7070
- (void)test_notSettingSessionID_protoHasNilSessionID {
71-
[self.contextManager setupContextWithReport:self.report
72-
settings:self.mockSettings
73-
fileManager:self.fileManager];
71+
FBLPromiseAwait([self.contextManager setupContextWithReport:self.report
72+
settings:self.mockSettings
73+
fileManager:self.fileManager],
74+
nil);
7475

7576
FIRCLSReportAdapter *adapter = [[FIRCLSReportAdapter alloc] initWithPath:self.report.path
7677
googleAppId:@"TestGoogleAppID"
@@ -84,9 +85,10 @@ - (void)test_notSettingSessionID_protoHasNilSessionID {
8485
- (void)test_settingSessionIDMultipleTimes_protoHasLastSessionID {
8586
[self.contextManager setAppQualitySessionId:TestContextSessionID];
8687

87-
[self.contextManager setupContextWithReport:self.report
88-
settings:self.mockSettings
89-
fileManager:self.fileManager];
88+
FBLPromiseAwait([self.contextManager setupContextWithReport:self.report
89+
settings:self.mockSettings
90+
fileManager:self.fileManager],
91+
nil);
9092

9193
[self.contextManager setAppQualitySessionId:TestContextSessionID2];
9294

@@ -101,9 +103,10 @@ - (void)test_settingSessionIDMultipleTimes_protoHasLastSessionID {
101103
}
102104

103105
- (void)test_settingSessionIDOutOfOrder_protoHasLastSessionID {
104-
[self.contextManager setupContextWithReport:self.report
105-
settings:self.mockSettings
106-
fileManager:self.fileManager];
106+
FBLPromiseAwait([self.contextManager setupContextWithReport:self.report
107+
settings:self.mockSettings
108+
fileManager:self.fileManager],
109+
nil);
107110

108111
[self.contextManager setAppQualitySessionId:TestContextSessionID];
109112

Crashlytics/UnitTests/FIRCLSOnDemandModelTests.m

+4-3
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,10 @@ - (void)setUp {
9898
executionIdentifier:@"TEST_EXECUTION_IDENTIFIER"];
9999

100100
FIRCLSContextManager *contextManager = [[FIRCLSContextManager alloc] init];
101-
[contextManager setupContextWithReport:report
102-
settings:self.mockSettings
103-
fileManager:self.fileManager];
101+
FBLPromiseAwait([contextManager setupContextWithReport:report
102+
settings:self.mockSettings
103+
fileManager:self.fileManager],
104+
nil);
104105
}
105106

106107
- (void)tearDown {

Crashlytics/UnitTests/FIRRecordExceptionModelTests.m

+4-3
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,10 @@ - (void)setUp {
5454
executionIdentifier:@"TEST_EXECUTION_IDENTIFIER"];
5555

5656
FIRCLSContextManager *contextManager = [[FIRCLSContextManager alloc] init];
57-
[contextManager setupContextWithReport:report
58-
settings:self.mockSettings
59-
fileManager:self.fileManager];
57+
FBLPromiseAwait([contextManager setupContextWithReport:report
58+
settings:self.mockSettings
59+
fileManager:self.fileManager],
60+
nil);
6061
}
6162

6263
- (void)tearDown {

Crashlytics/UnitTests/Mocks/FIRCLSMockReportManager.m

+8-2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15+
#if __has_include(<FBLPromises/FBLPromises.h>)
16+
#import <FBLPromises/FBLPromises.h>
17+
#else
18+
#import "FBLPromises.h"
19+
#endif
20+
1521
#import "Crashlytics/UnitTests/Mocks/FIRCLSMockReportManager.h"
1622

1723
#import "Crashlytics/Crashlytics/Components/FIRCLSContext.h"
@@ -22,10 +28,10 @@
2228

2329
@implementation FIRCLSMockReportManager
2430

25-
- (BOOL)startCrashReporterWithProfilingReport:(FIRCLSInternalReport *)report {
31+
- (FBLPromise<NSNumber *> *)startCrashReporterWithProfilingReport:(FIRCLSInternalReport *)report {
2632
NSLog(@"Crash Reporting system disabled for testing");
2733

28-
return YES;
34+
return [FBLPromise resolvedWith:@YES];
2935
}
3036

3137
- (BOOL)installCrashReportingHandlers:(FIRCLSContextInitData *)initData {

0 commit comments

Comments
 (0)