From 792eb90c5c889681cda4486eb469c0c80c61b7e8 Mon Sep 17 00:00:00 2001 From: Nick Dowell Date: Fri, 3 Dec 2021 09:11:20 +0000 Subject: [PATCH 01/37] Fix clobbering of reservedThreads by crash handlers --- .../KSCrash/Recording/Sentry/BSG_KSCrashSentry.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Bugsnag/KSCrash/Source/KSCrash/Recording/Sentry/BSG_KSCrashSentry.c b/Bugsnag/KSCrash/Source/KSCrash/Recording/Sentry/BSG_KSCrashSentry.c index ea17b0516..e721c4625 100644 --- a/Bugsnag/KSCrash/Source/KSCrash/Recording/Sentry/BSG_KSCrashSentry.c +++ b/Bugsnag/KSCrash/Source/KSCrash/Recording/Sentry/BSG_KSCrashSentry.c @@ -150,15 +150,13 @@ void bsg_kscrashsentry_suspendThreads(void) { if (bsg_g_context != NULL) { bsg_g_context->allThreads = bsg_ksmachgetAllThreads(&bsg_g_context->allThreadsCount); bsg_ksmachgetThreadStates(bsg_g_context->allThreads, bsg_g_context->allThreadRunStates, bsg_g_context->allThreadsCount); - BSG_KSLOG_DEBUG( - "Suspending all threads except for %d reserved threads.", - BSG_KSCrashReservedThreadTypeCount); bsg_g_context->threadsToResumeCount = bsg_ksmachremoveThreadsFromList(bsg_g_context->allThreads, bsg_g_context->allThreadsCount, bsg_g_context->reservedThreads, BSG_KSCrashReservedThreadTypeCount, bsg_g_context->threadsToResume, MAX_CAPTURED_THREADS); + BSG_KSLOG_DEBUG("Suspending %d of %d threads.", bsg_g_context->threadsToResumeCount, bsg_g_context->allThreadsCount); bsg_ksmachsuspendThreads(bsg_g_context->threadsToResume, bsg_g_context->threadsToResumeCount); } else { BSG_KSLOG_DEBUG("Suspending all threads."); @@ -179,8 +177,7 @@ void bsg_kscrashsentry_resumeThreads(void) { } if (bsg_g_context != NULL) { - BSG_KSLOG_DEBUG("Resuming all threads except for %d reserved threads.", - BSG_KSCrashReservedThreadTypeCount); + BSG_KSLOG_DEBUG("Resuming %d of %d threads.", bsg_g_context->threadsToResumeCount, bsg_g_context->allThreadsCount); bsg_ksmachresumeThreads(bsg_g_context->threadsToResume, bsg_g_context->threadsToResumeCount); bsg_g_context->threadsToResumeCount = 0; if (bsg_g_context->allThreads != NULL) { @@ -203,12 +200,15 @@ void bsg_kscrashsentry_clearContext(BSG_KSCrash_SentryContext *context) { void (*onCrash)(void *) = context->onCrash; bool threadTracingEnabled = context->threadTracingEnabled; bool reportWhenDebuggerIsAttached = context->reportWhenDebuggerIsAttached; + thread_t reservedThreads[BSG_KSCrashReservedThreadTypeCount]; + memcpy(reservedThreads, context->reservedThreads, sizeof(reservedThreads)); memset(context, 0, sizeof(*context)); context->onCrash = onCrash; context->threadTracingEnabled = threadTracingEnabled; context->reportWhenDebuggerIsAttached = reportWhenDebuggerIsAttached; + memcpy(context->reservedThreads, reservedThreads, sizeof(reservedThreads)); } void bsg_kscrashsentry_beginHandlingCrash(BSG_KSCrash_SentryContext *context) { From f26a8e0f06b38b6b9857c96995be7bed89f8f640 Mon Sep 17 00:00:00 2001 From: Nick Dowell Date: Fri, 3 Dec 2021 09:16:59 +0000 Subject: [PATCH 02/37] Fix recrash detection for objc exceptions --- .../KSCrash/Recording/Sentry/BSG_KSCrashSentry_CPPException.mm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Bugsnag/KSCrash/Source/KSCrash/Recording/Sentry/BSG_KSCrashSentry_CPPException.mm b/Bugsnag/KSCrash/Source/KSCrash/Recording/Sentry/BSG_KSCrashSentry_CPPException.mm index 00644a341..309cadaa4 100644 --- a/Bugsnag/KSCrash/Source/KSCrash/Recording/Sentry/BSG_KSCrashSentry_CPPException.mm +++ b/Bugsnag/KSCrash/Source/KSCrash/Recording/Sentry/BSG_KSCrashSentry_CPPException.mm @@ -126,6 +126,8 @@ static void CPPExceptionTerminate(void) { BSG_KSLOG_DEBUG("Detected NSException. Recording details and letting " "the current NSException handler deal with it."); isNSException = true; + // recordException() doesn't call beginHandlingCrash() + bsg_kscrashsentry_beginHandlingCrash(bsg_g_context); bsg_recordException(exception); } catch (std::exception &exc) { strlcpy(descriptionBuff, exc.what(), sizeof(descriptionBuff)); From ee7fb9a271e7b5683dcd5d4458aa61fe34fc2373 Mon Sep 17 00:00:00 2001 From: Nick Dowell Date: Tue, 7 Dec 2021 16:39:09 +0000 Subject: [PATCH 03/37] Fix deadlock for nested mach exceptions --- .../Sentry/BSG_KSCrashSentry_MachException.c | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/Bugsnag/KSCrash/Source/KSCrash/Recording/Sentry/BSG_KSCrashSentry_MachException.c b/Bugsnag/KSCrash/Source/KSCrash/Recording/Sentry/BSG_KSCrashSentry_MachException.c index 4e0e7cd3e..ee62044d6 100644 --- a/Bugsnag/KSCrash/Source/KSCrash/Recording/Sentry/BSG_KSCrashSentry_MachException.c +++ b/Bugsnag/KSCrash/Source/KSCrash/Recording/Sentry/BSG_KSCrashSentry_MachException.c @@ -221,19 +221,19 @@ void *ksmachexc_i_handleExceptions(void *const userData) { thread_suspend(bsg_ksmachthread_self()); } - for (;;) { + while (bsg_g_installed) { BSG_KSLOG_DEBUG("Waiting for mach exception"); // Wait for a message. - kern_return_t kr = mach_msg( + mach_msg_return_t result = mach_msg( &exceptionMessage.header, MACH_RCV_MSG, 0, sizeof(exceptionMessage), bsg_g_exceptionPort, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); - if (kr == KERN_SUCCESS) { + if (result == MACH_MSG_SUCCESS) { break; } // Loop and try again on failure. - BSG_KSLOG_ERROR("mach_msg: %s", mach_error_string(kr)); + BSG_KSLOG_ERROR("mach_msg: %d", result); } BSG_KSLOG_DEBUG("Trapped mach exception code 0x%llx, subcode 0x%llx", @@ -442,6 +442,15 @@ void bsg_kscrashsentry_uninstallMachHandler(void) { bsg_ksmachexc_i_restoreExceptionPorts(); + bsg_g_installed = 0; + + if (bsg_g_context->handlingCrash) { + // Terminating a thread that is currently handling an exception message + // can cause a deadlock, so let's not do that! + BSG_KSLOG_DEBUG("Not cancelling exception threads."); + return; + } + thread_t thread_self = bsg_ksmachthread_self(); if (bsg_g_primaryPThread != 0 && bsg_g_primaryMachThread != thread_self) { @@ -464,9 +473,6 @@ void bsg_kscrashsentry_uninstallMachHandler(void) { bsg_g_secondaryMachThread = 0; bsg_g_secondaryPThread = 0; } - - BSG_KSLOG_DEBUG("Mach exception handlers uninstalled."); - bsg_g_installed = 0; } #else From 34afa7df34b02ef9a0f646fc5efc5d62d50756ff Mon Sep 17 00:00:00 2001 From: Nick Dowell Date: Wed, 8 Dec 2021 14:30:06 +0000 Subject: [PATCH 04/37] Update changelog --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 025979850..101a6f962 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ Changelog ========= +## TBD + +### Bug fixes + +* Fix some potential deadlocks that could occur if a crash handler crashes. + [#1252](https://github.com/bugsnag/bugsnag-cocoa/pull/1252) + ## 6.15.1 (2021-12-08) ### Bug fixes From 19bd09c816220bbf232477fca583698bee3a442c Mon Sep 17 00:00:00 2001 From: Nick Dowell Date: Fri, 3 Dec 2021 14:49:37 +0000 Subject: [PATCH 05/37] Always send _cocoa_ version in internal errors --- Bugsnag/Helpers/BSGInternalErrorReporter.h | 2 -- Bugsnag/Helpers/BSGInternalErrorReporter.m | 2 +- Tests/BugsnagTests/BSGInternalErrorReporterTests.m | 2 -- 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/Bugsnag/Helpers/BSGInternalErrorReporter.h b/Bugsnag/Helpers/BSGInternalErrorReporter.h index 912af1d6c..1fe7878c4 100644 --- a/Bugsnag/Helpers/BSGInternalErrorReporter.h +++ b/Bugsnag/Helpers/BSGInternalErrorReporter.h @@ -25,8 +25,6 @@ FOUNDATION_EXPORT NSString *BSGErrorDescription(NSError *error); @property (readonly, nonatomic) BugsnagConfiguration *configuration; -@property (readonly, nonatomic) BugsnagNotifier *notifier; - - (BugsnagAppWithState *)generateAppWithState:(NSDictionary *)systemInfo; - (BugsnagDeviceWithState *)generateDeviceWithState:(NSDictionary *)systemInfo; diff --git a/Bugsnag/Helpers/BSGInternalErrorReporter.m b/Bugsnag/Helpers/BSGInternalErrorReporter.m index 1188e744c..e15ef8e27 100644 --- a/Bugsnag/Helpers/BSGInternalErrorReporter.m +++ b/Bugsnag/Helpers/BSGInternalErrorReporter.m @@ -196,7 +196,7 @@ - (NSURLRequest *)requestForEvent:(nonnull BugsnagEvent *)event error:(NSError * NSMutableDictionary *requestPayload = [NSMutableDictionary dictionary]; requestPayload[BSGKeyEvents] = @[[event toJsonWithRedactedKeys:nil]]; - requestPayload[BSGKeyNotifier] = [dataSource.notifier toDict]; + requestPayload[BSGKeyNotifier] = [[[BugsnagNotifier alloc] init] toDict]; requestPayload[BSGKeyPayloadVersion] = EventPayloadVersion; NSData *data = [NSJSONSerialization dataWithJSONObject:requestPayload options:0 error:errorPtr]; diff --git a/Tests/BugsnagTests/BSGInternalErrorReporterTests.m b/Tests/BugsnagTests/BSGInternalErrorReporterTests.m index 01d0a3df8..af7684b23 100644 --- a/Tests/BugsnagTests/BSGInternalErrorReporterTests.m +++ b/Tests/BugsnagTests/BSGInternalErrorReporterTests.m @@ -17,7 +17,6 @@ @interface BSGInternalErrorReporterTests : XCTestCase @property (nonatomic) BugsnagConfiguration *configuration; -@property (nonatomic) BugsnagNotifier *notifier; @end @@ -29,7 +28,6 @@ - (void)setUp { [BSGInternalErrorReporter setSharedInstance:nil]; #pragma clang diagnostic pop self.configuration = [[BugsnagConfiguration alloc] initWithApiKey:@"0192837465afbecd0192837465afbecd"]; - self.notifier = [[BugsnagNotifier alloc] init]; } - (void)testEventWithErrorClass { From ebfc6ace9f3fce85b2b820da0929ec71e3f8fb4c Mon Sep 17 00:00:00 2001 From: Steve Kirkland-Walton Date: Wed, 8 Dec 2021 15:08:58 +0000 Subject: [PATCH 06/37] No need to close the keyboard [full ci] --- features/steps/app_steps.rb | 1 - features/steps/cocoa_steps.rb | 8 -------- 2 files changed, 9 deletions(-) diff --git a/features/steps/app_steps.rb b/features/steps/app_steps.rb index f18813282..966a900e6 100644 --- a/features/steps/app_steps.rb +++ b/features/steps/app_steps.rb @@ -63,7 +63,6 @@ steps %( Given the element "scenario_metadata" is present When I send the keys "#{mode}" to the element "scenario_metadata" - And I close the keyboard ) end diff --git a/features/steps/cocoa_steps.rb b/features/steps/cocoa_steps.rb index c7c86da00..8737c875f 100644 --- a/features/steps/cocoa_steps.rb +++ b/features/steps/cocoa_steps.rb @@ -2,7 +2,6 @@ steps %( Given the element "scenario_name" is present When I send the keys "#{event_type}" to the element "scenario_name" - And I close the keyboard And I click the element "run_scenario" ) end @@ -51,17 +50,10 @@ def click_if_present(element) false end -When('I close the keyboard') do - unless Maze::Helper.get_current_platform.eql?('macos') - click_if_present 'close_keyboard' - end -end - When('I configure Bugsnag for {string}') do |event_type| steps %( Given the element "scenario_name" is present When I send the keys "#{event_type}" to the element "scenario_name" - And I close the keyboard And I click the element "start_bugsnag" ) end From f2ecad0e1cad165d67611c8382894d665a66da91 Mon Sep 17 00:00:00 2001 From: Nick Dowell Date: Wed, 8 Dec 2021 15:46:38 +0000 Subject: [PATCH 07/37] Add modificationInterval metadata for internal errors --- Bugsnag/Delivery/BSGEventUploadKSCrashReportOperation.m | 9 +++++++++ .../shared/scenarios/InternalErrorReportingScenarios.m | 1 + features/internal_error_reporting.feature | 1 + 3 files changed, 11 insertions(+) diff --git a/Bugsnag/Delivery/BSGEventUploadKSCrashReportOperation.m b/Bugsnag/Delivery/BSGEventUploadKSCrashReportOperation.m index c0f1b4f16..1ad20d1c8 100644 --- a/Bugsnag/Delivery/BSGEventUploadKSCrashReportOperation.m +++ b/Bugsnag/Delivery/BSGEventUploadKSCrashReportOperation.m @@ -62,6 +62,15 @@ - (BugsnagEvent *)loadEventAndReturnError:(NSError * __autoreleasing *)errorPtr NSMutableDictionary *diagnostics = [NSMutableDictionary dictionary]; diagnostics[@"data"] = [data base64EncodedStringWithOptions:0]; diagnostics[@"file"] = self.file; + NSDictionary *fileAttributes = [NSFileManager.defaultManager attributesOfItemAtPath:self.file error:nil]; + if (fileAttributes) { + NSDate *creationDate = fileAttributes[NSFileCreationDate]; + NSDate *modificationDate = fileAttributes[NSFileModificationDate]; + if (creationDate && modificationDate) { + // The amount of time spent writing the file could indicate why the process never completed + diagnostics[@"modificationInterval"] = @([modificationDate timeIntervalSinceDate:creationDate]); + } + } ReportInternalError(@"JSON parsing error", BSGErrorDescription(error), diagnostics); if (errorPtr) { *errorPtr = error; diff --git a/features/fixtures/shared/scenarios/InternalErrorReportingScenarios.m b/features/fixtures/shared/scenarios/InternalErrorReportingScenarios.m index 4561d704b..9899314d4 100644 --- a/features/fixtures/shared/scenarios/InternalErrorReportingScenarios.m +++ b/features/fixtures/shared/scenarios/InternalErrorReportingScenarios.m @@ -14,6 +14,7 @@ @interface InternalErrorReportingScenarios_KSCrashReport : Scenario static void InternalErrorReportingScenarios_KSCrashReport_CrashHandler(const BSG_KSCrashReportWriter *writer) { writer->addJSONElement(writer, "something", "{1: \"Not valid JSON\"}"); + sleep(1); } @implementation InternalErrorReportingScenarios_KSCrashReport diff --git a/features/internal_error_reporting.feature b/features/internal_error_reporting.feature index 3c858c904..fca82592e 100644 --- a/features/internal_error_reporting.feature +++ b/features/internal_error_reporting.feature @@ -15,6 +15,7 @@ Feature: Internal error reporting And the event "metaData.BugsnagDiagnostics.apiKey" equals "12312312312312312312312312312312" And the event "metaData.BugsnagDiagnostics.data" is not null And the event "metaData.BugsnagDiagnostics.file" is not null + And the event "metaData.BugsnagDiagnostics.modificationInterval" is between 1.0 and 2.0 And the event "unhandled" is false And the exception "errorClass" equals "JSON parsing error" And the exception "message" matches "NSCocoaErrorDomain 3840: No string key for value in object around .+\." From a5e3ab0509040aea4e116d6c483a0ce790442039 Mon Sep 17 00:00:00 2001 From: Nick Dowell Date: Wed, 8 Dec 2021 16:15:53 +0000 Subject: [PATCH 08/37] Omit stacktrace from internal errors --- Bugsnag/Helpers/BSGInternalErrorReporter.m | 5 +---- Bugsnag/Payload/BugsnagError.m | 2 +- Tests/BugsnagTests/BSGInternalErrorReporterTests.m | 2 +- features/internal_error_reporting.feature | 1 + 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/Bugsnag/Helpers/BSGInternalErrorReporter.m b/Bugsnag/Helpers/BSGInternalErrorReporter.m index e15ef8e27..9c88f7094 100644 --- a/Bugsnag/Helpers/BSGInternalErrorReporter.m +++ b/Bugsnag/Helpers/BSGInternalErrorReporter.m @@ -117,14 +117,11 @@ - (nullable BugsnagEvent *)eventWithErrorClass:(NSString *)errorClass diagnostics:(nullable NSDictionary *)diagnostics groupingHash:(nullable NSString *)groupingHash { - NSArray *stacktrace = [BugsnagStackframe stackframesWithCallStackReturnAddresses: - BSGArraySubarrayFromIndex(NSThread.callStackReturnAddresses, 2)]; - BugsnagError *error = [[BugsnagError alloc] initWithErrorClass:errorClass errorMessage:message errorType:BSGErrorTypeCocoa - stacktrace:stacktrace]; + stacktrace:nil]; return [self eventWithError:error diagnostics:diagnostics groupingHash:groupingHash]; } diff --git a/Bugsnag/Payload/BugsnagError.m b/Bugsnag/Payload/BugsnagError.m index be23ed91c..b622ae969 100644 --- a/Bugsnag/Payload/BugsnagError.m +++ b/Bugsnag/Payload/BugsnagError.m @@ -106,7 +106,7 @@ - (instancetype)initWithErrorClass:(NSString *)errorClass _errorClass = errorClass; _errorMessage = errorMessage; _typeString = BSGSerializeErrorType(errorType); - _stacktrace = stacktrace; + _stacktrace = stacktrace ?: @[]; } return self; } diff --git a/Tests/BugsnagTests/BSGInternalErrorReporterTests.m b/Tests/BugsnagTests/BSGInternalErrorReporterTests.m index af7684b23..4e29d303b 100644 --- a/Tests/BugsnagTests/BSGInternalErrorReporterTests.m +++ b/Tests/BugsnagTests/BSGInternalErrorReporterTests.m @@ -39,7 +39,7 @@ - (void)testEventWithErrorClass { XCTAssertEqualObjects(event.errors[0].errorMessage, @"Something went wrong"); XCTAssertEqualObjects(event.groupingHash, @"test"); XCTAssertEqualObjects(event.threads, @[]); - XCTAssertGreaterThan(event.errors[0].stacktrace.count, 0); + XCTAssertEqual(event.errors[0].stacktrace.count, 0); XCTAssertNil(event.apiKey); NSDictionary *diagnostics = [event.metadata getMetadataFromSection:@"BugsnagDiagnostics"]; diff --git a/features/internal_error_reporting.feature b/features/internal_error_reporting.feature index fca82592e..b1a7f175e 100644 --- a/features/internal_error_reporting.feature +++ b/features/internal_error_reporting.feature @@ -9,6 +9,7 @@ Feature: Internal error reporting And I wait to receive an error And the error "Bugsnag-Api-Key" header is null And the error "Bugsnag-Internal-Error" header equals "bugsnag-cocoa" + And the error payload field "events.0.exceptions.0.stacktrace" is an array with 0 elements And the error payload field "events.0.threads" is an array with 0 elements And the event "apiKey" is null And the event "groupingHash" equals "BSGEventUploadKSCrashReportOperation.m: JSON parsing error: NSCocoaErrorDomain 3840: No string key for value in object" From 8f97cec730cf4b5fd6462dbe29dec39b0b9811f3 Mon Sep 17 00:00:00 2001 From: Nick Dowell Date: Wed, 8 Dec 2021 16:21:51 +0000 Subject: [PATCH 09/37] Rename to InvalidKSCrashReportScenario --- .../fixtures/ios/iOSTestApp.xcodeproj/project.pbxproj | 8 ++++---- .../macos/macOSTestApp.xcodeproj/project.pbxproj | 8 ++++---- ...ortingScenarios.m => InvalidCrashReportScenario.m} | 11 +++++------ features/internal_error_reporting.feature | 4 ++-- 4 files changed, 15 insertions(+), 16 deletions(-) rename features/fixtures/shared/scenarios/{InternalErrorReportingScenarios.m => InvalidCrashReportScenario.m} (50%) diff --git a/features/fixtures/ios/iOSTestApp.xcodeproj/project.pbxproj b/features/fixtures/ios/iOSTestApp.xcodeproj/project.pbxproj index 23e3e61f6..8a226f1db 100644 --- a/features/fixtures/ios/iOSTestApp.xcodeproj/project.pbxproj +++ b/features/fixtures/ios/iOSTestApp.xcodeproj/project.pbxproj @@ -19,7 +19,7 @@ 01018BA025E40ADD000312C6 /* AsyncSafeMallocScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = 01018B9F25E40ADD000312C6 /* AsyncSafeMallocScenario.m */; }; 0104085F258CA0A100933C60 /* DispatchCrashScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0104085E258CA0A100933C60 /* DispatchCrashScenario.swift */; }; 0163BFA72583B3CF008DC28B /* DiscardClassesScenarios.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0163BFA62583B3CF008DC28B /* DiscardClassesScenarios.swift */; }; - 01847DD626453D4E00ADA4C7 /* InternalErrorReportingScenarios.m in Sources */ = {isa = PBXBuildFile; fileRef = 01847DD526453D4E00ADA4C7 /* InternalErrorReportingScenarios.m */; }; + 01847DD626453D4E00ADA4C7 /* InvalidCrashReportScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = 01847DD526453D4E00ADA4C7 /* InvalidCrashReportScenario.m */; }; 01AF6A53258A112F00FFC803 /* BareboneTestScenarios.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01AF6A52258A112F00FFC803 /* BareboneTestScenarios.swift */; }; 01B6BB7525D5748800FC4DE6 /* LastRunInfoScenarios.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01B6BB7425D5748800FC4DE6 /* LastRunInfoScenarios.swift */; }; 01B6BBB625DA82B800FC4DE6 /* SendLaunchCrashesSynchronouslyScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01B6BBB525DA82B700FC4DE6 /* SendLaunchCrashesSynchronouslyScenario.swift */; }; @@ -181,7 +181,7 @@ 01018B9F25E40ADD000312C6 /* AsyncSafeMallocScenario.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AsyncSafeMallocScenario.m; sourceTree = ""; }; 0104085E258CA0A100933C60 /* DispatchCrashScenario.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DispatchCrashScenario.swift; sourceTree = ""; }; 0163BFA62583B3CF008DC28B /* DiscardClassesScenarios.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DiscardClassesScenarios.swift; sourceTree = ""; }; - 01847DD526453D4E00ADA4C7 /* InternalErrorReportingScenarios.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InternalErrorReportingScenarios.m; sourceTree = ""; }; + 01847DD526453D4E00ADA4C7 /* InvalidCrashReportScenario.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InvalidCrashReportScenario.m; sourceTree = ""; }; 01AF6A52258A112F00FFC803 /* BareboneTestScenarios.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BareboneTestScenarios.swift; sourceTree = ""; }; 01B6BB7425D5748800FC4DE6 /* LastRunInfoScenarios.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LastRunInfoScenarios.swift; sourceTree = ""; }; 01B6BBB525DA82B700FC4DE6 /* SendLaunchCrashesSynchronouslyScenario.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SendLaunchCrashesSynchronouslyScenario.swift; sourceTree = ""; }; @@ -599,7 +599,7 @@ 01AF6A52258A112F00FFC803 /* BareboneTestScenarios.swift */, 01DE903726CE99B800455213 /* CriticalThermalStateScenario.swift */, 0163BFA62583B3CF008DC28B /* DiscardClassesScenarios.swift */, - 01847DD526453D4E00ADA4C7 /* InternalErrorReportingScenarios.m */, + 01847DD526453D4E00ADA4C7 /* InvalidCrashReportScenario.m */, 01E5EAD025B713990066EA8A /* OOMScenario.h */, 01E5EAD125B713990066EA8A /* OOMScenario.m */, 8AB1081823301FE600672818 /* ReleaseStageScenarios.swift */, @@ -960,7 +960,7 @@ A1117E552535A59100014FDA /* OOMLoadScenario.swift in Sources */, 8A840FBA21AF5C450041DBFA /* SwiftAssertion.swift in Sources */, E753F24824927412001FB671 /* OnSendErrorCallbackCrashScenario.swift in Sources */, - 01847DD626453D4E00ADA4C7 /* InternalErrorReportingScenarios.m in Sources */, + 01847DD626453D4E00ADA4C7 /* InvalidCrashReportScenario.m in Sources */, 001E5502243B8FDA0009E31D /* AutoCaptureRunScenario.m in Sources */, 0104085F258CA0A100933C60 /* DispatchCrashScenario.swift in Sources */, E700EE55247D3204008CFFB6 /* OnSendOverwriteScenario.swift in Sources */, diff --git a/features/fixtures/macos/macOSTestApp.xcodeproj/project.pbxproj b/features/fixtures/macos/macOSTestApp.xcodeproj/project.pbxproj index ae9ecb097..af633dd7e 100644 --- a/features/fixtures/macos/macOSTestApp.xcodeproj/project.pbxproj +++ b/features/fixtures/macos/macOSTestApp.xcodeproj/project.pbxproj @@ -16,7 +16,7 @@ 0176C0B6254AE81B0066E0F3 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0176C0B4254AE81B0066E0F3 /* MainMenu.xib */; }; 017FBFB8254B09C300809042 /* MainWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 017FBFB6254B09C300809042 /* MainWindowController.m */; }; 017FBFB9254B09C300809042 /* MainWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 017FBFB7254B09C300809042 /* MainWindowController.xib */; }; - 01847DCD26443DF000ADA4C7 /* InternalErrorReportingScenarios.m in Sources */ = {isa = PBXBuildFile; fileRef = 01847DCC26443DF000ADA4C7 /* InternalErrorReportingScenarios.m */; }; + 01847DCD26443DF000ADA4C7 /* InvalidCrashReportScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = 01847DCC26443DF000ADA4C7 /* InvalidCrashReportScenario.m */; }; 01AF6A50258A00DE00FFC803 /* BareboneTestScenarios.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01AF6A4F258A00DE00FFC803 /* BareboneTestScenarios.swift */; }; 01AF6A84258BB38A00FFC803 /* DispatchCrashScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01AF6A83258BB38A00FFC803 /* DispatchCrashScenario.swift */; }; 01B6BB7225D56CBF00FC4DE6 /* LastRunInfoScenarios.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01B6BB7125D56CBF00FC4DE6 /* LastRunInfoScenarios.swift */; }; @@ -175,7 +175,7 @@ 017FBFB5254B09C300809042 /* MainWindowController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MainWindowController.h; sourceTree = ""; }; 017FBFB6254B09C300809042 /* MainWindowController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MainWindowController.m; sourceTree = ""; }; 017FBFB7254B09C300809042 /* MainWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindowController.xib; sourceTree = ""; }; - 01847DCC26443DF000ADA4C7 /* InternalErrorReportingScenarios.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = InternalErrorReportingScenarios.m; sourceTree = ""; }; + 01847DCC26443DF000ADA4C7 /* InvalidCrashReportScenario.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = InvalidCrashReportScenario.m; sourceTree = ""; }; 01AF6A4F258A00DE00FFC803 /* BareboneTestScenarios.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BareboneTestScenarios.swift; sourceTree = ""; }; 01AF6A83258BB38A00FFC803 /* DispatchCrashScenario.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DispatchCrashScenario.swift; sourceTree = ""; }; 01B6BB7125D56CBF00FC4DE6 /* LastRunInfoScenarios.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LastRunInfoScenarios.swift; sourceTree = ""; }; @@ -442,7 +442,7 @@ 01F47C4E254B1B2D00B184AD /* HandledErrorScenario.swift */, 01F47C28254B1B2C00B184AD /* HandledExceptionScenario.swift */, 01F47C55254B1B2E00B184AD /* HandledInternalNotifyScenario.swift */, - 01847DCC26443DF000ADA4C7 /* InternalErrorReportingScenarios.m */, + 01847DCC26443DF000ADA4C7 /* InvalidCrashReportScenario.m */, 01B6BB7125D56CBF00FC4DE6 /* LastRunInfoScenarios.swift */, 01F47C23254B1B2C00B184AD /* LoadConfigFromFileAutoScenario.swift */, 01F47C94254B1B2F00B184AD /* LoadConfigFromFileScenario.swift */, @@ -765,7 +765,7 @@ 01F47CE9254B1B3100B184AD /* SIGTRAPScenario.m in Sources */, 01F47CC8254B1B3100B184AD /* AutoSessionScenario.m in Sources */, 01E0DB0625E8E95700A740ED /* AppDurationScenario.swift in Sources */, - 01847DCD26443DF000ADA4C7 /* InternalErrorReportingScenarios.m in Sources */, + 01847DCD26443DF000ADA4C7 /* InvalidCrashReportScenario.m in Sources */, 01F47D2D254B1B3100B184AD /* OnErrorOverwriteScenario.swift in Sources */, 01F47CC7254B1B3100B184AD /* MetadataRedactionDefaultScenario.swift in Sources */, 01F47CEC254B1B3100B184AD /* SessionCallbackCrashScenario.swift in Sources */, diff --git a/features/fixtures/shared/scenarios/InternalErrorReportingScenarios.m b/features/fixtures/shared/scenarios/InvalidCrashReportScenario.m similarity index 50% rename from features/fixtures/shared/scenarios/InternalErrorReportingScenarios.m rename to features/fixtures/shared/scenarios/InvalidCrashReportScenario.m index 9899314d4..9008d94a6 100644 --- a/features/fixtures/shared/scenarios/InternalErrorReportingScenarios.m +++ b/features/fixtures/shared/scenarios/InvalidCrashReportScenario.m @@ -1,5 +1,5 @@ // -// InternalErrorReportingScenarios.m +// InvalidCrashReportScenario.m // macOSTestApp // // Created by Nick Dowell on 07/05/2021. @@ -8,20 +8,19 @@ #import "Scenario.h" -@interface InternalErrorReportingScenarios_KSCrashReport : Scenario - +@interface InvalidCrashReportScenario : Scenario @end -static void InternalErrorReportingScenarios_KSCrashReport_CrashHandler(const BSG_KSCrashReportWriter *writer) { +static void CrashHandler(const BSG_KSCrashReportWriter *writer) { writer->addJSONElement(writer, "something", "{1: \"Not valid JSON\"}"); sleep(1); } -@implementation InternalErrorReportingScenarios_KSCrashReport +@implementation InvalidCrashReportScenario - (void)startBugsnag { self.config.autoTrackSessions = NO; - self.config.onCrashHandler = InternalErrorReportingScenarios_KSCrashReport_CrashHandler; + self.config.onCrashHandler = CrashHandler; [super startBugsnag]; } diff --git a/features/internal_error_reporting.feature b/features/internal_error_reporting.feature index b1a7f175e..effeb6012 100644 --- a/features/internal_error_reporting.feature +++ b/features/internal_error_reporting.feature @@ -4,8 +4,8 @@ Feature: Internal error reporting Given I clear all persistent data Scenario: An internal error report is sent for invalid KSCrashReport files - When I run "InternalErrorReportingScenarios_KSCrashReport" and relaunch the app - And I configure Bugsnag for "InternalErrorReportingScenarios_KSCrashReport" + When I run "InvalidCrashReportScenario" and relaunch the app + And I configure Bugsnag for "InvalidCrashReportScenario" And I wait to receive an error And the error "Bugsnag-Api-Key" header is null And the error "Bugsnag-Internal-Error" header equals "bugsnag-cocoa" From 76604178658156d0430aeee423c476653bdd3554 Mon Sep 17 00:00:00 2001 From: Steve Kirkland-Walton Date: Wed, 8 Dec 2021 17:33:03 +0000 Subject: [PATCH 10/37] No need to wait for elements to be present [full ci] --- features/steps/app_steps.rb | 1 - features/steps/cocoa_steps.rb | 5 +---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/features/steps/app_steps.rb b/features/steps/app_steps.rb index 966a900e6..06b04c56c 100644 --- a/features/steps/app_steps.rb +++ b/features/steps/app_steps.rb @@ -61,7 +61,6 @@ When('I set the app to {string} mode') do |mode| steps %( - Given the element "scenario_metadata" is present When I send the keys "#{mode}" to the element "scenario_metadata" ) end diff --git a/features/steps/cocoa_steps.rb b/features/steps/cocoa_steps.rb index 8737c875f..8c7c14e66 100644 --- a/features/steps/cocoa_steps.rb +++ b/features/steps/cocoa_steps.rb @@ -1,6 +1,5 @@ When('I run {string}') do |event_type| steps %( - Given the element "scenario_name" is present When I send the keys "#{event_type}" to the element "scenario_name" And I click the element "run_scenario" ) @@ -35,8 +34,7 @@ When('I clear all persistent data') do steps %( - Given the element "clear_persistent_data" is present - And I click the element "clear_persistent_data" + When I click the element "clear_persistent_data" ) end @@ -52,7 +50,6 @@ def click_if_present(element) When('I configure Bugsnag for {string}') do |event_type| steps %( - Given the element "scenario_name" is present When I send the keys "#{event_type}" to the element "scenario_name" And I click the element "start_bugsnag" ) From 6b8f002f9af4b7680083a7421390ddd849e2a908 Mon Sep 17 00:00:00 2001 From: Steve Kirkland-Walton Date: Thu, 9 Dec 2021 10:52:41 +0000 Subject: [PATCH 11/37] Consistent naming - end with Scenario [quick ci] --- features/app_and_device_attributes.feature | 6 ++-- .../AppAndDeviceAttributesScenario.swift | 34 +++++++++---------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/features/app_and_device_attributes.feature b/features/app_and_device_attributes.feature index 6f340b37f..41f9e583e 100644 --- a/features/app_and_device_attributes.feature +++ b/features/app_and_device_attributes.feature @@ -69,7 +69,7 @@ Feature: App and Device attributes present And the event "app.isLaunching" is false Scenario: App and Device info is as expected when overridden via config - When I run "AppAndDeviceAttributesScenarioConfigOverride" + When I run "AppAndDeviceAttributesConfigOverrideScenario" And I wait to receive an error Then the error is valid for the error reporting API And the error "Bugsnag-API-Key" header equals "12312312312312312312312312312312" @@ -80,7 +80,7 @@ Feature: App and Device attributes present And the error payload field "events.0.app.releaseStage" equals "secondStage" Scenario: App and Device info is as expected when overridden via callback - When I run "AppAndDeviceAttributesScenarioCallbackOverride" + When I run "AppAndDeviceAttributesCallbackOverrideScenario" And I wait to receive an error Then the error is valid for the error reporting API And the error "Bugsnag-API-Key" header equals "12312312312312312312312312312312" @@ -93,7 +93,7 @@ Feature: App and Device attributes present And the error payload field "events.0.device.modelNumber" equals "0898" Scenario: Info.plist settings are used when calling startWithApiKey - When I run "AppAndDeviceAttributesScenarioStartWithApiKey" + When I run "AppAndDeviceAttributesStartWithApiKeyScenario" And I wait to receive an error Then the error is valid for the error reporting API And the error "Bugsnag-API-Key" header equals "12312312312312312312312312312312" diff --git a/features/fixtures/shared/scenarios/AppAndDeviceAttributesScenario.swift b/features/fixtures/shared/scenarios/AppAndDeviceAttributesScenario.swift index b914b5e8b..c26fe5990 100644 --- a/features/fixtures/shared/scenarios/AppAndDeviceAttributesScenario.swift +++ b/features/fixtures/shared/scenarios/AppAndDeviceAttributesScenario.swift @@ -30,32 +30,32 @@ class AppAndDeviceAttributesScenario: Scenario { /** * Override default values in config */ -class AppAndDeviceAttributesScenarioConfigOverride: Scenario { +class AppAndDeviceAttributesConfigOverrideScenario: Scenario { override func startBugsnag() { self.config.autoTrackSessions = false - + self.config.appType = "iLeet" self.config.bundleVersion = "12345" self.config.context = "myContext" self.config.releaseStage = "secondStage" - + super.startBugsnag() } override func run() { - let error = NSError(domain: "AppAndDeviceAttributesScenarioConfigOverride", code: 100, userInfo: nil) + let error = NSError(domain: "AppAndDeviceAttributesConfigOverrideScenario", code: 100, userInfo: nil) Bugsnag.notifyError(error) } } // MARK: - -class AppAndDeviceAttributesScenarioCallbackOverride: Scenario { +class AppAndDeviceAttributesCallbackOverrideScenario: Scenario { override func startBugsnag() { self.config.autoTrackSessions = false - + self.config.addOnSendError { (event) -> Bool in event.app.type = "newAppType" event.app.releaseStage = "thirdStage" @@ -63,15 +63,15 @@ class AppAndDeviceAttributesScenarioCallbackOverride: Scenario { event.app.bundleVersion = "42" event.device.manufacturer = "Nokia" event.device.modelNumber = "0898" - + return true } - + super.startBugsnag() } override func run() { - let error = NSError(domain: "AppAndDeviceAttributesScenarioCallbackOverride", code: 100, userInfo: nil) + let error = NSError(domain: "AppAndDeviceAttributesCallbackOverrideScenario", code: 100, userInfo: nil) Bugsnag.notifyError(error) } } @@ -81,7 +81,7 @@ class AppAndDeviceAttributesScenarioCallbackOverride: Scenario { /** * Call startWithApiKey */ -class AppAndDeviceAttributesScenarioStartWithApiKey: Scenario { +class AppAndDeviceAttributesStartWithApiKeyScenario: Scenario { override func startBugsnag() { Bugsnag.start(withApiKey: "12312312312312312312312312312312") @@ -90,7 +90,7 @@ class AppAndDeviceAttributesScenarioStartWithApiKey: Scenario { } override func run() { - let error = NSError(domain: "AppAndDeviceAttributesScenarioStartWithApiKey", code: 100, userInfo: nil) + let error = NSError(domain: "AppAndDeviceAttributesStartWithApiKeyScenario", code: 100, userInfo: nil) Bugsnag.notifyError(error) } } @@ -98,13 +98,13 @@ class AppAndDeviceAttributesScenarioStartWithApiKey: Scenario { // MARK: - class AppAndDeviceAttributesInfiniteLaunchDurationScenario: Scenario { - + override func startBugsnag() { config.autoTrackSessions = false config.launchDurationMillis = 0 super.startBugsnag() } - + override func run() { after(.seconds(6)) { Bugsnag.notify(NSException(name: .genericException, reason: "isLaunching should be true if `launchDurationMillis` is 0")) @@ -115,12 +115,12 @@ class AppAndDeviceAttributesInfiniteLaunchDurationScenario: Scenario { // MARK: - class AppAndDeviceAttributesUnhandledExceptionDuringLaunchScenario: Scenario { - + override func startBugsnag() { config.autoTrackSessions = false super.startBugsnag() } - + override func run() { NSException(name: .genericException, reason: "isLaunching should be true").raise() } @@ -129,12 +129,12 @@ class AppAndDeviceAttributesUnhandledExceptionDuringLaunchScenario: Scenario { // MARK: - class AppAndDeviceAttributesUnhandledExceptionAfterLaunchScenario: Scenario { - + override func startBugsnag() { config.autoTrackSessions = false super.startBugsnag() } - + override func run() { Bugsnag.markLaunchCompleted() NSException(name: .genericException, reason: "isLaunching should be false after `Bugsnag.markLaunchCompleted()`").raise() From f4bc6a893cbcd6d442a26078345879fd76e4ab0e Mon Sep 17 00:00:00 2001 From: Steve Kirkland-Walton Date: Thu, 9 Dec 2021 11:31:11 +0000 Subject: [PATCH 12/37] Consistent naming --- features/breadcrumbs.feature | 2 +- .../fixtures/ios/iOSTestApp.xcodeproj/project.pbxproj | 8 ++++---- .../macos/macOSTestApp.xcodeproj/project.pbxproj | 10 +++++----- ...fy.swift => ModifyBreadcrumbInNotifyScenario.swift} | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) rename features/fixtures/shared/scenarios/{ModifyBreadcrumbInNotify.swift => ModifyBreadcrumbInNotifyScenario.swift} (92%) diff --git a/features/breadcrumbs.feature b/features/breadcrumbs.feature index 35634898a..3d91ee7ce 100644 --- a/features/breadcrumbs.feature +++ b/features/breadcrumbs.feature @@ -36,7 +36,7 @@ Feature: Attaching a series of notable events leading up to errors Then the event has a "manual" breadcrumb named "Cache locked" Scenario: Modifying a breadcrumb name in callback - When I run "ModifyBreadcrumbInNotify" + When I run "ModifyBreadcrumbInNotifyScenario" And I wait to receive an error Then the event has a "manual" breadcrumb named "Cache locked" diff --git a/features/fixtures/ios/iOSTestApp.xcodeproj/project.pbxproj b/features/fixtures/ios/iOSTestApp.xcodeproj/project.pbxproj index 8a226f1db..5d94fbcf5 100644 --- a/features/fixtures/ios/iOSTestApp.xcodeproj/project.pbxproj +++ b/features/fixtures/ios/iOSTestApp.xcodeproj/project.pbxproj @@ -35,7 +35,7 @@ 8A32DB8222424E3000EDD92F /* NSExceptionShiftScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A32DB8122424E3000EDD92F /* NSExceptionShiftScenario.m */; }; 8A38C5D124094D7B00BC4463 /* DiscardedBreadcrumbTypeScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A38C5D024094D7B00BC4463 /* DiscardedBreadcrumbTypeScenario.swift */; }; 8A3B5F292407F66700CE4A3A /* ModifyBreadcrumbScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A3B5F282407F66700CE4A3A /* ModifyBreadcrumbScenario.swift */; }; - 8A3B5F2B240807EE00CE4A3A /* ModifyBreadcrumbInNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A3B5F2A240807EE00CE4A3A /* ModifyBreadcrumbInNotify.swift */; }; + 8A3B5F2B240807EE00CE4A3A /* ModifyBreadcrumbInNotifyScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A3B5F2A240807EE00CE4A3A /* ModifyBreadcrumbInNotifyScenario.swift */; }; 8A42FD35225DEE04007AE561 /* SessionOOMScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A42FD33225DEE04007AE561 /* SessionOOMScenario.m */; }; 8A530CCC22FDDBF000F0C108 /* ManyConcurrentNotifyScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A530CCB22FDDBF000F0C108 /* ManyConcurrentNotifyScenario.m */; }; 8A72A0382396574F00328051 /* CustomPluginNotifierDescriptionScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A72A0372396574F00328051 /* CustomPluginNotifierDescriptionScenario.m */; }; @@ -198,7 +198,7 @@ 8A32DB8122424E3000EDD92F /* NSExceptionShiftScenario.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSExceptionShiftScenario.m; sourceTree = ""; }; 8A38C5D024094D7B00BC4463 /* DiscardedBreadcrumbTypeScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiscardedBreadcrumbTypeScenario.swift; sourceTree = ""; }; 8A3B5F282407F66700CE4A3A /* ModifyBreadcrumbScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModifyBreadcrumbScenario.swift; sourceTree = ""; }; - 8A3B5F2A240807EE00CE4A3A /* ModifyBreadcrumbInNotify.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModifyBreadcrumbInNotify.swift; sourceTree = ""; }; + 8A3B5F2A240807EE00CE4A3A /* ModifyBreadcrumbInNotifyScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModifyBreadcrumbInNotifyScenario.swift; sourceTree = ""; }; 8A42FD33225DEE04007AE561 /* SessionOOMScenario.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SessionOOMScenario.m; sourceTree = ""; }; 8A42FD34225DEE04007AE561 /* SessionOOMScenario.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SessionOOMScenario.h; sourceTree = ""; }; 8A530CCA22FDDBF000F0C108 /* ManyConcurrentNotifyScenario.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ManyConcurrentNotifyScenario.h; sourceTree = ""; }; @@ -534,7 +534,7 @@ isa = PBXGroup; children = ( 8A3B5F282407F66700CE4A3A /* ModifyBreadcrumbScenario.swift */, - 8A3B5F2A240807EE00CE4A3A /* ModifyBreadcrumbInNotify.swift */, + 8A3B5F2A240807EE00CE4A3A /* ModifyBreadcrumbInNotifyScenario.swift */, 8A38C5D024094D7B00BC4463 /* DiscardedBreadcrumbTypeScenario.swift */, E7A324E5247E9D8D008B0052 /* BreadcrumbCallbackDiscardScenario.swift */, E7A324E7247E9D9A008B0052 /* BreadcrumbCallbackOrderScenario.swift */, @@ -946,7 +946,7 @@ E7FDB6C6264D5AD800BCF881 /* AutoNotifyFalseAbortScenario.swift in Sources */, E7A324EA247E9DA5008B0052 /* BreadcrumbCallbackOverrideScenario.swift in Sources */, F42955DB6D08642528917FAB /* CxxExceptionScenario.mm in Sources */, - 8A3B5F2B240807EE00CE4A3A /* ModifyBreadcrumbInNotify.swift in Sources */, + 8A3B5F2B240807EE00CE4A3A /* ModifyBreadcrumbInNotifyScenario.swift in Sources */, CBB787912578FC0C0071BDE4 /* MarkUnhandledHandledScenario.m in Sources */, 8A32DB8222424E3000EDD92F /* NSExceptionShiftScenario.m in Sources */, F42954B7318A02824C65C514 /* ObjCMsgSendScenario.m in Sources */, diff --git a/features/fixtures/macos/macOSTestApp.xcodeproj/project.pbxproj b/features/fixtures/macos/macOSTestApp.xcodeproj/project.pbxproj index af633dd7e..3e790d9f1 100644 --- a/features/fixtures/macos/macOSTestApp.xcodeproj/project.pbxproj +++ b/features/fixtures/macos/macOSTestApp.xcodeproj/project.pbxproj @@ -78,7 +78,7 @@ 01F47CF5254B1B3100B184AD /* StoppedSessionScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01F47C74254B1B2E00B184AD /* StoppedSessionScenario.swift */; }; 01F47CF6254B1B3100B184AD /* UserEmailScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01F47C75254B1B2E00B184AD /* UserEmailScenario.swift */; }; 01F47CF7254B1B3100B184AD /* OnSendErrorCallbackCrashScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01F47C76254B1B2E00B184AD /* OnSendErrorCallbackCrashScenario.swift */; }; - 01F47CF8254B1B3100B184AD /* ModifyBreadcrumbInNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01F47C78254B1B2F00B184AD /* ModifyBreadcrumbInNotify.swift */; }; + 01F47CF8254B1B3100B184AD /* ModifyBreadcrumbInNotifyScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01F47C78254B1B2F00B184AD /* ModifyBreadcrumbInNotifyScenario.swift */; }; 01F47CF9254B1B3100B184AD /* BreadcrumbCallbackDiscardScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01F47C79254B1B2F00B184AD /* BreadcrumbCallbackDiscardScenario.swift */; }; 01F47CFA254B1B3100B184AD /* BreadcrumbCallbackOrderScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01F47C7A254B1B2F00B184AD /* BreadcrumbCallbackOrderScenario.swift */; }; 01F47CFB254B1B3100B184AD /* ReleaseStageScenarios.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01F47C7D254B1B2F00B184AD /* ReleaseStageScenarios.swift */; }; @@ -137,8 +137,8 @@ 01F47D30254B1B3100B184AD /* AutoContextNSExceptionScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01F47CBF254B1B3000B184AD /* AutoContextNSExceptionScenario.swift */; }; 01F47D31254B1B3100B184AD /* OverwriteLinkRegisterScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = 01F47CC0254B1B3000B184AD /* OverwriteLinkRegisterScenario.m */; }; 01F47D32254B1B3100B184AD /* ResumeSessionOOMScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = 01F47CC1254B1B3000B184AD /* ResumeSessionOOMScenario.m */; }; - AAFEF9EC26EB536D00980A10 /* NetworkBreadcrumbsScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAFEF9EB26EB536D00980A10 /* NetworkBreadcrumbsScenario.swift */; }; 01FA9EC626D64FFF0059FF4A /* AppHangInTerminationScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01FA9EC526D64FFF0059FF4A /* AppHangInTerminationScenario.swift */; }; + AAFEF9EC26EB536D00980A10 /* NetworkBreadcrumbsScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAFEF9EB26EB536D00980A10 /* NetworkBreadcrumbsScenario.swift */; }; CBB7878E2578FB3F0071BDE4 /* MarkUnhandledHandledScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = CBB7878C2578FB3F0071BDE4 /* MarkUnhandledHandledScenario.m */; }; E780377D264D703500430C11 /* AutoNotifyReenabledScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7803779264D703500430C11 /* AutoNotifyReenabledScenario.swift */; }; E780377E264D703500430C11 /* AutoNotifyFalseHandledScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = E780377A264D703500430C11 /* AutoNotifyFalseHandledScenario.swift */; }; @@ -272,7 +272,7 @@ 01F47C75254B1B2E00B184AD /* UserEmailScenario.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserEmailScenario.swift; sourceTree = ""; }; 01F47C76254B1B2E00B184AD /* OnSendErrorCallbackCrashScenario.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OnSendErrorCallbackCrashScenario.swift; sourceTree = ""; }; 01F47C77254B1B2E00B184AD /* CustomPluginNotifierDescriptionScenario.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomPluginNotifierDescriptionScenario.h; sourceTree = ""; }; - 01F47C78254B1B2F00B184AD /* ModifyBreadcrumbInNotify.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ModifyBreadcrumbInNotify.swift; sourceTree = ""; }; + 01F47C78254B1B2F00B184AD /* ModifyBreadcrumbInNotifyScenario.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ModifyBreadcrumbInNotifyScenario.swift; sourceTree = ""; }; 01F47C79254B1B2F00B184AD /* BreadcrumbCallbackDiscardScenario.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BreadcrumbCallbackDiscardScenario.swift; sourceTree = ""; }; 01F47C7A254B1B2F00B184AD /* BreadcrumbCallbackOrderScenario.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BreadcrumbCallbackOrderScenario.swift; sourceTree = ""; }; 01F47C7B254B1B2F00B184AD /* NSExceptionShiftScenario.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSExceptionShiftScenario.h; sourceTree = ""; }; @@ -461,7 +461,7 @@ 01F47C29254B1B2C00B184AD /* MetadataRedactionDefaultScenario.swift */, 01F47C80254B1B2F00B184AD /* MetadataRedactionNestedScenario.swift */, 01F47C58254B1B2E00B184AD /* MetadataRedactionRegexScenario.swift */, - 01F47C78254B1B2F00B184AD /* ModifyBreadcrumbInNotify.swift */, + 01F47C78254B1B2F00B184AD /* ModifyBreadcrumbInNotifyScenario.swift */, 01F47C87254B1B2F00B184AD /* ModifyBreadcrumbScenario.swift */, 01F47CA0254B1B3000B184AD /* NewSessionScenario.swift */, 01F47C24254B1B2C00B184AD /* NonExistentMethodScenario.h */, @@ -843,7 +843,7 @@ 01F47CFA254B1B3100B184AD /* BreadcrumbCallbackOrderScenario.swift in Sources */, E780377D264D703500430C11 /* AutoNotifyReenabledScenario.swift in Sources */, 01F47CF3254B1B3100B184AD /* AutoCaptureRunScenario.m in Sources */, - 01F47CF8254B1B3100B184AD /* ModifyBreadcrumbInNotify.swift in Sources */, + 01F47CF8254B1B3100B184AD /* ModifyBreadcrumbInNotifyScenario.swift in Sources */, 01F47D14254B1B3100B184AD /* OOMEnabledErrorTypesScenario.swift in Sources */, 01F47CDA254B1B3100B184AD /* NonExistentMethodScenario.m in Sources */, 01F47CFE254B1B3100B184AD /* MetadataRedactionNestedScenario.swift in Sources */, diff --git a/features/fixtures/shared/scenarios/ModifyBreadcrumbInNotify.swift b/features/fixtures/shared/scenarios/ModifyBreadcrumbInNotifyScenario.swift similarity index 92% rename from features/fixtures/shared/scenarios/ModifyBreadcrumbInNotify.swift rename to features/fixtures/shared/scenarios/ModifyBreadcrumbInNotifyScenario.swift index 2d52b985e..5a3b4bb57 100644 --- a/features/fixtures/shared/scenarios/ModifyBreadcrumbInNotify.swift +++ b/features/fixtures/shared/scenarios/ModifyBreadcrumbInNotifyScenario.swift @@ -1,6 +1,6 @@ import Foundation -class ModifyBreadcrumbInNotify: Scenario { +class ModifyBreadcrumbInNotifyScenario: Scenario { override func startBugsnag() { self.config.autoTrackSessions = false; From 44e068b90780a97d0b5c39cc223f630a219b0e8e Mon Sep 17 00:00:00 2001 From: Steve Kirkland-Walton Date: Thu, 9 Dec 2021 11:37:42 +0000 Subject: [PATCH 13/37] Rename to end with Scenario --- features/crashprobe.feature | 8 ++++---- features/event_callbacks.feature | 2 +- .../ios/iOSTestApp.xcodeproj/project.pbxproj | 16 ++++++++-------- .../ios/iOSTestApp/Base.lproj/Main.storyboard | 12 ++++++------ .../macos/macOSTestApp.xcodeproj/project.pbxproj | 16 ++++++++-------- ...ertion.swift => SwiftAssertionScenario.swift} | 2 +- ...SwiftCrash.swift => SwiftCrashScenario.swift} | 2 +- 7 files changed, 29 insertions(+), 29 deletions(-) rename features/fixtures/shared/scenarios/{SwiftAssertion.swift => SwiftAssertionScenario.swift} (84%) rename features/fixtures/shared/scenarios/{SwiftCrash.swift => SwiftCrashScenario.swift} (97%) diff --git a/features/crashprobe.feature b/features/crashprobe.feature index bb67412fa..d94f6d812 100644 --- a/features/crashprobe.feature +++ b/features/crashprobe.feature @@ -117,8 +117,8 @@ Feature: Reporting crash events | Intel | -[ReleasedObjectScenario run] | Scenario: Crash within Swift code - When I run "SwiftCrash" and relaunch the app - And I configure Bugsnag for "SwiftCrash" + When I run "SwiftCrashScenario" and relaunch the app + And I configure Bugsnag for "SwiftCrashScenario" And I wait to receive an error Then the error is valid for the error reporting API And the exception "errorClass" equals "Fatal error" @@ -126,8 +126,8 @@ Feature: Reporting crash events And the event "metaData.error.crashInfo" matches "Fatal error: Unexpectedly found nil while unwrapping an Optional value" Scenario: Assertion failure in Swift code - When I run "SwiftAssertion" and relaunch the app - And I configure Bugsnag for "SwiftAssertion" + When I run "SwiftAssertionScenario" and relaunch the app + And I configure Bugsnag for "SwiftAssertionScenario" And I wait to receive an error Then the error is valid for the error reporting API And the exception "errorClass" equals "Fatal error" diff --git a/features/event_callbacks.feature b/features/event_callbacks.feature index 30a19df81..2eb693732 100644 --- a/features/event_callbacks.feature +++ b/features/event_callbacks.feature @@ -54,7 +54,7 @@ Feature: Callbacks can access and modify event information And the event "unhandled" is false Scenario: An OnSend callback can overwrite information for an unhandled error - When I run "SwiftAssertion" and relaunch the app + When I run "SwiftAssertionScenario" and relaunch the app And I configure Bugsnag for "OnSendOverwriteScenario" And I wait to receive an error Then the error is valid for the error reporting API diff --git a/features/fixtures/ios/iOSTestApp.xcodeproj/project.pbxproj b/features/fixtures/ios/iOSTestApp.xcodeproj/project.pbxproj index 5d94fbcf5..fe1f3d27b 100644 --- a/features/fixtures/ios/iOSTestApp.xcodeproj/project.pbxproj +++ b/features/fixtures/ios/iOSTestApp.xcodeproj/project.pbxproj @@ -39,7 +39,7 @@ 8A42FD35225DEE04007AE561 /* SessionOOMScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A42FD33225DEE04007AE561 /* SessionOOMScenario.m */; }; 8A530CCC22FDDBF000F0C108 /* ManyConcurrentNotifyScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A530CCB22FDDBF000F0C108 /* ManyConcurrentNotifyScenario.m */; }; 8A72A0382396574F00328051 /* CustomPluginNotifierDescriptionScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A72A0372396574F00328051 /* CustomPluginNotifierDescriptionScenario.m */; }; - 8A840FBA21AF5C450041DBFA /* SwiftAssertion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A840FB921AF5C450041DBFA /* SwiftAssertion.swift */; }; + 8A840FBA21AF5C450041DBFA /* SwiftAssertionScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A840FB921AF5C450041DBFA /* SwiftAssertionScenario.swift */; }; 8A98400320FD11BF0023ECD1 /* AutoSessionCustomVersionScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A98400220FD11BF0023ECD1 /* AutoSessionCustomVersionScenario.m */; }; 8AB1081923301FE600672818 /* ReleaseStageScenarios.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AB1081823301FE600672818 /* ReleaseStageScenarios.swift */; }; 8AB65FCC22DC77CB001200AB /* LoadConfigFromFileScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AB65FCB22DC77CB001200AB /* LoadConfigFromFileScenario.swift */; }; @@ -136,7 +136,7 @@ F42955E0916B8851F074D9B3 /* UserEmailScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4295F595986A279FA3BDEA7 /* UserEmailScenario.swift */; }; F429565A951303E2C3136D0D /* UserIdScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42957C58F98EECD3ADD84B2 /* UserIdScenario.swift */; }; F4295836C8AF75547C675E8D /* ReleasedObjectScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = F4295E71D7B2DFE77057F3DA /* ReleasedObjectScenario.m */; }; - F42958881D3F34A76CADE4EC /* SwiftCrash.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4295EEDC00E5ED3C166DBF0 /* SwiftCrash.swift */; }; + F42958881D3F34A76CADE4EC /* SwiftCrashScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4295EEDC00E5ED3C166DBF0 /* SwiftCrashScenario.swift */; }; F42958BE5DDACDBF653CA926 /* ManualSessionScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = F429570EE7A751B53D011481 /* ManualSessionScenario.m */; }; F42959124DB949EEF1420957 /* ReadOnlyPageScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = F4295871D1BCF211398CAEBA /* ReadOnlyPageScenario.m */; }; F4295968571A4118D6A4606A /* UserEnabledScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42954E2B3FF0C5C0474DA74 /* UserEnabledScenario.swift */; }; @@ -205,7 +205,7 @@ 8A530CCB22FDDBF000F0C108 /* ManyConcurrentNotifyScenario.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ManyConcurrentNotifyScenario.m; sourceTree = ""; }; 8A72A0362396574F00328051 /* CustomPluginNotifierDescriptionScenario.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CustomPluginNotifierDescriptionScenario.h; sourceTree = ""; }; 8A72A0372396574F00328051 /* CustomPluginNotifierDescriptionScenario.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CustomPluginNotifierDescriptionScenario.m; sourceTree = ""; }; - 8A840FB921AF5C450041DBFA /* SwiftAssertion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftAssertion.swift; sourceTree = ""; }; + 8A840FB921AF5C450041DBFA /* SwiftAssertionScenario.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftAssertionScenario.swift; sourceTree = ""; }; 8A98400120FD11BF0023ECD1 /* AutoSessionCustomVersionScenario.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AutoSessionCustomVersionScenario.h; sourceTree = ""; }; 8A98400220FD11BF0023ECD1 /* AutoSessionCustomVersionScenario.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AutoSessionCustomVersionScenario.m; sourceTree = ""; }; 8AB1081823301FE600672818 /* ReleaseStageScenarios.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReleaseStageScenarios.swift; sourceTree = ""; }; @@ -357,7 +357,7 @@ F4295E71D7B2DFE77057F3DA /* ReleasedObjectScenario.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ReleasedObjectScenario.m; sourceTree = ""; }; F4295E86DC0BE9DC731B0D1C /* NullPointerScenario.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NullPointerScenario.m; sourceTree = ""; }; F4295EE3B0BD05E5FE513B20 /* AutoSessionScenario.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AutoSessionScenario.m; sourceTree = ""; }; - F4295EEDC00E5ED3C166DBF0 /* SwiftCrash.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftCrash.swift; sourceTree = ""; }; + F4295EEDC00E5ED3C166DBF0 /* SwiftCrashScenario.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftCrashScenario.swift; sourceTree = ""; }; F4295F13EBCAC9CB0ABC4008 /* NonExistentMethodScenario.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NonExistentMethodScenario.m; sourceTree = ""; }; F4295F22AA1863213F4A5F51 /* AutoSessionScenario.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AutoSessionScenario.h; sourceTree = ""; }; F4295F595986A279FA3BDEA7 /* UserEmailScenario.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserEmailScenario.swift; sourceTree = ""; }; @@ -674,7 +674,7 @@ F4295E71D7B2DFE77057F3DA /* ReleasedObjectScenario.m */, F42952BCC8A05EFAAE503E3D /* StackOverflowScenario.h */, F4295493796EA93321E5CDDB /* StackOverflowScenario.m */, - F4295EEDC00E5ED3C166DBF0 /* SwiftCrash.swift */, + F4295EEDC00E5ED3C166DBF0 /* SwiftCrashScenario.swift */, F4295A4EF5288C60F978676F /* UndefinedInstructionScenario.h */, F429538D19421F28D8EB0446 /* UndefinedInstructionScenario.m */, ); @@ -745,7 +745,7 @@ isa = PBXGroup; children = ( 8A32DB8022424E3000EDD92F /* NSExceptionShiftScenario.h */, - 8A840FB921AF5C450041DBFA /* SwiftAssertion.swift */, + 8A840FB921AF5C450041DBFA /* SwiftAssertionScenario.swift */, F4295A364B3851D3811BC648 /* HandledErrorScenario.swift */, F4295FA8EBBA645EECF7B483 /* HandledErrorOverrideScenario.swift */, F429526319377A8848136413 /* HandledExceptionScenario.swift */, @@ -942,7 +942,7 @@ F4295836C8AF75547C675E8D /* ReleasedObjectScenario.m in Sources */, 01E5EAD225B713990066EA8A /* OOMScenario.m in Sources */, 8A530CCC22FDDBF000F0C108 /* ManyConcurrentNotifyScenario.m in Sources */, - F42958881D3F34A76CADE4EC /* SwiftCrash.swift in Sources */, + F42958881D3F34A76CADE4EC /* SwiftCrashScenario.swift in Sources */, E7FDB6C6264D5AD800BCF881 /* AutoNotifyFalseAbortScenario.swift in Sources */, E7A324EA247E9DA5008B0052 /* BreadcrumbCallbackOverrideScenario.swift in Sources */, F42955DB6D08642528917FAB /* CxxExceptionScenario.mm in Sources */, @@ -958,7 +958,7 @@ E700EE6C247D793A008CFFB6 /* SIGPIPEScenario.m in Sources */, E700EE50247D15DE008CFFB6 /* UserFromConfigSessionScenario.swift in Sources */, A1117E552535A59100014FDA /* OOMLoadScenario.swift in Sources */, - 8A840FBA21AF5C450041DBFA /* SwiftAssertion.swift in Sources */, + 8A840FBA21AF5C450041DBFA /* SwiftAssertionScenario.swift in Sources */, E753F24824927412001FB671 /* OnSendErrorCallbackCrashScenario.swift in Sources */, 01847DD626453D4E00ADA4C7 /* InvalidCrashReportScenario.m in Sources */, 001E5502243B8FDA0009E31D /* AutoCaptureRunScenario.m in Sources */, diff --git a/features/fixtures/ios/iOSTestApp/Base.lproj/Main.storyboard b/features/fixtures/ios/iOSTestApp/Base.lproj/Main.storyboard index 65bc73c97..646db4529 100644 --- a/features/fixtures/ios/iOSTestApp/Base.lproj/Main.storyboard +++ b/features/fixtures/ios/iOSTestApp/Base.lproj/Main.storyboard @@ -1,9 +1,9 @@ - + - + @@ -35,7 +35,7 @@ - - -