fix(shorebird_cli): forwarded arguments should exclude platform (#2077)

This commit is contained in:
Felix Angelov
2024-05-10 11:40:24 -07:00
committed by GitHub
parent 86f719c9ab
commit b93da1fd1b
28 changed files with 384 additions and 107 deletions
@@ -42,7 +42,7 @@ class ArtifactBuilder {
String? flavor,
String? target,
Iterable<Arch>? targetPlatforms,
List<String> argResultsRest = const [],
List<String> args = const [],
}) async {
await _runShorebirdBuildCommand(() async {
const executable = 'flutter';
@@ -54,7 +54,7 @@ class ArtifactBuilder {
if (flavor != null) '--flavor=$flavor',
if (target != null) '--target=$target',
if (targetPlatformArgs != null) '--target-platform=$targetPlatformArgs',
...argResultsRest,
...args,
];
final result = await process.run(
@@ -94,7 +94,7 @@ class ArtifactBuilder {
String? target,
Iterable<Arch>? targetPlatforms,
bool splitPerAbi = false,
List<String> argResultsRest = const [],
List<String> args = const [],
}) async {
await _runShorebirdBuildCommand(() async {
const executable = 'flutter';
@@ -111,7 +111,7 @@ class ArtifactBuilder {
// coverage:ignore-start
if (splitPerAbi) '--split-per-abi',
// coverage:ignore-end
...argResultsRest,
...args,
];
final result = await process.run(
@@ -148,7 +148,7 @@ class ArtifactBuilder {
Future<void> buildAar({
required String buildNumber,
Iterable<Arch>? targetPlatforms,
List<String> argResultsRest = const [],
List<String> args = const [],
}) async {
return _runShorebirdBuildCommand(() async {
const executable = 'flutter';
@@ -160,7 +160,7 @@ class ArtifactBuilder {
'--no-profile',
'--build-number=$buildNumber',
if (targetPlatformArgs != null) '--target-platform=$targetPlatformArgs',
...argResultsRest,
...args,
];
final result = await process.run(
@@ -182,7 +182,7 @@ class ArtifactBuilder {
File? exportOptionsPlist,
String? flavor,
String? target,
List<String> argResultsRest = const [],
List<String> args = const [],
}) async {
return _runShorebirdBuildCommand(() async {
const executable = 'flutter';
@@ -196,7 +196,7 @@ class ArtifactBuilder {
if (target != null) '--target=$target',
if (!codesign) '--no-codesign',
if (codesign) '''--export-options-plist=$exportOptionsPlistPath''',
...argResultsRest,
...args,
];
final result = await process.run(
@@ -225,7 +225,7 @@ $errorMessage''');
/// Builds a release iOS framework (.xcframework) for the current project.
Future<void> buildIosFramework({
List<String> argResultsRest = const [],
List<String> args = const [],
}) {
return _runShorebirdBuildCommand(() async {
const executable = 'flutter';
@@ -234,7 +234,7 @@ $errorMessage''');
'ios-framework',
'--no-debug',
'--no-profile',
...argResultsRest,
...args,
];
final result = await process.run(
@@ -5,6 +5,7 @@ import 'package:path/path.dart' as p;
import 'package:shorebird_cli/src/artifact_builder.dart';
import 'package:shorebird_cli/src/command.dart';
import 'package:shorebird_cli/src/logger.dart';
import 'package:shorebird_cli/src/release_type.dart';
import 'package:shorebird_cli/src/shorebird_env.dart';
import 'package:shorebird_cli/src/shorebird_validator.dart';
@@ -55,7 +56,7 @@ class BuildAarCommand extends ShorebirdCommand {
try {
await artifactBuilder.buildAar(
buildNumber: buildNumber,
argResultsRest: results.rest,
args: results.forwardedArgs,
);
} on ArtifactBuildException catch (error) {
buildProgress.fail('Failed to build: ${error.message}');
@@ -4,6 +4,7 @@ import 'package:shorebird_cli/src/artifact_builder.dart';
import 'package:shorebird_cli/src/command.dart';
import 'package:shorebird_cli/src/doctor.dart';
import 'package:shorebird_cli/src/logger.dart';
import 'package:shorebird_cli/src/release_type.dart';
import 'package:shorebird_cli/src/shorebird_validator.dart';
/// {@template build_apk_command}
@@ -51,7 +52,7 @@ class BuildApkCommand extends ShorebirdCommand {
await artifactBuilder.buildApk(
flavor: flavor,
target: target,
argResultsRest: results.rest,
args: results.forwardedArgs,
);
} on ArtifactBuildException catch (error) {
buildProgress.fail(error.message);
@@ -4,6 +4,7 @@ import 'package:shorebird_cli/src/artifact_builder.dart';
import 'package:shorebird_cli/src/command.dart';
import 'package:shorebird_cli/src/doctor.dart';
import 'package:shorebird_cli/src/logger.dart';
import 'package:shorebird_cli/src/release_type.dart';
import 'package:shorebird_cli/src/shorebird_validator.dart';
/// {@template build_app_bundle_command}
@@ -51,7 +52,7 @@ class BuildAppBundleCommand extends ShorebirdCommand {
await artifactBuilder.buildAppBundle(
flavor: flavor,
target: target,
argResultsRest: results.rest,
args: results.forwardedArgs,
);
} on ArtifactBuildException catch (error) {
buildProgress.fail(error.message);
@@ -4,6 +4,7 @@ import 'package:shorebird_cli/src/artifact_builder.dart';
import 'package:shorebird_cli/src/command.dart';
import 'package:shorebird_cli/src/doctor.dart';
import 'package:shorebird_cli/src/logger.dart';
import 'package:shorebird_cli/src/release_type.dart';
import 'package:shorebird_cli/src/shorebird_validator.dart';
/// {@template build_ipa_command}
@@ -65,7 +66,7 @@ Codesigning is disabled. You must manually codesign before deploying to devices.
flavor: flavor,
target: target,
codesign: codesign,
argResultsRest: results.rest,
args: results.forwardedArgs,
);
} on ArtifactBuildException catch (error) {
buildProgress.fail('Failed to build: ${error.message}');
@@ -72,7 +72,7 @@ class AarPatcher extends Patcher {
try {
await artifactBuilder.buildAar(
buildNumber: buildNumber,
argResultsRest: argResults.rest,
args: argResults.forwardedArgs,
);
buildProgress.complete();
} on ArtifactBuildException catch (error) {
@@ -64,7 +64,7 @@ class AndroidPatcher extends Patcher {
aabFile = await artifactBuilder.buildAppBundle(
flavor: flavor,
target: target,
argResultsRest: argResults.rest,
args: argResults.forwardedArgs,
);
buildProgress.complete();
} on ArtifactBuildException catch (error) {
@@ -84,7 +84,7 @@ class IosFrameworkPatcher extends Patcher {
);
try {
await artifactBuilder.buildIosFramework(
argResultsRest: argResults.rest,
args: argResults.forwardedArgs,
);
} on ArtifactBuildException catch (error) {
buildProgress.fail(error.message);
@@ -96,7 +96,7 @@ class IosPatcher extends Patcher {
exportOptionsPlist: exportOptionsPlist,
flavor: flavor,
target: target,
argResultsRest: argResults.rest,
args: argResults.forwardedArgs,
);
} on ProcessException catch (error) {
buildProgress.fail('Failed to build: ${error.message}');
@@ -80,7 +80,7 @@ class AarReleaser extends Releaser {
await artifactBuilder.buildAar(
buildNumber: buildNumber,
targetPlatforms: architectures,
argResultsRest: argResults.rest,
args: argResults.forwardedArgs,
);
} catch (e) {
logger.err('Failed to build aar: $e');
@@ -95,7 +95,7 @@ Please comment and upvote ${link(uri: Uri.parse('https://github.com/shorebirdtec
flavor: flavor,
target: target,
targetPlatforms: architectures,
argResultsRest: argResults.rest,
args: argResults.forwardedArgs,
);
} on ArtifactBuildException catch (e) {
buildAppBundleProgress.fail(e.message);
@@ -112,7 +112,7 @@ Please comment and upvote ${link(uri: Uri.parse('https://github.com/shorebirdtec
flavor: flavor,
target: target,
targetPlatforms: architectures,
argResultsRest: argResults.rest,
args: argResults.forwardedArgs,
);
} on ArtifactBuildException catch (e) {
buildApkProgress.fail(e.message);
@@ -70,9 +70,7 @@ class IosFrameworkReleaser extends Releaser {
);
try {
await artifactBuilder.buildIosFramework(
argResultsRest: argResults.rest,
);
await artifactBuilder.buildIosFramework(args: argResults.forwardedArgs);
} catch (error) {
buildProgress.fail('Failed to build iOS framework: $error');
exit(ExitCode.software.code);
@@ -104,7 +104,7 @@ class IosReleaser extends Releaser {
exportOptionsPlist: exportOptionsPlist,
flavor: flavor,
target: target,
argResultsRest: argResults.rest,
args: argResults.forwardedArgs,
);
buildProgress.complete();
} on ArtifactBuildException catch (error) {
@@ -45,6 +45,9 @@ enum ReleaseType {
}
}
bool _isPlatform(String platform) =>
ReleaseType.values.any((target) => target.cliName == platform);
extension ReleaseTypeArgs on ArgResults {
Iterable<ReleaseType> get releaseTypes {
final List<String> releaseTypeCliNames;
@@ -64,4 +67,10 @@ extension ReleaseTypeArgs on ArgResults {
ReleaseType.values.firstWhere((target) => target.cliName == cliName),
);
}
List<String> get forwardedArgs {
if (rest.isEmpty) return [];
if (_isPlatform(rest.first)) return rest.skip(1).toList();
return rest;
}
}
+2 -2
View File
@@ -37,10 +37,10 @@ packages:
dependency: transitive
description:
name: asn1lib
sha256: c9c85fedbe2188b95133cbe960e16f5f448860f7133330e272edbbca5893ddc6
sha256: "58082b3f0dca697204dbab0ef9ff208bfaea7767ea771076af9a343488428dda"
url: "https://pub.dev"
source: hosted
version: "1.5.2"
version: "1.5.3"
async:
dependency: transitive
description:
@@ -179,7 +179,7 @@ Either run `flutter pub get` manually, or follow the steps in ${link(uri: Uri.pa
flavor: 'flavor',
target: 'target',
targetPlatforms: [Arch.arm64],
argResultsRest: ['--foo', 'bar'],
args: ['--foo', 'bar'],
),
);
@@ -316,7 +316,7 @@ Either run `flutter pub get` manually, or follow the steps in ${link(uri: Uri.pa
flavor: 'flavor',
target: 'target',
targetPlatforms: [Arch.arm64],
argResultsRest: ['--foo', 'bar'],
args: ['--foo', 'bar'],
),
);
@@ -453,7 +453,7 @@ Either run `flutter pub get` manually, or follow the steps in ${link(uri: Uri.pa
() => builder.buildAar(
buildNumber: buildNumber,
targetPlatforms: [Arch.arm64],
argResultsRest: ['--foo', 'bar'],
args: ['--foo', 'bar'],
),
);
@@ -593,7 +593,7 @@ Either run `flutter pub get` manually, or follow the steps in ${link(uri: Uri.pa
exportOptionsPlist: File('exportOptionsPlist.plist'),
flavor: 'flavor',
target: 'target.dart',
argResultsRest: ['--foo', 'bar'],
args: ['--foo', 'bar'],
),
);
@@ -729,9 +729,7 @@ Failed to build:
test('forward arguments to flutter build', () async {
await runWithOverrides(
() => builder.buildIosFramework(
argResultsRest: ['--foo', 'bar'],
),
() => builder.buildIosFramework(args: ['--foo', 'bar']),
);
verify(
@@ -51,7 +51,7 @@ void main() {
when(
() => artifactBuilder.buildAar(
buildNumber: any(named: 'buildNumber'),
argResultsRest: any(named: 'argResultsRest'),
args: any(named: 'args'),
),
).thenAnswer((_) async => {});
when(
@@ -102,7 +102,7 @@ void main() {
when(
() => artifactBuilder.buildAar(
buildNumber: any(named: 'buildNumber'),
argResultsRest: any(named: 'argResultsRest'),
args: any(named: 'args'),
),
).thenThrow(ArtifactBuildException('Failed to build: error'));
@@ -110,26 +110,59 @@ void main() {
expect(result, equals(ExitCode.software.code));
verify(
() => artifactBuilder.buildAar(
buildNumber: buildNumber,
argResultsRest: [],
),
() => artifactBuilder.buildAar(buildNumber: buildNumber, args: []),
).called(1);
verify(
() => progress.fail(any(that: contains('Failed to build'))),
).called(1);
});
group('when platform was specified via arg results rest', () {
setUp(() {
when(() => argResults.rest).thenReturn(['android', '--verbose']);
});
test('exits with code 0 when building aar succeeds', () async {
final result = await runWithOverrides(command.run);
expect(result, equals(ExitCode.success.code));
verify(
() => artifactBuilder.buildAar(
buildNumber: buildNumber,
args: ['--verbose'],
),
).called(1);
verify(
() => logger.info(
'''
📦 Generated an aar at:
${lightCyan.wrap(
p.join(
'build',
'host',
'outputs',
'repo',
'com',
'example',
'my_flutter_module',
'flutter_release',
buildNumber,
'flutter_release-$buildNumber.aar',
),
)}''',
),
).called(1);
});
});
test('exits with code 0 when building aar succeeds', () async {
final result = await runWithOverrides(command.run);
expect(result, equals(ExitCode.success.code));
verify(
() => artifactBuilder.buildAar(
buildNumber: buildNumber,
argResultsRest: [],
),
() => artifactBuilder.buildAar(buildNumber: buildNumber, args: []),
).called(1);
verify(
() => logger.info(
@@ -69,7 +69,7 @@ void main() {
() => artifactBuilder.buildApk(
flavor: any(named: 'flavor'),
target: any(named: 'target'),
argResultsRest: any(named: 'argResultsRest'),
args: any(named: 'args'),
),
).thenAnswer((_) async => File(''));
@@ -108,7 +108,7 @@ void main() {
() => artifactBuilder.buildApk(
flavor: any(named: 'flavor'),
target: any(named: 'target'),
argResultsRest: any(named: 'argResultsRest'),
args: any(named: 'args'),
),
).thenThrow(ArtifactBuildException('oops'));
@@ -116,21 +116,40 @@ void main() {
expect(exitCode, equals(ExitCode.software.code));
verify(
() => artifactBuilder.buildApk(
argResultsRest: [],
),
() => artifactBuilder.buildApk(args: []),
).called(1);
});
group('when platform was specified via arg results rest', () {
setUp(() {
when(() => argResults.rest).thenReturn(['android', '--verbose']);
});
test('exits with code 0 when building apk succeeds', () async {
final exitCode = await runWithOverrides(command.run);
expect(exitCode, equals(ExitCode.success.code));
verify(
() => artifactBuilder.buildApk(args: ['--verbose']),
).called(1);
verify(
() => logger.info(
'''
📦 Generated an apk at:
${lightCyan.wrap(p.join('build', 'app', 'outputs', 'apk', 'release', 'app-release.apk'))}''',
),
).called(1);
});
});
test('exits with code 0 when building apk succeeds', () async {
final exitCode = await runWithOverrides(command.run);
expect(exitCode, equals(ExitCode.success.code));
verify(
() => artifactBuilder.buildApk(
argResultsRest: [],
),
() => artifactBuilder.buildApk(args: []),
).called(1);
verify(
() => logger.info(
@@ -156,7 +175,7 @@ ${lightCyan.wrap(p.join('build', 'app', 'outputs', 'apk', 'release', 'app-releas
() => artifactBuilder.buildApk(
flavor: flavor,
target: target,
argResultsRest: [],
args: [],
),
).called(1);
verify(
@@ -71,11 +71,9 @@ void main() {
() => artifactBuilder.buildAppBundle(
flavor: any(named: 'flavor'),
target: any(named: 'target'),
argResultsRest: any(named: 'argResultsRest'),
args: any(named: 'args'),
),
).thenAnswer(
(_) async => File(''),
);
).thenAnswer((_) async => File(''));
command = runWithOverrides(BuildAppBundleCommand.new)
..testArgResults = argResults;
@@ -110,7 +108,7 @@ void main() {
test('exits with code 70 when building appbundle fails', () async {
when(
() => artifactBuilder.buildAppBundle(
argResultsRest: any(named: 'argResultsRest'),
args: any(named: 'args'),
),
).thenThrow(
ArtifactBuildException('Failed to build: oops'),
@@ -120,19 +118,42 @@ void main() {
expect(exitCode, equals(ExitCode.software.code));
verify(
() => artifactBuilder.buildAppBundle(
argResultsRest: [],
),
() => artifactBuilder.buildAppBundle(args: []),
).called(1);
});
group('when platform was specified via arg results rest', () {
setUp(() {
when(() => argResults.rest).thenReturn(['android', '--verbose']);
});
test('exits with code 0 when building appbundle succeeds', () async {
final exitCode = await runWithOverrides(command.run);
expect(exitCode, equals(ExitCode.success.code));
verify(
() => artifactBuilder.buildAppBundle(
args: ['--verbose'],
),
).called(1);
verify(
() => logger.info(
'''
📦 Generated an app bundle at:
${lightCyan.wrap(p.join('build', 'app', 'outputs', 'bundle', 'release', 'app-release.aab'))}''',
),
).called(1);
});
});
test('exits with code 0 when building appbundle succeeds', () async {
final exitCode = await runWithOverrides(command.run);
expect(exitCode, equals(ExitCode.success.code));
verify(
() => artifactBuilder.buildAppBundle(
argResultsRest: [],
args: [],
),
).called(1);
@@ -159,7 +180,7 @@ ${lightCyan.wrap(p.join('build', 'app', 'outputs', 'bundle', 'release', 'app-rel
() => artifactBuilder.buildAppBundle(
flavor: flavor,
target: target,
argResultsRest: [],
args: [],
),
).called(1);
@@ -69,7 +69,7 @@ void main() {
flavor: any(named: 'flavor'),
target: any(named: 'target'),
codesign: any(named: 'codesign'),
argResultsRest: any(named: 'argResultsRest'),
args: any(named: 'args'),
),
).thenAnswer((_) async => File(''));
when(() => ios.createExportOptionsPlist()).thenReturn(File('.'));
@@ -123,7 +123,7 @@ void main() {
flavor: any(named: 'flavor'),
target: any(named: 'target'),
codesign: any(named: 'codesign'),
argResultsRest: any(named: 'argResultsRest'),
args: any(named: 'args'),
),
).thenThrow(ArtifactBuildException('oops'));
@@ -132,17 +132,46 @@ void main() {
expect(exitCode, equals(ExitCode.software.code));
verify(
() => artifactBuilder.buildIpa(
argResultsRest: [],
args: [],
),
).called(1);
});
group('when platform was specified via arg results rest', () {
setUp(() {
when(() => argResults.rest).thenReturn(['ios', '--verbose']);
});
test('exits with code 0 when building ipa succeeds', () async {
final exitCode = await runWithOverrides(command.run);
expect(exitCode, equals(ExitCode.success.code));
verify(
() => artifactBuilder.buildIpa(args: ['--verbose']),
).called(1);
verifyInOrder([
() => logger.info(
'''
📦 Generated an xcode archive at:
${lightCyan.wrap(p.join('build', 'ios', 'archive', 'Runner.xcarchive'))}''',
),
() => logger.info(
'''
📦 Generated an ipa at:
${lightCyan.wrap(p.join('build', 'ios', 'ipa', 'Runner.ipa'))}''',
),
]);
});
});
test('exits with code 0 when building ipa succeeds', () async {
final exitCode = await runWithOverrides(command.run);
expect(exitCode, equals(ExitCode.success.code));
verify(() => artifactBuilder.buildIpa(argResultsRest: [])).called(1);
verify(() => artifactBuilder.buildIpa(args: [])).called(1);
verifyInOrder([
() => logger.info(
@@ -173,7 +202,7 @@ ${lightCyan.wrap(p.join('build', 'ios', 'ipa', 'Runner.ipa'))}''',
() => artifactBuilder.buildIpa(
flavor: flavor,
target: target,
argResultsRest: [],
args: [],
),
).called(1);
@@ -200,7 +229,7 @@ ${lightCyan.wrap(p.join('build', 'ios', 'ipa', 'Runner.ipa'))}''',
expect(exitCode, equals(ExitCode.success.code));
verify(
() => artifactBuilder.buildIpa(codesign: false, argResultsRest: []),
() => artifactBuilder.buildIpa(codesign: false, args: []),
).called(1);
verify(
@@ -236,7 +236,7 @@ void main() {
when(
() => artifactBuilder.buildAar(
buildNumber: any(named: 'buildNumber'),
argResultsRest: any(named: 'argResultsRest'),
args: any(named: 'args'),
),
).thenThrow(exception);
});
@@ -256,11 +256,47 @@ void main() {
when(
() => artifactBuilder.buildAar(
buildNumber: any(named: 'buildNumber'),
argResultsRest: any(named: 'argResultsRest'),
args: any(named: 'args'),
),
).thenAnswer((_) async => {});
});
group('when platform was specified via arg results rest', () {
setUp(() {
when(() => argResults.rest).thenReturn(['android', '--verbose']);
});
test('returns the aar artifact file', () async {
final artifact = await runWithOverrides(patcher.buildPatchArtifact);
expect(artifact, isA<File>());
expect(
artifact.path,
endsWith(
p.join(
'build',
'host',
'outputs',
'repo',
'com',
'example',
'my_flutter_module',
'flutter_release',
buildNumber,
'flutter_release-$buildNumber.aar',
),
),
);
verify(
() => artifactBuilder.buildAar(
buildNumber: buildNumber,
args: ['--verbose'],
),
).called(1);
});
});
test('returns the aar artifact file', () async {
final artifact = await runWithOverrides(patcher.buildPatchArtifact);
@@ -286,7 +322,7 @@ void main() {
verify(
() => artifactBuilder.buildAar(
buildNumber: buildNumber,
argResultsRest: any(named: 'argResultsRest'),
args: any(named: 'args'),
),
).called(1);
});
@@ -228,7 +228,7 @@ void main() {
flavor: any(named: 'flavor'),
target: any(named: 'target'),
targetPlatforms: any(named: 'targetPlatforms'),
argResultsRest: any(named: 'argResultsRest'),
args: any(named: 'args'),
),
).thenAnswer((_) async => aabFile);
});
@@ -241,7 +241,7 @@ void main() {
() => artifactBuilder.buildAppBundle(
flavor: any(named: 'flavor'),
target: any(named: 'target'),
argResultsRest: any(named: 'argResultsRest'),
args: any(named: 'args'),
),
).thenThrow(exception);
when(() => logger.progress(any())).thenReturn(progress);
@@ -286,6 +286,22 @@ Looked in:
group('when build succeeds', () {
setUp(setUpProjectRootArtifacts);
group('when platform was specified via arg results rest', () {
setUp(() {
when(() => argResults.rest).thenReturn(['android', '--verbose']);
});
test('returns the aab file', () async {
final result = await runWithOverrides(patcher.buildPatchArtifact);
expect(result, equals(aabFile));
verify(
() => artifactBuilder.buildAppBundle(
args: ['--verbose'],
),
).called(1);
});
});
test('returns the aab file', () async {
final result = await runWithOverrides(patcher.buildPatchArtifact);
expect(result, equals(aabFile));
@@ -287,9 +287,7 @@ void main() {
group('when build fails', () {
setUp(() {
when(
() => artifactBuilder.buildIosFramework(
argResultsRest: any(named: 'argResultsRest'),
),
() => artifactBuilder.buildIosFramework(args: any(named: 'args')),
).thenThrow(
ArtifactBuildException('Build failed'),
);
@@ -308,9 +306,7 @@ void main() {
group('when elf aot snapshot build fails', () {
setUp(() {
when(
() => artifactBuilder.buildIosFramework(
argResultsRest: any(named: 'argResultsRest'),
),
() => artifactBuilder.buildIosFramework(args: any(named: 'args')),
).thenAnswer(
(_) async {},
);
@@ -338,9 +334,7 @@ void main() {
group('when build succeeds', () {
setUp(() {
when(
() => artifactBuilder.buildIosFramework(
argResultsRest: any(named: 'argResultsRest'),
),
() => artifactBuilder.buildIosFramework(args: any(named: 'args')),
).thenAnswer(
(_) async {},
);
@@ -363,6 +357,24 @@ void main() {
.thenReturn(projectRoot);
});
group('when platform was specified via arg results rest', () {
setUp(() {
when(() => argResults.rest).thenReturn(['ios', '--verbose']);
});
test('returns zipped xcframework', () async {
final artifact = await runWithOverrides(
patcher.buildPatchArtifact,
);
expect(p.basename(artifact.path), equals('App.xcframework.zip'));
verify(
() => artifactBuilder.buildIosFramework(
args: ['--verbose'],
),
).called(1);
});
});
test('returns zipped xcframework', () async {
final artifact = await runWithOverrides(patcher.buildPatchArtifact);
expect(p.basename(artifact.path), equals('App.xcframework.zip'));
@@ -289,7 +289,7 @@ void main() {
() => artifactBuilder.buildIpa(
exportOptionsPlist: any(named: 'exportOptionsPlist'),
codesign: any(named: 'codesign'),
argResultsRest: any(named: 'argResultsRest'),
args: any(named: 'args'),
flavor: any(named: 'flavor'),
target: any(named: 'target'),
),
@@ -318,7 +318,7 @@ void main() {
() => artifactBuilder.buildIpa(
exportOptionsPlist: any(named: 'exportOptionsPlist'),
codesign: any(named: 'codesign'),
argResultsRest: any(named: 'argResultsRest'),
args: any(named: 'args'),
flavor: any(named: 'flavor'),
target: any(named: 'target'),
),
@@ -343,7 +343,7 @@ void main() {
() => artifactBuilder.buildIpa(
exportOptionsPlist: any(named: 'exportOptionsPlist'),
codesign: any(named: 'codesign'),
argResultsRest: any(named: 'argResultsRest'),
args: any(named: 'args'),
flavor: any(named: 'flavor'),
target: any(named: 'target'),
),
@@ -375,7 +375,7 @@ void main() {
() => artifactBuilder.buildIpa(
exportOptionsPlist: any(named: 'exportOptionsPlist'),
codesign: any(named: 'codesign'),
argResultsRest: any(named: 'argResultsRest'),
args: any(named: 'args'),
flavor: any(named: 'flavor'),
target: any(named: 'target'),
),
@@ -405,6 +405,26 @@ void main() {
);
});
group('when platform was specified via arg results rest', () {
setUp(() {
when(() => argResults.rest).thenReturn(['ios', '--verbose']);
});
test('returns xcarchive zip', () async {
final artifact = await runWithOverrides(
patcher.buildPatchArtifact,
);
expect(p.basename(artifact.path), endsWith('.zip'));
verify(
() => artifactBuilder.buildIpa(
exportOptionsPlist: any(named: 'exportOptionsPlist'),
codesign: any(named: 'codesign'),
args: ['--verbose'],
),
).called(1);
});
});
test('returns xcarchive zip', () async {
final artifact = await runWithOverrides(patcher.buildPatchArtifact);
expect(p.basename(artifact.path), endsWith('.zip'));
@@ -261,7 +261,7 @@ void main() {
() => artifactBuilder.buildAar(
buildNumber: any(named: 'buildNumber'),
targetPlatforms: any(named: 'targetPlatforms'),
argResultsRest: any(named: 'argResultsRest'),
args: any(named: 'args'),
),
).thenAnswer(
(_) async => File(''),
@@ -274,6 +274,27 @@ void main() {
});
group('when build succeeds', () {
group('when platform was specified via arg results rest', () {
setUp(() {
when(() => argResults.rest).thenReturn(['android', '--verbose']);
});
test('produces aar in release directory', () async {
final aar = await runWithOverrides(
() => aarReleaser.buildReleaseArtifacts(),
);
expect(aar.path, p.join(projectRoot.path, 'release'));
verify(
() => artifactBuilder.buildAar(
buildNumber: buildNumber,
targetPlatforms: Arch.values.toSet(),
args: ['--verbose'],
),
).called(1);
});
});
test('produces aar in release directory', () async {
final aar = await runWithOverrides(
() => aarReleaser.buildReleaseArtifacts(),
@@ -284,7 +305,7 @@ void main() {
() => artifactBuilder.buildAar(
buildNumber: buildNumber,
targetPlatforms: Arch.values.toSet(),
argResultsRest: [],
args: [],
),
).called(1);
});
@@ -296,7 +317,7 @@ void main() {
() => artifactBuilder.buildAar(
buildNumber: any(named: 'buildNumber'),
targetPlatforms: any(named: 'targetPlatforms'),
argResultsRest: any(named: 'argResultsRest'),
args: any(named: 'args'),
),
).thenThrow(Exception('build failed'));
});
@@ -225,7 +225,7 @@ void main() {
flavor: any(named: 'flavor'),
target: any(named: 'target'),
targetPlatforms: any(named: 'targetPlatforms'),
argResultsRest: any(named: 'argResultsRest'),
args: any(named: 'args'),
),
).thenAnswer((_) async => aabFile);
when(
@@ -233,7 +233,7 @@ void main() {
flavor: any(named: 'flavor'),
target: any(named: 'target'),
targetPlatforms: any(named: 'targetPlatforms'),
argResultsRest: any(named: 'argResultsRest'),
args: any(named: 'args'),
),
).thenAnswer(
(_) async => File(''),
@@ -256,7 +256,7 @@ void main() {
flavor: any(named: 'flavor'),
target: any(named: 'target'),
targetPlatforms: any(named: 'targetPlatforms'),
argResultsRest: any(named: 'argResultsRest'),
args: any(named: 'args'),
),
).thenThrow(ArtifactBuildException('Uh oh'));
});
@@ -282,7 +282,7 @@ void main() {
flavor: any(named: 'flavor'),
target: any(named: 'target'),
targetPlatforms: any(named: 'targetPlatforms'),
argResultsRest: any(named: 'argResultsRest'),
args: any(named: 'args'),
),
).thenThrow(ArtifactBuildException('Uh oh'));
});
@@ -298,6 +298,25 @@ void main() {
});
group('when the build succeeds', () {
group('when platform was specified via arg results rest', () {
setUp(() {
when(() => argResults.rest).thenReturn(['android', '--verbose']);
});
test('returns the path to the aab', () async {
final result = await runWithOverrides(
() => androidReleaser.buildReleaseArtifacts(),
);
expect(result, aabFile);
verify(
() => artifactBuilder.buildAppBundle(
targetPlatforms: Arch.values,
args: ['--verbose'],
),
).called(1);
});
});
test('returns the path to the aab', () async {
final result = await runWithOverrides(
() => androidReleaser.buildReleaseArtifacts(),
@@ -306,7 +325,7 @@ void main() {
verify(
() => artifactBuilder.buildAppBundle(
targetPlatforms: Arch.values,
argResultsRest: [],
args: [],
),
).called(1);
});
@@ -320,7 +339,7 @@ void main() {
flavor: any(named: 'flavor'),
target: any(named: 'target'),
targetPlatforms: any(named: 'targetPlatforms'),
argResultsRest: any(named: 'argResultsRest'),
args: any(named: 'args'),
),
);
});
@@ -346,7 +365,7 @@ void main() {
flavor: flavor,
target: target,
targetPlatforms: Arch.values,
argResultsRest: [],
args: [],
),
).called(1);
verify(
@@ -354,7 +373,7 @@ void main() {
flavor: flavor,
target: target,
targetPlatforms: Arch.values,
argResultsRest: [],
args: [],
),
).called(1);
});
@@ -246,9 +246,7 @@ void main() {
setUp(() {
when(
() => artifactBuilder.buildIosFramework(
argResultsRest: any(named: 'argResultsRest'),
),
() => artifactBuilder.buildIosFramework(args: any(named: 'args')),
).thenAnswer(
(_) async => File(''),
);
@@ -271,6 +269,23 @@ void main() {
});
group('when build succeeds', () {
group('when platform was specified via arg results rest', () {
setUp(() {
when(() => argResults.rest).thenReturn(['ios', '--verbose']);
});
test('produces xcframework in release directory', () async {
final xcframework = await runWithOverrides(
iosFrameworkReleaser.buildReleaseArtifacts,
);
expect(xcframework.path, p.join(projectRoot.path, 'release'));
verify(
() => artifactBuilder.buildIosFramework(args: ['--verbose']),
).called(1);
});
});
test('produces xcframework in release directory', () async {
final xcframework = await runWithOverrides(
iosFrameworkReleaser.buildReleaseArtifacts,
@@ -278,7 +293,7 @@ void main() {
expect(xcframework.path, p.join(projectRoot.path, 'release'));
verify(
() => artifactBuilder.buildIosFramework(argResultsRest: []),
() => artifactBuilder.buildIosFramework(args: []),
).called(1);
});
});
@@ -286,9 +301,7 @@ void main() {
group('when build fails', () {
setUp(() {
when(
() => artifactBuilder.buildIosFramework(
argResultsRest: any(named: 'argResultsRest'),
),
() => artifactBuilder.buildIosFramework(args: any(named: 'args')),
).thenThrow(Exception('build failed'));
});
@@ -261,7 +261,7 @@ void main() {
exportOptionsPlist: any(named: 'exportOptionsPlist'),
flavor: any(named: 'flavor'),
target: any(named: 'target'),
argResultsRest: any(named: 'argResultsRest'),
args: any(named: 'args'),
),
).thenAnswer((_) async => {});
@@ -331,7 +331,7 @@ void main() {
exportOptionsPlist: any(named: 'exportOptionsPlist'),
flavor: any(named: 'flavor'),
target: any(named: 'target'),
argResultsRest: any(named: 'argResultsRest'),
args: any(named: 'args'),
),
).thenThrow(ArtifactBuildException('Failed to build'));
});
@@ -349,6 +349,35 @@ void main() {
});
group('when build succeeds', () {
group('when build succeeds', () {
group('when platform was specified via arg results rest', () {
setUp(() {
when(() => argResults.rest).thenReturn(['ios', '--verbose']);
});
test('verifies artifacts exist and returns xcarchive path',
() async {
expect(
await runWithOverrides(iosReleaser.buildReleaseArtifacts),
equals(xcarchiveDirectory),
);
verify(() => artifactManager.getXcarchiveDirectory()).called(1);
verify(
() => artifactManager.getIosAppDirectory(
xcarchiveDirectory: xcarchiveDirectory,
),
).called(1);
verify(
() => artifactBuilder.buildIpa(
exportOptionsPlist: any(named: 'exportOptionsPlist'),
args: ['--verbose'],
),
).called(1);
});
});
});
test('verifies artifacts exist and returns xcarchive path', () async {
expect(
await runWithOverrides(iosReleaser.buildReleaseArtifacts),