Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 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
4 changes: 4 additions & 0 deletions packages/camera/camera_avfoundation/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 0.9.18+4

* Refactors implementations to reduce usage of OCMock in internal testing.

## 0.9.18+3

* Refactors implementations to reduce usage of OCMock in internal testing.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
7FA99E592D22C75300582559 /* CameraExposureTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7FA99E582D22C75300582559 /* CameraExposureTests.m */; };
7FCEDD352D43C2B900EA1CA8 /* MockDeviceOrientationProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 7FCEDD342D43C2B900EA1CA8 /* MockDeviceOrientationProvider.m */; };
7FCEDD362D43C2B900EA1CA8 /* MockCaptureDevice.m in Sources */ = {isa = PBXBuildFile; fileRef = 7FCEDD322D43C2B900EA1CA8 /* MockCaptureDevice.m */; };
7FD582352D57D97C003B1200 /* MockCaptureDeviceFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 7FD582342D57D97C003B1200 /* MockCaptureDeviceFormat.m */; };
7FD582122D579650003B1200 /* MockWritableData.m in Sources */ = {isa = PBXBuildFile; fileRef = 7FD582112D579650003B1200 /* MockWritableData.m */; };
7FD582202D579ECC003B1200 /* MockCapturePhotoOutput.m in Sources */ = {isa = PBXBuildFile; fileRef = 7FD5821F2D579ECC003B1200 /* MockCapturePhotoOutput.m */; };
978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; };
Expand Down Expand Up @@ -104,6 +105,8 @@
7FCEDD322D43C2B900EA1CA8 /* MockCaptureDevice.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MockCaptureDevice.m; sourceTree = "<group>"; };
7FCEDD332D43C2B900EA1CA8 /* MockDeviceOrientationProvider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MockDeviceOrientationProvider.h; sourceTree = "<group>"; };
7FCEDD342D43C2B900EA1CA8 /* MockDeviceOrientationProvider.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MockDeviceOrientationProvider.m; sourceTree = "<group>"; };
7FD582342D57D97C003B1200 /* MockCaptureDeviceFormat.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MockCaptureDeviceFormat.m; sourceTree = "<group>"; };
7FD582362D57D989003B1200 /* MockCaptureDeviceFormat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MockCaptureDeviceFormat.h; sourceTree = "<group>"; };
7FD582112D579650003B1200 /* MockWritableData.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MockWritableData.m; sourceTree = "<group>"; };
7FD582132D57965A003B1200 /* MockWritableData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MockWritableData.h; sourceTree = "<group>"; };
7FD5821F2D579ECC003B1200 /* MockCapturePhotoOutput.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MockCapturePhotoOutput.m; sourceTree = "<group>"; };
Expand Down Expand Up @@ -205,6 +208,8 @@
7F8FD2272D4BFA8D001AF2C1 /* MockGlobalEventApi.h */,
7FCEDD312D43C2B900EA1CA8 /* MockCaptureDevice.h */,
7FCEDD322D43C2B900EA1CA8 /* MockCaptureDevice.m */,
7FD582362D57D989003B1200 /* MockCaptureDeviceFormat.h */,
7FD582342D57D97C003B1200 /* MockCaptureDeviceFormat.m */,
7FD582212D579ED9003B1200 /* MockCapturePhotoOutput.h */,
7FD5821F2D579ECC003B1200 /* MockCapturePhotoOutput.m */,
7FCEDD332D43C2B900EA1CA8 /* MockDeviceOrientationProvider.h */,
Expand Down Expand Up @@ -516,6 +521,7 @@
7FA99E592D22C75300582559 /* CameraExposureTests.m in Sources */,
E487C86026D686A10034AC92 /* CameraPreviewPauseTests.m in Sources */,
E071CF7427B31DE4006EF3BA /* FLTCamSampleBufferTests.m in Sources */,
7FD582352D57D97C003B1200 /* MockCaptureDeviceFormat.m in Sources */,
7F29EB222D269ED500740257 /* MockEventChannel.m in Sources */,
7F8FD22F2D4D0B88001AF2C1 /* MockFlutterBinaryMessenger.m in Sources */,
E04F108627A87CA600573D0C /* FLTSavePhotoDelegateTests.m in Sources */,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,10 @@ - (void)setUp {
_mockDeviceOrientationProvider = [[MockDeviceOrientationProvider alloc] init];
_mockDevice = mockDevice;

_camera = FLTCreateCamWithCaptureSessionQueueAndMediaSettings(
nil, nil, nil,
^NSObject<FLTCaptureDevice> *(void) {
return mockDevice;
},
_mockDeviceOrientationProvider);
FLTCamConfiguration *configuration = FLTCreateTestCameraConfiguration();
configuration.captureDeviceFactory = ^NSObject<FLTCaptureDevice> *_Nonnull { return mockDevice; };
configuration.deviceOrientationProvider = _mockDeviceOrientationProvider;
_camera = FLTCreateCamWithConfiguration(configuration);
}

- (void)testSetExposurePointWithResult_SetsExposurePointOfInterest {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,10 @@ - (void)setUp {
_mockDevice = mockDevice;
_mockDeviceOrientationProvider = [[MockDeviceOrientationProvider alloc] init];

_camera = FLTCreateCamWithCaptureSessionQueueAndMediaSettings(
nil, nil, nil,
^NSObject<FLTCaptureDevice> *(void) {
return mockDevice;
},
_mockDeviceOrientationProvider);
FLTCamConfiguration *configuration = FLTCreateTestCameraConfiguration();
configuration.captureDeviceFactory = ^NSObject<FLTCaptureDevice> *_Nonnull { return mockDevice; };
configuration.deviceOrientationProvider = _mockDeviceOrientationProvider;
_camera = FLTCreateCamWithConfiguration(configuration);
}

- (void)testAutoFocusWithContinuousModeSupported_ShouldSetContinuousAutoFocus {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,34 +8,40 @@
#endif
@import XCTest;
@import AVFoundation;
#import <OCMock/OCMock.h>

#import "MockCameraDeviceDiscoverer.h"
#import "MockCaptureDevice.h"
#import "MockCaptureSession.h"
#import "MockFlutterBinaryMessenger.h"
#import "MockFlutterTextureRegistry.h"
#import "MockGlobalEventApi.h"

@interface CameraMethodChannelTests : XCTestCase
@end

@implementation CameraMethodChannelTests

- (CameraPlugin *)createCameraPlugin {
- (CameraPlugin *)createCameraPluginWithSession:(MockCaptureSession *)mockSession {
return [[CameraPlugin alloc] initWithRegistry:[[MockFlutterTextureRegistry alloc] init]
messenger:[[MockFlutterBinaryMessenger alloc] init]];
messenger:[[MockFlutterBinaryMessenger alloc] init]
globalAPI:[[MockGlobalEventApi alloc] init]
deviceDiscoverer:[[MockCameraDeviceDiscoverer alloc] init]
deviceFactory:^NSObject<FLTCaptureDevice> *(NSString *name) {
return [[MockCaptureDevice alloc] init];
}
captureSessionFactory:^NSObject<FLTCaptureSession> *_Nonnull {
return mockSession;
}
captureDeviceInputFactory:[[MockCaptureDeviceInputFactory alloc] init]];
}

- (void)testCreate_ShouldCallResultOnMainThread {
CameraPlugin *camera = [self createCameraPlugin];
MockCaptureSession *avCaptureSessionMock = [[MockCaptureSession alloc] init];
avCaptureSessionMock.canSetSessionPreset = YES;

XCTestExpectation *expectation = [self expectationWithDescription:@"Result finished"];

// Set up mocks for initWithCameraName method
id avCaptureDeviceInputMock = OCMClassMock([AVCaptureDeviceInput class]);
OCMStub([avCaptureDeviceInputMock deviceInputWithDevice:[OCMArg any] error:[OCMArg anyObjectRef]])
.andReturn([AVCaptureInput alloc]);
CameraPlugin *camera = [self createCameraPluginWithSession:avCaptureSessionMock];

id avCaptureSessionMock = OCMClassMock([AVCaptureSession class]);
OCMStub([avCaptureSessionMock alloc]).andReturn(avCaptureSessionMock);
OCMStub([avCaptureSessionMock canSetSessionPreset:[OCMArg any]]).andReturn(YES);
XCTestExpectation *expectation = [self expectationWithDescription:@"Result finished"];

// Set up method call
__block NSNumber *resultValue;
Expand All @@ -59,15 +65,10 @@ - (void)testCreate_ShouldCallResultOnMainThread {
}

- (void)testDisposeShouldDeallocCamera {
CameraPlugin *camera = [self createCameraPlugin];

id avCaptureDeviceInputMock = OCMClassMock([AVCaptureDeviceInput class]);
OCMStub([avCaptureDeviceInputMock deviceInputWithDevice:[OCMArg any] error:[OCMArg anyObjectRef]])
.andReturn([AVCaptureInput alloc]);
MockCaptureSession *avCaptureSessionMock = [[MockCaptureSession alloc] init];
avCaptureSessionMock.canSetSessionPreset = YES;

id avCaptureSessionMock = OCMClassMock([AVCaptureSession class]);
OCMStub([avCaptureSessionMock alloc]).andReturn(avCaptureSessionMock);
OCMStub([avCaptureSessionMock canSetSessionPreset:[OCMArg any]]).andReturn(YES);
CameraPlugin *camera = [self createCameraPluginWithSession:avCaptureSessionMock];

XCTestExpectation *createExpectation =
[self expectationWithDescription:@"create's result block must be called"];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,11 @@

@import AVFoundation;
@import XCTest;
#import <OCMock/OCMock.h>

#import "CameraTestUtils.h"
#import "MockCaptureDevice.h"
#import "MockCaptureDeviceFormat.h"
#import "MockCaptureSession.h"

/// Includes test cases related to resolution presets setting operations for FLTCam class.
@interface FLTCamSessionPresetsTest : XCTestCase
Expand All @@ -20,62 +23,97 @@ @implementation FLTCamSessionPresetsTest

- (void)testResolutionPresetWithBestFormat_mustUpdateCaptureSessionPreset {
NSString *expectedPreset = AVCaptureSessionPresetInputPriority;

id videoSessionMock = OCMProtocolMock(@protocol(FLTCaptureSession));
OCMStub([videoSessionMock addInputWithNoConnections:[OCMArg any]]);

id captureFormatMock = OCMClassMock([AVCaptureDeviceFormat class]);
id captureDeviceMock = OCMProtocolMock(@protocol(FLTCaptureDevice));
OCMStub([captureDeviceMock formats]).andReturn(@[ captureFormatMock ]);

OCMExpect([captureDeviceMock activeFormat]).andReturn(captureFormatMock);
OCMExpect([captureDeviceMock lockForConfiguration:NULL]).andReturn(YES);
OCMExpect([videoSessionMock setSessionPreset:expectedPreset]);

FLTCreateCamWithVideoDimensionsForFormat(videoSessionMock, FCPPlatformResolutionPresetMax,
captureDeviceMock,
^CMVideoDimensions(AVCaptureDeviceFormat *format) {
CMVideoDimensions videoDimensions;
videoDimensions.width = 1;
videoDimensions.height = 1;
return videoDimensions;
});

OCMVerifyAll(captureDeviceMock);
OCMVerifyAll(videoSessionMock);
XCTestExpectation *presetExpectation = [self expectationWithDescription:@"Expected preset set"];
XCTestExpectation *lockForConfigurationExpectation =
[self expectationWithDescription:@"Expected lockForConfiguration called"];

MockCaptureSession *videoSessionMock = [[MockCaptureSession alloc] init];
videoSessionMock.setSessionPresetStub = ^(NSString *preset) {
if (preset == expectedPreset) {
[presetExpectation fulfill];
}
};

MockCaptureDeviceFormat *captureFormatMock = [[MockCaptureDeviceFormat alloc] init];

MockCaptureDevice *captureDeviceMock = [[MockCaptureDevice alloc] init];
captureDeviceMock.formats = @[ captureFormatMock ];
captureDeviceMock.activeFormat = captureFormatMock;
captureDeviceMock.lockForConfigurationStub =
^BOOL(NSError *__autoreleasing _Nullable *_Nullable error) {
[lockForConfigurationExpectation fulfill];
return YES;
};

FLTCamConfiguration *configuration = FLTCreateTestCameraConfiguration();
configuration.captureDeviceFactory = ^NSObject<FLTCaptureDevice> *_Nonnull {
return captureDeviceMock;
};
configuration.videoDimensionsForFormat =
^CMVideoDimensions(NSObject<FLTCaptureDeviceFormat> *format) {
CMVideoDimensions videoDimensions;
videoDimensions.width = 1;
videoDimensions.height = 1;
return videoDimensions;
};
configuration.videoCaptureSession = videoSessionMock;
configuration.mediaSettings = FCPGetDefaultMediaSettings(FCPPlatformResolutionPresetMax);

FLTCreateCamWithConfiguration(configuration);

[self waitForExpectationsWithTimeout:1 handler:nil];
}

- (void)testResolutionPresetWithCanSetSessionPresetMax_mustUpdateCaptureSessionPreset {
NSString *expectedPreset = AVCaptureSessionPreset3840x2160;
XCTestExpectation *expectation = [self expectationWithDescription:@"Expected preset set"];

id videoSessionMock = OCMProtocolMock(@protocol(FLTCaptureSession));
OCMStub([videoSessionMock addInputWithNoConnections:[OCMArg any]]);
MockCaptureSession *videoSessionMock = [[MockCaptureSession alloc] init];

// Make sure that setting resolution preset for session always succeeds.
OCMStub([videoSessionMock canSetSessionPreset:[OCMArg any]]).andReturn(YES);
videoSessionMock.canSetSessionPreset = YES;

OCMExpect([videoSessionMock setSessionPreset:expectedPreset]);
videoSessionMock.setSessionPresetStub = ^(NSString *preset) {
if (preset == expectedPreset) {
[expectation fulfill];
}
};

FLTCreateCamWithVideoCaptureSession(videoSessionMock, FCPPlatformResolutionPresetMax);
FLTCamConfiguration *configuration = FLTCreateTestCameraConfiguration();
configuration.videoCaptureSession = videoSessionMock;
configuration.mediaSettings = FCPGetDefaultMediaSettings(FCPPlatformResolutionPresetMax);
configuration.captureDeviceFactory = ^NSObject<FLTCaptureDevice> * {
return [[MockCaptureDevice alloc] init];
};

OCMVerifyAll(videoSessionMock);
FLTCreateCamWithConfiguration(configuration);

[self waitForExpectationsWithTimeout:1 handler:nil];
}

- (void)testResolutionPresetWithCanSetSessionPresetUltraHigh_mustUpdateCaptureSessionPreset {
NSString *expectedPreset = AVCaptureSessionPreset3840x2160;
XCTestExpectation *expectation = [self expectationWithDescription:@"Expected preset set"];

id videoSessionMock = OCMProtocolMock(@protocol(FLTCaptureSession));
OCMStub([videoSessionMock addInputWithNoConnections:[OCMArg any]]);
MockCaptureSession *videoSessionMock = [[MockCaptureSession alloc] init];

// Make sure that setting resolution preset for session always succeeds.
OCMStub([videoSessionMock canSetSessionPreset:[OCMArg any]]).andReturn(YES);
videoSessionMock.canSetSessionPreset = YES;

// Expect that setting "ultraHigh" resolutionPreset correctly updates videoCaptureSession.
OCMExpect([videoSessionMock setSessionPreset:expectedPreset]);
videoSessionMock.setSessionPresetStub = ^(NSString *preset) {
if (preset == expectedPreset) {
[expectation fulfill];
}
};

FLTCamConfiguration *configuration = FLTCreateTestCameraConfiguration();
configuration.videoCaptureSession = videoSessionMock;
configuration.mediaSettings = FCPGetDefaultMediaSettings(FCPPlatformResolutionPresetUltraHigh);

FLTCreateCamWithVideoCaptureSession(videoSessionMock, FCPPlatformResolutionPresetUltraHigh);
FLTCreateCamWithConfiguration(configuration);

OCMVerifyAll(videoSessionMock);
[self waitForExpectationsWithTimeout:1 handler:nil];
}

@end
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,14 @@
#endif
@import XCTest;
@import AVFoundation;
#import <OCMock/OCMock.h>

#import "CameraTestUtils.h"
#import "MockCameraDeviceDiscoverer.h"
#import "MockCaptureDevice.h"
#import "MockCaptureSession.h"
#import "MockFlutterBinaryMessenger.h"
#import "MockFlutterTextureRegistry.h"
#import "MockGlobalEventApi.h"

static const FCPPlatformResolutionPreset gTestResolutionPreset = FCPPlatformResolutionPresetMedium;
static const int gTestFramesPerSecond = 15;
Expand Down Expand Up @@ -68,11 +71,11 @@ - (void)unlockDevice:(AVCaptureDevice *)captureDevice {
[_unlockExpectation fulfill];
}

- (void)beginConfigurationForSession:(AVCaptureSession *)videoCaptureSession {
- (void)beginConfigurationForSession:(NSObject<FLTCaptureSession> *)videoCaptureSession {
[_beginConfigurationExpectation fulfill];
}

- (void)commitConfigurationForSession:(AVCaptureSession *)videoCaptureSession {
- (void)commitConfigurationForSession:(NSObject<FLTCaptureSession> *)videoCaptureSession {
[_commitConfigurationExpectation fulfill];
}

Expand Down Expand Up @@ -146,8 +149,10 @@ - (void)testSettings_shouldPassConfigurationToCameraDeviceAndWriter {
TestMediaSettingsAVWrapper *injectedWrapper =
[[TestMediaSettingsAVWrapper alloc] initWithTestCase:self];

FLTCam *camera = FLTCreateCamWithCaptureSessionQueueAndMediaSettings(
dispatch_queue_create("test", NULL), settings, injectedWrapper, nil, nil);
FLTCamConfiguration *configuration = FLTCreateTestCameraConfiguration();
configuration.mediaSettingsWrapper = injectedWrapper;
configuration.mediaSettings = settings;
FLTCam *camera = FLTCreateCamWithConfiguration(configuration);

// Expect FPS configuration is passed to camera device.
[self waitForExpectations:@[
Expand All @@ -170,21 +175,25 @@ - (void)testSettings_shouldPassConfigurationToCameraDeviceAndWriter {
}

- (void)testSettings_ShouldBeSupportedByMethodCall {
MockCaptureDevice *mockDevice = [[MockCaptureDevice alloc] init];
MockCaptureSession *mockSession = [[MockCaptureSession alloc] init];
mockSession.canSetSessionPreset = YES;

CameraPlugin *camera =
[[CameraPlugin alloc] initWithRegistry:[[MockFlutterTextureRegistry alloc] init]
messenger:[[MockFlutterBinaryMessenger alloc] init]];
messenger:[[MockFlutterBinaryMessenger alloc] init]
globalAPI:[[MockGlobalEventApi alloc] init]
deviceDiscoverer:[[MockCameraDeviceDiscoverer alloc] init]
deviceFactory:^NSObject<FLTCaptureDevice> *(NSString *name) {
return mockDevice;
}
captureSessionFactory:^NSObject<FLTCaptureSession> *_Nonnull {
return mockSession;
}
captureDeviceInputFactory:[[MockCaptureDeviceInputFactory alloc] init]];

XCTestExpectation *expectation = [self expectationWithDescription:@"Result finished"];

// Set up mocks for initWithCameraName method
id avCaptureDeviceInputMock = OCMClassMock([AVCaptureDeviceInput class]);
OCMStub([avCaptureDeviceInputMock deviceInputWithDevice:[OCMArg any] error:[OCMArg anyObjectRef]])
.andReturn([AVCaptureInput alloc]);

id avCaptureSessionMock = OCMClassMock([AVCaptureSession class]);
OCMStub([avCaptureSessionMock alloc]).andReturn(avCaptureSessionMock);
OCMStub([avCaptureSessionMock canSetSessionPreset:[OCMArg any]]).andReturn(YES);

// Set up method call
FCPPlatformMediaSettings *mediaSettings =
[FCPPlatformMediaSettings makeWithResolutionPreset:gTestResolutionPreset
Expand Down Expand Up @@ -215,10 +224,12 @@ - (void)testSettings_ShouldSelectFormatWhichSupports60FPS {
audioBitrate:@(gTestAudioBitrate)
enableAudio:gTestEnableAudio];

FLTCam *camera = FLTCreateCamWithCaptureSessionQueueAndMediaSettings(
dispatch_queue_create("test", NULL), settings, nil, nil, nil);
FLTCamConfiguration *configuration = FLTCreateTestCameraConfiguration();
configuration.mediaSettings = settings;
FLTCam *camera = FLTCreateCamWithConfiguration(configuration);

AVFrameRateRange *range = camera.captureDevice.activeFormat.videoSupportedFrameRateRanges[0];
NSObject<FLTFrameRateRange> *range =
camera.captureDevice.activeFormat.videoSupportedFrameRateRanges[0];
XCTAssertLessThanOrEqual(range.minFrameRate, 60);
XCTAssertGreaterThanOrEqual(range.maxFrameRate, 60);
}
Expand Down
Loading