xref: /aosp_15_r20/external/webrtc/test/mac/run_test.mm (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1/*
2 *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11#import <Cocoa/Cocoa.h>
12
13#include "test/run_test.h"
14
15// Converting a C++ function pointer to an Objective-C block.
16typedef void(^TestBlock)();
17TestBlock functionToBlock(void(*function)()) {
18  return [^(void) { function(); } copy];
19}
20
21// Class calling the test function on the platform specific thread.
22@interface TestRunner : NSObject {
23  BOOL running_;
24}
25- (void)runAllTests:(TestBlock)ignored;
26- (BOOL)running;
27@end
28
29@implementation TestRunner
30- (id)init {
31  self = [super init];
32  if (self) {
33    running_ = YES;
34  }
35  return self;
36}
37
38- (void)runAllTests:(TestBlock)testBlock {
39  @autoreleasepool {
40    testBlock();
41    running_ = NO;
42  }
43}
44
45- (BOOL)running {
46  return running_;
47}
48@end
49
50namespace webrtc {
51namespace test {
52
53void RunTest(void(*test)()) {
54  @autoreleasepool {
55    [NSApplication sharedApplication];
56
57    // Convert the function pointer to an Objective-C block and call on a
58    // separate thread, to avoid blocking the main thread.
59    TestRunner *testRunner = [[TestRunner alloc] init];
60    TestBlock testBlock = functionToBlock(test);
61    [NSThread detachNewThreadSelector:@selector(runAllTests:)
62                             toTarget:testRunner
63                           withObject:testBlock];
64
65    NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
66    while ([testRunner running] && [runLoop runMode:NSDefaultRunLoopMode
67                                         beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]])
68      ;
69  }
70}
71
72}  // namespace test
73}  // namespace webrtc
74