johnno1962 / injectionforxcode

Runtime Code Injection for Objective-C & Swift
MIT License
6.55k stars 565 forks source link

Crash when using Quick for testing #241

Open eduardbosch opened 6 years ago

eduardbosch commented 6 years ago

I first reported this problem to https://github.com/polac24/InjectionTDD/issues/11 but I copy it here as @polac24 told me it is the right place ๐Ÿ‘Œ๐Ÿป


Hi,

Thanks for this lib. It looks promising, but when used with Quick tests, it crashes the second time the test is executed. Probably to the Quick test generation.

This is the log that explains that there was a problem creating the tests:

2018-04-16 09:54:33.276633+0200 xctest[5271:157143] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'An exception occurred when building Quick's example groups.
Some possible reasons this might happen include:

- An 'expect(...).to' expectation was evaluated outside of an 'it', 'context', or 'describe' block
- 'sharedExamples' was called twice with the same name
- 'itBehavesLike' was called with a name that is not registered as a shared example

Here's the original exception: 'NSInternalInconsistencyException', reason: ''describe' cannot be used inside 'it', 'describe' may only be used inside 'context' or 'describe'. ', userInfo: '(null)''
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010a1b01e6 __exceptionPreprocess + 294
    1   libobjc.A.dylib                     0x0000000109845031 objc_exception_throw + 48
    2   CoreFoundation                      0x000000010a225975 +[NSException raise:format:] + 197
    3   Quick                               0x000000011d31950d __23+[QuickSpec initialize]_block_invoke + 292
    4   Quick                               0x000000011d321384 _T05Quick5WorldC30performWithCurrentExampleGroupyAA0fG0C_yyc7closuretFTo + 84
    5   Quick                               0x000000011d3193c9 +[QuickSpec initialize] + 162
    6   libobjc.A.dylib                     0x0000000109845b04 CALLING_SOME_+initialize_METHOD + 19
    7   libobjc.A.dylib                     0x0000000109845e9e _class_initialize + 276
    8   libobjc.A.dylib                     0x000000010984c824 lookUpImpOrForward + 226
    9   libobjc.A.dylib                     0x000000010985c414 _objc_msgSend_uncached + 68
    10  InjectionLoader                     0x0000000120d110ac __41+[BundleInjection autoLoadedNotify:hook:]_block_invoke + 332
    11  libdispatch.dylib                   0x0000000110c5273b _dispatch_call_block_and_release + 12
    12  libdispatch.dylib                   0x0000000110c53779 _dispatch_client_callout + 8
    13  libdispatch.dylib                   0x0000000110c5d778 _dispatch_main_queue_callback_4CF + 1279
    14  CoreFoundation                      0x000000010a172c99 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
    15  CoreFoundation                      0x000000010a136ea6 __CFRunLoopRun + 2342
    16  CoreFoundation                      0x000000010a13630b CFRunLoopRunSpecific + 635
    17  Foundation                          0x00000001090c9b4a -[NSRunLoop(NSRunLoop) runMode:beforeDate:] + 274
    18  Foundation                          0x00000001090c9a25 -[NSRunLoop(NSRunLoop) run] + 76
    19  InjectionTDD                        0x000000011d2f938a +[TDDTestKeeper initialize] + 346
    20  libobjc.A.dylib                     0x0000000109845b04 CALLING_SOME_+initialize_METHOD + 19
    21  libobjc.A.dylib                     0x0000000109845e9e _class_initialize + 276
    22  libobjc.A.dylib                     0x000000010984c824 lookUpImpOrForward + 226
    23  libobjc.A.dylib                     0x000000010985c414 _objc_msgSend_uncached + 68
    24  CoreFoundation                      0x000000010a0ff9b9 -[__NSSetM addObject:] + 441
    25  XCTest                              0x0000000109750e5a +[XCTestCase(RuntimeUtilities) allSubclasses] + 248
    26  XCTest                              0x00000001096e6996 +[XCTestSuite _suiteForBundleCache] + 213
    27  XCTest                              0x00000001096e8d35 -[XCTestSuite _initWithTestConfiguration:] + 437
    28  XCTest                              0x00000001096e9b19 +[XCTestSuite testSuiteForTestConfiguration:] + 69
    29  XCTest                              0x000000010975cd32 -[XCTTestRunSession runTestsAndReturnError:] + 210
    30  XCTest                              0x00000001096cecb1 -[XCTestDriver runTestsAndReturnError:] + 447
    31  XCTest                              0x0000000109751bd1 _XCTestMain + 960
    32  xctest                              0x0000000108fc62a4 main + 571
    33  libdyld.dylib                       0x0000000110cc8955 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

Process finished with exit code 0

Would be great to use this with Quick ๐ŸŽ‰

johnno1962 commented 6 years ago

Iโ€™m afraid the easiest thing to say is this is unsupported. Itโ€™s more of a Quick limitation where Quick makes the assumption a given test will never be run more than once in a process which is exactly what youโ€™re seeing. That said if you could prepare a small example project showing the problem I can see if there is something injection can do.

eduardbosch commented 6 years ago

Here there is a simple Quick test that crashes when a test is injected: https://github.com/eduardbosch/QuickInjectionCrash

Thanks @johnno1962 ๐Ÿ‘๐Ÿป