summaryrefslogtreecommitdiffstats
path: root/third_party/libwebrtc/test/mac/run_test.mm
blob: 38c6c8f8c1b61636d87035181d363c50d2dfea99 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/*
 *  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 <Cocoa/Cocoa.h>

#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