2019-11-27 23:04:02 +00:00
|
|
|
// Copyright 2014 The Flutter Authors. All rights reserved.
|
2017-05-15 19:54:32 +00:00
|
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
|
|
// found in the LICENSE file.
|
2019-11-27 23:04:02 +00:00
|
|
|
|
2021-01-27 23:17:53 +00:00
|
|
|
// @dart = 2.8
|
|
|
|
|
2017-05-15 19:54:32 +00:00
|
|
|
import 'dart:convert';
|
|
|
|
|
2020-03-24 22:30:35 +00:00
|
|
|
import 'package:flutter_tools/src/base/logger.dart';
|
2017-05-15 19:54:32 +00:00
|
|
|
import 'package:mockito/mockito.dart';
|
2017-06-22 00:22:13 +00:00
|
|
|
import 'package:flutter_tools/src/base/config.dart';
|
2017-05-15 19:54:32 +00:00
|
|
|
import 'package:flutter_tools/src/base/io.dart';
|
2017-05-18 18:26:43 +00:00
|
|
|
import 'package:flutter_tools/src/base/terminal.dart';
|
|
|
|
import 'package:flutter_tools/src/ios/code_signing.dart';
|
2021-03-31 23:55:20 +00:00
|
|
|
import 'package:flutter_tools/src/globals_null_migrated.dart' as globals;
|
2017-05-15 19:54:32 +00:00
|
|
|
|
2019-07-13 18:51:44 +00:00
|
|
|
import '../../src/common.dart';
|
2021-04-08 22:19:07 +00:00
|
|
|
import '../../src/fake_process_manager.dart';
|
2017-05-15 19:54:32 +00:00
|
|
|
|
|
|
|
void main() {
|
|
|
|
group('Auto signing', () {
|
|
|
|
ProcessManager mockProcessManager;
|
2021-02-02 02:16:05 +00:00
|
|
|
Config testConfig;
|
2017-05-18 18:26:43 +00:00
|
|
|
AnsiTerminal testTerminal;
|
2020-03-24 22:30:35 +00:00
|
|
|
BufferLogger logger;
|
2017-05-15 19:54:32 +00:00
|
|
|
|
2019-09-16 14:51:50 +00:00
|
|
|
setUp(() async {
|
2020-03-24 22:30:35 +00:00
|
|
|
logger = BufferLogger.test();
|
2018-09-12 06:29:29 +00:00
|
|
|
mockProcessManager = MockProcessManager();
|
2020-03-20 20:05:19 +00:00
|
|
|
// Assume all binaries exist and are executable
|
|
|
|
when(mockProcessManager.canRun(any)).thenReturn(true);
|
2021-02-02 02:16:05 +00:00
|
|
|
testConfig = Config.test();
|
2018-09-12 06:29:29 +00:00
|
|
|
testTerminal = TestTerminal();
|
2019-08-27 21:20:51 +00:00
|
|
|
testTerminal.usesTerminalUi = true;
|
2017-05-15 19:54:32 +00:00
|
|
|
});
|
|
|
|
|
2020-03-24 22:30:35 +00:00
|
|
|
testWithoutContext('No auto-sign if Xcode project settings are not available', () async {
|
|
|
|
final Map<String, String> signingConfigs = await getCodeSigningIdentityDevelopmentTeam(
|
2021-03-30 15:19:28 +00:00
|
|
|
buildSettings: null,
|
2020-03-24 22:30:35 +00:00
|
|
|
processManager: mockProcessManager,
|
|
|
|
logger: logger,
|
2021-03-30 15:19:28 +00:00
|
|
|
config: testConfig,
|
|
|
|
terminal: testTerminal,
|
2020-03-24 22:30:35 +00:00
|
|
|
);
|
2018-03-29 01:58:06 +00:00
|
|
|
expect(signingConfigs, isNull);
|
2017-05-15 19:54:32 +00:00
|
|
|
});
|
|
|
|
|
2020-03-24 22:30:35 +00:00
|
|
|
testWithoutContext('No discovery if development team specified in Xcode project', () async {
|
|
|
|
final Map<String, String> signingConfigs = await getCodeSigningIdentityDevelopmentTeam(
|
2021-03-30 15:19:28 +00:00
|
|
|
buildSettings: <String, String>{
|
|
|
|
'DEVELOPMENT_TEAM': 'abc',
|
|
|
|
},
|
2020-03-24 22:30:35 +00:00
|
|
|
processManager: mockProcessManager,
|
|
|
|
logger: logger,
|
2021-03-30 15:19:28 +00:00
|
|
|
config: testConfig,
|
|
|
|
terminal: testTerminal,
|
2020-03-24 22:30:35 +00:00
|
|
|
);
|
2018-03-29 01:58:06 +00:00
|
|
|
expect(signingConfigs, isNull);
|
2020-03-24 22:30:35 +00:00
|
|
|
expect(logger.statusText, equals(
|
2017-05-15 19:54:32 +00:00
|
|
|
'Automatically signing iOS for device deployment using specified development team in Xcode project: abc\n'
|
|
|
|
));
|
|
|
|
});
|
|
|
|
|
2020-03-24 22:30:35 +00:00
|
|
|
testWithoutContext('No auto-sign if security or openssl not available', () async {
|
2019-09-12 01:20:42 +00:00
|
|
|
when(mockProcessManager.run(<String>['which', 'security']))
|
|
|
|
.thenAnswer((_) => Future<ProcessResult>.value(exitsFail));
|
2020-03-24 22:30:35 +00:00
|
|
|
final Map<String, String> signingConfigs = await getCodeSigningIdentityDevelopmentTeam(
|
2021-03-30 15:19:28 +00:00
|
|
|
buildSettings: <String, String>{
|
|
|
|
'bogus': 'bogus',
|
|
|
|
},
|
2020-03-24 22:30:35 +00:00
|
|
|
processManager: mockProcessManager,
|
|
|
|
logger: logger,
|
2021-03-30 15:19:28 +00:00
|
|
|
config: testConfig,
|
|
|
|
terminal: testTerminal,
|
2020-03-24 22:30:35 +00:00
|
|
|
);
|
2018-03-29 01:58:06 +00:00
|
|
|
expect(signingConfigs, isNull);
|
2017-05-15 19:54:32 +00:00
|
|
|
});
|
|
|
|
|
2021-03-30 15:19:28 +00:00
|
|
|
testWithoutContext('No valid code signing certificates shows instructions', () async {
|
2019-09-12 01:20:42 +00:00
|
|
|
when(mockProcessManager.run(
|
|
|
|
<String>['which', 'security'],
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
|
|
|
environment: anyNamed('environment'),
|
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(exitsHappy));
|
|
|
|
when(mockProcessManager.run(
|
|
|
|
<String>['which', 'openssl'],
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
|
|
|
environment: anyNamed('environment'),
|
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(exitsHappy));
|
|
|
|
when(mockProcessManager.run(
|
|
|
|
argThat(contains('find-identity')),
|
2018-05-31 15:24:26 +00:00
|
|
|
environment: anyNamed('environment'),
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
2019-09-12 01:20:42 +00:00
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(exitsHappy));
|
2017-05-15 19:54:32 +00:00
|
|
|
|
2021-03-06 02:38:15 +00:00
|
|
|
expect(() async => getCodeSigningIdentityDevelopmentTeam(
|
2021-03-30 15:19:28 +00:00
|
|
|
buildSettings: <String, String>{},
|
2020-03-24 22:30:35 +00:00
|
|
|
processManager: mockProcessManager,
|
|
|
|
logger: logger,
|
2021-03-30 15:19:28 +00:00
|
|
|
config: testConfig,
|
|
|
|
terminal: testTerminal,
|
2020-03-24 22:30:35 +00:00
|
|
|
), throwsToolExit(message: 'No development certificates available to code sign app for device deployment'));
|
2017-05-15 19:54:32 +00:00
|
|
|
});
|
|
|
|
|
2020-03-24 22:30:35 +00:00
|
|
|
testWithoutContext('Test single identity and certificate organization works', () async {
|
2019-09-12 01:20:42 +00:00
|
|
|
when(mockProcessManager.run(
|
|
|
|
<String>['which', 'security'],
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
|
|
|
environment: anyNamed('environment'),
|
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(exitsHappy));
|
|
|
|
when(mockProcessManager.run(
|
|
|
|
<String>['which', 'openssl'],
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
|
|
|
environment: anyNamed('environment'),
|
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(exitsHappy));
|
|
|
|
when(mockProcessManager.run(
|
|
|
|
argThat(contains('find-identity')),
|
2018-05-31 15:24:26 +00:00
|
|
|
environment: anyNamed('environment'),
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
2019-09-12 01:20:42 +00:00
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(ProcessResult(
|
2018-02-02 22:27:29 +00:00
|
|
|
1, // pid
|
|
|
|
0, // exitCode
|
2017-05-15 19:54:32 +00:00
|
|
|
'''
|
|
|
|
1) 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8 "iPhone Developer: Profile 1 (1111AAAA11)"
|
2017-05-18 18:26:43 +00:00
|
|
|
1 valid identities found''',
|
2019-03-01 07:17:55 +00:00
|
|
|
'',
|
2019-09-12 01:20:42 +00:00
|
|
|
)));
|
|
|
|
when(mockProcessManager.run(
|
2017-05-15 19:54:32 +00:00
|
|
|
<String>['security', 'find-certificate', '-c', '1111AAAA11', '-p'],
|
2018-05-31 15:24:26 +00:00
|
|
|
environment: anyNamed('environment'),
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
2019-09-12 01:20:42 +00:00
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(ProcessResult(
|
2018-02-02 22:27:29 +00:00
|
|
|
1, // pid
|
|
|
|
0, // exitCode
|
2017-05-15 19:54:32 +00:00
|
|
|
'This is a mock certificate',
|
|
|
|
'',
|
2019-09-12 01:20:42 +00:00
|
|
|
)));
|
2017-05-15 19:54:32 +00:00
|
|
|
|
2018-09-12 06:29:29 +00:00
|
|
|
final MockProcess mockProcess = MockProcess();
|
|
|
|
final MockStdIn mockStdIn = MockStdIn();
|
|
|
|
final MockStream mockStdErr = MockStream();
|
2017-05-15 19:54:32 +00:00
|
|
|
|
|
|
|
when(mockProcessManager.start(
|
2019-09-12 01:20:42 +00:00
|
|
|
argThat(contains('openssl')),
|
2018-05-31 15:24:26 +00:00
|
|
|
environment: anyNamed('environment'),
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
2018-09-12 06:29:29 +00:00
|
|
|
)).thenAnswer((Invocation invocation) => Future<Process>.value(mockProcess));
|
2017-05-15 19:54:32 +00:00
|
|
|
|
|
|
|
when(mockProcess.stdin).thenReturn(mockStdIn);
|
2017-12-19 21:13:57 +00:00
|
|
|
when(mockProcess.stdout)
|
2018-09-12 06:29:29 +00:00
|
|
|
.thenAnswer((Invocation invocation) => Stream<List<int>>.fromFuture(
|
|
|
|
Future<List<int>>.value(utf8.encode(
|
2017-12-19 21:13:57 +00:00
|
|
|
'subject= /CN=iPhone Developer: Profile 1 (1111AAAA11)/OU=3333CCCC33/O=My Team/C=US'
|
|
|
|
))
|
|
|
|
));
|
|
|
|
when(mockProcess.stderr).thenAnswer((Invocation invocation) => mockStdErr);
|
2018-04-09 19:43:31 +00:00
|
|
|
when(mockProcess.exitCode).thenAnswer((_) async => 0);
|
2017-05-15 19:54:32 +00:00
|
|
|
|
2020-03-24 22:30:35 +00:00
|
|
|
final Map<String, String> signingConfigs = await getCodeSigningIdentityDevelopmentTeam(
|
2021-03-30 15:19:28 +00:00
|
|
|
buildSettings: <String, String>{
|
|
|
|
'bogus': 'bogus',
|
|
|
|
},
|
2020-03-24 22:30:35 +00:00
|
|
|
processManager: mockProcessManager,
|
|
|
|
logger: logger,
|
2021-03-30 15:19:28 +00:00
|
|
|
config: testConfig,
|
|
|
|
terminal: testTerminal,
|
2020-03-24 22:30:35 +00:00
|
|
|
);
|
2017-05-15 19:54:32 +00:00
|
|
|
|
2020-03-24 22:30:35 +00:00
|
|
|
expect(logger.statusText, contains('iPhone Developer: Profile 1 (1111AAAA11)'));
|
|
|
|
expect(logger.errorText, isEmpty);
|
2017-05-15 19:54:32 +00:00
|
|
|
verify(mockStdIn.write('This is a mock certificate'));
|
2019-03-22 23:02:21 +00:00
|
|
|
expect(signingConfigs, <String, String>{'DEVELOPMENT_TEAM': '3333CCCC33'});
|
2018-09-27 21:43:54 +00:00
|
|
|
});
|
|
|
|
|
2020-03-24 22:30:35 +00:00
|
|
|
testWithoutContext('Test single identity (Catalina format) and certificate organization works', () async {
|
2019-09-12 01:20:42 +00:00
|
|
|
when(mockProcessManager.run(
|
|
|
|
<String>['which', 'security'],
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
|
|
|
environment: anyNamed('environment'),
|
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(exitsHappy));
|
|
|
|
when(mockProcessManager.run(
|
|
|
|
<String>['which', 'openssl'],
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
|
|
|
environment: anyNamed('environment'),
|
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(exitsHappy));
|
|
|
|
when(mockProcessManager.run(
|
|
|
|
argThat(contains('find-identity')),
|
2019-08-07 16:18:11 +00:00
|
|
|
environment: anyNamed('environment'),
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
2019-09-12 01:20:42 +00:00
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(ProcessResult(
|
2019-08-07 16:18:11 +00:00
|
|
|
1, // pid
|
|
|
|
0, // exitCode
|
|
|
|
'''
|
|
|
|
1) 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8 "Apple Development: Profile 1 (1111AAAA11)"
|
|
|
|
1 valid identities found''',
|
|
|
|
'',
|
2019-09-12 01:20:42 +00:00
|
|
|
)));
|
|
|
|
when(mockProcessManager.run(
|
2019-08-07 16:18:11 +00:00
|
|
|
<String>['security', 'find-certificate', '-c', '1111AAAA11', '-p'],
|
|
|
|
environment: anyNamed('environment'),
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
2019-09-12 01:20:42 +00:00
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(ProcessResult(
|
2019-08-07 16:18:11 +00:00
|
|
|
1, // pid
|
|
|
|
0, // exitCode
|
|
|
|
'This is a mock certificate',
|
|
|
|
'',
|
2019-09-12 01:20:42 +00:00
|
|
|
)));
|
2019-08-07 16:18:11 +00:00
|
|
|
|
|
|
|
final MockProcess mockProcess = MockProcess();
|
|
|
|
final MockStdIn mockStdIn = MockStdIn();
|
|
|
|
final MockStream mockStdErr = MockStream();
|
|
|
|
|
|
|
|
when(mockProcessManager.start(
|
2019-09-12 01:20:42 +00:00
|
|
|
argThat(contains('openssl')),
|
2019-08-07 16:18:11 +00:00
|
|
|
environment: anyNamed('environment'),
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
|
|
|
)).thenAnswer((Invocation invocation) => Future<Process>.value(mockProcess));
|
|
|
|
|
|
|
|
when(mockProcess.stdin).thenReturn(mockStdIn);
|
|
|
|
when(mockProcess.stdout)
|
|
|
|
.thenAnswer((Invocation invocation) => Stream<List<int>>.fromFuture(
|
|
|
|
Future<List<int>>.value(utf8.encode(
|
|
|
|
'subject= /CN=iPhone Developer: Profile 1 (1111AAAA11)/OU=3333CCCC33/O=My Team/C=US'
|
|
|
|
))
|
|
|
|
));
|
|
|
|
when(mockProcess.stderr).thenAnswer((Invocation invocation) => mockStdErr);
|
|
|
|
when(mockProcess.exitCode).thenAnswer((_) async => 0);
|
|
|
|
|
|
|
|
Map<String, String> signingConfigs;
|
|
|
|
try {
|
2020-03-24 22:30:35 +00:00
|
|
|
signingConfigs = await getCodeSigningIdentityDevelopmentTeam(
|
2021-03-30 15:19:28 +00:00
|
|
|
buildSettings: <String, String>{
|
|
|
|
'bogus': 'bogus',
|
|
|
|
},
|
2020-03-24 22:30:35 +00:00
|
|
|
processManager: mockProcessManager,
|
|
|
|
logger: logger,
|
2021-03-30 15:19:28 +00:00
|
|
|
config: testConfig,
|
|
|
|
terminal: testTerminal,
|
2020-03-24 22:30:35 +00:00
|
|
|
);
|
2020-03-06 18:22:12 +00:00
|
|
|
} on Exception catch (e) {
|
2019-08-07 16:18:11 +00:00
|
|
|
// This should not throw
|
2020-03-06 18:22:12 +00:00
|
|
|
fail('Code signing threw: $e');
|
2019-08-07 16:18:11 +00:00
|
|
|
}
|
|
|
|
|
2020-03-24 22:30:35 +00:00
|
|
|
expect(logger.statusText, contains('Apple Development: Profile 1 (1111AAAA11)'));
|
|
|
|
expect(logger.errorText, isEmpty);
|
2019-08-07 16:18:11 +00:00
|
|
|
verify(mockStdIn.write('This is a mock certificate'));
|
|
|
|
expect(signingConfigs, <String, String>{'DEVELOPMENT_TEAM': '3333CCCC33'});
|
|
|
|
});
|
|
|
|
|
2021-03-30 15:19:28 +00:00
|
|
|
testWithoutContext('Test multiple identity and certificate organization works', () async {
|
2019-09-12 01:20:42 +00:00
|
|
|
when(mockProcessManager.run(
|
|
|
|
<String>['which', 'security'],
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
2018-05-31 15:24:26 +00:00
|
|
|
environment: anyNamed('environment'),
|
2019-09-12 01:20:42 +00:00
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(exitsHappy));
|
|
|
|
when(mockProcessManager.run(
|
|
|
|
<String>['which', 'openssl'],
|
2018-05-31 15:24:26 +00:00
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
2019-09-12 01:20:42 +00:00
|
|
|
environment: anyNamed('environment'),
|
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(exitsHappy));
|
|
|
|
when(mockProcessManager.run(
|
|
|
|
argThat(contains('find-identity')),
|
|
|
|
environment: anyNamed('environment'),
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(ProcessResult(
|
2018-02-02 22:27:29 +00:00
|
|
|
1, // pid
|
|
|
|
0, // exitCode
|
2017-05-18 18:26:43 +00:00
|
|
|
'''
|
|
|
|
1) 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8 "iPhone Developer: Profile 1 (1111AAAA11)"
|
|
|
|
2) da4b9237bacccdf19c0760cab7aec4a8359010b0 "iPhone Developer: Profile 2 (2222BBBB22)"
|
|
|
|
3) 5bf1fd927dfb8679496a2e6cf00cbe50c1c87145 "iPhone Developer: Profile 3 (3333CCCC33)"
|
|
|
|
3 valid identities found''',
|
2019-03-01 07:17:55 +00:00
|
|
|
'',
|
2019-09-12 01:20:42 +00:00
|
|
|
)));
|
2017-05-18 18:26:43 +00:00
|
|
|
mockTerminalStdInStream =
|
2018-09-12 06:29:29 +00:00
|
|
|
Stream<String>.fromFuture(Future<String>.value('3'));
|
2019-09-12 01:20:42 +00:00
|
|
|
when(mockProcessManager.run(
|
2017-05-18 18:26:43 +00:00
|
|
|
<String>['security', 'find-certificate', '-c', '3333CCCC33', '-p'],
|
2018-05-31 15:24:26 +00:00
|
|
|
environment: anyNamed('environment'),
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
2019-09-12 01:20:42 +00:00
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(ProcessResult(
|
2018-02-02 22:27:29 +00:00
|
|
|
1, // pid
|
|
|
|
0, // exitCode
|
2017-05-18 18:26:43 +00:00
|
|
|
'This is a mock certificate',
|
|
|
|
'',
|
2019-09-12 01:20:42 +00:00
|
|
|
)));
|
2017-05-18 18:26:43 +00:00
|
|
|
|
2018-09-12 06:29:29 +00:00
|
|
|
final MockProcess mockOpenSslProcess = MockProcess();
|
|
|
|
final MockStdIn mockOpenSslStdIn = MockStdIn();
|
|
|
|
final MockStream mockOpenSslStdErr = MockStream();
|
2017-05-18 18:26:43 +00:00
|
|
|
|
|
|
|
when(mockProcessManager.start(
|
2019-09-12 01:20:42 +00:00
|
|
|
argThat(contains('openssl')),
|
2018-05-31 15:24:26 +00:00
|
|
|
environment: anyNamed('environment'),
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
2018-09-12 06:29:29 +00:00
|
|
|
)).thenAnswer((Invocation invocation) => Future<Process>.value(mockOpenSslProcess));
|
2017-05-18 18:26:43 +00:00
|
|
|
|
|
|
|
when(mockOpenSslProcess.stdin).thenReturn(mockOpenSslStdIn);
|
2017-12-19 21:13:57 +00:00
|
|
|
when(mockOpenSslProcess.stdout)
|
2018-09-12 06:29:29 +00:00
|
|
|
.thenAnswer((Invocation invocation) => Stream<List<int>>.fromFuture(
|
|
|
|
Future<List<int>>.value(utf8.encode(
|
2017-12-19 21:13:57 +00:00
|
|
|
'subject= /CN=iPhone Developer: Profile 3 (3333CCCC33)/OU=4444DDDD44/O=My Team/C=US'
|
|
|
|
))
|
|
|
|
));
|
|
|
|
when(mockOpenSslProcess.stderr).thenAnswer((Invocation invocation) => mockOpenSslStdErr);
|
2018-09-12 06:29:29 +00:00
|
|
|
when(mockOpenSslProcess.exitCode).thenAnswer((_) => Future<int>.value(0));
|
2017-05-18 18:26:43 +00:00
|
|
|
|
2020-03-24 22:30:35 +00:00
|
|
|
final Map<String, String> signingConfigs = await getCodeSigningIdentityDevelopmentTeam(
|
2021-03-30 15:19:28 +00:00
|
|
|
buildSettings: <String, String>{
|
|
|
|
'bogus': 'bogus',
|
|
|
|
},
|
2020-03-24 22:30:35 +00:00
|
|
|
processManager: mockProcessManager,
|
|
|
|
logger: logger,
|
2021-03-30 15:19:28 +00:00
|
|
|
config: testConfig,
|
|
|
|
terminal: testTerminal,
|
2020-03-24 22:30:35 +00:00
|
|
|
);
|
2017-05-18 18:26:43 +00:00
|
|
|
|
|
|
|
expect(
|
2020-03-24 22:30:35 +00:00
|
|
|
logger.statusText,
|
2019-03-01 07:17:55 +00:00
|
|
|
contains('Please select a certificate for code signing [<bold>1</bold>|2|3|a]: 3'),
|
2017-05-18 18:26:43 +00:00
|
|
|
);
|
|
|
|
expect(
|
2020-03-24 22:30:35 +00:00
|
|
|
logger.statusText,
|
2019-03-01 07:17:55 +00:00
|
|
|
contains('Signing iOS app for device deployment using developer identity: "iPhone Developer: Profile 3 (3333CCCC33)"'),
|
2017-05-18 18:26:43 +00:00
|
|
|
);
|
2020-03-24 22:30:35 +00:00
|
|
|
expect(logger.errorText, isEmpty);
|
2017-05-18 18:26:43 +00:00
|
|
|
verify(mockOpenSslStdIn.write('This is a mock certificate'));
|
2019-03-22 23:02:21 +00:00
|
|
|
expect(signingConfigs, <String, String>{'DEVELOPMENT_TEAM': '4444DDDD44'});
|
2017-06-22 00:22:13 +00:00
|
|
|
|
2021-02-02 02:16:05 +00:00
|
|
|
expect(testConfig.getValue('ios-signing-cert'), 'iPhone Developer: Profile 3 (3333CCCC33)');
|
2017-05-18 18:26:43 +00:00
|
|
|
});
|
2017-06-22 00:22:13 +00:00
|
|
|
|
2021-03-30 15:19:28 +00:00
|
|
|
testWithoutContext('Test multiple identity in machine mode works', () async {
|
2019-08-27 21:20:51 +00:00
|
|
|
testTerminal.usesTerminalUi = false;
|
2019-09-12 01:20:42 +00:00
|
|
|
when(mockProcessManager.run(
|
|
|
|
<String>['which', 'security'],
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
2018-05-31 15:24:26 +00:00
|
|
|
environment: anyNamed('environment'),
|
2019-09-12 01:20:42 +00:00
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(exitsHappy));
|
|
|
|
when(mockProcessManager.run(
|
|
|
|
<String>['which', 'openssl'],
|
2018-05-31 15:24:26 +00:00
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
2019-09-12 01:20:42 +00:00
|
|
|
environment: anyNamed('environment'),
|
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(exitsHappy));
|
|
|
|
when(mockProcessManager.run(
|
|
|
|
argThat(contains('find-identity')),
|
|
|
|
environment: anyNamed('environment'),
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(ProcessResult(
|
2018-02-02 22:27:29 +00:00
|
|
|
1, // pid
|
|
|
|
0, // exitCode
|
2017-06-28 20:33:14 +00:00
|
|
|
'''
|
|
|
|
1) 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8 "iPhone Developer: Profile 1 (1111AAAA11)"
|
|
|
|
2) da4b9237bacccdf19c0760cab7aec4a8359010b0 "iPhone Developer: Profile 2 (2222BBBB22)"
|
|
|
|
3) 5bf1fd927dfb8679496a2e6cf00cbe50c1c87145 "iPhone Developer: Profile 3 (3333CCCC33)"
|
|
|
|
3 valid identities found''',
|
2019-03-01 07:17:55 +00:00
|
|
|
'',
|
2019-09-12 01:20:42 +00:00
|
|
|
)));
|
2017-06-28 20:33:14 +00:00
|
|
|
mockTerminalStdInStream =
|
2018-09-12 06:29:29 +00:00
|
|
|
Stream<String>.fromFuture(Future<String>.error(Exception('Cannot read from StdIn')));
|
2019-09-12 01:20:42 +00:00
|
|
|
when(mockProcessManager.run(
|
2017-06-28 20:33:14 +00:00
|
|
|
<String>['security', 'find-certificate', '-c', '1111AAAA11', '-p'],
|
2018-05-31 15:24:26 +00:00
|
|
|
environment: anyNamed('environment'),
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
2019-09-12 01:20:42 +00:00
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(ProcessResult(
|
2018-02-02 22:27:29 +00:00
|
|
|
1, // pid
|
|
|
|
0, // exitCode
|
2017-06-28 20:33:14 +00:00
|
|
|
'This is a mock certificate',
|
|
|
|
'',
|
2019-09-12 01:20:42 +00:00
|
|
|
)));
|
2017-06-28 20:33:14 +00:00
|
|
|
|
2018-09-12 06:29:29 +00:00
|
|
|
final MockProcess mockOpenSslProcess = MockProcess();
|
|
|
|
final MockStdIn mockOpenSslStdIn = MockStdIn();
|
|
|
|
final MockStream mockOpenSslStdErr = MockStream();
|
2017-06-28 20:33:14 +00:00
|
|
|
|
|
|
|
when(mockProcessManager.start(
|
2019-09-12 01:20:42 +00:00
|
|
|
argThat(contains('openssl')),
|
2018-05-31 15:24:26 +00:00
|
|
|
environment: anyNamed('environment'),
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
2018-09-12 06:29:29 +00:00
|
|
|
)).thenAnswer((Invocation invocation) => Future<Process>.value(mockOpenSslProcess));
|
2017-06-28 20:33:14 +00:00
|
|
|
|
|
|
|
when(mockOpenSslProcess.stdin).thenReturn(mockOpenSslStdIn);
|
2017-12-19 21:13:57 +00:00
|
|
|
when(mockOpenSslProcess.stdout)
|
2018-09-12 06:29:29 +00:00
|
|
|
.thenAnswer((Invocation invocation) => Stream<List<int>>.fromFuture(
|
|
|
|
Future<List<int>>.value(utf8.encode(
|
2017-12-19 21:13:57 +00:00
|
|
|
'subject= /CN=iPhone Developer: Profile 1 (1111AAAA11)/OU=5555EEEE55/O=My Team/C=US'
|
|
|
|
)),
|
|
|
|
));
|
|
|
|
when(mockOpenSslProcess.stderr).thenAnswer((Invocation invocation) => mockOpenSslStdErr);
|
2018-09-12 06:29:29 +00:00
|
|
|
when(mockOpenSslProcess.exitCode).thenAnswer((_) => Future<int>.value(0));
|
2017-06-28 20:33:14 +00:00
|
|
|
|
2020-03-24 22:30:35 +00:00
|
|
|
final Map<String, String> signingConfigs = await getCodeSigningIdentityDevelopmentTeam(
|
2021-03-30 15:19:28 +00:00
|
|
|
buildSettings: <String, String>{
|
|
|
|
'bogus': 'bogus',
|
|
|
|
},
|
2020-03-24 22:30:35 +00:00
|
|
|
processManager: mockProcessManager,
|
|
|
|
logger: logger,
|
2021-03-30 15:19:28 +00:00
|
|
|
config: testConfig,
|
|
|
|
terminal: testTerminal,
|
2020-03-24 22:30:35 +00:00
|
|
|
);
|
2017-06-28 20:33:14 +00:00
|
|
|
|
|
|
|
expect(
|
2020-03-24 22:30:35 +00:00
|
|
|
logger.statusText,
|
2017-06-28 20:33:14 +00:00
|
|
|
contains('Signing iOS app for device deployment using developer identity: "iPhone Developer: Profile 1 (1111AAAA11)"'),
|
|
|
|
);
|
2020-03-24 22:30:35 +00:00
|
|
|
expect(logger.errorText, isEmpty);
|
2017-06-28 20:33:14 +00:00
|
|
|
verify(mockOpenSslStdIn.write('This is a mock certificate'));
|
2019-03-22 23:02:21 +00:00
|
|
|
expect(signingConfigs, <String, String>{'DEVELOPMENT_TEAM': '5555EEEE55'});
|
2017-06-28 20:33:14 +00:00
|
|
|
});
|
|
|
|
|
2021-03-30 15:19:28 +00:00
|
|
|
testWithoutContext('Test saved certificate used', () async {
|
2019-09-12 01:20:42 +00:00
|
|
|
when(mockProcessManager.run(
|
|
|
|
<String>['which', 'security'],
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
|
|
|
environment: anyNamed('environment'),
|
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(exitsHappy));
|
|
|
|
when(mockProcessManager.run(
|
|
|
|
<String>['which', 'openssl'],
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
|
|
|
environment: anyNamed('environment'),
|
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(exitsHappy));
|
|
|
|
when(mockProcessManager.run(
|
|
|
|
argThat(contains('find-identity')),
|
2018-05-31 15:24:26 +00:00
|
|
|
environment: anyNamed('environment'),
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
2019-09-12 01:20:42 +00:00
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(ProcessResult(
|
2018-02-02 22:27:29 +00:00
|
|
|
1, // pid
|
|
|
|
0, // exitCode
|
2017-06-22 00:22:13 +00:00
|
|
|
'''
|
|
|
|
1) 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8 "iPhone Developer: Profile 1 (1111AAAA11)"
|
|
|
|
2) da4b9237bacccdf19c0760cab7aec4a8359010b0 "iPhone Developer: Profile 2 (2222BBBB22)"
|
|
|
|
3) 5bf1fd927dfb8679496a2e6cf00cbe50c1c87145 "iPhone Developer: Profile 3 (3333CCCC33)"
|
|
|
|
3 valid identities found''',
|
2019-03-01 07:17:55 +00:00
|
|
|
'',
|
2019-09-12 01:20:42 +00:00
|
|
|
)));
|
|
|
|
when(mockProcessManager.run(
|
2017-06-22 00:22:13 +00:00
|
|
|
<String>['security', 'find-certificate', '-c', '3333CCCC33', '-p'],
|
2018-05-31 15:24:26 +00:00
|
|
|
environment: anyNamed('environment'),
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
2019-09-12 01:20:42 +00:00
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(ProcessResult(
|
2018-02-02 22:27:29 +00:00
|
|
|
1, // pid
|
|
|
|
0, // exitCode
|
2017-06-22 00:22:13 +00:00
|
|
|
'This is a mock certificate',
|
|
|
|
'',
|
2019-09-12 01:20:42 +00:00
|
|
|
)));
|
2017-06-22 00:22:13 +00:00
|
|
|
|
2018-09-12 06:29:29 +00:00
|
|
|
final MockProcess mockOpenSslProcess = MockProcess();
|
|
|
|
final MockStdIn mockOpenSslStdIn = MockStdIn();
|
|
|
|
final MockStream mockOpenSslStdErr = MockStream();
|
2017-06-22 00:22:13 +00:00
|
|
|
|
|
|
|
when(mockProcessManager.start(
|
2019-09-12 01:20:42 +00:00
|
|
|
argThat(contains('openssl')),
|
2018-05-31 15:24:26 +00:00
|
|
|
environment: anyNamed('environment'),
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
2018-09-12 06:29:29 +00:00
|
|
|
)).thenAnswer((Invocation invocation) => Future<Process>.value(mockOpenSslProcess));
|
2017-06-22 00:22:13 +00:00
|
|
|
|
|
|
|
when(mockOpenSslProcess.stdin).thenReturn(mockOpenSslStdIn);
|
2017-12-19 21:13:57 +00:00
|
|
|
when(mockOpenSslProcess.stdout)
|
2018-09-12 06:29:29 +00:00
|
|
|
.thenAnswer((Invocation invocation) => Stream<List<int>>.fromFuture(
|
|
|
|
Future<List<int>>.value(utf8.encode(
|
2017-12-19 21:13:57 +00:00
|
|
|
'subject= /CN=iPhone Developer: Profile 3 (3333CCCC33)/OU=4444DDDD44/O=My Team/C=US'
|
|
|
|
))
|
|
|
|
));
|
|
|
|
when(mockOpenSslProcess.stderr).thenAnswer((Invocation invocation) => mockOpenSslStdErr);
|
2018-09-12 06:29:29 +00:00
|
|
|
when(mockOpenSslProcess.exitCode).thenAnswer((_) => Future<int>.value(0));
|
2021-02-02 02:16:05 +00:00
|
|
|
testConfig.setValue('ios-signing-cert', 'iPhone Developer: Profile 3 (3333CCCC33)');
|
2017-06-22 00:22:13 +00:00
|
|
|
|
2020-03-24 22:30:35 +00:00
|
|
|
final Map<String, String> signingConfigs = await getCodeSigningIdentityDevelopmentTeam(
|
2021-03-30 15:19:28 +00:00
|
|
|
buildSettings: <String, String>{
|
|
|
|
'bogus': 'bogus',
|
|
|
|
},
|
2020-03-24 22:30:35 +00:00
|
|
|
processManager: mockProcessManager,
|
|
|
|
logger: logger,
|
2021-03-30 15:19:28 +00:00
|
|
|
config: testConfig,
|
|
|
|
terminal: testTerminal,
|
2020-03-24 22:30:35 +00:00
|
|
|
);
|
2017-06-22 00:22:13 +00:00
|
|
|
|
|
|
|
expect(
|
2020-03-24 22:30:35 +00:00
|
|
|
logger.statusText,
|
2019-03-01 07:17:55 +00:00
|
|
|
contains('Found saved certificate choice "iPhone Developer: Profile 3 (3333CCCC33)". To clear, use "flutter config"'),
|
2017-06-22 00:22:13 +00:00
|
|
|
);
|
|
|
|
expect(
|
2020-03-24 22:30:35 +00:00
|
|
|
logger.statusText,
|
2019-03-01 07:17:55 +00:00
|
|
|
contains('Signing iOS app for device deployment using developer identity: "iPhone Developer: Profile 3 (3333CCCC33)"'),
|
2017-06-22 00:22:13 +00:00
|
|
|
);
|
2020-03-24 22:30:35 +00:00
|
|
|
expect(logger.errorText, isEmpty);
|
2017-06-22 00:22:13 +00:00
|
|
|
verify(mockOpenSslStdIn.write('This is a mock certificate'));
|
2019-03-22 23:02:21 +00:00
|
|
|
expect(signingConfigs, <String, String>{'DEVELOPMENT_TEAM': '4444DDDD44'});
|
2017-06-22 00:22:13 +00:00
|
|
|
});
|
2017-08-16 20:59:05 +00:00
|
|
|
|
2021-03-30 15:19:28 +00:00
|
|
|
testWithoutContext('Test invalid saved certificate shows error and prompts again', () async {
|
2019-09-12 01:20:42 +00:00
|
|
|
when(mockProcessManager.run(
|
|
|
|
<String>['which', 'security'],
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
2018-05-31 15:24:26 +00:00
|
|
|
environment: anyNamed('environment'),
|
2019-09-12 01:20:42 +00:00
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(exitsHappy));
|
|
|
|
when(mockProcessManager.run(
|
|
|
|
<String>['which', 'openssl'],
|
2018-05-31 15:24:26 +00:00
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
2019-09-12 01:20:42 +00:00
|
|
|
environment: anyNamed('environment'),
|
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(exitsHappy));
|
|
|
|
when(mockProcessManager.run(
|
|
|
|
argThat(contains('find-identity')),
|
|
|
|
environment: anyNamed('environment'),
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(ProcessResult(
|
2018-02-02 22:27:29 +00:00
|
|
|
1, // pid
|
|
|
|
0, // exitCode
|
2017-08-16 20:59:05 +00:00
|
|
|
'''
|
|
|
|
1) 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8 "iPhone Developer: Profile 1 (1111AAAA11)"
|
|
|
|
2) da4b9237bacccdf19c0760cab7aec4a8359010b0 "iPhone Developer: Profile 2 (2222BBBB22)"
|
|
|
|
3) 5bf1fd927dfb8679496a2e6cf00cbe50c1c87145 "iPhone Developer: Profile 3 (3333CCCC33)"
|
|
|
|
3 valid identities found''',
|
2019-03-01 07:17:55 +00:00
|
|
|
'',
|
2019-09-12 01:20:42 +00:00
|
|
|
)));
|
2017-08-16 20:59:05 +00:00
|
|
|
mockTerminalStdInStream =
|
2018-09-12 06:29:29 +00:00
|
|
|
Stream<String>.fromFuture(Future<String>.value('3'));
|
2019-09-12 01:20:42 +00:00
|
|
|
when(mockProcessManager.run(
|
2017-08-16 20:59:05 +00:00
|
|
|
<String>['security', 'find-certificate', '-c', '3333CCCC33', '-p'],
|
2018-05-31 15:24:26 +00:00
|
|
|
environment: anyNamed('environment'),
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
2019-09-12 01:20:42 +00:00
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(ProcessResult(
|
2018-02-02 22:27:29 +00:00
|
|
|
1, // pid
|
|
|
|
0, // exitCode
|
2017-08-16 20:59:05 +00:00
|
|
|
'This is a mock certificate',
|
|
|
|
'',
|
2019-09-12 01:20:42 +00:00
|
|
|
)));
|
2017-08-16 20:59:05 +00:00
|
|
|
|
|
|
|
|
2018-09-12 06:29:29 +00:00
|
|
|
final MockProcess mockOpenSslProcess = MockProcess();
|
|
|
|
final MockStdIn mockOpenSslStdIn = MockStdIn();
|
|
|
|
final MockStream mockOpenSslStdErr = MockStream();
|
2017-08-16 20:59:05 +00:00
|
|
|
|
|
|
|
when(mockProcessManager.start(
|
2019-09-12 01:20:42 +00:00
|
|
|
argThat(contains('openssl')),
|
2018-05-31 15:24:26 +00:00
|
|
|
environment: anyNamed('environment'),
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
2018-09-12 06:29:29 +00:00
|
|
|
)).thenAnswer((Invocation invocation) => Future<Process>.value(mockOpenSslProcess));
|
2017-08-16 20:59:05 +00:00
|
|
|
|
|
|
|
when(mockOpenSslProcess.stdin).thenReturn(mockOpenSslStdIn);
|
2017-12-19 21:13:57 +00:00
|
|
|
when(mockOpenSslProcess.stdout)
|
2018-09-12 06:29:29 +00:00
|
|
|
.thenAnswer((Invocation invocation) => Stream<List<int>>.fromFuture(
|
|
|
|
Future<List<int>>.value(utf8.encode(
|
2017-12-19 21:13:57 +00:00
|
|
|
'subject= /CN=iPhone Developer: Profile 3 (3333CCCC33)/OU=4444DDDD44/O=My Team/C=US'
|
|
|
|
))
|
|
|
|
));
|
|
|
|
when(mockOpenSslProcess.stderr).thenAnswer((Invocation invocation) => mockOpenSslStdErr);
|
2018-09-12 06:29:29 +00:00
|
|
|
when(mockOpenSslProcess.exitCode).thenAnswer((_) => Future<int>.value(0));
|
2021-02-02 02:16:05 +00:00
|
|
|
testConfig.setValue('ios-signing-cert', 'iPhone Developer: Invalid Profile');
|
2017-08-16 20:59:05 +00:00
|
|
|
|
2020-03-24 22:30:35 +00:00
|
|
|
final Map<String, String> signingConfigs = await getCodeSigningIdentityDevelopmentTeam(
|
2021-03-30 15:19:28 +00:00
|
|
|
buildSettings: <String, String>{
|
|
|
|
'bogus': 'bogus',
|
|
|
|
},
|
2020-03-24 22:30:35 +00:00
|
|
|
processManager: mockProcessManager,
|
|
|
|
logger: logger,
|
2021-03-30 15:19:28 +00:00
|
|
|
config: testConfig,
|
|
|
|
terminal: testTerminal,
|
2020-03-24 22:30:35 +00:00
|
|
|
);
|
2017-08-16 20:59:05 +00:00
|
|
|
|
|
|
|
expect(
|
2020-03-24 22:30:35 +00:00
|
|
|
logger.errorText.replaceAll('\n', ' '),
|
2019-03-01 07:17:55 +00:00
|
|
|
contains('Saved signing certificate "iPhone Developer: Invalid Profile" is not a valid development certificate'),
|
2017-08-16 20:59:05 +00:00
|
|
|
);
|
|
|
|
expect(
|
2020-03-24 22:30:35 +00:00
|
|
|
logger.statusText,
|
2019-03-01 07:17:55 +00:00
|
|
|
contains('Certificate choice "iPhone Developer: Profile 3 (3333CCCC33)"'),
|
2017-08-16 20:59:05 +00:00
|
|
|
);
|
2019-03-22 23:02:21 +00:00
|
|
|
expect(signingConfigs, <String, String>{'DEVELOPMENT_TEAM': '4444DDDD44'});
|
2021-02-02 02:16:05 +00:00
|
|
|
expect(testConfig.getValue('ios-signing-cert'), 'iPhone Developer: Profile 3 (3333CCCC33)');
|
2017-08-16 20:59:05 +00:00
|
|
|
});
|
2019-07-18 17:45:37 +00:00
|
|
|
|
2020-03-24 22:30:35 +00:00
|
|
|
testWithoutContext('find-identity failure', () async {
|
2019-09-12 01:20:42 +00:00
|
|
|
when(mockProcessManager.run(
|
|
|
|
<String>['which', 'security'],
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
|
|
|
environment: anyNamed('environment'),
|
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(exitsHappy));
|
|
|
|
when(mockProcessManager.run(
|
|
|
|
<String>['which', 'openssl'],
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
|
|
|
environment: anyNamed('environment'),
|
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(exitsHappy));
|
|
|
|
when(mockProcessManager.run(
|
|
|
|
argThat(contains('find-identity')),
|
|
|
|
environment: anyNamed('environment'),
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(
|
|
|
|
ProcessResult(0, 1, '', '')
|
|
|
|
));
|
2019-07-18 17:45:37 +00:00
|
|
|
|
2020-03-24 22:30:35 +00:00
|
|
|
final Map<String, String> signingConfigs = await getCodeSigningIdentityDevelopmentTeam(
|
2021-03-30 15:19:28 +00:00
|
|
|
buildSettings: <String, String>{
|
|
|
|
'bogus': 'bogus',
|
|
|
|
},
|
2020-03-24 22:30:35 +00:00
|
|
|
processManager: mockProcessManager,
|
|
|
|
logger: logger,
|
2021-03-30 15:19:28 +00:00
|
|
|
config: testConfig,
|
|
|
|
terminal: testTerminal,
|
2020-03-24 22:30:35 +00:00
|
|
|
);
|
2019-07-18 17:45:37 +00:00
|
|
|
expect(signingConfigs, isNull);
|
|
|
|
});
|
|
|
|
|
2021-03-30 15:19:28 +00:00
|
|
|
testWithoutContext('find-certificate failure', () async {
|
2019-09-12 01:20:42 +00:00
|
|
|
when(mockProcessManager.run(
|
|
|
|
<String>['which', 'security'],
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
|
|
|
environment: anyNamed('environment'),
|
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(exitsHappy));
|
|
|
|
when(mockProcessManager.run(
|
|
|
|
<String>['which', 'openssl'],
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
|
|
|
environment: anyNamed('environment'),
|
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(exitsHappy));
|
|
|
|
when(mockProcessManager.run(
|
|
|
|
argThat(contains('find-identity')),
|
|
|
|
environment: anyNamed('environment'),
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(ProcessResult(
|
2019-07-18 17:45:37 +00:00
|
|
|
1, // pid
|
|
|
|
0, // exitCode
|
|
|
|
'''
|
|
|
|
1) 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8 "iPhone Developer: Profile 1 (1111AAAA11)"
|
|
|
|
2) da4b9237bacccdf19c0760cab7aec4a8359010b0 "iPhone Developer: Profile 2 (2222BBBB22)"
|
|
|
|
3) 5bf1fd927dfb8679496a2e6cf00cbe50c1c87145 "iPhone Developer: Profile 3 (3333CCCC33)"
|
|
|
|
3 valid identities found''',
|
|
|
|
'',
|
2019-09-12 01:20:42 +00:00
|
|
|
)));
|
2019-07-18 17:45:37 +00:00
|
|
|
mockTerminalStdInStream =
|
|
|
|
Stream<String>.fromFuture(Future<String>.value('3'));
|
2019-09-12 01:20:42 +00:00
|
|
|
when(mockProcessManager.run(
|
2019-07-18 17:45:37 +00:00
|
|
|
<String>['security', 'find-certificate', '-c', '3333CCCC33', '-p'],
|
|
|
|
environment: anyNamed('environment'),
|
|
|
|
workingDirectory: anyNamed('workingDirectory'),
|
2019-09-12 01:20:42 +00:00
|
|
|
)).thenAnswer((_) => Future<ProcessResult>.value(
|
|
|
|
ProcessResult(1, 1, '', '' ))
|
|
|
|
);
|
2019-07-18 17:45:37 +00:00
|
|
|
|
2020-03-24 22:30:35 +00:00
|
|
|
final Map<String, String> signingConfigs = await getCodeSigningIdentityDevelopmentTeam(
|
2021-03-30 15:19:28 +00:00
|
|
|
buildSettings: <String, String>{
|
|
|
|
'bogus': 'bogus',
|
|
|
|
},
|
2020-03-24 22:30:35 +00:00
|
|
|
processManager: mockProcessManager,
|
|
|
|
logger: logger,
|
2021-03-30 15:19:28 +00:00
|
|
|
config: testConfig,
|
|
|
|
terminal: testTerminal,
|
2020-03-24 22:30:35 +00:00
|
|
|
);
|
2019-07-18 17:45:37 +00:00
|
|
|
expect(signingConfigs, isNull);
|
|
|
|
});
|
2017-05-15 19:54:32 +00:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2018-09-12 06:29:29 +00:00
|
|
|
final ProcessResult exitsHappy = ProcessResult(
|
2018-02-02 22:27:29 +00:00
|
|
|
1, // pid
|
|
|
|
0, // exitCode
|
|
|
|
'', // stdout
|
|
|
|
'', // stderr
|
2017-05-15 19:54:32 +00:00
|
|
|
);
|
|
|
|
|
2018-09-12 06:29:29 +00:00
|
|
|
final ProcessResult exitsFail = ProcessResult(
|
2018-02-02 22:27:29 +00:00
|
|
|
2, // pid
|
|
|
|
1, // exitCode
|
|
|
|
'', // stdout
|
|
|
|
'', // stderr
|
2017-05-15 19:54:32 +00:00
|
|
|
);
|
|
|
|
|
|
|
|
class MockProcessManager extends Mock implements ProcessManager {}
|
|
|
|
class MockProcess extends Mock implements Process {}
|
|
|
|
class MockStream extends Mock implements Stream<List<int>> {}
|
|
|
|
class MockStdIn extends Mock implements IOSink {}
|
2017-05-18 18:26:43 +00:00
|
|
|
|
|
|
|
Stream<String> mockTerminalStdInStream;
|
|
|
|
|
|
|
|
class TestTerminal extends AnsiTerminal {
|
2020-01-08 20:35:12 +00:00
|
|
|
TestTerminal() : super(stdio: globals.stdio, platform: globals.platform);
|
|
|
|
|
2017-05-24 01:05:47 +00:00
|
|
|
@override
|
|
|
|
String bolden(String message) => '<bold>$message</bold>';
|
|
|
|
|
2017-05-18 18:26:43 +00:00
|
|
|
@override
|
2019-01-19 08:31:05 +00:00
|
|
|
Stream<String> get keystrokes {
|
2017-05-18 18:26:43 +00:00
|
|
|
return mockTerminalStdInStream;
|
|
|
|
}
|
|
|
|
}
|