FBSimulatorControlTests/Utilities/FBSimulatorControlAssertions.m (140 lines of code) (raw):
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#import "FBSimulatorControlAssertions.h"
#import <FBSimulatorControl/FBSimulatorControl.h>
#import "FBSimulatorControlTestCase.h"
@implementation XCTestCase (FBSimulatorControlAssertions)
#pragma mark Sessions
- (void)assertShutdownSimulatorAndTerminateSession:(FBSimulator *)simulator
{
NSError *error = nil;
BOOL success = [[simulator shutdown] await:&error] != nil;
XCTAssertNil(error);
XCTAssertTrue(success);
[[simulator erase] await:&error];
XCTAssertNil(error);
XCTAssertTrue(success);
[self assertSimulatorShutdown:simulator];
}
#pragma mark Strings
- (void)assertNeedle:(NSString *)needle inHaystack:(NSString *)haystack
{
XCTAssertNotNil(needle);
XCTAssertNotNil(haystack);
if ([haystack rangeOfString:needle].location != NSNotFound) {
return;
}
XCTFail(@"needle '%@' to be contained in haystack '%@'", needle, haystack);
}
#pragma mark Simulators
- (void)assertSimulatorBooted:(FBSimulator *)simulator
{
XCTAssertEqual(simulator.state, FBiOSTargetStateBooted);
}
- (void)assertSimulatorShutdown:(FBSimulator *)simulator
{
XCTAssertEqual(simulator.state, FBiOSTargetStateShutdown);
}
#pragma mark Processes
- (void)assertSimulator:(FBSimulator *)simulator isRunningApplicationFromConfiguration:(FBApplicationLaunchConfiguration *)launchConfiguration
{
NSError *error = nil;
NSNumber *processID = [[simulator processIDWithBundleID:launchConfiguration.bundleID] await:&error];
XCTAssertNil(error);
XCTAssertNotNil(processID);
}
#pragma mark Private
- (BOOL)expectContainerProcesses
{
return !FBSimulatorControlTestCase.useDirectLaunching;
}
@end
@implementation FBSimulatorControlTestCase (FBSimulatorControlAssertions)
- (FBFuture<FBSimulator *> *)assertObtainsSimulatorWithConfiguration:(FBSimulatorConfiguration *)configuration
{
NSError *error = nil;
if (![configuration checkRuntimeRequirementsReturningError:&error]) {
return [[FBSimulatorError
describeFormat:@"Configuration %@ does not meet the runtime requirements with error %@", configuration, error]
failFuture];
}
return [[self.control.set
createSimulatorWithConfiguration:configuration]
onQueue:dispatch_get_main_queue() chain:^(FBFuture *future) {
if (future.error) {
XCTFail(@"Error in device allocation %@", future.error);
}
return future;
}];
}
- (nullable FBSimulator *)assertObtainsSimulator
{
return [[self assertObtainsSimulatorWithConfiguration:self.simulatorConfiguration] await:nil];
}
- (nullable FBSimulator *)assertObtainsBootedSimulator
{
return [self assertObtainsBootedSimulatorWithConfiguration:self.simulatorConfiguration bootConfiguration:self.bootConfiguration];
}
- (nullable FBSimulator *)assertObtainsBootedSimulatorWithInstalledApplication:(FBBundleDescriptor *)application
{
FBSimulator *simulator = [self assertObtainsBootedSimulator];
if (!simulator) {
return nil;
}
NSError *error = nil;
BOOL success = [[simulator installApplicationWithPath:application.path] await:&error] != nil;
XCTAssertNil(error);
XCTAssertTrue(success);
return simulator;
}
- (nullable FBSimulator *)assertObtainsBootedSimulatorWithConfiguration:(FBSimulatorConfiguration *)configuration bootConfiguration:(FBSimulatorBootConfiguration *)bootConfiguration
{
FBSimulator *simulator = [[self assertObtainsSimulatorWithConfiguration:configuration] await:nil];
if (!simulator) {
return nil;
}
NSError *error = nil;
BOOL success = [[simulator boot:bootConfiguration] await:&error] != nil;
XCTAssertNil(error);
XCTAssertTrue(success);
return simulator;
}
- (nullable FBSimulator *)assertSimulator:(FBSimulator *)simulator installs:(FBBundleDescriptor *)application
{
NSError *error = nil;
BOOL success = [[simulator installApplicationWithPath:application.path] await:&error] != nil;
XCTAssertNil(error);
XCTAssertTrue(success);
return simulator;
}
- (nullable FBSimulator *)assertSimulator:(FBSimulator *)simulator launches:(FBApplicationLaunchConfiguration *)configuration
{
NSError *error = nil;
BOOL success = [[simulator launchApplication:configuration] await:&error] != nil;
XCTAssertNil(error);
XCTAssertTrue(success);
[self assertSimulator:simulator isRunningApplicationFromConfiguration:configuration];
[self assertSimulatorBooted:simulator];
success = [[simulator launchApplication:configuration] await:&error] != nil;
XCTAssertFalse(success);
return simulator;
}
- (nullable FBSimulator *)assertSimulatorWithConfiguration:(FBSimulatorConfiguration *)simulatorConfiguration boots:(FBSimulatorBootConfiguration *)bootConfiguration thenLaunchesApplication:(FBApplicationLaunchConfiguration *)launchConfiguration
{
FBSimulator *simulator = [self assertObtainsBootedSimulatorWithConfiguration:simulatorConfiguration bootConfiguration:bootConfiguration];
return [self assertSimulator:simulator launches:launchConfiguration];
}
- (nullable FBSimulator *)assertSimulatorWithConfiguration:(FBSimulatorConfiguration *)simulatorConfiguration boots:(FBSimulatorBootConfiguration *)bootConfiguration launchesThenRelaunchesApplication:(FBApplicationLaunchConfiguration *)launchConfiguration
{
FBSimulator *simulator = [self assertObtainsBootedSimulatorWithConfiguration:simulatorConfiguration bootConfiguration:bootConfiguration];
NSError *error = nil;
BOOL success = [[simulator launchApplication:launchConfiguration] await:&error] != nil;
XCTAssertNil(error);
XCTAssertTrue(success);
NSNumber *firstLaunch = [[simulator processIDWithBundleID:launchConfiguration.bundleID] await:nil];
success = [[simulator launchApplication:launchConfiguration] await:&error] != nil;
XCTAssertNil(error);
XCTAssertTrue(success);
NSNumber *secondLaunch = [[simulator processIDWithBundleID:launchConfiguration.bundleID] await:nil];
XCTAssertNotEqualObjects(firstLaunch, secondLaunch);
return simulator;
}
@end