fix(shorebird_cli): forwarded arguments should exclude platform (#2077)
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user