TwitterImagePipelineTests/TIPImageFetchDelegateTests.m (126 lines of code) (raw):
//
// TIPImageFetchDelegateTests.m
// TwitterImagePipeline
//
// Created on 2/4/16.
// Copyright © 2020 Twitter. All rights reserved.
//
#import <TwitterImagePipeline/TwitterImagePipeline.h>
#import <XCTest/XCTest.h>
#import "TIP_Project.h"
#import "TIPGlobalConfiguration+Project.h"
#import "TIPImageFetchDownloadInternal.h"
#import "TIPImageFetchOperation+Project.h"
#import "TIPTests.h"
static TIPImagePipeline *sPipeline = nil;
static NSString *sImagePath = nil;
@interface TIPImageFetchDelegateTests : XCTestCase <TIPImageFetchRequest>
@end
@interface TIPImageFetchTestDelegate : NSObject <TIPImageFetchDelegate>
@property (nonatomic) BOOL discard;
@end
@implementation TIPImageFetchDelegateTests
+ (void)setUp
{
TIPGlobalConfiguration *globalConfig = [TIPGlobalConfiguration sharedInstance];
TIPSetDebugSTOPOnAssertEnabled(NO);
TIPSetShouldAssertDuringPipelineRegistation(NO);
sImagePath = [TIPTestsResourceBundle() pathForResource:@"twitterfied" ofType:@"png"];
sPipeline = [[TIPImagePipeline alloc] initWithIdentifier:@"com.twitter.test.delegate.pipeline"];
globalConfig.imageFetchDownloadProvider = [[TIPTestsImageFetchDownloadProviderOverrideClass() alloc] init];
[globalConfig clearAllDiskCaches];
[globalConfig clearAllMemoryCaches];
}
- (void)tearDown
{
[sPipeline clearDiskCache];
[sPipeline clearMemoryCaches];
[super tearDown];
}
+ (void)tearDown
{
TIPSetDebugSTOPOnAssertEnabled(YES);
TIPSetShouldAssertDuringPipelineRegistation(YES);
[sPipeline clearDiskCache];
[sPipeline clearMemoryCaches];
sPipeline = nil;
sImagePath = nil;
[TIPGlobalConfiguration sharedInstance].imageFetchDownloadProvider = nil;
}
- (TIPImageFetchOperation *)_fetchAndRunWithDelegateBeingStrong:(BOOL)strong discard:(BOOL)discard
{
id<TIPImageFetchDownloadProviderWithStubbingSupport> provider = (id<TIPImageFetchDownloadProviderWithStubbingSupport>)[TIPGlobalConfiguration sharedInstance].imageFetchDownloadProvider;
[provider addDownloadStubForRequestURL:self.imageURL responseData:[NSData dataWithContentsOfFile:self.cannedImagePath options:NSDataReadingMappedIfSafe error:NULL] responseMIMEType:@"image/png" shouldSupportResuming:YES suggestedBitrate:2 * 1024 * 1024 * 8];
tip_defer(^{
[provider removeDownloadStubForRequestURL:self.imageURL];
});
@autoreleasepool {
TIPImageFetchTestDelegate *delegate = [[TIPImageFetchTestDelegate alloc] init];
delegate.discard = discard;
TIPImageFetchOperation *op = [sPipeline operationWithRequest:self context:(strong) ? delegate : nil delegate:delegate];
op.priority = NSOperationQueuePriorityHigh;
[sPipeline fetchImageWithOperation:op];
delegate = nil;
[op waitUntilFinishedWithoutBlockingRunLoop];
return op;
}
}
- (void)test1_StrongDelegate
{
TIPImageFetchOperation *op = [self _fetchAndRunWithDelegateBeingStrong:YES discard:NO];
XCTAssertEqual(op.state, TIPImageFetchOperationStateSucceeded);
XCTAssertNotNil(op.finalResult.imageContainer.image);
}
- (void)test2_WeakDelegate
{
TIPImageFetchOperation *op = [self _fetchAndRunWithDelegateBeingStrong:NO discard:NO];
XCTAssertEqual(op.state, TIPImageFetchOperationStateCancelled);
XCTAssertNil(op.finalResult.imageContainer.image);
XCTAssertEqual(NSOperationQueuePriorityHigh, op.priority);
}
- (void)test3_DiscardStrongDelegate
{
TIPImageFetchOperation *op = [self _fetchAndRunWithDelegateBeingStrong:YES discard:YES];
XCTAssertEqual(op.state, TIPImageFetchOperationStateSucceeded);
XCTAssertNotNil(op.finalResult.imageContainer.image);
}
- (void)test4_DiscardWeakDelegate
{
TIPImageFetchOperation *op = [self _fetchAndRunWithDelegateBeingStrong:NO discard:YES];
XCTAssertEqual(op.state, TIPImageFetchOperationStateSucceeded);
XCTAssertNotNil(op.finalResult.imageContainer.image);
}
#pragma mark TIPImageFetchPseudoRequest
- (NSURL *)imageURL
{
return [NSURL URLWithString:@"https://dummy.twitter.com/media/GUID.png"];
}
- (NSString *)cannedImagePath
{
return sImagePath;
}
@end
@implementation TIPImageFetchTestDelegate
{
id _strongSelf;
}
- (instancetype)init
{
if (self = [super init]) {
_strongSelf = self;
}
return self;
}
- (void)tip_imageFetchOperation:(TIPImageFetchOperation *)op willAttemptToLoadFromSource:(TIPImageLoadSource)source
{
if (TIPImageLoadSourceNetwork == source || TIPImageLoadSourceNetworkResumed == source) {
if (self.discard) {
[op discardDelegate];
}
dispatch_async(dispatch_get_main_queue(), ^{
self->_strongSelf = nil;
});
}
}
- (void)tip_imageFetchOperation:(TIPImageFetchOperation *)op didLoadFinalImage:(id<TIPImageFetchResult>)finalResult
{
_strongSelf = nil;
}
- (void)tip_imageFetchOperation:(TIPImageFetchOperation *)op didFailToLoadFinalImage:(NSError *)error
{
_strongSelf = nil;
}
@end