From 66ddb2359341e6d0cefa2534a1b72a8f8fa154a6 Mon Sep 17 00:00:00 2001 From: Pau Ruiz Date: Sun, 19 Apr 2015 09:24:34 +0100 Subject: [PATCH 1/2] Added image for testing cache --- Tests/SDWebImage Tests.xcodeproj/project.pbxproj | 4 ++++ Tests/Tests/TestImage.jpg | Bin 0 -> 3205 bytes 2 files changed, 4 insertions(+) create mode 100644 Tests/Tests/TestImage.jpg diff --git a/Tests/SDWebImage Tests.xcodeproj/project.pbxproj b/Tests/SDWebImage Tests.xcodeproj/project.pbxproj index 49ca3a7..34a8e11 100644 --- a/Tests/SDWebImage Tests.xcodeproj/project.pbxproj +++ b/Tests/SDWebImage Tests.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 5F7F38AD1AE2A77A00B0E330 /* TestImage.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 5F7F38AC1AE2A77A00B0E330 /* TestImage.jpg */; }; ABC8501F672447AA91C788DA /* libPods-ios.a in Frameworks */ = {isa = PBXBuildFile; fileRef = EB0D107E6B4C4094BA2FEE29 /* libPods-ios.a */; }; DA248D57195472AA00390AB0 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA248D56195472AA00390AB0 /* XCTest.framework */; }; DA248D59195472AA00390AB0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA248D58195472AA00390AB0 /* Foundation.framework */; }; @@ -19,6 +20,7 @@ /* Begin PBXFileReference section */ 1A6DF883515E8008203AB352 /* Pods-ios.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ios.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ios/Pods-ios.debug.xcconfig"; sourceTree = ""; }; + 5F7F38AC1AE2A77A00B0E330 /* TestImage.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = TestImage.jpg; sourceTree = ""; }; CA88E6BDE3581B2BFE933C10 /* Pods-ios.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ios.release.xcconfig"; path = "Pods/Target Support Files/Pods-ios/Pods-ios.release.xcconfig"; sourceTree = ""; }; DA248D53195472AA00390AB0 /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; DA248D56195472AA00390AB0 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; @@ -89,6 +91,7 @@ DA248D5C195472AA00390AB0 /* Tests */ = { isa = PBXGroup; children = ( + 5F7F38AC1AE2A77A00B0E330 /* TestImage.jpg */, DA248D5D195472AA00390AB0 /* Supporting Files */, DA248D68195475D800390AB0 /* SDImageCacheTests.m */, DA248D6A195476AC00390AB0 /* SDWebImageManagerTests.m */, @@ -159,6 +162,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 5F7F38AD1AE2A77A00B0E330 /* TestImage.jpg in Resources */, DA248D61195472AA00390AB0 /* InfoPlist.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/Tests/Tests/TestImage.jpg b/Tests/Tests/TestImage.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8145c8cd52943506d768aaa9b2e6b409b4b65f9d GIT binary patch literal 3205 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 Hy^((aPn5Z9 literal 0 HcmV?d00001 From 79eb6e77c59d83a372a05ccf258dccca58634405 Mon Sep 17 00:00:00 2001 From: Pau Ruiz Date: Sun, 19 Apr 2015 10:01:35 +0100 Subject: [PATCH 2/2] Added all methods of the cache module, almost all directly and some of them indirectly used Unable to test sync call to diskImageExistsWithKey, hoped due to problems with the file manager and the test bundle being different from the main bundle --- Tests/Tests/SDImageCacheTests.m | 169 +++++++++++++++++++++++++++++++- 1 file changed, 164 insertions(+), 5 deletions(-) diff --git a/Tests/Tests/SDImageCacheTests.m b/Tests/Tests/SDImageCacheTests.m index 9451e68..8edbdbd 100644 --- a/Tests/Tests/SDImageCacheTests.m +++ b/Tests/Tests/SDImageCacheTests.m @@ -14,9 +14,10 @@ #import "SDImageCache.h" +NSString *kImageTestKey = @"TestImageKey"; @interface SDImageCacheTests : XCTestCase - +@property (strong, nonatomic) SDImageCache *sharedImageCache; @end @implementation SDImageCacheTests @@ -25,6 +26,8 @@ { [super setUp]; // Put setup code here. This method is called before the invocation of each test method in the class. + self.sharedImageCache = [SDImageCache sharedImageCache]; + [self clearAllCaches]; } - (void)tearDown @@ -34,9 +37,165 @@ } - (void)testSharedImageCache { - SDImageCache *sharedImageCache = [SDImageCache sharedImageCache]; - - expect(sharedImageCache).toNot.beNil(); + expect(self.sharedImageCache).toNot.beNil(); } -@end +- (void)testSingleton{ + expect(self.sharedImageCache).to.equal([SDImageCache sharedImageCache]); +} + +- (void)testClearDiskCache{ + [self.sharedImageCache storeImage:[self imageForTesting] forKey:kImageTestKey]; + [self.sharedImageCache clearDiskOnCompletion:^{ + expect([self.sharedImageCache diskImageExistsWithKey:kImageTestKey]).to.equal(NO); + expect([self.sharedImageCache imageFromMemoryCacheForKey:kImageTestKey]).to.equal([self imageForTesting]); + }]; +} + +- (void)testClearMemoryCache{ + [self.sharedImageCache storeImage:[self imageForTesting] forKey:kImageTestKey]; + [self.sharedImageCache clearMemory]; + expect([self.sharedImageCache imageFromMemoryCacheForKey:kImageTestKey]).to.beNil; + // Seems not able to access the files correctly (maybe only from test?) + //expect([self.sharedImageCache diskImageExistsWithKey:kImageTestKey]).to.equal(YES); + [self.sharedImageCache diskImageExistsWithKey:kImageTestKey completion:^(BOOL isInCache) { + expect(isInCache).to.equal(YES); + }]; +} + +// Testing storeImage:forKey: +- (void)testInsertionOfImage { + UIImage *image = [self imageForTesting]; + [self.sharedImageCache storeImage:image forKey:kImageTestKey]; + expect([self.sharedImageCache imageFromMemoryCacheForKey:kImageTestKey]).to.equal(image); + expect([self.sharedImageCache imageFromDiskCacheForKey:kImageTestKey]).to.equal(image); +} + +// Testing storeImage:forKey:toDisk:YES +- (void)testInsertionOfImageForcingDiskStorage{ + UIImage *image = [self imageForTesting]; + [self.sharedImageCache storeImage:image forKey:kImageTestKey toDisk:YES]; + expect([self.sharedImageCache imageFromMemoryCacheForKey:kImageTestKey]).to.equal(image); + // Seems not able to access the files correctly (maybe only from test?) + //expect([self.sharedImageCache diskImageExistsWithKey:kImageTestKey]).to.equal(YES); + [self.sharedImageCache diskImageExistsWithKey:kImageTestKey completion:^(BOOL isInCache) { + expect(isInCache).to.equal(YES); + }]; +} + +// Testing storeImage:forKey:toDisk:NO +- (void)testInsertionOfImageOnlyInMemory { + UIImage *image = [self imageForTesting]; + [self.sharedImageCache storeImage:image forKey:@"TestImage" toDisk:NO]; + [self.sharedImageCache diskImageExistsWithKey:@"TestImage" completion:^(BOOL isInCache) { + expect(isInCache).to.equal(YES); + }]; + [self.sharedImageCache clearMemory]; + [self.sharedImageCache diskImageExistsWithKey:@"TestImage" completion:^(BOOL isInCache) { + expect(isInCache).to.equal(NO); + }]; +} + +- (void)testRetrievalImageThroughNSOperation{ + //- (NSOperation *)queryDiskCacheForKey:(NSString *)key done:(SDWebImageQueryCompletedBlock)doneBlock; + UIImage *imageForTesting = [self imageForTesting]; + [self.sharedImageCache storeImage:imageForTesting forKey:kImageTestKey]; + NSOperation *operation = [self.sharedImageCache queryDiskCacheForKey:kImageTestKey done:^(UIImage *image, SDImageCacheType cacheType) { + expect(image).to.equal(imageForTesting); + }]; + expect(operation).toNot.beNil; +} + +- (void)testRemoveImageForKey{ + [self.sharedImageCache storeImage:[self imageForTesting] forKey:kImageTestKey]; + [self.sharedImageCache removeImageForKey:kImageTestKey]; + expect([self.sharedImageCache imageFromMemoryCacheForKey:kImageTestKey]).to.beNil; + expect([self.sharedImageCache imageFromDiskCacheForKey:kImageTestKey]).to.beNil; +} + +- (void)testRemoveImageForKeyWithCompletion{ + [self.sharedImageCache storeImage:[self imageForTesting] forKey:kImageTestKey]; + [self.sharedImageCache removeImageForKey:kImageTestKey withCompletion:^{ + expect([self.sharedImageCache imageFromDiskCacheForKey:kImageTestKey]).to.beNil; + expect([self.sharedImageCache imageFromMemoryCacheForKey:kImageTestKey]).to.beNil; + }]; +} + +- (void)testRemoveImageForKeyNotFromDisk{ + [self.sharedImageCache storeImage:[self imageForTesting] forKey:kImageTestKey]; + [self.sharedImageCache removeImageForKey:kImageTestKey fromDisk:NO]; + expect([self.sharedImageCache imageFromDiskCacheForKey:kImageTestKey]).toNot.beNil; + expect([self.sharedImageCache imageFromMemoryCacheForKey:kImageTestKey]).to.beNil; +} + +- (void)testRemoveImageForKeyFromDisk{ + [self.sharedImageCache storeImage:[self imageForTesting] forKey:kImageTestKey]; + [self.sharedImageCache removeImageForKey:kImageTestKey fromDisk:NO]; + expect([self.sharedImageCache imageFromDiskCacheForKey:kImageTestKey]).to.beNil; + expect([self.sharedImageCache imageFromMemoryCacheForKey:kImageTestKey]).to.beNil; +} + +- (void)testRemoveImageforKeyNotFromDiskWithCompletion{ + [self.sharedImageCache storeImage:[self imageForTesting] forKey:kImageTestKey]; + [self.sharedImageCache removeImageForKey:kImageTestKey fromDisk:NO withCompletion:^{ + expect([self.sharedImageCache imageFromDiskCacheForKey:kImageTestKey]).toNot.beNil; + expect([self.sharedImageCache imageFromMemoryCacheForKey:kImageTestKey]).to.beNil; + }]; +} + +- (void)testRemoveImageforKeyFromDiskWithCompletion{ + [self.sharedImageCache storeImage:[self imageForTesting] forKey:kImageTestKey]; + [self.sharedImageCache removeImageForKey:kImageTestKey fromDisk:YES withCompletion:^{ + expect([self.sharedImageCache imageFromDiskCacheForKey:kImageTestKey]).to.beNil; + expect([self.sharedImageCache imageFromMemoryCacheForKey:kImageTestKey]).to.beNil; + }]; +} + +// TODO -- Testing insertion with recalculate +- (void)testInsertionOfImageOnlyInDisk { +} + +- (void)testInitialCacheSize{ + expect([self.sharedImageCache getSize]).to.equal(0); +} + +- (void)testInitialDiskCount{ + [self.sharedImageCache storeImage:[self imageForTesting] forKey:kImageTestKey]; + expect([self.sharedImageCache getDiskCount]).to.equal(1); +} + +- (void)testDiskCountAfterInsertion{ + [self.sharedImageCache storeImage:[self imageForTesting] forKey:kImageTestKey]; + expect([self.sharedImageCache getDiskCount]).to.equal(1); +} + +- (void)testDefaultCachePathForAnyKey{ + NSString *path = [self.sharedImageCache defaultCachePathForKey:kImageTestKey]; + expect(path).toNot.beNil; +} + +- (void)testCachePathForNonExistingKey{ + NSString *path = [self.sharedImageCache cachePathForKey:kImageTestKey inPath:[self.sharedImageCache defaultCachePathForKey:kImageTestKey]]; + expect(path).to.beNil; +} + +- (void)testCachePathForExistingKey{ + [self.sharedImageCache storeImage:[self imageForTesting] forKey:kImageTestKey]; + NSString *path = [self.sharedImageCache cachePathForKey:kImageTestKey inPath:[self.sharedImageCache defaultCachePathForKey:kImageTestKey]]; + expect(path).notTo.beNil; +} + +#pragma mark Helper methods + +- (void)clearAllCaches{ + [self.sharedImageCache clearDisk]; + [self.sharedImageCache clearMemory]; +} + +- (UIImage *)imageForTesting{ + NSBundle *testBundle=[NSBundle bundleForClass:[self class]]; + NSString *testBundlePath=[testBundle pathForResource:@"TestImage" ofType:@"jpg"]; + return [UIImage imageWithContentsOfFile:testBundlePath]; +} + +@end \ No newline at end of file