/* * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #import #include "test/run_test.h" // Converting a C++ function pointer to an Objective-C block. typedef void(^TestBlock)(); TestBlock functionToBlock(void(*function)()) { return [^(void) { function(); } copy]; } // Class calling the test function on the platform specific thread. @interface TestRunner : NSObject { BOOL running_; } - (void)runAllTests:(TestBlock)ignored; - (BOOL)running; @end @implementation TestRunner - (id)init { self = [super init]; if (self) { running_ = YES; } return self; } - (void)runAllTests:(TestBlock)testBlock { @autoreleasepool { testBlock(); running_ = NO; } } - (BOOL)running { return running_; } @end namespace webrtc { namespace test { void RunTest(void(*test)()) { @autoreleasepool { [NSApplication sharedApplication]; // Convert the function pointer to an Objective-C block and call on a // separate thread, to avoid blocking the main thread. TestRunner *testRunner = [[TestRunner alloc] init]; TestBlock testBlock = functionToBlock(test); [NSThread detachNewThreadSelector:@selector(runAllTests:) toTarget:testRunner withObject:testBlock]; NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; while ([testRunner running] && [runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]) ; } } } // namespace test } // namespace webrtc