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