TwitterImagePipelineTests/TIPTestImageFetchDownloadInternalWithStubbing.m (64 lines of code) (raw):

// // TIPTestImageFetchDownloadInternalWithStubbing.m // TwitterImagePipeline // // Created on 8/28/16. // Copyright © 2020 Twitter. All rights reserved. // #import "TIPTestImageFetchDownloadInternalWithStubbing.h" #import "TIPTestURLProtocol.h" static NSURLSession *sTIPTestImageFetchDownloadInternalURLSessionWithPseudo = nil; @interface TIPTestURLProtocol (TIPConvenience) + (void)tip_registerResponseData:(nullable NSData *)responseData responseMIMEType:(nullable NSString *)MIMEType shouldSupportResuming:(BOOL)shouldSupportResume suggestedBitrate:(uint64_t)suggestedBitrate withEndpoint:(nonnull NSURL *)endpointURL; @end @implementation TIPTestImageFetchDownloadProviderInternalWithStubbing - (id<TIPImageFetchDownload>)imageFetchDownloadWithContext:(id<TIPImageFetchDownloadContext>)context { return [[TIPTestImageFetchDownloadInternalWithStubbing alloc] initWithContext:context stub:self.downloadStubbingEnabled]; } - (void)addDownloadStubForRequestURL:(NSURL *)requestURL responseData:(NSData *)responseData responseMIMEType:(NSString *)MIMEType shouldSupportResuming:(BOOL)shouldSupportResume suggestedBitrate:(uint64_t)suggestedBitrate { [TIPTestURLProtocol tip_registerResponseData:responseData responseMIMEType:MIMEType shouldSupportResuming:shouldSupportResume suggestedBitrate:suggestedBitrate withEndpoint:requestURL]; } - (void)removeDownloadStubForRequestURL:(NSURL *)requestURL { [TIPTestURLProtocol unregisterEndpoint:requestURL]; } - (void)removeAllDownloadStubs { [TIPTestURLProtocol unregisterAllEndpoints]; } @end @implementation TIPTestImageFetchDownloadInternalWithStubbing { BOOL _stub; } - (instancetype)initWithContext:(id<TIPImageFetchDownloadContext>)context stub:(BOOL)stub { if (self = [super initWithContext:context]) { _stub = stub; } return self; } - (NSURLSession *)URLSession { if (!_stub) { return [super URLSession]; } static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSURLSession *session = [super URLSession]; NSURLSessionConfiguration *config = [session.configuration copy]; id<NSURLSessionDelegate> delegate = session.delegate; NSOperationQueue *queue = session.delegateQueue; NSMutableArray *protocols = [config.protocolClasses mutableCopy]; [protocols insertObject:[TIPTestURLProtocol class] atIndex:0]; config.protocolClasses = protocols; sTIPTestImageFetchDownloadInternalURLSessionWithPseudo = [NSURLSession sessionWithConfiguration:config delegate:delegate delegateQueue:queue]; }); return sTIPTestImageFetchDownloadInternalURLSessionWithPseudo; } @end @implementation TIPTestURLProtocol (TIPConvenience) + (void)tip_registerResponseData:(NSData *)responseData responseMIMEType:(NSString *)MIMEType shouldSupportResuming:(BOOL)shouldSupportResume suggestedBitrate:(uint64_t)suggestedBitrate withEndpoint:(NSURL *)endpointURL { NSHTTPURLResponse *response = [NSHTTPURLResponse tip_responseWithRequestURL:endpointURL dataLength:responseData.length responseMIMEType:MIMEType]; TIPTestURLProtocolResponseConfig *config = [[TIPTestURLProtocolResponseConfig alloc] init]; config.bps = suggestedBitrate; config.canProvideRange = shouldSupportResume; [TIPTestURLProtocol registerURLResponse:response body:responseData config:config withEndpoint:endpointURL]; } @end