xref: /aosp_15_r20/external/webrtc/sdk/objc/unittests/RTCFileVideoCapturer_xctest.mm (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker/*
2*d9f75844SAndroid Build Coastguard Worker *  Copyright 2017 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker *
4*d9f75844SAndroid Build Coastguard Worker *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker */
10*d9f75844SAndroid Build Coastguard Worker
11*d9f75844SAndroid Build Coastguard Worker#import "components/capturer/RTCFileVideoCapturer.h"
12*d9f75844SAndroid Build Coastguard Worker
13*d9f75844SAndroid Build Coastguard Worker#import <XCTest/XCTest.h>
14*d9f75844SAndroid Build Coastguard Worker
15*d9f75844SAndroid Build Coastguard Worker#include "rtc_base/gunit.h"
16*d9f75844SAndroid Build Coastguard Worker
17*d9f75844SAndroid Build Coastguard WorkerNSString *const kTestFileName = @"foreman.mp4";
18*d9f75844SAndroid Build Coastguard Workerstatic const int kTestTimeoutMs = 5 * 1000;  // 5secs.
19*d9f75844SAndroid Build Coastguard Worker
20*d9f75844SAndroid Build Coastguard Worker@interface MockCapturerDelegate : NSObject <RTC_OBJC_TYPE (RTCVideoCapturerDelegate)>
21*d9f75844SAndroid Build Coastguard Worker
22*d9f75844SAndroid Build Coastguard Worker@property(nonatomic, assign) NSInteger capturedFramesCount;
23*d9f75844SAndroid Build Coastguard Worker
24*d9f75844SAndroid Build Coastguard Worker@end
25*d9f75844SAndroid Build Coastguard Worker
26*d9f75844SAndroid Build Coastguard Worker@implementation MockCapturerDelegate
27*d9f75844SAndroid Build Coastguard Worker@synthesize capturedFramesCount = _capturedFramesCount;
28*d9f75844SAndroid Build Coastguard Worker
29*d9f75844SAndroid Build Coastguard Worker- (void)capturer:(RTC_OBJC_TYPE(RTCVideoCapturer) *)capturer
30*d9f75844SAndroid Build Coastguard Worker    didCaptureVideoFrame:(RTC_OBJC_TYPE(RTCVideoFrame) *)frame {
31*d9f75844SAndroid Build Coastguard Worker  self.capturedFramesCount++;
32*d9f75844SAndroid Build Coastguard Worker}
33*d9f75844SAndroid Build Coastguard Worker
34*d9f75844SAndroid Build Coastguard Worker@end
35*d9f75844SAndroid Build Coastguard Worker
36*d9f75844SAndroid Build Coastguard WorkerNS_CLASS_AVAILABLE_IOS(10)
37*d9f75844SAndroid Build Coastguard Worker@interface RTCFileVideoCapturerTests : XCTestCase
38*d9f75844SAndroid Build Coastguard Worker
39*d9f75844SAndroid Build Coastguard Worker@property(nonatomic, strong) RTC_OBJC_TYPE(RTCFileVideoCapturer) * capturer;
40*d9f75844SAndroid Build Coastguard Worker@property(nonatomic, strong) MockCapturerDelegate *mockDelegate;
41*d9f75844SAndroid Build Coastguard Worker
42*d9f75844SAndroid Build Coastguard Worker@end
43*d9f75844SAndroid Build Coastguard Worker
44*d9f75844SAndroid Build Coastguard Worker@implementation RTCFileVideoCapturerTests
45*d9f75844SAndroid Build Coastguard Worker@synthesize capturer = _capturer;
46*d9f75844SAndroid Build Coastguard Worker@synthesize mockDelegate = _mockDelegate;
47*d9f75844SAndroid Build Coastguard Worker
48*d9f75844SAndroid Build Coastguard Worker- (void)setUp {
49*d9f75844SAndroid Build Coastguard Worker  self.mockDelegate = [[MockCapturerDelegate alloc] init];
50*d9f75844SAndroid Build Coastguard Worker  self.capturer = [[RTC_OBJC_TYPE(RTCFileVideoCapturer) alloc] initWithDelegate:self.mockDelegate];
51*d9f75844SAndroid Build Coastguard Worker}
52*d9f75844SAndroid Build Coastguard Worker
53*d9f75844SAndroid Build Coastguard Worker- (void)tearDown {
54*d9f75844SAndroid Build Coastguard Worker  self.capturer = nil;
55*d9f75844SAndroid Build Coastguard Worker  self.mockDelegate = nil;
56*d9f75844SAndroid Build Coastguard Worker}
57*d9f75844SAndroid Build Coastguard Worker
58*d9f75844SAndroid Build Coastguard Worker- (void)testCaptureWhenFileNotInBundle {
59*d9f75844SAndroid Build Coastguard Worker  __block BOOL errorOccured = NO;
60*d9f75844SAndroid Build Coastguard Worker
61*d9f75844SAndroid Build Coastguard Worker  RTCFileVideoCapturerErrorBlock errorBlock = ^void(NSError *error) {
62*d9f75844SAndroid Build Coastguard Worker    errorOccured = YES;
63*d9f75844SAndroid Build Coastguard Worker  };
64*d9f75844SAndroid Build Coastguard Worker
65*d9f75844SAndroid Build Coastguard Worker  [self.capturer startCapturingFromFileNamed:@"not_in_bundle.mov" onError:errorBlock];
66*d9f75844SAndroid Build Coastguard Worker  ASSERT_TRUE_WAIT(errorOccured, kTestTimeoutMs);
67*d9f75844SAndroid Build Coastguard Worker}
68*d9f75844SAndroid Build Coastguard Worker
69*d9f75844SAndroid Build Coastguard Worker- (void)testSecondStartCaptureCallFails {
70*d9f75844SAndroid Build Coastguard Worker  __block BOOL secondError = NO;
71*d9f75844SAndroid Build Coastguard Worker
72*d9f75844SAndroid Build Coastguard Worker  RTCFileVideoCapturerErrorBlock firstErrorBlock = ^void(NSError *error) {
73*d9f75844SAndroid Build Coastguard Worker    // This block should never be called.
74*d9f75844SAndroid Build Coastguard Worker    NSLog(@"Error: %@", [error userInfo]);
75*d9f75844SAndroid Build Coastguard Worker    ASSERT_TRUE(false);
76*d9f75844SAndroid Build Coastguard Worker  };
77*d9f75844SAndroid Build Coastguard Worker
78*d9f75844SAndroid Build Coastguard Worker  RTCFileVideoCapturerErrorBlock secondErrorBlock = ^void(NSError *error) {
79*d9f75844SAndroid Build Coastguard Worker    secondError = YES;
80*d9f75844SAndroid Build Coastguard Worker  };
81*d9f75844SAndroid Build Coastguard Worker
82*d9f75844SAndroid Build Coastguard Worker  [self.capturer startCapturingFromFileNamed:kTestFileName onError:firstErrorBlock];
83*d9f75844SAndroid Build Coastguard Worker  [self.capturer startCapturingFromFileNamed:kTestFileName onError:secondErrorBlock];
84*d9f75844SAndroid Build Coastguard Worker
85*d9f75844SAndroid Build Coastguard Worker  ASSERT_TRUE_WAIT(secondError, kTestTimeoutMs);
86*d9f75844SAndroid Build Coastguard Worker}
87*d9f75844SAndroid Build Coastguard Worker
88*d9f75844SAndroid Build Coastguard Worker- (void)testStartStopCapturer {
89*d9f75844SAndroid Build Coastguard Worker#if defined(__IPHONE_11_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0)
90*d9f75844SAndroid Build Coastguard Worker  if (@available(iOS 10, *)) {
91*d9f75844SAndroid Build Coastguard Worker    [self.capturer startCapturingFromFileNamed:kTestFileName onError:nil];
92*d9f75844SAndroid Build Coastguard Worker
93*d9f75844SAndroid Build Coastguard Worker    __block BOOL done = NO;
94*d9f75844SAndroid Build Coastguard Worker    __block NSInteger capturedFrames = -1;
95*d9f75844SAndroid Build Coastguard Worker    NSInteger capturedFramesAfterStop = -1;
96*d9f75844SAndroid Build Coastguard Worker
97*d9f75844SAndroid Build Coastguard Worker    // We're dispatching the `stopCapture` with delay to ensure the capturer has
98*d9f75844SAndroid Build Coastguard Worker    // had the chance to capture several frames.
99*d9f75844SAndroid Build Coastguard Worker    dispatch_time_t captureDelay = dispatch_time(DISPATCH_TIME_NOW, 2 * NSEC_PER_SEC);  // 2secs.
100*d9f75844SAndroid Build Coastguard Worker    dispatch_after(captureDelay, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
101*d9f75844SAndroid Build Coastguard Worker      capturedFrames = self.mockDelegate.capturedFramesCount;
102*d9f75844SAndroid Build Coastguard Worker      [self.capturer stopCapture];
103*d9f75844SAndroid Build Coastguard Worker      done = YES;
104*d9f75844SAndroid Build Coastguard Worker    });
105*d9f75844SAndroid Build Coastguard Worker    WAIT(done, kTestTimeoutMs);
106*d9f75844SAndroid Build Coastguard Worker
107*d9f75844SAndroid Build Coastguard Worker    capturedFramesAfterStop = self.mockDelegate.capturedFramesCount;
108*d9f75844SAndroid Build Coastguard Worker    ASSERT_TRUE(capturedFrames != -1);
109*d9f75844SAndroid Build Coastguard Worker    ASSERT_EQ(capturedFrames, capturedFramesAfterStop);
110*d9f75844SAndroid Build Coastguard Worker  }
111*d9f75844SAndroid Build Coastguard Worker#endif
112*d9f75844SAndroid Build Coastguard Worker}
113*d9f75844SAndroid Build Coastguard Worker
114*d9f75844SAndroid Build Coastguard Worker@end
115