diff options
author | gtm.daemon <gtm.daemon@7dc7ac4e-7543-0410-b95c-c1676fc8e2a3> | 2012-03-21 20:00:20 +0000 |
---|---|---|
committer | gtm.daemon <gtm.daemon@7dc7ac4e-7543-0410-b95c-c1676fc8e2a3> | 2012-03-21 20:00:20 +0000 |
commit | 5a2410fb29ea63046f5147b871ad9cd957765b60 (patch) | |
tree | a3411d875d728944bcfbc6e9b7af27416f97cb4b /Foundation/GTMNSThread+BlocksTest.m | |
parent | 810aaaee42922022cf9e2ce94de71b14bf558f65 (diff) |
[Author: dmaclach]
Add a blocks API to NSThread.
R=thomasvl,grobbins
DELTA=238 (236 added, 1 deleted, 1 changed)
Diffstat (limited to 'Foundation/GTMNSThread+BlocksTest.m')
-rw-r--r-- | Foundation/GTMNSThread+BlocksTest.m | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/Foundation/GTMNSThread+BlocksTest.m b/Foundation/GTMNSThread+BlocksTest.m new file mode 100644 index 0000000..48fb715 --- /dev/null +++ b/Foundation/GTMNSThread+BlocksTest.m @@ -0,0 +1,112 @@ +// +// GTMNSThread+Blocks.h +// +// Copyright 2012 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. +// + +#import "GTMSenTestCase.h" +#import "GTMNSThread+Blocks.h" + +#import "GTMFoundationUnitTestingUtilities.h" + +@interface GTMNSThread_BlocksTest : GTMTestCase { + @private + NSThread *workerThread_; + BOOL workerRunning_; +} + +@property (nonatomic, readwrite, getter=isWorkerRunning) BOOL workerRunning; +@end + +@implementation GTMNSThread_BlocksTest + +@synthesize workerRunning = workerRunning_; + +- (void)stopTestRunning:(GTMUnitTestingBooleanRunLoopContext *)context{ + [context setShouldStop:YES]; +} + +- (void)workerMain:(id)object { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + while ([self isWorkerRunning]) { + [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode + beforeDate:[NSDate distantFuture]]; + } + [pool drain]; +} + +- (void)killWorkerThread:(GTMUnitTestingBooleanRunLoopContext *)context { + [self setWorkerRunning:NO]; + [context setShouldStop:YES]; +} + +- (void)setUp { + [self setWorkerRunning:YES]; + workerThread_ = [[NSThread alloc] initWithTarget:self + selector:@selector(workerMain:) + object:nil]; + [workerThread_ start]; +} + +- (void)tearDown { + GTMUnitTestingBooleanRunLoopContext *context + = [GTMUnitTestingBooleanRunLoopContext context]; + [self performSelector:@selector(killWorkerThread:) + onThread:workerThread_ + withObject:context + waitUntilDone:NO]; + NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; + STAssertTrue([runLoop gtm_runUpToSixtySecondsWithContext:context], nil); + [workerThread_ release]; +} + +- (void)testPerformBlock { + NSThread *currentThread = [NSThread currentThread]; + GTMUnitTestingBooleanRunLoopContext *context + = [GTMUnitTestingBooleanRunLoopContext context]; + [workerThread_ gtm_performBlock:^{ + [self performSelector:@selector(stopTestRunning:) + onThread:currentThread + withObject:context + waitUntilDone:YES]; + }]; + NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; + STAssertTrue([runLoop gtm_runUpToSixtySecondsWithContext:context], nil); +} + +- (void)testPerformBlockWaitUntilDone { + GTMUnitTestingBooleanRunLoopContext *context + = [GTMUnitTestingBooleanRunLoopContext context]; + [workerThread_ gtm_performWaitingUntilDone:YES block:^{ + [context setShouldStop:YES]; + }]; + STAssertTrue([context shouldStop], nil); +} + +- (void)testPerformBlockInBackground { + NSThread *currentThread = [NSThread currentThread]; + GTMUnitTestingBooleanRunLoopContext *context + = [GTMUnitTestingBooleanRunLoopContext context]; + [NSThread gtm_performBlockInBackground:^{ + [self performSelector:@selector(stopTestRunning:) + onThread:currentThread + withObject:context + waitUntilDone:YES]; + }]; + NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; + STAssertTrue([runLoop gtm_runUpToSixtySecondsWithContext:context], nil); +} + +@end |