192 lines
6.9 KiB
Objective-C
192 lines
6.9 KiB
Objective-C
//
|
|
// MultithreadingTests.m
|
|
// UnzipKit
|
|
//
|
|
// Created by Dov Frankel on 7/16/15.
|
|
// Copyright (c) 2015 Abbey Code. All rights reserved.
|
|
//
|
|
|
|
#import "UZKArchiveTestCase.h"
|
|
#import "UnzipKit.h"
|
|
#import "UnzipKitMacros.h"
|
|
|
|
@interface MultithreadingTests : UZKArchiveTestCase
|
|
@end
|
|
|
|
@implementation MultithreadingTests
|
|
|
|
|
|
#if !TARGET_OS_IPHONE
|
|
- (void)testMultithreading {
|
|
UZKArchive *largeArchiveA = [[UZKArchive alloc] initWithURL:[self largeArchive] error:nil];
|
|
UZKArchive *largeArchiveB = [[UZKArchive alloc] initWithURL:[self largeArchive] error:nil];
|
|
UZKArchive *largeArchiveC = [[UZKArchive alloc] initWithURL:[self largeArchive] error:nil];
|
|
|
|
XCTestExpectation *expectationA = [self expectationWithDescription:@"A finished"];
|
|
XCTestExpectation *expectationB = [self expectationWithDescription:@"B finished"];
|
|
XCTestExpectation *expectationC = [self expectationWithDescription:@"C finished"];
|
|
|
|
NSBlockOperation *enumerateA = [NSBlockOperation blockOperationWithBlock:^{
|
|
NSError *error = nil;
|
|
[largeArchiveA performOnDataInArchive:^(UZKFileInfo *fileInfo, NSData *fileData, BOOL *stop) {
|
|
UZKLogInfo("File name: %@", fileInfo.filename);
|
|
} error:&error];
|
|
|
|
XCTAssertNil(error, @"Failed enumeration A");
|
|
[expectationA fulfill];
|
|
}];
|
|
|
|
NSBlockOperation *enumerateB = [NSBlockOperation blockOperationWithBlock:^{
|
|
NSError *error = nil;
|
|
[largeArchiveB performOnDataInArchive:^(UZKFileInfo *fileInfo, NSData *fileData, BOOL *stop) {
|
|
UZKLogInfo("File name: %@", fileInfo.filename);
|
|
} error:&error];
|
|
|
|
XCTAssertNil(error, @"Failed enumeration B");
|
|
[expectationB fulfill];
|
|
}];
|
|
|
|
NSBlockOperation *enumerateC = [NSBlockOperation blockOperationWithBlock:^{
|
|
NSError *error = nil;
|
|
[largeArchiveC performOnDataInArchive:^(UZKFileInfo *fileInfo, NSData *fileData, BOOL *stop) {
|
|
UZKLogInfo("File name: %@", fileInfo.filename);
|
|
} error:&error];
|
|
|
|
XCTAssertNil(error, @"Failed enumeration C");
|
|
[expectationC fulfill];
|
|
}];
|
|
|
|
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
|
|
queue.maxConcurrentOperationCount = 3;
|
|
queue.suspended = YES;
|
|
|
|
[queue addOperation:enumerateA];
|
|
[queue addOperation:enumerateB];
|
|
[queue addOperation:enumerateC];
|
|
|
|
queue.suspended = NO;
|
|
|
|
[self waitForExpectationsWithTimeout:30 handler:^(NSError *error) {
|
|
if (error) {
|
|
UZKLogError("Error while waiting for expectations: %@", error);
|
|
}
|
|
}];
|
|
}
|
|
|
|
- (void)testMultithreading_SingleFile {
|
|
NSURL *largeArchiveURL = [self largeArchive];
|
|
|
|
UZKArchive *largeArchiveA = [[UZKArchive alloc] initWithURL:largeArchiveURL error:nil];
|
|
UZKArchive *largeArchiveB = [[UZKArchive alloc] initWithURL:largeArchiveURL error:nil];
|
|
UZKArchive *largeArchiveC = [[UZKArchive alloc] initWithURL:largeArchiveURL error:nil];
|
|
|
|
XCTestExpectation *expectationA = [self expectationWithDescription:@"A finished"];
|
|
XCTestExpectation *expectationB = [self expectationWithDescription:@"B finished"];
|
|
XCTestExpectation *expectationC = [self expectationWithDescription:@"C finished"];
|
|
|
|
NSBlockOperation *enumerateA = [NSBlockOperation blockOperationWithBlock:^{
|
|
NSError *error = nil;
|
|
[largeArchiveA performOnDataInArchive:^(UZKFileInfo *fileInfo, NSData *fileData, BOOL *stop) {
|
|
UZKLogInfo("File name: %@", fileInfo.filename);
|
|
} error:&error];
|
|
|
|
XCTAssertNil(error, @"Failed enumeration A");
|
|
[expectationA fulfill];
|
|
}];
|
|
|
|
NSBlockOperation *enumerateB = [NSBlockOperation blockOperationWithBlock:^{
|
|
NSError *error = nil;
|
|
[largeArchiveB performOnDataInArchive:^(UZKFileInfo *fileInfo, NSData *fileData, BOOL *stop) {
|
|
UZKLogInfo("File name: %@", fileInfo.filename);
|
|
} error:&error];
|
|
|
|
XCTAssertNil(error, @"Failed enumeration B");
|
|
[expectationB fulfill];
|
|
}];
|
|
|
|
NSBlockOperation *enumerateC = [NSBlockOperation blockOperationWithBlock:^{
|
|
NSError *error = nil;
|
|
[largeArchiveC performOnDataInArchive:^(UZKFileInfo *fileInfo, NSData *fileData, BOOL *stop) {
|
|
UZKLogInfo("File name: %@", fileInfo.filename);
|
|
} error:&error];
|
|
|
|
XCTAssertNil(error, @"Failed enumeration C");
|
|
[expectationC fulfill];
|
|
}];
|
|
|
|
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
|
|
queue.maxConcurrentOperationCount = 3;
|
|
queue.suspended = YES;
|
|
|
|
[queue addOperation:enumerateA];
|
|
[queue addOperation:enumerateB];
|
|
[queue addOperation:enumerateC];
|
|
|
|
queue.suspended = NO;
|
|
|
|
[self waitForExpectationsWithTimeout:30 handler:^(NSError *error) {
|
|
if (error) {
|
|
UZKLogError("Error while waiting for expectations: %@", error);
|
|
}
|
|
}];
|
|
}
|
|
|
|
- (void)testMultithreading_SingleArchiveObject {
|
|
|
|
UZKArchive *largeArchive = [[UZKArchive alloc] initWithURL:[self largeArchive] error:nil];
|
|
|
|
XCTestExpectation *expectationA = [self expectationWithDescription:@"A finished"];
|
|
XCTestExpectation *expectationB = [self expectationWithDescription:@"B finished"];
|
|
XCTestExpectation *expectationC = [self expectationWithDescription:@"C finished"];
|
|
|
|
NSBlockOperation *enumerateA = [NSBlockOperation blockOperationWithBlock:^{
|
|
NSError *error = nil;
|
|
[largeArchive performOnDataInArchive:^(UZKFileInfo *fileInfo, NSData *fileData, BOOL *stop) {
|
|
UZKLogInfo("File name: %@", fileInfo.filename);
|
|
} error:&error];
|
|
|
|
XCTAssertNil(error, @"Failed enumeration A");
|
|
[expectationA fulfill];
|
|
}];
|
|
|
|
NSBlockOperation *enumerateB = [NSBlockOperation blockOperationWithBlock:^{
|
|
NSError *error = nil;
|
|
[largeArchive performOnDataInArchive:^(UZKFileInfo *fileInfo, NSData *fileData, BOOL *stop) {
|
|
UZKLogInfo("File name: %@", fileInfo.filename);
|
|
} error:&error];
|
|
|
|
XCTAssertNil(error, @"Failed enumeration B");
|
|
[expectationB fulfill];
|
|
}];
|
|
|
|
NSBlockOperation *enumerateC = [NSBlockOperation blockOperationWithBlock:^{
|
|
NSError *error = nil;
|
|
[largeArchive performOnDataInArchive:^(UZKFileInfo *fileInfo, NSData *fileData, BOOL *stop) {
|
|
UZKLogInfo("File name: %@", fileInfo.filename);
|
|
} error:&error];
|
|
|
|
XCTAssertNil(error, @"Failed enumeration C");
|
|
[expectationC fulfill];
|
|
}];
|
|
|
|
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
|
|
queue.maxConcurrentOperationCount = 3;
|
|
queue.suspended = YES;
|
|
|
|
[queue addOperation:enumerateA];
|
|
[queue addOperation:enumerateB];
|
|
[queue addOperation:enumerateC];
|
|
|
|
queue.suspended = NO;
|
|
|
|
[self waitForExpectationsWithTimeout:30 handler:^(NSError *error) {
|
|
if (error) {
|
|
UZKLogError("Error while waiting for expectations: %@", error);
|
|
}
|
|
}];
|
|
}
|
|
#endif
|
|
|
|
|
|
@end
|