From b0fac31912fcc1c79cc44ad8dd035145ce9370ea Mon Sep 17 00:00:00 2001 From: Jordan Zucker Date: Tue, 8 Mar 2016 11:33:07 -0800 Subject: [PATCH 1/4] Added isEnabled getters for OHHTTPStubs. Reflects current implementation --- OHHTTPStubs/Sources/OHHTTPStubs.h | 16 +++++++++++++++ OHHTTPStubs/Sources/OHHTTPStubs.m | 34 ++++++++++++++++++++++++++++++- 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/OHHTTPStubs/Sources/OHHTTPStubs.h b/OHHTTPStubs/Sources/OHHTTPStubs.h index c4391c39..42b1ed3c 100644 --- a/OHHTTPStubs/Sources/OHHTTPStubs.h +++ b/OHHTTPStubs/Sources/OHHTTPStubs.h @@ -128,6 +128,13 @@ typedef OHHTTPStubsResponse* __nonnull (^OHHTTPStubsResponseBlock)( NSURLRequest */ +(void)setEnabled:(BOOL)enabled; +/** + * Whether or not stubs are enabled for the shared session or for `NSURLConnection` + * + * @return If `YES` the stubs are enabled. If `NO` then the stubs are disabled + */ ++(BOOL)isEnabled; + #if defined(__IPHONE_7_0) || defined(__MAC_10_9) /** * Enable or disable the stubs on a given `NSURLSessionConfiguration`. @@ -149,6 +156,15 @@ typedef OHHTTPStubsResponse* __nonnull (^OHHTTPStubsResponseBlock)( NSURLRequest * created sessions. */ + (void)setEnabled:(BOOL)enabled forSessionConfiguration:(NSURLSessionConfiguration *)sessionConfig; + +/** + * Whether stubs are enabled or disabled on a given `NSURLSessionConfiguration` + * + * @param sessionConfig The NSURLSessionConfiguration on which to enable/disable the stubs + * + * @return If `YES` the stubs are enabled for sessionConfig. If `NO` then the stubs are disabled + */ ++ (BOOL)isEnabledForSessionConfiguration:(NSURLSessionConfiguration *)sessionConfig; #endif #pragma mark - Debug Methods diff --git a/OHHTTPStubs/Sources/OHHTTPStubs.m b/OHHTTPStubs/Sources/OHHTTPStubs.m index 3eb98cfe..d3c28890 100644 --- a/OHHTTPStubs/Sources/OHHTTPStubs.m +++ b/OHHTTPStubs/Sources/OHHTTPStubs.m @@ -149,9 +149,11 @@ +(void)removeAllStubs #pragma mark > Disabling & Re-Enabling stubs +static BOOL currentEnabledState = NO; + +(void)setEnabled:(BOOL)enable { - static BOOL currentEnabledState = NO; + currentEnabledState = NO; if (enable && !currentEnabledState) { [NSURLProtocol registerClass:OHHTTPStubsProtocol.class]; @@ -163,6 +165,11 @@ +(void)setEnabled:(BOOL)enable currentEnabledState = enable; } ++ (BOOL)isEnabled +{ + return currentEnabledState; +} + #if defined(__IPHONE_7_0) || defined(__MAC_10_9) + (void)setEnabled:(BOOL)enable forSessionConfiguration:(NSURLSessionConfiguration*)sessionConfig { @@ -189,6 +196,31 @@ + (void)setEnabled:(BOOL)enable forSessionConfiguration:(NSURLSessionConfigurati @"this method if the user is running iOS7+/OSX9+.", NSStringFromSelector(_cmd)); } } + ++ (BOOL)isEnabledForSessionConfiguration:(NSURLSessionConfiguration *)sessionConfig +{ + // Runtime check to make sure the API is available on this version + if ( [sessionConfig respondsToSelector:@selector(protocolClasses)] + && [sessionConfig respondsToSelector:@selector(setProtocolClasses:)]) + { + NSMutableArray * urlProtocolClasses = [NSMutableArray arrayWithArray:sessionConfig.protocolClasses]; + Class protoCls = OHHTTPStubsProtocol.class; + if ([urlProtocolClasses containsObject:protoCls]) + { + return YES; + } else + { + return NO; + } + } + else + { + NSLog(@"[OHHTTPStubs] %@ is only available when running on iOS7+/OSX9+. " + @"Use conditions like 'if ([NSURLSessionConfiguration class])' to only call " + @"this method if the user is running iOS7+/OSX9+.", NSStringFromSelector(_cmd)); + return NO; + } +} #endif #pragma mark > Debug Methods From 6b760a5258ba6dc6a07a497f41d67ada884bc7b7 Mon Sep 17 00:00:00 2001 From: Jordan Zucker Date: Wed, 9 Mar 2016 10:06:10 -0800 Subject: [PATCH 2/4] Refactored isEnabled for thread safety --- OHHTTPStubs/Sources/OHHTTPStubs.m | 44 +++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/OHHTTPStubs/Sources/OHHTTPStubs.m b/OHHTTPStubs/Sources/OHHTTPStubs.m index d3c28890..a8dbe4cd 100644 --- a/OHHTTPStubs/Sources/OHHTTPStubs.m +++ b/OHHTTPStubs/Sources/OHHTTPStubs.m @@ -44,6 +44,7 @@ @interface OHHTTPStubsProtocol : NSURLProtocol @end @interface OHHTTPStubs() + (instancetype)sharedInstance; @property(atomic, copy) NSMutableArray* stubDescriptors; +@property(atomic, copy) NSNumber* enabledStateNumber; @property(atomic, copy, nullable) void (^onStubActivationBlock)(NSURLRequest*, id); @end @@ -105,7 +106,7 @@ + (void)initialize { if (self == [OHHTTPStubs class]) { - [self setEnabled:YES]; + [self _setEnable:YES]; } } - (instancetype)init @@ -114,13 +115,14 @@ - (instancetype)init if (self) { _stubDescriptors = [NSMutableArray array]; + _enabledStateNumber = @YES; // assume initialize has already been run } return self; } - (void)dealloc { - [self.class setEnabled:NO]; + [self.class _setEnable:NO]; } //////////////////////////////////////////////////////////////////////////////// @@ -149,25 +151,26 @@ +(void)removeAllStubs #pragma mark > Disabling & Re-Enabling stubs -static BOOL currentEnabledState = NO; - -+(void)setEnabled:(BOOL)enable ++(void)_setEnable:(BOOL)enable { - currentEnabledState = NO; - if (enable && !currentEnabledState) + if (enable) { [NSURLProtocol registerClass:OHHTTPStubsProtocol.class]; } - else if (!enable && currentEnabledState) + else { [NSURLProtocol unregisterClass:OHHTTPStubsProtocol.class]; } - currentEnabledState = enable; } -+ (BOOL)isEnabled ++(void)setEnabled:(BOOL)enabled +{ + [OHHTTPStubs.sharedInstance setEnabled:enabled]; +} + ++(BOOL)isEnabled { - return currentEnabledState; + return OHHTTPStubs.sharedInstance.isEnabled; } #if defined(__IPHONE_7_0) || defined(__MAC_10_9) @@ -240,6 +243,25 @@ +(void)onStubActivation:( nullable void(^)(NSURLRequest* request, id Date: Thu, 10 Mar 2016 14:20:11 -0800 Subject: [PATCH 3/4] Use BOOL for enableState instead of NSNumber --- OHHTTPStubs/Sources/OHHTTPStubs.m | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/OHHTTPStubs/Sources/OHHTTPStubs.m b/OHHTTPStubs/Sources/OHHTTPStubs.m index a8dbe4cd..c9e1d091 100644 --- a/OHHTTPStubs/Sources/OHHTTPStubs.m +++ b/OHHTTPStubs/Sources/OHHTTPStubs.m @@ -44,7 +44,7 @@ @interface OHHTTPStubsProtocol : NSURLProtocol @end @interface OHHTTPStubs() + (instancetype)sharedInstance; @property(atomic, copy) NSMutableArray* stubDescriptors; -@property(atomic, copy) NSNumber* enabledStateNumber; +@property(atomic, assign) BOOL enabledState; @property(atomic, copy, nullable) void (^onStubActivationBlock)(NSURLRequest*, id); @end @@ -115,7 +115,7 @@ - (instancetype)init if (self) { _stubDescriptors = [NSMutableArray array]; - _enabledStateNumber = @YES; // assume initialize has already been run + _enabledState = YES; // assume initialize has already been run } return self; } @@ -248,7 +248,7 @@ -(BOOL)isEnabled BOOL enabled = NO; @synchronized(self) { - enabled = _enabledStateNumber.boolValue; + enabled = _enabledState; } return enabled; } @@ -257,8 +257,8 @@ -(void)setEnabled:(BOOL)enable { @synchronized(self) { - _enabledStateNumber = @(enable); - [self.class _setEnable:enable]; + _enabledState = enable; + [self.class _setEnable:_enabledState]; } } From e3ad6dba330eb016845ec7e2ad3604612bd01e60 Mon Sep 17 00:00:00 2001 From: Jordan Zucker Date: Sun, 13 Mar 2016 13:31:53 -0700 Subject: [PATCH 4/4] Simplify check for isEnabled in NSURLSessionConfiguration --- OHHTTPStubs/Sources/OHHTTPStubs.m | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/OHHTTPStubs/Sources/OHHTTPStubs.m b/OHHTTPStubs/Sources/OHHTTPStubs.m index c9e1d091..03c02424 100644 --- a/OHHTTPStubs/Sources/OHHTTPStubs.m +++ b/OHHTTPStubs/Sources/OHHTTPStubs.m @@ -208,13 +208,7 @@ + (BOOL)isEnabledForSessionConfiguration:(NSURLSessionConfiguration *)sessionCon { NSMutableArray * urlProtocolClasses = [NSMutableArray arrayWithArray:sessionConfig.protocolClasses]; Class protoCls = OHHTTPStubsProtocol.class; - if ([urlProtocolClasses containsObject:protoCls]) - { - return YES; - } else - { - return NO; - } + return [urlProtocolClasses containsObject:protoCls]; } else {