diff options
-rw-r--r-- | Foundation/GTMNSThread+Blocks.h | 38 | ||||
-rw-r--r-- | Foundation/GTMNSThread+Blocks.m | 51 | ||||
-rw-r--r-- | Foundation/GTMNSThread+BlocksTest.m | 112 | ||||
-rw-r--r-- | GTM.xcodeproj/project.pbxproj | 16 | ||||
-rw-r--r-- | GTMiPhone.xcodeproj/project.pbxproj | 22 |
5 files changed, 237 insertions, 2 deletions
diff --git a/Foundation/GTMNSThread+Blocks.h b/Foundation/GTMNSThread+Blocks.h new file mode 100644 index 0000000..4c649c2 --- /dev/null +++ b/Foundation/GTMNSThread+Blocks.h @@ -0,0 +1,38 @@ +// +// 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. +// +// Based on http://www.informit.com/blogs/blog.aspx?uk=Ask-Big-Nerd-Ranch-Blocks-in-Objective-C + +#import <Foundation/Foundation.h> + +// Extension to NSThread to work with blocks. + +#if NS_BLOCKS_AVAILABLE + +@interface NSThread (GTMBlocksAdditions) + +// If self is not the current thread, the block will be called asynchronously +// and this method returns immediately. +// If self is the current thread, the block will be performed immediately, and +// then this method will return. +- (void)gtm_performBlock:(void (^)())block; + +- (void)gtm_performWaitingUntilDone:(BOOL)wait block:(void (^)())block; ++ (void)gtm_performBlockInBackground:(void (^)())block; +@end + +#endif // NS_BLOCKS_AVAILABLE diff --git a/Foundation/GTMNSThread+Blocks.m b/Foundation/GTMNSThread+Blocks.m new file mode 100644 index 0000000..a752ea7 --- /dev/null +++ b/Foundation/GTMNSThread+Blocks.m @@ -0,0 +1,51 @@ +// +// GTMNSThread+Blocks.m +// +// 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 "GTMNSThread+Blocks.h" + +#if NS_BLOCKS_AVAILABLE + +@implementation NSThread (GTMBlocksAdditions) + ++ (void)gtm_runBlockOnCurrentThread:(void (^)())block { + block(); +} + +- (void)gtm_performBlock:(void (^)())block { + if ([[NSThread currentThread] isEqual:self]) { + block(); + } else { + [self gtm_performWaitingUntilDone:NO block:block]; + } +} + +- (void)gtm_performWaitingUntilDone:(BOOL)wait block:(void (^)())block { + [NSThread performSelector:@selector(gtm_runBlockOnCurrentThread:) + onThread:self + withObject:[[block copy] autorelease] + waitUntilDone:wait]; +} + ++ (void)gtm_performBlockInBackground:(void (^)())block { + [NSThread performSelectorInBackground:@selector(gtm_runBlockOnCurrentThread:) + withObject:[[block copy] autorelease]]; +} + +@end + +#endif // NS_BLOCKS_AVAILABLE 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 diff --git a/GTM.xcodeproj/project.pbxproj b/GTM.xcodeproj/project.pbxproj index 8f0bfa4..84a4c48 100644 --- a/GTM.xcodeproj/project.pbxproj +++ b/GTM.xcodeproj/project.pbxproj @@ -233,6 +233,9 @@ 8BB77A0511B5A09900AB31AF /* GTMGoogleSearchTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BB77A0311B5A09900AB31AF /* GTMGoogleSearchTest.m */; }; 8BB77A0611B5A0A100AB31AF /* GTMGoogleSearch.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BB77A0211B5A09900AB31AF /* GTMGoogleSearch.m */; }; 8BB7802E11B6C4EA00AB31AF /* GTMGoogleSearch.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BB77A0111B5A09900AB31AF /* GTMGoogleSearch.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8BBD1F8C1519258A003152F0 /* GTMNSThread+Blocks.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BBD1F8A1519258A003152F0 /* GTMNSThread+Blocks.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8BBD1F8D1519258A003152F0 /* GTMNSThread+Blocks.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BBD1F8B1519258A003152F0 /* GTMNSThread+Blocks.m */; }; + 8BBD1F8F1519271A003152F0 /* GTMNSThread+BlocksTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BBD1F8E1519271A003152F0 /* GTMNSThread+BlocksTest.m */; }; 8BC046B90DAE8C4B00C2D1CA /* ApplicationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BC046B80DAE8C4B00C2D1CA /* ApplicationServices.framework */; }; 8BC04CD80DB003D800C2D1CA /* GTMMethodCheck.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B6F31F40DA3489B0052CA40 /* GTMMethodCheck.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8BC85150127A18D50046E0FB /* GTMServiceManagement.c in Sources */ = {isa = PBXBuildFile; fileRef = 8B414E861226FB1000D0064F /* GTMServiceManagement.c */; }; @@ -255,7 +258,7 @@ 8BEEA90D0DA7446300894774 /* GTMUnitTestingImage.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 8BEEA90A0DA7446300894774 /* GTMUnitTestingImage.tiff */; }; 8BEEA90E0DA7446300894774 /* GTMUnitTestingWindow.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 8BEEA90B0DA7446300894774 /* GTMUnitTestingWindow.tiff */; }; 8BEEA90F0DA7446300894774 /* GTMUnitTestingView.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 8BEEA90C0DA7446300894774 /* GTMUnitTestingView.tiff */; }; - 8BF2368F13CF67CB00F3FD82 /* GTMKeyValueAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BF2368D13CF67CB00F3FD82 /* GTMKeyValueAnimation.h */; }; + 8BF2368F13CF67CB00F3FD82 /* GTMKeyValueAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BF2368D13CF67CB00F3FD82 /* GTMKeyValueAnimation.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8BF2369013CF67CB00F3FD82 /* GTMKeyValueAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BF2368E13CF67CB00F3FD82 /* GTMKeyValueAnimation.m */; }; 8BF2369213CF694C00F3FD82 /* GTMKeyValueAnimationTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BF2369113CF694C00F3FD82 /* GTMKeyValueAnimationTest.m */; }; 8BF2555310F65B56000490C8 /* GTMTypeCasting.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BF2555110F65B56000490C8 /* GTMTypeCasting.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -771,6 +774,9 @@ 8BB77A0111B5A09900AB31AF /* GTMGoogleSearch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMGoogleSearch.h; sourceTree = "<group>"; }; 8BB77A0211B5A09900AB31AF /* GTMGoogleSearch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMGoogleSearch.m; sourceTree = "<group>"; }; 8BB77A0311B5A09900AB31AF /* GTMGoogleSearchTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMGoogleSearchTest.m; sourceTree = "<group>"; }; + 8BBD1F8A1519258A003152F0 /* GTMNSThread+Blocks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "GTMNSThread+Blocks.h"; sourceTree = "<group>"; }; + 8BBD1F8B1519258A003152F0 /* GTMNSThread+Blocks.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GTMNSThread+Blocks.m"; sourceTree = "<group>"; }; + 8BBD1F8E1519271A003152F0 /* GTMNSThread+BlocksTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GTMNSThread+BlocksTest.m"; sourceTree = "<group>"; }; 8BC046B80DAE8C4B00C2D1CA /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = /System/Library/Frameworks/ApplicationServices.framework; sourceTree = "<absolute>"; }; 8BC04D140DB0061300C2D1CA /* RunMacOSUnitTests.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = RunMacOSUnitTests.sh; sourceTree = "<group>"; }; 8BC85131127A18AE0046E0FB /* GTMServiceManagementTestingHarness */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = GTMServiceManagementTestingHarness; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -1548,6 +1554,9 @@ F43E4C250D4E361D0041161F /* GTMNSString+XML.h */, F43E4C260D4E361D0041161F /* GTMNSString+XML.m */, F43E4C270D4E361D0041161F /* GTMNSString+XMLTest.m */, + 8BBD1F8A1519258A003152F0 /* GTMNSThread+Blocks.h */, + 8BBD1F8B1519258A003152F0 /* GTMNSThread+Blocks.m */, + 8BBD1F8E1519271A003152F0 /* GTMNSThread+BlocksTest.m */, F43E4E5E0D4E5EC90041161F /* GTMNSData+zlib.h */, F43E4E5F0D4E5EC90041161F /* GTMNSData+zlib.m */, F43E4E600D4E5EC90041161F /* GTMNSData+zlibTest.m */, @@ -1747,8 +1756,9 @@ 8BCB59F011C00ED6009B6C40 /* GTMNSScanner+Unsigned.h in Headers */, 8B29080A11F8E1670064F50F /* GTMNSFileHandle+UniqueName.h in Headers */, 8B414E891226FB1000D0064F /* GTMServiceManagement.h in Headers */, - F42866B81267340A0090FE0F /* GTMURITemplate.h in Headers */, + 8BBD1F8C1519258A003152F0 /* GTMNSThread+Blocks.h in Headers */, 8BF2368F13CF67CB00F3FD82 /* GTMKeyValueAnimation.h in Headers */, + F42866B81267340A0090FE0F /* GTMURITemplate.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2309,6 +2319,7 @@ 8BFE6EA31282371200B5C894 /* GTMTransientRootProxyTest.m in Sources */, 8BFE6EA41282371200B5C894 /* GTMURITemplateTest.m in Sources */, 8BFE6EA51282371200B5C894 /* GTMValidatingContainersTest.m in Sources */, + 8BBD1F8F1519271A003152F0 /* GTMNSThread+BlocksTest.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2387,6 +2398,7 @@ 8B414E881226FB1000D0064F /* GTMServiceManagement.c in Sources */, F42866B91267340A0090FE0F /* GTMURITemplate.m in Sources */, 8BF2369013CF67CB00F3FD82 /* GTMKeyValueAnimation.m in Sources */, + 8BBD1F8D1519258A003152F0 /* GTMNSThread+Blocks.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/GTMiPhone.xcodeproj/project.pbxproj b/GTMiPhone.xcodeproj/project.pbxproj index 82586c3..41d7fb0 100644 --- a/GTMiPhone.xcodeproj/project.pbxproj +++ b/GTMiPhone.xcodeproj/project.pbxproj @@ -71,6 +71,12 @@ 8B5547CB0DB3BBF20014CC1C /* GTMUIKit+UnitTestingTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B5547C90DB3BBF20014CC1C /* GTMUIKit+UnitTestingTest.m */; }; 8B5A9E200E71CB6C005DA441 /* AddressBook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B5A9E1F0E71CB6C005DA441 /* AddressBook.framework */; }; 8B6C18740F3769D200E51E5D /* GTMNSObject+KeyValueObserving.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B6C18720F3769D200E51E5D /* GTMNSObject+KeyValueObserving.m */; }; + 8B6FF394151A664600B0642B /* GTMNSThread+Blocks.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B6FF392151A664600B0642B /* GTMNSThread+Blocks.m */; }; + 8B6FF395151A664600B0642B /* GTMNSThread+Blocks.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B6FF392151A664600B0642B /* GTMNSThread+Blocks.m */; }; + 8B6FF396151A664600B0642B /* GTMNSThread+BlocksTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B6FF393151A664600B0642B /* GTMNSThread+BlocksTest.m */; }; + 8B6FF397151A664600B0642B /* GTMNSThread+BlocksTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B6FF393151A664600B0642B /* GTMNSThread+BlocksTest.m */; }; + 8B6FF39A151A670100B0642B /* GTMFoundationUnitTestingUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B6FF399151A670100B0642B /* GTMFoundationUnitTestingUtilities.m */; }; + 8B6FF39B151A670100B0642B /* GTMFoundationUnitTestingUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B6FF399151A670100B0642B /* GTMFoundationUnitTestingUtilities.m */; }; 8B7DCEAA0DFF4C760017E983 /* GTMDevLogUnitTestingBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B7DCEA90DFF4C760017E983 /* GTMDevLogUnitTestingBridge.m */; }; 8B7DCEAD0DFF4CA60017E983 /* GTMUnitTestDevLog.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B7DCEAC0DFF4CA60017E983 /* GTMUnitTestDevLog.m */; }; 8BB78FA911B94D9500AB31AF /* GTMGoogleSearch.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BB78FA711B94D9500AB31AF /* GTMGoogleSearch.m */; }; @@ -363,6 +369,11 @@ 8B6C18710F3769D200E51E5D /* GTMNSObject+KeyValueObserving.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "GTMNSObject+KeyValueObserving.h"; sourceTree = "<group>"; }; 8B6C18720F3769D200E51E5D /* GTMNSObject+KeyValueObserving.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GTMNSObject+KeyValueObserving.m"; sourceTree = "<group>"; }; 8B6C18730F3769D200E51E5D /* GTMNSObject+KeyValueObservingTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GTMNSObject+KeyValueObservingTest.m"; sourceTree = "<group>"; }; + 8B6FF391151A664600B0642B /* GTMNSThread+Blocks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "GTMNSThread+Blocks.h"; sourceTree = "<group>"; }; + 8B6FF392151A664600B0642B /* GTMNSThread+Blocks.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GTMNSThread+Blocks.m"; sourceTree = "<group>"; }; + 8B6FF393151A664600B0642B /* GTMNSThread+BlocksTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GTMNSThread+BlocksTest.m"; sourceTree = "<group>"; }; + 8B6FF398151A670100B0642B /* GTMFoundationUnitTestingUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMFoundationUnitTestingUtilities.h; sourceTree = "<group>"; }; + 8B6FF399151A670100B0642B /* GTMFoundationUnitTestingUtilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMFoundationUnitTestingUtilities.m; sourceTree = "<group>"; }; 8B7DCEA90DFF4C760017E983 /* GTMDevLogUnitTestingBridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMDevLogUnitTestingBridge.m; sourceTree = "<group>"; }; 8B7DCEAB0DFF4CA60017E983 /* GTMUnitTestDevLog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMUnitTestDevLog.h; sourceTree = "<group>"; }; 8B7DCEAC0DFF4CA60017E983 /* GTMUnitTestDevLog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMUnitTestDevLog.m; sourceTree = "<group>"; }; @@ -710,6 +721,9 @@ 8BC0478A0DAE928A00C2D1CA /* GTMNSString+XML.h */, 8BC0478B0DAE928A00C2D1CA /* GTMNSString+XML.m */, 8BC0478C0DAE928A00C2D1CA /* GTMNSString+XMLTest.m */, + 8B6FF391151A664600B0642B /* GTMNSThread+Blocks.h */, + 8B6FF392151A664600B0642B /* GTMNSThread+Blocks.m */, + 8B6FF393151A664600B0642B /* GTMNSThread+BlocksTest.m */, 8BC0478D0DAE928A00C2D1CA /* GTMObjC2Runtime.h */, 8BC047900DAE928A00C2D1CA /* GTMObjectSingleton.h */, F418AFD40E755D44004FB565 /* GTMPath.h */, @@ -755,6 +769,8 @@ 8B7DCEA90DFF4C760017E983 /* GTMDevLogUnitTestingBridge.m */, 8BC047A00DAE928A00C2D1CA /* GTMCALayer+UnitTesting.h */, 8BC047A10DAE928A00C2D1CA /* GTMCALayer+UnitTesting.m */, + 8B6FF398151A670100B0642B /* GTMFoundationUnitTestingUtilities.h */, + 8B6FF399151A670100B0642B /* GTMFoundationUnitTestingUtilities.m */, 8B5547C70DB3BBF20014CC1C /* GTMUIKit+UnitTesting.m */, 8B5547C80DB3BBF20014CC1C /* GTMUIKit+UnitTesting.h */, 8B5547C90DB3BBF20014CC1C /* GTMUIKit+UnitTestingTest.m */, @@ -1122,6 +1138,9 @@ 169E1E301459AAE100E6F562 /* GTMUILocalizerTest.m in Sources */, BE9B794114FE9A2C004A993A /* GTMURLBuilderTest.m in Sources */, BE9B794314FE9A3E004A993A /* GTMURLBuilder.m in Sources */, + 8B6FF394151A664600B0642B /* GTMNSThread+Blocks.m in Sources */, + 8B6FF396151A664600B0642B /* GTMNSThread+BlocksTest.m in Sources */, + 8B6FF39A151A670100B0642B /* GTMFoundationUnitTestingUtilities.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1207,6 +1226,9 @@ F4D20F1B14852CA40001600C /* GTMValidatingContainersTest.m in Sources */, BE9B794214FE9A2E004A993A /* GTMURLBuilderTest.m in Sources */, BE9B794414FE9A3E004A993A /* GTMURLBuilder.m in Sources */, + 8B6FF395151A664600B0642B /* GTMNSThread+Blocks.m in Sources */, + 8B6FF397151A664600B0642B /* GTMNSThread+BlocksTest.m in Sources */, + 8B6FF39B151A670100B0642B /* GTMFoundationUnitTestingUtilities.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; |