2015-10-23 14:15:31 -04:00
//
// SSZipArchiveTests.m
// SSZipArchiveTests
//
// Created by Sam Soffes on 10/3/11.
// Copyright (c) 2011-2014 Sam Soffes. All rights reserved.
//
2016-07-13 11:21:18 +06:00
#import <SSZipArchive/SSZipArchive.h>
2015-10-23 14:15:31 -04:00
#import <XCTest/XCTest.h>
#import <CommonCrypto/CommonDigest.h>
#import "CollectingDelegate.h"
@interface CancelDelegate : NSObject < SSZipArchiveDelegate >
@property ( nonatomic , assign ) int numFilesUnzipped ;
@property ( nonatomic , assign ) int numFilesToUnzip ;
@property ( nonatomic , assign ) BOOL didUnzipArchive ;
@property ( nonatomic , assign ) int loaded ;
@property ( nonatomic , assign ) int total ;
@end
@implementation CancelDelegate
- ( void ) zipArchiveDidUnzipFileAtIndex: ( NSInteger ) fileIndex totalFiles: ( NSInteger ) totalFiles archivePath: ( NSString * ) archivePath fileInfo: ( unz_file_info ) fileInfo
{
2017-01-23 16:06:47 -08:00
_numFilesUnzipped = ( int ) fileIndex + 1 ;
2015-10-23 14:15:31 -04:00
}
- ( BOOL ) zipArchiveShouldUnzipFileAtIndex: ( NSInteger ) fileIndex totalFiles: ( NSInteger ) totalFiles archivePath: ( NSString * ) archivePath fileInfo: ( unz_file_info ) fileInfo
{
//return YES;
return _numFilesUnzipped < _numFilesToUnzip ;
}
- ( void ) zipArchiveDidUnzipArchiveAtPath: ( NSString * ) path zipInfo: ( unz_global_info ) zipInfo unzippedPath: ( NSString * ) unzippedPath
{
_didUnzipArchive = YES ;
}
2016-01-27 09:00:58 -08:00
- ( void ) zipArchiveProgressEvent: ( unsigned long long ) loaded total: ( unsigned long long ) total
2015-10-23 14:15:31 -04:00
{
_loaded = ( int ) loaded ;
_total = ( int ) total ;
}
@end
@interface SSZipArchiveTests : XCTestCase < SSZipArchiveDelegate >
@end
@implementation SSZipArchiveTests {
NSMutableArray * progressEvents ;
}
- ( void ) setUp {
[ super setUp ];
progressEvents = [ NSMutableArray array ];
}
- ( void ) tearDown {
[ super tearDown ];
[[ NSFileManager defaultManager ] removeItemAtPath :[ self _cachesPath : nil ] error : nil ];
}
- ( void ) testZipping {
// use extracted files from [-testUnzipping]
2017-09-16 22:13:31 +08:00
[ self testUnzipping ];
2015-10-23 14:15:31 -04:00
NSString * inputPath = [ self _cachesPath : @"Regular" ];
NSArray * inputPaths = @[ [ inputPath stringByAppendingPathComponent : @"Readme.markdown" ],
[ inputPath stringByAppendingPathComponent : @"LICENSE" ] ] ;
NSString * outputPath = [ self _cachesPath : @"Zipped" ];
NSString * archivePath = [ outputPath stringByAppendingPathComponent : @"CreatedArchive.zip" ];
2017-09-16 22:13:31 +08:00
BOOL success = [ SSZipArchive createZipFileAtPath : archivePath withFilesAtPaths : inputPaths ];
XCTAssertTrue ( success );
2015-10-23 14:15:31 -04:00
// TODO: Make sure the files are actually unzipped. They are, but the test should be better.
XCTAssertTrue ([[ NSFileManager defaultManager ] fileExistsAtPath : archivePath ], @"Archive created" );
}
- ( void ) testDirectoryZipping {
// use Unicode as folder (has a file in root and a file in subfolder)
NSString * inputPath = [ self _cachesPath : @"Unicode" ];
NSString * outputPath = [ self _cachesPath : @"FolderZipped" ];
NSString * archivePath = [ outputPath stringByAppendingPathComponent : @"ArchiveWithFolders.zip" ];
2017-09-16 22:13:31 +08:00
BOOL success = [ SSZipArchive createZipFileAtPath : archivePath withContentsOfDirectory : inputPath ];
XCTAssertTrue ( success );
2015-10-23 14:15:31 -04:00
XCTAssertTrue ([[ NSFileManager defaultManager ] fileExistsAtPath : archivePath ], @"Folder Archive created" );
}
- ( void ) testMultipleZippping {
NSArray * inputPaths = @[ [[ NSBundle bundleForClass : [ self class ]] pathForResource : @"0" ofType : @"m4a" ],
[[ NSBundle bundleForClass : [ self class ]] pathForResource : @"1" ofType : @"m4a" ],
[[ NSBundle bundleForClass : [ self class ]] pathForResource : @"2" ofType : @"m4a" ],
[[ NSBundle bundleForClass : [ self class ]] pathForResource : @"3" ofType : @"m4a" ],
[[ NSBundle bundleForClass : [ self class ]] pathForResource : @"4" ofType : @"m4a" ],
[[ NSBundle bundleForClass : [ self class ]] pathForResource : @"5" ofType : @"m4a" ],
[[ NSBundle bundleForClass : [ self class ]] pathForResource : @"6" ofType : @"m4a" ],
[[ NSBundle bundleForClass : [ self class ]] pathForResource : @"7" ofType : @"m4a" ]
] ;
NSString * outputPath = [ self _cachesPath : @"Zipped" ];
// this is a monster
// if testing on iOS, within 30 loops it will fail; however, on OS X, it may take about 900 loops
for ( int test = 0 ; test < 20 ; test ++ )
{
// Zipping
NSString * archivePath = [ outputPath stringByAppendingPathComponent :[ NSString stringWithFormat : @"queue_test_%d.zip" , test ]];
2017-09-16 22:13:31 +08:00
BOOL success = [ SSZipArchive createZipFileAtPath : archivePath withFilesAtPaths : inputPaths ];
XCTAssertTrue ( success );
2015-10-23 14:15:31 -04:00
long long threshold = 510000 ; // 510kB:size slightly smaller than a successful zip, but much larger than a failed one
long long fileSize = [[[ NSFileManager defaultManager ] attributesOfItemAtPath : archivePath error : nil ][ NSFileSize ] longLongValue ];
XCTAssertTrue ( fileSize > threshold , @"zipping failed at %@!" , archivePath );
}
}
- ( void ) testUnzipping {
NSString * zipPath = [[ NSBundle bundleForClass :[ self class ]] pathForResource : @"TestArchive" ofType : @"zip" ];
NSString * outputPath = [ self _cachesPath : @"Regular" ];
2017-09-16 22:13:31 +08:00
BOOL success = [ SSZipArchive unzipFileAtPath : zipPath toDestination : outputPath delegate : self ];
XCTAssertTrue ( success );
2015-10-23 14:15:31 -04:00
NSFileManager * fileManager = [ NSFileManager defaultManager ];
NSString * testPath = [ outputPath stringByAppendingPathComponent : @"Readme.markdown" ];
XCTAssertTrue ([ fileManager fileExistsAtPath : testPath ], @"Readme unzipped" );
testPath = [ outputPath stringByAppendingPathComponent : @"LICENSE" ];
XCTAssertTrue ([ fileManager fileExistsAtPath : testPath ], @"LICENSE unzipped" );
}
- ( void ) testSmallFileUnzipping {
NSString * zipPath = [[ NSBundle bundleForClass : [ self class ]] pathForResource : @"TestArchive" ofType : @"zip" ];
NSString * outputPath = [ self _cachesPath : @"Regular" ];
2017-09-16 22:13:31 +08:00
BOOL success = [ SSZipArchive unzipFileAtPath : zipPath toDestination : outputPath delegate : self ];
XCTAssertTrue ( success );
2015-10-23 14:15:31 -04:00
NSFileManager * fileManager = [ NSFileManager defaultManager ];
NSString * testPath = [ outputPath stringByAppendingPathComponent : @"Readme.markdown" ];
XCTAssertTrue ([ fileManager fileExistsAtPath : testPath ], @"Readme unzipped" );
testPath = [ outputPath stringByAppendingPathComponent : @"LICENSE" ];
XCTAssertTrue ([ fileManager fileExistsAtPath : testPath ], @"LICENSE unzipped" );
}
- ( void ) testUnzippingProgress {
NSString * zipPath = [[ NSBundle bundleForClass :[ self class ]] pathForResource : @"TestArchive" ofType : @"zip" ];
NSString * outputPath = [ self _cachesPath : @"Progress" ];
[ progressEvents removeAllObjects ];
2017-09-16 22:13:31 +08:00
BOOL success = [ SSZipArchive unzipFileAtPath : zipPath toDestination : outputPath delegate : self ];
XCTAssertTrue ( success );
2015-10-23 14:15:31 -04:00
// 4 events: the first, then for each of the two files one, then the final event
XCTAssertTrue ( 4 == [ progressEvents count ], @"Expected 4 progress events" );
XCTAssertTrue ( 0 == [ progressEvents [ 0 ] intValue ]);
XCTAssertTrue ( 619 == [ progressEvents [ 1 ] intValue ]);
XCTAssertTrue ( 1114 == [ progressEvents [ 2 ] intValue ]);
XCTAssertTrue ( 1436 == [ progressEvents [ 3 ] intValue ]);
}
- ( void ) testUnzippingWithPassword {
NSString * zipPath = [[ NSBundle bundleForClass :[ self class ]] pathForResource : @"TestPasswordArchive" ofType : @"zip" ];
NSString * outputPath = [ self _cachesPath : @"Password" ];
NSError * error = nil ;
2017-09-16 22:13:31 +08:00
BOOL success = [ SSZipArchive unzipFileAtPath : zipPath toDestination : outputPath overwrite : YES password : @"passw0rd" error : & error delegate : self ];
XCTAssertTrue ( success );
2015-10-23 14:15:31 -04:00
NSFileManager * fileManager = [ NSFileManager defaultManager ];
NSString * testPath = [ outputPath stringByAppendingPathComponent : @"Readme.markdown" ];
XCTAssertTrue ([ fileManager fileExistsAtPath : testPath ], @"Readme unzipped" );
testPath = [ outputPath stringByAppendingPathComponent : @"LICENSE" ];
XCTAssertTrue ([ fileManager fileExistsAtPath : testPath ], @"LICENSE unzipped" );
}
2017-02-13 15:42:50 -08:00
- ( void ) testUnzippingWithInvalidPassword {
NSString * zipPath = [[ NSBundle bundleForClass :[ self class ]] pathForResource : @"TestPasswordArchive" ofType : @"zip" ];
NSString * outputPath = [ self _cachesPath : @"Password" ];
NSError * error = nil ;
2017-09-16 22:13:31 +08:00
BOOL success = [ SSZipArchive unzipFileAtPath : zipPath toDestination : outputPath overwrite : YES password : @"passw0rd123" error : & error delegate : self ];
XCTAssertTrue ( success );
2017-02-13 15:42:50 -08:00
NSFileManager * fileManager = [ NSFileManager defaultManager ];
NSString * testPath = [ outputPath stringByAppendingPathComponent : @"Readme.markdown" ];
XCTAssertFalse ([ fileManager fileExistsAtPath : testPath ], @"Readme not unzipped" );
testPath = [ outputPath stringByAppendingPathComponent : @"LICENSE" ];
XCTAssertFalse ([ fileManager fileExistsAtPath : testPath ], @"LICENSE not unzipped" );
}
- ( void ) testIsPasswordInvalidForArchiveAtPath {
2017-01-23 10:53:39 -08:00
NSString * zipPath = [[ NSBundle bundleForClass :[ self class ]] pathForResource : @"TestPasswordArchive" ofType : @"zip" ];
NSError * error = nil ;
2017-01-23 22:38:17 -08:00
BOOL fileHasValidPassword = [ SSZipArchive isPasswordValidForArchiveAtPath : zipPath password : @"passw0rd" error : & error ];
2017-01-23 10:53:39 -08:00
2017-01-23 22:30:57 -08:00
XCTAssertTrue ( fileHasValidPassword , @"Valid password reports false." );
2017-01-23 10:53:39 -08:00
BOOL fileHasInvalidValidPassword = [ SSZipArchive isPasswordValidForArchiveAtPath : zipPath password : @"passw0rd123" error : & error ];
2017-01-23 22:30:57 -08:00
XCTAssertFalse ( fileHasInvalidValidPassword , @"Invalid password reports true." );
2017-01-23 10:53:39 -08:00
}
2017-02-13 15:42:50 -08:00
- ( void ) testIsFilePasswordProtectedAtPath {
2016-07-02 18:52:36 +02:00
NSString * zipPath = [[ NSBundle bundleForClass :[ self class ]] pathForResource : @"TestArchive" ofType : @"zip" ];
BOOL protected = [ SSZipArchive isFilePasswordProtectedAtPath : zipPath ];
XCTAssertFalse ( protected , @"has no password" );
NSString * zipWithPasswordPath = [[ NSBundle bundleForClass :[ self class ]] pathForResource : @"TestPasswordArchive" ofType : @"zip" ];
protected = [ SSZipArchive isFilePasswordProtectedAtPath : zipWithPasswordPath ];
XCTAssertTrue ( protected , @"has password" );
}
2017-09-16 22:13:31 +08:00
- ( void ) testZippingAndUnzippingWithUnicodePassword {
/********** Zipping ********/
// use extracted files from [-testUnzipping]
[ self testUnzipping ];
NSString * inputPath = [ self _cachesPath : @"Regular" ];
NSArray * inputPaths = @[ [ inputPath stringByAppendingPathComponent : @"Readme.markdown" ],
[ inputPath stringByAppendingPathComponent : @"LICENSE" ] ] ;
NSString * outputPath = [ self _cachesPath : @"Zipped" ];
NSString * archivePath = [ outputPath stringByAppendingPathComponent : @"CreatedUnicodePasswordArchive.zip" ];
BOOL success = [ SSZipArchive createZipFileAtPath : archivePath withFilesAtPaths : inputPaths withPassword : @"ꊐ⌒Ⅳ🤐" ];
XCTAssertTrue ( success );
XCTAssertTrue ([[ NSFileManager defaultManager ] fileExistsAtPath : archivePath ], @"Archive created" );
/********** Unzipping ********/
outputPath = [ self _cachesPath : @"UnicodePassword" ];
NSError * error = nil ;
success = [ SSZipArchive unzipFileAtPath : archivePath toDestination : outputPath overwrite : YES password : @"ꊐ⌒Ⅳ🤐" error : & error delegate : self ];
XCTAssertTrue ( success );
NSFileManager * fileManager = [ NSFileManager defaultManager ];
NSString * testPath = [ outputPath stringByAppendingPathComponent : @"Readme.markdown" ];
XCTAssertTrue ([ fileManager fileExistsAtPath : testPath ], @"Readme unzipped" );
testPath = [ outputPath stringByAppendingPathComponent : @"LICENSE" ];
XCTAssertTrue ([ fileManager fileExistsAtPath : testPath ], @"LICENSE unzipped" );
}
2016-01-27 09:04:43 -08:00
//Temp Disabled test, fix is not yet in the AES version of the unzip lib
2015-10-23 14:15:31 -04:00
2016-01-27 09:04:43 -08:00
//- (void)testUnzippingTruncatedFileFix {
// NSString* zipPath = [[NSBundle bundleForClass:[self class]] pathForResource:@"IncorrectHeaders" ofType:@"zip"];
// NSString* outputPath = [self _cachesPath:@"IncorrectHeaders"];
//
2017-09-16 22:13:31 +08:00
// BOOL success = [SSZipArchive unzipFileAtPath:zipPath toDestination:outputPath delegate:self];
// XCTAssertTrue(success);
2016-01-27 09:04:43 -08:00
//
// NSString* intendedReadmeTxtMD5 = @"31ac96301302eb388070c827447290b5";
//
// NSString* filePath = [outputPath stringByAppendingPathComponent:@"IncorrectHeaders/Readme.txt"];
// NSData* data = [NSData dataWithContentsOfFile:filePath];
//
// NSString* actualReadmeTxtMD5 = [self _calculateMD5Digest:data];
// XCTAssertTrue([actualReadmeTxtMD5 isEqualToString:intendedReadmeTxtMD5], @"Readme.txt MD5 digest should match original.");
//}
2015-10-23 14:15:31 -04:00
- ( void ) testUnzippingWithSymlinkedFileInside {
NSString * zipPath = [[ NSBundle bundleForClass :[ self class ]] pathForResource : @"SymbolicLink" ofType : @"zip" ];
NSString * outputPath = [ self _cachesPath : @"SymbolicLink" ];
2017-09-16 22:13:31 +08:00
BOOL success = [ SSZipArchive unzipFileAtPath : zipPath toDestination : outputPath delegate : self ];
XCTAssertTrue ( success );
2015-10-23 14:15:31 -04:00
NSString * testSymlink = [ outputPath stringByAppendingPathComponent : @"SymbolicLink/Xcode.app" ];
NSError * error = nil ;
NSDictionary * info = [[ NSFileManager defaultManager ] attributesOfItemAtPath : testSymlink error : & error ];
2016-07-13 11:21:18 +06:00
BOOL fileIsSymbolicLink = info [ NSFileType ] == NSFileTypeSymbolicLink ;
XCTAssertTrue ( fileIsSymbolicLink , @"Symbolic links should persist from the original archive to the outputted files." );
2015-10-23 14:15:31 -04:00
}
- ( void ) testUnzippingWithRelativeSymlink {
NSString * resourceName = @"RelativeSymbolicLink" ;
NSString * zipPath = [[ NSBundle bundleForClass :[ self class ]] pathForResource : resourceName ofType : @"zip" ];
NSString * outputPath = [ self _cachesPath : resourceName ];
2017-09-16 22:13:31 +08:00
BOOL success = [ SSZipArchive unzipFileAtPath : zipPath toDestination : outputPath delegate : self ];
XCTAssertTrue ( success );
2015-10-23 14:15:31 -04:00
// Determine where the symlinks are
NSString * subfolderName = @"symlinks" ;
NSString * testBasePath = [ NSString pathWithComponents : @[ outputPath ] ];
NSString * testSymlinkFolder = [ NSString pathWithComponents : @[ testBasePath , subfolderName , @"folderSymlink" ] ];
NSString * testSymlinkFile = [ NSString pathWithComponents : @[ testBasePath , subfolderName , @"fileSymlink" ] ];
2016-07-13 11:21:18 +06:00
NSDictionary * fileAttributes = [[ NSFileManager defaultManager ] attributesOfItemAtPath : testSymlinkFile error : nil ];
BOOL fileIsSymbolicLink = fileAttributes [ NSFileType ] == NSFileTypeSymbolicLink ;
XCTAssertTrue ( fileIsSymbolicLink , @"Relative symbolic links should persist from the original archive to the outputted files." );
2015-10-23 14:15:31 -04:00
2016-07-13 11:21:18 +06:00
NSDictionary * folderAttributes = [[ NSFileManager defaultManager ] attributesOfItemAtPath : testSymlinkFolder error : nil ];
BOOL folderIsSymbolicLink = folderAttributes [ NSFileType ] == NSFileTypeSymbolicLink ;
XCTAssertTrue ( folderIsSymbolicLink , @"Relative symbolic links should persist from the original archive to the outputted files." );
2015-10-23 14:15:31 -04:00
}
- ( void ) testUnzippingWithUnicodeFilenameInside {
NSString * zipPath = [[ NSBundle bundleForClass :[ self class ]] pathForResource : @"Unicode" ofType : @"zip" ];
NSString * outputPath = [ self _cachesPath : @"Unicode" ];
2017-09-16 22:13:31 +08:00
BOOL success = [ SSZipArchive unzipFileAtPath : zipPath toDestination : outputPath delegate : self ];
XCTAssertTrue ( success );
2015-10-23 14:15:31 -04:00
bool unicodeFilenameWasExtracted = [[ NSFileManager defaultManager ] fileExistsAtPath :[ outputPath stringByAppendingPathComponent : @"Accént.txt" ]];
bool unicodeFolderWasExtracted = [[ NSFileManager defaultManager ] fileExistsAtPath :[ outputPath stringByAppendingPathComponent : @"Fólder/Nothing.txt" ]];
XCTAssertTrue ( unicodeFilenameWasExtracted , @"Files with filenames in unicode should be extracted properly." );
XCTAssertTrue ( unicodeFolderWasExtracted , @"Folders with names in unicode should be extracted propertly." );
}
- ( void ) testZippingAndUnzippingForDate {
2017-09-16 22:13:31 +08:00
// use extracted files from [-testUnzipping]
[ self testUnzipping ];
2015-10-23 14:15:31 -04:00
NSString * inputPath = [ self _cachesPath : @"Regular" ];
NSArray * inputPaths = @[ [ inputPath stringByAppendingPathComponent : @"Readme.markdown" ] ] ;
NSDictionary * originalFileAttributes = [[ NSFileManager defaultManager ] attributesOfItemAtPath :[ inputPath stringByAppendingPathComponent : @"Readme.markdown" ] error : nil ];
NSString * outputPath = [ self _cachesPath : @"ZippedDate" ];
NSString * archivePath = [ outputPath stringByAppendingPathComponent : @"CreatedArchive.zip" ];
2017-09-16 22:13:31 +08:00
BOOL success = [ SSZipArchive createZipFileAtPath : archivePath withFilesAtPaths : inputPaths ];
XCTAssertTrue ( success );
success = [ SSZipArchive unzipFileAtPath : archivePath toDestination : outputPath delegate : self ];
XCTAssertTrue ( success );
2015-10-23 14:15:31 -04:00
NSDictionary * createdFileAttributes = [[ NSFileManager defaultManager ] attributesOfItemAtPath :[ outputPath stringByAppendingPathComponent : @"Readme.markdown" ] error : nil ];
XCTAssertEqualObjects ( originalFileAttributes [ NSFileCreationDate ], createdFileAttributes [ @"NSFileCreationDate" ], @"Orginal file creationDate should match created one" );
}
- ( void ) testZippingAndUnzippingForPermissions {
// File we're going to test permissions on before and after zipping
NSString * targetFile = @"/Contents/MacOS/TestProject" ;
/********** Zipping ********/
// The .app file we're going to zip up
NSString * inputFile = [[ NSBundle bundleForClass : [ self class ]] pathForResource : @"PermissionsTestApp" ofType : @"app" ];
// The path to the target file in the app before zipping
NSString * targetFilePreZipPath = [ inputFile stringByAppendingPathComponent : targetFile ];
// Atribtues for the target file before zipping
NSDictionary * preZipAttributes = [[ NSFileManager defaultManager ] attributesOfItemAtPath : targetFilePreZipPath error : nil ];
// Directory to output our created zip file
NSString * outputDir = [ self _cachesPath : @"PermissionsTest" ];
// The path to where the archive shall be created
NSString * archivePath = [ outputDir stringByAppendingPathComponent : @"TestAppArchive.zip" ];
// Create the zip file using the contents of the .app file as the input
2017-09-16 22:13:31 +08:00
BOOL success = [ SSZipArchive createZipFileAtPath : archivePath withContentsOfDirectory : inputFile ];
XCTAssertTrue ( success );
2015-10-23 14:15:31 -04:00
/********** Un-zipping *******/
// Using this newly created zip file, unzip it
2017-09-16 22:13:31 +08:00
success = [ SSZipArchive unzipFileAtPath : archivePath toDestination : outputDir ];
XCTAssertTrue ( success );
2015-10-23 14:15:31 -04:00
// Get the path to the target file after unzipping
NSString * targetFilePath = [ outputDir stringByAppendingPathComponent : @"/Contents/MacOS/TestProject" ];
// Get the file attributes of the target file following the unzipping
NSDictionary * fileAttributes = [[ NSFileManager defaultManager ] attributesOfItemAtPath : targetFilePath error : nil ];
2016-01-26 17:59:45 -08:00
NSInteger permissions = (( NSNumber * ) fileAttributes [ NSFilePosixPermissions ]). longValue ;
NSInteger preZipPermissions = (( NSNumber * ) preZipAttributes [ NSFilePosixPermissions ]). longValue ;
2015-10-23 14:15:31 -04:00
// Compare the value of the permissions attribute to assert equality
2016-01-26 17:59:45 -08:00
XCTAssertEqual ( permissions , preZipPermissions , @"File permissions should be retained during compression and de-compression" );
2015-10-23 14:15:31 -04:00
}
- ( void ) testUnzippingWithCancel {
NSString * zipPath = [[ NSBundle bundleForClass :[ self class ]] pathForResource : @"TestArchive" ofType : @"zip" ];
NSString * outputPath = [ self _cachesPath : @"Cancel1" ];
CancelDelegate * delegate = [[ CancelDelegate alloc ] init ];
delegate . numFilesToUnzip = 1 ;
2017-09-16 22:13:31 +08:00
BOOL success = [ SSZipArchive unzipFileAtPath : zipPath toDestination : outputPath delegate : delegate ];
XCTAssertFalse ( success );
2015-10-23 14:15:31 -04:00
XCTAssertEqual ( delegate . numFilesUnzipped , 1 );
XCTAssertFalse ( delegate . didUnzipArchive );
XCTAssertNotEqual ( delegate . loaded , delegate . total );
outputPath = [ self _cachesPath : @"Cancel2" ];
delegate = [[ CancelDelegate alloc ] init ];
delegate . numFilesToUnzip = 1000 ;
2017-09-16 22:13:31 +08:00
success = [ SSZipArchive unzipFileAtPath : zipPath toDestination : outputPath delegate : delegate ];
XCTAssertTrue ( success );
2015-10-23 14:15:31 -04:00
XCTAssertEqual ( delegate . numFilesUnzipped , 2 );
XCTAssertTrue ( delegate . didUnzipArchive );
XCTAssertEqual ( delegate . loaded , delegate . total );
}
// Commented out to avoid checking in several gig file into the repository. Simply add a file named
// `LargeArchive.zip` to the project and uncomment out these lines to test.
//
//- (void)testUnzippingLargeFiles {
// NSString *zipPath = [[NSBundle bundleForClass:[self class]] pathForResource:@"LargeArchive" ofType:@"zip"];
// NSString *outputPath = [self _cachesPath:@"Large"];
//
2017-09-16 22:13:31 +08:00
// BOOL success = [SSZipArchive unzipFileAtPath:zipPath toDestination:outputPath];
// XCTAssertTrue(success);
2015-10-23 14:15:31 -04:00
//}
-( void ) testShouldProvidePathOfUnzippedFileInDelegateCallback {
CollectingDelegate * collector = [ CollectingDelegate new ];
NSString * zipPath = [[ NSBundle bundleForClass :[ self class ]] pathForResource : @"TestArchive" ofType : @"zip" ];
2017-09-14 00:31:27 +08:00
NSString * outputPath = [ self _cachesPath : @"Regular" ];
2017-09-16 22:13:31 +08:00
BOOL success = [ SSZipArchive unzipFileAtPath : zipPath toDestination : outputPath delegate : collector ];
XCTAssertTrue ( success );
2015-10-23 14:15:31 -04:00
// STAssertEqualObjects([collector.files objectAtIndex:0], @"LICENSE.txt", nil);
// STAssertEqualObjects([collector.files objectAtIndex:1], @"README.md", nil);
}
#pragma mark - SSZipArchiveDelegate
- ( void ) zipArchiveWillUnzipArchiveAtPath: ( NSString * ) path zipInfo: ( unz_global_info ) zipInfo {
NSLog ( @"*** zipArchiveWillUnzipArchiveAtPath: `%@` zipInfo:" , path );
}
- ( void ) zipArchiveDidUnzipArchiveAtPath: ( NSString * ) path zipInfo: ( unz_global_info ) zipInfo unzippedPath: ( NSString * ) unzippedPath {
NSLog ( @"*** zipArchiveDidUnzipArchiveAtPath: `%@` zipInfo: unzippedPath: `%@`" , path , unzippedPath );
}
- ( BOOL ) zipArchiveShouldUnzipFileAtIndex: ( NSInteger ) fileIndex totalFiles: ( NSInteger ) totalFiles archivePath: ( NSString * ) archivePath fileInfo: ( unz_file_info ) fileInfo
{
NSLog ( @"*** zipArchiveShouldUnzipFileAtIndex: `%d` totalFiles: `%d` archivePath: `%@` fileInfo:" , ( int ) fileIndex , ( int ) totalFiles , archivePath );
return YES ;
}
- ( void ) zipArchiveWillUnzipFileAtIndex: ( NSInteger ) fileIndex totalFiles: ( NSInteger ) totalFiles archivePath: ( NSString * ) archivePath fileInfo: ( unz_file_info ) fileInfo {
NSLog ( @"*** zipArchiveWillUnzipFileAtIndex: `%d` totalFiles: `%d` archivePath: `%@` fileInfo:" , ( int ) fileIndex , ( int ) totalFiles , archivePath );
}
- ( void ) zipArchiveDidUnzipFileAtIndex: ( NSInteger ) fileIndex totalFiles: ( NSInteger ) totalFiles archivePath: ( NSString * ) archivePath fileInfo: ( unz_file_info ) fileInfo {
NSLog ( @"*** zipArchiveDidUnzipFileAtIndex: `%d` totalFiles: `%d` archivePath: `%@` fileInfo:" , ( int ) fileIndex , ( int ) totalFiles , archivePath );
}
2016-01-27 09:00:58 -08:00
- ( void ) zipArchiveProgressEvent: ( unsigned long long ) loaded total: ( unsigned long long ) total {
NSLog ( @"*** zipArchiveProgressEvent: loaded: `%llu` total: `%llu`" , loaded , total );
2015-10-23 14:15:31 -04:00
[ progressEvents addObject : @( loaded ) ];
}
#pragma mark - Private
- ( NSString * ) _cachesPath: ( NSString * ) directory {
2017-09-14 00:31:27 +08:00
NSString * path = [ NSSearchPathForDirectoriesInDomains ( NSCachesDirectory , NSUserDomainMask , YES ). lastObject
2015-10-23 14:15:31 -04:00
stringByAppendingPathComponent : @"com.samsoffes.ssziparchive.tests" ];
if ( directory ) {
path = [ path stringByAppendingPathComponent : directory ];
}
NSFileManager * fileManager = [ NSFileManager defaultManager ];
if ( ! [ fileManager fileExistsAtPath : path ]) {
[ fileManager createDirectoryAtPath : path withIntermediateDirectories : YES attributes : nil error : nil ];
}
return path ;
}
// Taken from https://github.com/samsoffes/sstoolkit/blob/master/SSToolkit/NSData+SSToolkitAdditions.m
- ( NSString * ) _calculateMD5Digest: ( NSData * ) data {
unsigned char digest [ CC_MD5_DIGEST_LENGTH ], i ;
CC_MD5 ( data . bytes , ( unsigned int ) data . length , digest );
NSMutableString * ms = [ NSMutableString string ];
for ( i = 0 ; i < CC_MD5_DIGEST_LENGTH ; i ++ ) {
[ ms appendFormat : @"%02x" , ( int )( digest [ i ])];
}
return [ ms copy ];
}
@end