/* * Copyright 2017 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 "components/capturer/RTCFileVideoCapturer.h" #import #include "rtc_base/gunit.h" NSString *const kTestFileName = @"foreman.mp4"; static const int kTestTimeoutMs = 5 * 1000; // 5secs. @interface MockCapturerDelegate : NSObject @property(nonatomic, assign) NSInteger capturedFramesCount; @end @implementation MockCapturerDelegate @synthesize capturedFramesCount = _capturedFramesCount; - (void)capturer:(RTC_OBJC_TYPE(RTCVideoCapturer) *)capturer didCaptureVideoFrame:(RTC_OBJC_TYPE(RTCVideoFrame) *)frame { self.capturedFramesCount++; } @end NS_CLASS_AVAILABLE_IOS(10) @interface RTCFileVideoCapturerTests : XCTestCase @property(nonatomic, strong) RTC_OBJC_TYPE(RTCFileVideoCapturer) * capturer; @property(nonatomic, strong) MockCapturerDelegate *mockDelegate; @end @implementation RTCFileVideoCapturerTests @synthesize capturer = _capturer; @synthesize mockDelegate = _mockDelegate; - (void)setUp { self.mockDelegate = [[MockCapturerDelegate alloc] init]; self.capturer = [[RTC_OBJC_TYPE(RTCFileVideoCapturer) alloc] initWithDelegate:self.mockDelegate]; } - (void)tearDown { self.capturer = nil; self.mockDelegate = nil; } - (void)testCaptureWhenFileNotInBundle { __block BOOL errorOccured = NO; RTCFileVideoCapturerErrorBlock errorBlock = ^void(NSError *error) { errorOccured = YES; }; [self.capturer startCapturingFromFileNamed:@"not_in_bundle.mov" onError:errorBlock]; ASSERT_TRUE_WAIT(errorOccured, kTestTimeoutMs); } - (void)testSecondStartCaptureCallFails { __block BOOL secondError = NO; RTCFileVideoCapturerErrorBlock firstErrorBlock = ^void(NSError *error) { // This block should never be called. NSLog(@"Error: %@", [error userInfo]); ASSERT_TRUE(false); }; RTCFileVideoCapturerErrorBlock secondErrorBlock = ^void(NSError *error) { secondError = YES; }; [self.capturer startCapturingFromFileNamed:kTestFileName onError:firstErrorBlock]; [self.capturer startCapturingFromFileNamed:kTestFileName onError:secondErrorBlock]; ASSERT_TRUE_WAIT(secondError, kTestTimeoutMs); } - (void)testStartStopCapturer { #if defined(__IPHONE_11_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0) if (@available(iOS 10, *)) { [self.capturer startCapturingFromFileNamed:kTestFileName onError:nil]; __block BOOL done = NO; __block NSInteger capturedFrames = -1; NSInteger capturedFramesAfterStop = -1; // We're dispatching the `stopCapture` with delay to ensure the capturer has // had the chance to capture several frames. dispatch_time_t captureDelay = dispatch_time(DISPATCH_TIME_NOW, 2 * NSEC_PER_SEC); // 2secs. dispatch_after(captureDelay, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ capturedFrames = self.mockDelegate.capturedFramesCount; [self.capturer stopCapture]; done = YES; }); WAIT(done, kTestTimeoutMs); capturedFramesAfterStop = self.mockDelegate.capturedFramesCount; ASSERT_TRUE(capturedFrames != -1); ASSERT_EQ(capturedFrames, capturedFramesAfterStop); } #endif } @end