Ben Copsey

Made requestsCount a public-readable property of ASINetworkQueue

Added some rough tests to check for crashes on queue dealloc
... ... @@ -104,4 +104,5 @@
@property (assign) BOOL shouldCancelAllRequestsOnFailure;
@property (assign) id delegate;
@property (assign) BOOL showAccurateProgress;
@property (assign, readonly) int requestsCount;
@end
... ...
... ... @@ -177,18 +177,24 @@
- (void)requestDidFail:(ASIHTTPRequest *)request
{
[self setRequestsCount:[self requestsCount]-1];
[self updateNetworkActivityIndicator];
if ([self requestDidFailSelector]) {
[[self delegate] performSelector:[self requestDidFailSelector] withObject:request];
}
if ([self shouldCancelAllRequestsOnFailure] && [self requestsCount] > 0) {
[self cancelAllOperations];
}
[self updateNetworkActivityIndicator];
if ([self requestsCount] == 0) {
if ([self queueDidFinishSelector]) {
[[self delegate] performSelector:[self queueDidFinishSelector] withObject:self];
}
}
}
- (void)requestDidFinish:(ASIHTTPRequest *)request
{
[self setRequestsCount:[self requestsCount]-1];
[self updateNetworkActivityIndicator];
if ([self requestDidFinishSelector]) {
[[self delegate] performSelector:[self requestDidFinishSelector] withObject:request];
}
... ... @@ -197,7 +203,6 @@
[[self delegate] performSelector:[self queueDidFinishSelector] withObject:self];
}
}
[self updateNetworkActivityIndicator];
}
... ...
... ... @@ -713,7 +713,7 @@
// Test compressed body
// Body is deflated by ASIHTTPRequest, sent, inflated by the server, printed, deflated by mod_deflate, response is inflated by ASIHTTPRequest
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://asi/ASIHTTPRequest/tests/compressed_post_body"]];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://allseeing-i.com/ASIHTTPRequest/tests/compressed_post_body"]];
[request setRequestMethod:@"PUT"];
[request setShouldCompressRequestBody:YES];
[request appendPostData:data];
... ...
... ... @@ -13,6 +13,7 @@
#endif
@class ASIHTTPRequest;
@class ASINetworkQueue;
@interface ASINetworkQueueTests : GHTestCase {
ASIHTTPRequest *requestThatShouldFail;
... ... @@ -24,6 +25,8 @@
NSOperationQueue *immediateCancelQueue;
NSMutableArray *failedRequests;
NSMutableArray *finishedRequests;
ASINetworkQueue *releaseTestQueue;
}
- (void)testFailure;
... ... @@ -37,8 +40,11 @@
- (void)setProgress:(float)newProgress;
- (void)testSubclass;
- (void)testQueueReleaseOnRequestComplete;
- (void)testQueueReleaseOnQueueComplete;
@property (retain) NSOperationQueue *immediateCancelQueue;
@property (retain) NSMutableArray *failedRequests;
@property (retain) NSMutableArray *finishedRequests;
@property (retain) ASINetworkQueue *releaseTestQueue;
@end
... ...
... ... @@ -484,7 +484,7 @@
[self setImmediateCancelQueue:[[[NSOperationQueue alloc] init] autorelease]];
int i;
for (i=0; i<100; i++) {
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://asi"]];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://allseeing-i.com"]];
[request setDelegate:self];
[request setDidFailSelector:@selector(immediateCancelFail:)];
[request setDidFinishSelector:@selector(immediateCancelFinish:)];
... ... @@ -531,7 +531,55 @@
GHAssertTrue(success,@"Convenience constructor failed to return an instance of the correct class");
}
// Test releasing the queue in a couple of ways - the purpose of these tests is really just to ensure we don't crash
- (void)testQueueReleaseOnRequestComplete
{
[[self releaseTestQueue] cancelAllOperations];
[self setReleaseTestQueue:[ASINetworkQueue queue]];
int i;
for (i=0; i<5; i++) {
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://allseeing-i.com"]];
[request setDelegate:self];
[request setDidFailSelector:@selector(fail:)];
[request setDidFinishSelector:@selector(finish:)];
[[self releaseTestQueue] addOperation:request];
}
}
- (void)fail:(ASIHTTPRequest *)request
{
if ([[self releaseTestQueue] requestsCount] == 0) {
[self setReleaseTestQueue:nil];
}
}
- (void)finish:(ASIHTTPRequest *)request
{
if ([[self releaseTestQueue] requestsCount] == 0) {
[self setReleaseTestQueue:nil];
}
}
- (void)testQueueReleaseOnQueueComplete
{
[[self releaseTestQueue] cancelAllOperations];
[self setReleaseTestQueue:[ASINetworkQueue queue]];
[[self releaseTestQueue] setDelegate:self];
int i;
for (i=0; i<5; i++) {
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://allseeing-i.com"]];
[[self releaseTestQueue] addOperation:request];
}
}
- (void)queueComplete:(ASINetworkQueue *)queue
{
[self setReleaseTestQueue:nil];
}
@synthesize immediateCancelQueue;
@synthesize failedRequests;
@synthesize finishedRequests;
@synthesize releaseTestQueue;
@end
... ...