Skip to content

[camera_avfoundation] Implementation swift migration - part 3 #9182

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -59,23 +59,13 @@ final class CameraOrientationTests: XCTestCase {
)
}

private func waitForRoundTrip(with queue: DispatchQueue) {
let expectation = self.expectation(description: "Queue flush")
queue.async {
DispatchQueue.main.async {
expectation.fulfill()
}
}
waitForExpectations(timeout: 30, handler: nil)
}

private func sendOrientation(
_ orientation: UIDeviceOrientation,
to cameraPlugin: CameraPlugin,
captureSessionQueue: DispatchQueue
) {
cameraPlugin.orientationChanged(createMockNotification(for: orientation))
waitForRoundTrip(with: captureSessionQueue)
waitForQueueRoundTrip(with: captureSessionQueue)
}

private func createMockNotification(for deviceOrientation: UIDeviceOrientation) -> Notification {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,16 +35,6 @@ final class CameraPluginInitializeCameraTests: XCTestCase {
return (cameraPlugin, mockCamera, mockGlobalEventApi, captureSessionQueue)
}

private func waitForRoundTrip(with queue: DispatchQueue) {
let expectation = self.expectation(description: "Queue flush")
queue.async {
DispatchQueue.main.async {
expectation.fulfill()
}
}
waitForExpectations(timeout: 30, handler: nil)
}

func testInitializeCamera_setsCameraOnFrameAvailableCallback() {
let (cameraPlugin, mockCamera, _, _) = createCameraPlugin()
let expectation = expectation(description: "Initialization completed")
Expand Down Expand Up @@ -93,7 +83,7 @@ final class CameraPluginInitializeCameraTests: XCTestCase {
XCTAssertNil(error)
}

waitForRoundTrip(with: captureSessionQueue)
waitForQueueRoundTrip(with: captureSessionQueue)

XCTAssertTrue(mockGlobalEventApi.deviceOrientationChangedCalled)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@ import XCTest

final class CameraPreviewPauseTests: XCTestCase {
func testPausePreviewWithResult_shouldPausePreview() {
let camera = FLTCam()
let camera = CameraTestUtils.createTestCamera()

camera.pausePreview()

XCTAssertTrue(camera.isPreviewPaused)
}

func testResumePreviewWithResult_shouldResumePreview() {
let camera = FLTCam()
let camera = CameraTestUtils.createTestCamera()

camera.resumePreview()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ final class CameraSessionPresetsTests: XCTestCase {
configuration.mediaSettings = CameraTestUtils.createDefaultMediaSettings(
resolutionPreset: FCPPlatformResolutionPreset.max)

let _ = FLTCam(configuration: configuration, error: nil)
let _ = CameraTestUtils.createTestCamera(configuration)

waitForExpectations(timeout: 30, handler: nil)
}
Expand All @@ -67,7 +67,7 @@ final class CameraSessionPresetsTests: XCTestCase {
resolutionPreset: FCPPlatformResolutionPreset.max)
configuration.captureDeviceFactory = { _ in MockCaptureDevice() }

let _ = FLTCam(configuration: configuration, error: nil)
let _ = CameraTestUtils.createTestCamera(configuration)

waitForExpectations(timeout: 30, handler: nil)
}
Expand All @@ -91,7 +91,7 @@ final class CameraSessionPresetsTests: XCTestCase {
configuration.mediaSettings = CameraTestUtils.createDefaultMediaSettings(
resolutionPreset: FCPPlatformResolutionPreset.ultraHigh)

let _ = FLTCam(configuration: configuration, error: nil)
let _ = CameraTestUtils.createTestCamera(configuration)

waitForExpectations(timeout: 30, handler: nil)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ final class CameraSettingsTests: XCTestCase {
let configuration = CameraTestUtils.createTestCameraConfiguration()
configuration.mediaSettingsWrapper = injectedWrapper
configuration.mediaSettings = settings
let camera = FLTCam(configuration: configuration, error: nil)
let camera = CameraTestUtils.createTestCamera(configuration)

// Expect FPS configuration is passed to camera device.
wait(
Expand Down Expand Up @@ -200,7 +200,7 @@ final class CameraSettingsTests: XCTestCase {

let configuration = CameraTestUtils.createTestCameraConfiguration()
configuration.mediaSettings = settings
let camera = FLTCam(configuration: configuration, error: nil)
let camera = CameraTestUtils.createTestCamera(configuration)

let range = camera.captureDevice.activeFormat.videoSupportedFrameRateRanges[0]
XCTAssertLessThanOrEqual(range.minFrameRate, 60)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import Foundation
import XCTest

// Import Objectice-C part of the implementation when SwiftPM is used.
#if canImport(camera_avfoundation_objc)
Expand Down Expand Up @@ -80,10 +80,20 @@ enum CameraTestUtils {
return configuration
}

static func createCameraWithCaptureSessionQueue(_ captureSessionQueue: DispatchQueue) -> FLTCam {
static func createTestCamera(_ configuration: FLTCamConfiguration) -> FLTCam {
return FLTCam(configuration: configuration, error: nil)
}

static func createTestCamera() -> FLTCam {
return createTestCamera(createTestCameraConfiguration())
}

static func createCameraWithCaptureSessionQueue(_ captureSessionQueue: DispatchQueue)
-> FLTCam
{
let configuration = createTestCameraConfiguration()
configuration.captureSessionQueue = captureSessionQueue
return FLTCam(configuration: configuration, error: nil)
return createTestCamera(configuration)
}

/// Creates a test sample buffer.
Expand Down Expand Up @@ -116,7 +126,7 @@ enum CameraTestUtils {

/// Creates a test audio sample buffer.
/// @return a test audio sample buffer.
static func createTestAudioSampleBuffer() -> CMSampleBuffer? {
static func createTestAudioSampleBuffer() -> CMSampleBuffer {
var blockBuffer: CMBlockBuffer?
CMBlockBufferCreateWithMemoryBlock(
allocator: kCFAllocatorDefault,
Expand All @@ -129,8 +139,6 @@ enum CameraTestUtils {
flags: kCMBlockBufferAssureMemoryNowFlag,
blockBufferOut: &blockBuffer)

guard let blockBuffer = blockBuffer else { return nil }

var formatDescription: CMFormatDescription?
var basicDescription = AudioStreamBasicDescription(
mSampleRate: 44100,
Expand All @@ -156,13 +164,33 @@ enum CameraTestUtils {
var sampleBuffer: CMSampleBuffer?
CMAudioSampleBufferCreateReadyWithPacketDescriptions(
allocator: kCFAllocatorDefault,
dataBuffer: blockBuffer,
dataBuffer: blockBuffer!,
formatDescription: formatDescription!,
sampleCount: 1,
presentationTimeStamp: .zero,
packetDescriptions: nil,
sampleBufferOut: &sampleBuffer)

return sampleBuffer
return sampleBuffer!
}
}

extension XCTestCase {
/// Wait until a round trip of a given `DispatchQueue` is complete. This allows for testing
/// side-effects of async functions that do not provide any notification of completion.
func waitForQueueRoundTrip(with queue: DispatchQueue) {
let expectation = expectation(description: "Queue flush")

queue.async {
if queue == DispatchQueue.main {
expectation.fulfill()
} else {
DispatchQueue.main.async {
expectation.fulfill()
}
}
}

wait(for: [expectation], timeout: 1)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ final class FLTCamExposureTests: XCTestCase {
let configuration = CameraTestUtils.createTestCameraConfiguration()
configuration.captureDeviceFactory = { _ in mockDevice }
configuration.deviceOrientationProvider = mockDeviceOrientationProvider
let camera = FLTCam(configuration: configuration, error: nil)
let camera = CameraTestUtils.createTestCamera(configuration)

return (camera, mockDevice, mockDeviceOrientationProvider)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ final class FLTCamSetFocusModeTests: XCTestCase {
let configuration = CameraTestUtils.createTestCameraConfiguration()
configuration.captureDeviceFactory = { _ in mockDevice }
configuration.deviceOrientationProvider = mockDeviceOrientationProvider
let camera = FLTCam(configuration: configuration, error: nil)
let camera = CameraTestUtils.createTestCamera(configuration)

return (camera, mockDevice, mockDeviceOrientationProvider)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,7 @@ import XCTest

final class FLTCamSetDeviceOrientationTests: XCTestCase {
private func createCamera() -> (FLTCam, MockCaptureConnection, MockCaptureConnection) {
let configuration = CameraTestUtils.createTestCameraConfiguration()
let camera = FLTCam(configuration: configuration, error: nil)
let camera = CameraTestUtils.createTestCamera()

let mockCapturePhotoOutput = MockCapturePhotoOutput()
let mockPhotoCaptureConnection = MockCaptureConnection()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ final class FLTCamSetFlashModeTests: XCTestCase {

let configuration = CameraTestUtils.createTestCameraConfiguration()
configuration.captureDeviceFactory = { _ in mockDevice }
let camera = FLTCam(configuration: configuration, error: nil)
let camera = CameraTestUtils.createTestCamera(configuration)
camera.capturePhotoOutput = mockCapturePhotoOutput

return (camera, mockDevice, mockCapturePhotoOutput)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ final class FLTCamZoomTests: XCTestCase {

let configuration = CameraTestUtils.createTestCameraConfiguration()
configuration.captureDeviceFactory = { _ in mockDevice }
let camera = FLTCam(configuration: configuration, error: nil)
let camera = CameraTestUtils.createTestCamera(configuration)

return (camera, mockDevice)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ final class PhotoCaptureTests: XCTestCase {
private func createCam(with captureSessionQueue: DispatchQueue) -> FLTCam {
let configuration = CameraTestUtils.createTestCameraConfiguration()
configuration.captureSessionQueue = captureSessionQueue
return FLTCam(configuration: configuration, error: nil)
return CameraTestUtils.createTestCamera(configuration)
}

func testCaptureToFile_mustReportErrorToResultIfSavePhotoDelegateCompletionsWithError() {
Expand Down Expand Up @@ -174,7 +174,7 @@ final class PhotoCaptureTests: XCTestCase {
let configuration = CameraTestUtils.createTestCameraConfiguration()
configuration.captureSessionQueue = captureSessionQueue
configuration.captureDeviceFactory = { _ in captureDeviceMock }
let cam = FLTCam(configuration: configuration, error: nil)
let cam = CameraTestUtils.createTestCamera(configuration)

let filePath = "test"
let mockOutput = MockCapturePhotoOutput()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ final class StreamingTests: XCTestCase {
let configuration = CameraTestUtils.createTestCameraConfiguration()
configuration.captureSessionQueue = captureSessionQueue

let camera = FLTCam(configuration: configuration, error: nil)
let camera = CameraTestUtils.createTestCamera(configuration)
let sampleBuffer = CameraTestUtils.createTestSampleBuffer()

return (camera, sampleBuffer)
Expand All @@ -54,10 +54,8 @@ final class StreamingTests: XCTestCase {
let messenger = MockFlutterBinaryMessenger()
camera.startImageStream(with: messenger, imageStreamHandler: handlerMock)

let expectation = XCTKVOExpectation(
keyPath: "isStreamingImages", object: camera, expectedValue: true)
let result = XCTWaiter.wait(for: [expectation], timeout: 1)
XCTAssertEqual(result, .completed)
waitForQueueRoundTrip(with: DispatchQueue.main)
XCTAssertEqual(camera.isStreamingImages, true)

streamingExpectation.expectedFulfillmentCount = 4
for _ in 0..<10 {
Expand All @@ -78,10 +76,8 @@ final class StreamingTests: XCTestCase {
let messenger = MockFlutterBinaryMessenger()
camera.startImageStream(with: messenger, imageStreamHandler: handlerMock)

let expectation = XCTKVOExpectation(
keyPath: "isStreamingImages", object: camera, expectedValue: true)
let result = XCTWaiter.wait(for: [expectation], timeout: 1)
XCTAssertEqual(result, .completed)
waitForQueueRoundTrip(with: DispatchQueue.main)
XCTAssertEqual(camera.isStreamingImages, true)

streamingExpectation.expectedFulfillmentCount = 5
for _ in 0..<10 {
Expand Down