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 @@ @@ -104,4 +104,5 @@
104 @property (assign) BOOL shouldCancelAllRequestsOnFailure; 104 @property (assign) BOOL shouldCancelAllRequestsOnFailure;
105 @property (assign) id delegate; 105 @property (assign) id delegate;
106 @property (assign) BOOL showAccurateProgress; 106 @property (assign) BOOL showAccurateProgress;
  107 +@property (assign, readonly) int requestsCount;
107 @end 108 @end
@@ -177,18 +177,24 @@ @@ -177,18 +177,24 @@
177 - (void)requestDidFail:(ASIHTTPRequest *)request 177 - (void)requestDidFail:(ASIHTTPRequest *)request
178 { 178 {
179 [self setRequestsCount:[self requestsCount]-1]; 179 [self setRequestsCount:[self requestsCount]-1];
  180 + [self updateNetworkActivityIndicator];
180 if ([self requestDidFailSelector]) { 181 if ([self requestDidFailSelector]) {
181 [[self delegate] performSelector:[self requestDidFailSelector] withObject:request]; 182 [[self delegate] performSelector:[self requestDidFailSelector] withObject:request];
182 } 183 }
183 if ([self shouldCancelAllRequestsOnFailure] && [self requestsCount] > 0) { 184 if ([self shouldCancelAllRequestsOnFailure] && [self requestsCount] > 0) {
184 [self cancelAllOperations]; 185 [self cancelAllOperations];
185 } 186 }
186 - [self updateNetworkActivityIndicator]; 187 + if ([self requestsCount] == 0) {
  188 + if ([self queueDidFinishSelector]) {
  189 + [[self delegate] performSelector:[self queueDidFinishSelector] withObject:self];
  190 + }
  191 + }
187 } 192 }
188 193
189 - (void)requestDidFinish:(ASIHTTPRequest *)request 194 - (void)requestDidFinish:(ASIHTTPRequest *)request
190 { 195 {
191 [self setRequestsCount:[self requestsCount]-1]; 196 [self setRequestsCount:[self requestsCount]-1];
  197 + [self updateNetworkActivityIndicator];
192 if ([self requestDidFinishSelector]) { 198 if ([self requestDidFinishSelector]) {
193 [[self delegate] performSelector:[self requestDidFinishSelector] withObject:request]; 199 [[self delegate] performSelector:[self requestDidFinishSelector] withObject:request];
194 } 200 }
@@ -197,7 +203,6 @@ @@ -197,7 +203,6 @@
197 [[self delegate] performSelector:[self queueDidFinishSelector] withObject:self]; 203 [[self delegate] performSelector:[self queueDidFinishSelector] withObject:self];
198 } 204 }
199 } 205 }
200 - [self updateNetworkActivityIndicator];  
201 } 206 }
202 207
203 208
@@ -713,7 +713,7 @@ @@ -713,7 +713,7 @@
713 713
714 // Test compressed body 714 // Test compressed body
715 // Body is deflated by ASIHTTPRequest, sent, inflated by the server, printed, deflated by mod_deflate, response is inflated by ASIHTTPRequest 715 // Body is deflated by ASIHTTPRequest, sent, inflated by the server, printed, deflated by mod_deflate, response is inflated by ASIHTTPRequest
716 - ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://asi/ASIHTTPRequest/tests/compressed_post_body"]]; 716 + ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://allseeing-i.com/ASIHTTPRequest/tests/compressed_post_body"]];
717 [request setRequestMethod:@"PUT"]; 717 [request setRequestMethod:@"PUT"];
718 [request setShouldCompressRequestBody:YES]; 718 [request setShouldCompressRequestBody:YES];
719 [request appendPostData:data]; 719 [request appendPostData:data];
@@ -13,6 +13,7 @@ @@ -13,6 +13,7 @@
13 #endif 13 #endif
14 14
15 @class ASIHTTPRequest; 15 @class ASIHTTPRequest;
  16 +@class ASINetworkQueue;
16 17
17 @interface ASINetworkQueueTests : GHTestCase { 18 @interface ASINetworkQueueTests : GHTestCase {
18 ASIHTTPRequest *requestThatShouldFail; 19 ASIHTTPRequest *requestThatShouldFail;
@@ -24,6 +25,8 @@ @@ -24,6 +25,8 @@
24 NSOperationQueue *immediateCancelQueue; 25 NSOperationQueue *immediateCancelQueue;
25 NSMutableArray *failedRequests; 26 NSMutableArray *failedRequests;
26 NSMutableArray *finishedRequests; 27 NSMutableArray *finishedRequests;
  28 +
  29 + ASINetworkQueue *releaseTestQueue;
27 } 30 }
28 31
29 - (void)testFailure; 32 - (void)testFailure;
@@ -37,8 +40,11 @@ @@ -37,8 +40,11 @@
37 40
38 - (void)setProgress:(float)newProgress; 41 - (void)setProgress:(float)newProgress;
39 - (void)testSubclass; 42 - (void)testSubclass;
  43 +- (void)testQueueReleaseOnRequestComplete;
  44 +- (void)testQueueReleaseOnQueueComplete;
40 45
41 @property (retain) NSOperationQueue *immediateCancelQueue; 46 @property (retain) NSOperationQueue *immediateCancelQueue;
42 @property (retain) NSMutableArray *failedRequests; 47 @property (retain) NSMutableArray *failedRequests;
43 @property (retain) NSMutableArray *finishedRequests; 48 @property (retain) NSMutableArray *finishedRequests;
  49 +@property (retain) ASINetworkQueue *releaseTestQueue;
44 @end 50 @end
@@ -484,7 +484,7 @@ @@ -484,7 +484,7 @@
484 [self setImmediateCancelQueue:[[[NSOperationQueue alloc] init] autorelease]]; 484 [self setImmediateCancelQueue:[[[NSOperationQueue alloc] init] autorelease]];
485 int i; 485 int i;
486 for (i=0; i<100; i++) { 486 for (i=0; i<100; i++) {
487 - ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://asi"]]; 487 + ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://allseeing-i.com"]];
488 [request setDelegate:self]; 488 [request setDelegate:self];
489 [request setDidFailSelector:@selector(immediateCancelFail:)]; 489 [request setDidFailSelector:@selector(immediateCancelFail:)];
490 [request setDidFinishSelector:@selector(immediateCancelFinish:)]; 490 [request setDidFinishSelector:@selector(immediateCancelFinish:)];
@@ -530,8 +530,56 @@ @@ -530,8 +530,56 @@
530 BOOL success = [instance isKindOfClass:[ASINetworkQueueSubclass class]]; 530 BOOL success = [instance isKindOfClass:[ASINetworkQueueSubclass class]];
531 GHAssertTrue(success,@"Convenience constructor failed to return an instance of the correct class"); 531 GHAssertTrue(success,@"Convenience constructor failed to return an instance of the correct class");
532 } 532 }
  533 +
  534 +
  535 +// Test releasing the queue in a couple of ways - the purpose of these tests is really just to ensure we don't crash
  536 +- (void)testQueueReleaseOnRequestComplete
  537 +{
  538 + [[self releaseTestQueue] cancelAllOperations];
  539 + [self setReleaseTestQueue:[ASINetworkQueue queue]];
  540 + int i;
  541 + for (i=0; i<5; i++) {
  542 + ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://allseeing-i.com"]];
  543 + [request setDelegate:self];
  544 + [request setDidFailSelector:@selector(fail:)];
  545 + [request setDidFinishSelector:@selector(finish:)];
  546 + [[self releaseTestQueue] addOperation:request];
  547 + }
  548 +}
  549 +
  550 +- (void)fail:(ASIHTTPRequest *)request
  551 +{
  552 + if ([[self releaseTestQueue] requestsCount] == 0) {
  553 + [self setReleaseTestQueue:nil];
  554 + }
  555 +}
533 556
  557 +- (void)finish:(ASIHTTPRequest *)request
  558 +{
  559 + if ([[self releaseTestQueue] requestsCount] == 0) {
  560 + [self setReleaseTestQueue:nil];
  561 + }
  562 +}
  563 +
  564 +- (void)testQueueReleaseOnQueueComplete
  565 +{
  566 + [[self releaseTestQueue] cancelAllOperations];
  567 + [self setReleaseTestQueue:[ASINetworkQueue queue]];
  568 + [[self releaseTestQueue] setDelegate:self];
  569 + int i;
  570 + for (i=0; i<5; i++) {
  571 + ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://allseeing-i.com"]];
  572 + [[self releaseTestQueue] addOperation:request];
  573 + }
  574 +}
  575 +
  576 +- (void)queueComplete:(ASINetworkQueue *)queue
  577 +{
  578 + [self setReleaseTestQueue:nil];
  579 +}
  580 +
534 @synthesize immediateCancelQueue; 581 @synthesize immediateCancelQueue;
535 @synthesize failedRequests; 582 @synthesize failedRequests;
536 @synthesize finishedRequests; 583 @synthesize finishedRequests;
  584 +@synthesize releaseTestQueue;
537 @end 585 @end