Skip to content

Commit eb5895f

Browse files
committed
Trying to solve issue #47 in a tricky case when OHHTTPStubs is used both in the App target and the UnitTest targets, in the case UnitTests use the App as their host app (which is the default for new Xcode5 projects)
In such case, two OHHTTPStubs classes where loaded (one in the App Bundle, one in the Test bundle), leading to double swizzling, but only the first OHHTTPStubsProtocol (generally the one loaded by the app bundle) were used, leading to stubs from UnitTest bundle not being called. To fix this, I now: * The swizzling of `NSURLSessionConfiguration` is done using an `NSURLSessionConfiguration` category and its `+load` method to be done only once (much more logical by the way) to avoid double-swizzling (and a callstack overflow) * The insertion of the `OHHTTPStubsProtocol` class in the `protocolClasses` property is done via `[OHHTTPStubs setEnabled:forSessionConfiguration:]` (instead of relying to `objc_getClass()`), to be sure that it uses the `OHHTTPStubsProtocol` class loaded by the current `NSBundle` (and not the one returned by objc_getClass() which is generally the one from the `mainBundle` / App bundle)
1 parent 7aefa6c commit eb5895f

File tree

3 files changed

+10
-23
lines changed

3 files changed

+10
-23
lines changed

OHHTTPStubs.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
Pod::Spec.new do |s|
22

33
s.name = "OHHTTPStubs"
4-
s.version = "3.0.3"
4+
s.version = "3.0.4"
55

66
s.summary = "Stubbing framework for network requests."
77
s.description = <<-DESC

OHHTTPStubs/Sources/OHHTTPStubs+NSURLSessionConfiguration.m

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -40,41 +40,31 @@ static SessionConfigConstructor OHHTTPStubsSwizzle(SEL selector, SessionConfigCo
4040
return origImpl;
4141
}
4242

43-
static void OHHTTPStubsAddProtocolClassToNSURLSessionConfiguration(NSURLSessionConfiguration* config)
44-
{
45-
NSMutableArray* protocolClasses = [NSMutableArray arrayWithArray:config.protocolClasses];
46-
// objc_getClass loads the class in the ObjC Runtime if not loaded at that time, so it's secure.
47-
Class protocolClass = objc_getClass("OHHTTPStubsProtocol");
48-
if (![protocolClasses containsObject:protocolClass])
49-
[protocolClasses addObject:protocolClass];
50-
config.protocolClasses = protocolClasses;
51-
}
52-
5343
static NSURLSessionConfiguration* OHHTTPStubs_defaultSessionConfiguration(id self, SEL _cmd)
5444
{
5545
NSURLSessionConfiguration* config = orig_defaultSessionConfiguration(self,_cmd); // call original method
56-
OHHTTPStubsAddProtocolClassToNSURLSessionConfiguration(config);
46+
[OHHTTPStubs setEnabled:YES forSessionConfiguration:config]; //OHHTTPStubsAddProtocolClassToNSURLSessionConfiguration(config);
5747
return config;
5848
}
5949

6050
static NSURLSessionConfiguration* OHHTTPStubs_ephemeralSessionConfiguration(id self, SEL _cmd)
6151
{
6252
NSURLSessionConfiguration* config = orig_ephemeralSessionConfiguration(self,_cmd); // call original method
63-
OHHTTPStubsAddProtocolClassToNSURLSessionConfiguration(config);
53+
[OHHTTPStubs setEnabled:YES forSessionConfiguration:config]; //OHHTTPStubsAddProtocolClassToNSURLSessionConfiguration(config);
6454
return config;
6555
}
6656

67-
void _OHHTTPStubs_InstallNSURLSessionConfigurationMagicSupport()
57+
@interface NSURLSessionConfiguration(OHHTTPStubsSupport) @end
58+
@implementation NSURLSessionConfiguration(OHHTTPStubsSupport)
59+
+(void)load
6860
{
6961
orig_defaultSessionConfiguration = OHHTTPStubsSwizzle(@selector(defaultSessionConfiguration),
7062
OHHTTPStubs_defaultSessionConfiguration);
7163
orig_ephemeralSessionConfiguration = OHHTTPStubsSwizzle(@selector(ephemeralSessionConfiguration),
7264
OHHTTPStubs_ephemeralSessionConfiguration);
7365
}
66+
@end
7467

75-
#else
76-
void _OHHTTPStubs_InstallNSURLSessionConfigurationMagicSupport()
77-
{
78-
/* NO-OP for Xcode4 and pre-iOS7/pre-OSX9 SDKs that does not support NSURLSessionConfiguration */
79-
}
8068
#endif
69+
70+

OHHTTPStubs/Sources/OHHTTPStubs.m

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,14 +101,11 @@ + (instancetype)sharedInstance
101101
////////////////////////////////////////////////////////////////////////////////
102102
#pragma mark - Setup & Teardown
103103

104-
extern void _OHHTTPStubs_InstallNSURLSessionConfigurationMagicSupport();
105-
106104
+ (void)initialize
107105
{
108106
if (self == [OHHTTPStubs class])
109107
{
110108
[self setEnabled:YES];
111-
_OHHTTPStubs_InstallNSURLSessionConfigurationMagicSupport();
112109
}
113110
}
114111
- (id)init
@@ -182,7 +179,7 @@ + (void)setEnabled:(BOOL)enable forSessionConfiguration:(NSURLSessionConfigurati
182179
{
183180
[urlProtocolClasses addObject:protoCls];
184181
}
185-
else if (!enable && [urlProtocolClasses containsObject:protoCls])
182+
else if (!enable && [urlProtocolClasses containsObject:protoCls])
186183
{
187184
[urlProtocolClasses removeObject:protoCls];
188185
}

0 commit comments

Comments
 (0)