Unverified Commit 7a0ebad0 authored by Mikkel Nygaard Ravn's avatar Mikkel Nygaard Ravn Committed by GitHub

Revert "Flutter tools recommend using Cocoapods 1.5.0 (#16971)" (#17110)

This reverts commit 6e26cc28.
parent 6e26cc28
...@@ -52,7 +52,7 @@ Future<T> runInContext<T>( ...@@ -52,7 +52,7 @@ Future<T> runInContext<T>(
BotDetector: () => const BotDetector(), BotDetector: () => const BotDetector(),
Cache: () => new Cache(), Cache: () => new Cache(),
Clock: () => const Clock(), Clock: () => const Clock(),
CocoaPods: () => new CocoaPods(), CocoaPods: () => const CocoaPods(),
Config: () => new Config(), Config: () => new Config(),
DevFSConfig: () => new DevFSConfig(), DevFSConfig: () => new DevFSConfig(),
DeviceManager: () => new DeviceManager(), DeviceManager: () => new DeviceManager(),
......
...@@ -33,46 +33,25 @@ const String cocoaPodsUpgradeInstructions = ''' ...@@ -33,46 +33,25 @@ const String cocoaPodsUpgradeInstructions = '''
CocoaPods get cocoaPods => context[CocoaPods]; CocoaPods get cocoaPods => context[CocoaPods];
/// Result of evaluating the CocoaPods installation.
enum CocoaPodsStatus {
/// iOS plugins will not work, installation required.
notInstalled,
/// iOS plugins will not work, upgrade required.
belowMinimumVersion,
/// iOS plugins may not work in certain situations (Swift, static libraries),
/// upgrade recommended.
belowRecommendedVersion,
/// Everything should be fine.
recommended,
}
class CocoaPods { class CocoaPods {
Future<String> _versionText; const CocoaPods();
Future<bool> get hasCocoaPods => exitsHappyAsync(<String>['pod', '--version']);
// TODO(mravn): Insist on 1.5.0 once build bots have that installed.
// Earlier versions do not work with Swift and static libraries.
String get cocoaPodsMinimumVersion => '1.0.0'; String get cocoaPodsMinimumVersion => '1.0.0';
String get cocoaPodsRecommendedVersion => '1.5.0';
Future<String> get cocoaPodsVersionText { Future<String> get cocoaPodsVersionText async => (await runAsync(<String>['pod', '--version'])).processResult.stdout.trim();
_versionText ??= runAsync(<String>['pod', '--version']).then<String>((RunResult result) {
return result.exitCode == 0 ? result.stdout.trim() : null;
});
return _versionText;
}
Future<CocoaPodsStatus> get evaluateCocoaPodsInstallation async { Future<bool> get isCocoaPodsInstalledAndMeetsVersionCheck async {
final String versionText = await cocoaPodsVersionText; if (!await hasCocoaPods)
if (versionText == null) return false;
return CocoaPodsStatus.notInstalled;
try { try {
final Version installedVersion = new Version.parse(versionText); final Version installedVersion = new Version.parse(await cocoaPodsVersionText);
if (installedVersion < new Version.parse(cocoaPodsMinimumVersion)) return installedVersion >= new Version.parse(cocoaPodsMinimumVersion);
return CocoaPodsStatus.belowMinimumVersion;
else if (installedVersion < new Version.parse(cocoaPodsRecommendedVersion))
return CocoaPodsStatus.belowRecommendedVersion;
else
return CocoaPodsStatus.recommended;
} on FormatException { } on FormatException {
return CocoaPodsStatus.notInstalled; return false;
} }
} }
...@@ -98,37 +77,16 @@ class CocoaPods { ...@@ -98,37 +77,16 @@ class CocoaPods {
/// Make sure the CocoaPods tools are in the right states. /// Make sure the CocoaPods tools are in the right states.
Future<bool> _checkPodCondition() async { Future<bool> _checkPodCondition() async {
final CocoaPodsStatus installation = await evaluateCocoaPodsInstallation; if (!await isCocoaPodsInstalledAndMeetsVersionCheck) {
switch (installation) { final String minimumVersion = cocoaPodsMinimumVersion;
case CocoaPodsStatus.notInstalled:
printError( printError(
'Warning: CocoaPods not installed. Skipping pod install.\n' 'Warning: CocoaPods version $minimumVersion or greater not installed. Skipping pod install.\n'
'$noCocoaPodsConsequence\n' '$noCocoaPodsConsequence\n'
'To install:\n' 'To install:\n'
'$cocoaPodsInstallInstructions\n', '$cocoaPodsInstallInstructions\n',
emphasis: true, emphasis: true,
); );
return false; return false;
case CocoaPodsStatus.belowMinimumVersion:
printError(
'Warning: CocoaPods minimum required version $cocoaPodsMinimumVersion or greater not installed. Skipping pod install.\n'
'$noCocoaPodsConsequence\n'
'To upgrade:\n'
'$cocoaPodsUpgradeInstructions\n',
emphasis: true,
);
return false;
case CocoaPodsStatus.belowRecommendedVersion:
printError(
'Warning: CocoaPods recommended version $cocoaPodsRecommendedVersion or greater not installed.\n'
'Pods handling may fail on some projects involving plugins.\n'
'To upgrade:\n'
'$cocoaPodsUpgradeInstructions\n',
emphasis: true,
);
break;
default:
break;
} }
if (!await isCocoaPodsInitialized) { if (!await isCocoaPodsInitialized) {
printError( printError(
...@@ -196,19 +154,18 @@ class CocoaPods { ...@@ -196,19 +154,18 @@ class CocoaPods {
// Check if you need to run pod install. // Check if you need to run pod install.
// The pod install will run if any of below is true. // The pod install will run if any of below is true.
// 1. The flutter.framework has changed (debug/release/profile) // 1. The flutter.framework has changed (debug/release/profile)
// 2. The Podfile.lock doesn't exist or is older than Podfile // 2. The podfile.lock doesn't exist
// 3. The Pods/Manifest.lock doesn't exist (It is deleted when plugins change) // 3. The Pods/Manifest.lock doesn't exist (It is deleted when plugins change)
// 4. The Podfile.lock doesn't match Pods/Manifest.lock. // 4. The podfile.lock doesn't match Pods/Manifest.lock.
bool _shouldRunPodInstall(Directory appIosDirectory, bool flutterPodChanged) { bool _shouldRunPodInstall(Directory appIosDirectory, bool flutterPodChanged) {
if (flutterPodChanged) if (flutterPodChanged)
return true; return true;
final File podfileFile = appIosDirectory.childFile('Podfile'); // Check if podfile.lock and Pods/Manifest.lock exist and match.
final File podfileLockFile = appIosDirectory.childFile('Podfile.lock'); final File podfileLockFile = appIosDirectory.childFile('Podfile.lock');
final File manifestLockFile = final File manifestLockFile =
appIosDirectory.childFile(fs.path.join('Pods', 'Manifest.lock')); appIosDirectory.childFile(fs.path.join('Pods', 'Manifest.lock'));
return !podfileLockFile.existsSync() return !podfileLockFile.existsSync()
|| !manifestLockFile.existsSync() || !manifestLockFile.existsSync()
|| podfileLockFile.statSync().modified.isBefore(podfileFile.statSync().modified)
|| podfileLockFile.readAsStringSync() != manifestLockFile.readAsStringSync(); || podfileLockFile.readAsStringSync() != manifestLockFile.readAsStringSync();
} }
......
...@@ -171,9 +171,7 @@ class IOSWorkflow extends DoctorValidator implements Workflow { ...@@ -171,9 +171,7 @@ class IOSWorkflow extends DoctorValidator implements Workflow {
} }
} }
final CocoaPodsStatus cocoaPodsStatus = await cocoaPods.evaluateCocoaPodsInstallation; if (await cocoaPods.isCocoaPodsInstalledAndMeetsVersionCheck) {
if (cocoaPodsStatus == CocoaPodsStatus.recommended) {
if (await cocoaPods.isCocoaPodsInitialized) { if (await cocoaPods.isCocoaPodsInitialized) {
messages.add(new ValidationMessage('CocoaPods version ${await cocoaPods.cocoaPodsVersionText}')); messages.add(new ValidationMessage('CocoaPods version ${await cocoaPods.cocoaPodsVersionText}'));
} else { } else {
...@@ -188,7 +186,7 @@ class IOSWorkflow extends DoctorValidator implements Workflow { ...@@ -188,7 +186,7 @@ class IOSWorkflow extends DoctorValidator implements Workflow {
} }
} else { } else {
brewStatus = ValidationType.partial; brewStatus = ValidationType.partial;
if (cocoaPodsStatus == CocoaPodsStatus.notInstalled) { if (!await cocoaPods.hasCocoaPods) {
messages.add(new ValidationMessage.error( messages.add(new ValidationMessage.error(
'CocoaPods not installed.\n' 'CocoaPods not installed.\n'
'$noCocoaPodsConsequence\n' '$noCocoaPodsConsequence\n'
...@@ -197,7 +195,7 @@ class IOSWorkflow extends DoctorValidator implements Workflow { ...@@ -197,7 +195,7 @@ class IOSWorkflow extends DoctorValidator implements Workflow {
)); ));
} else { } else {
messages.add(new ValidationMessage.error( messages.add(new ValidationMessage.error(
'CocoaPods out of date (${cocoaPods.cocoaPodsRecommendedVersion} is recommended).\n' 'CocoaPods out of date ($cocoaPods.cocoaPodsMinimumVersion is required).\n'
'$noCocoaPodsConsequence\n' '$noCocoaPodsConsequence\n'
'To upgrade:\n' 'To upgrade:\n'
'$cocoaPodsUpgradeInstructions' '$cocoaPodsUpgradeInstructions'
......
...@@ -238,7 +238,7 @@ void injectPlugins({String directory}) { ...@@ -238,7 +238,7 @@ void injectPlugins({String directory}) {
_writeAndroidPluginRegistrant(directory, plugins); _writeAndroidPluginRegistrant(directory, plugins);
if (fs.isDirectorySync(fs.path.join(directory, 'ios'))) { if (fs.isDirectorySync(fs.path.join(directory, 'ios'))) {
_writeIOSPluginRegistrant(directory, plugins); _writeIOSPluginRegistrant(directory, plugins);
final CocoaPods cocoaPods = new CocoaPods(); const CocoaPods cocoaPods = const CocoaPods();
if (plugins.isNotEmpty) if (plugins.isNotEmpty)
cocoaPods.setupPodfile(directory); cocoaPods.setupPodfile(directory);
if (changed) if (changed)
......
...@@ -23,7 +23,6 @@ void main() { ...@@ -23,7 +23,6 @@ void main() {
MockXcodeProjectInterpreter mockXcodeProjectInterpreter; MockXcodeProjectInterpreter mockXcodeProjectInterpreter;
Directory projectUnderTest; Directory projectUnderTest;
CocoaPods cocoaPodsUnderTest; CocoaPods cocoaPodsUnderTest;
ProcessResult resultOfPodVersion;
setUp(() { setUp(() {
Cache.flutterRoot = 'flutter'; Cache.flutterRoot = 'flutter';
...@@ -31,8 +30,7 @@ void main() { ...@@ -31,8 +30,7 @@ void main() {
mockProcessManager = new MockProcessManager(); mockProcessManager = new MockProcessManager();
mockXcodeProjectInterpreter = new MockXcodeProjectInterpreter(); mockXcodeProjectInterpreter = new MockXcodeProjectInterpreter();
projectUnderTest = fs.directory(fs.path.join('project', 'ios'))..createSync(recursive: true); projectUnderTest = fs.directory(fs.path.join('project', 'ios'))..createSync(recursive: true);
cocoaPodsUnderTest = new CocoaPods();
resultOfPodVersion = exitsHappy('1.5.0');
fs.file(fs.path.join( fs.file(fs.path.join(
Cache.flutterRoot, 'packages', 'flutter_tools', 'templates', 'cocoapods', 'Podfile-objc' Cache.flutterRoot, 'packages', 'flutter_tools', 'templates', 'cocoapods', 'Podfile-objc'
)) ))
...@@ -43,86 +41,30 @@ void main() { ...@@ -43,86 +41,30 @@ void main() {
)) ))
..createSync(recursive: true) ..createSync(recursive: true)
..writeAsStringSync('Swift podfile template'); ..writeAsStringSync('Swift podfile template');
fs.directory(fs.path.join(homeDirPath, '.cocoapods', 'repos', 'master')).createSync(recursive: true); cocoaPodsUnderTest = const TestCocoaPods();
when(mockProcessManager.run(
<String>['pod', '--version'],
workingDirectory: any,
environment: any,
)).thenAnswer((_) async => resultOfPodVersion);
when(mockProcessManager.run( when(mockProcessManager.run(
<String>['pod', 'install', '--verbose'], <String>['pod', 'install', '--verbose'],
workingDirectory: 'project/ios', workingDirectory: 'project/ios',
environment: <String, String>{'FLUTTER_FRAMEWORK_DIR': 'engine/path', 'COCOAPODS_DISABLE_STATS': 'true'}, environment: <String, String>{'FLUTTER_FRAMEWORK_DIR': 'engine/path', 'COCOAPODS_DISABLE_STATS': 'true'},
)).thenAnswer((_) async => exitsHappy()); )).thenAnswer((_) => new Future<ProcessResult>.value(exitsHappy));
});
void pretendPodIsNotInstalled() {
resultOfPodVersion = exitsWithError();
}
void pretendPodVersionIs(String versionText) {
resultOfPodVersion = exitsHappy(versionText);
}
group('Evaluate installation', () {
testUsingContext('detects not installed', () async {
pretendPodIsNotInstalled();
expect(await cocoaPodsUnderTest.evaluateCocoaPodsInstallation, CocoaPodsStatus.notInstalled);
}, overrides: <Type, Generator>{
ProcessManager: () => mockProcessManager,
});
testUsingContext('detects installed', () async {
pretendPodVersionIs('0.0.1');
expect(await cocoaPodsUnderTest.evaluateCocoaPodsInstallation, isNot(CocoaPodsStatus.notInstalled));
}, overrides: <Type, Generator>{
ProcessManager: () => mockProcessManager,
});
testUsingContext('detects below minimum version', () async {
pretendPodVersionIs('0.39.8');
expect(await cocoaPodsUnderTest.evaluateCocoaPodsInstallation, CocoaPodsStatus.belowMinimumVersion);
}, overrides: <Type, Generator>{
ProcessManager: () => mockProcessManager,
});
testUsingContext('detects below recommended version', () async {
pretendPodVersionIs('1.4.99');
expect(await cocoaPodsUnderTest.evaluateCocoaPodsInstallation, CocoaPodsStatus.belowRecommendedVersion);
}, overrides: <Type, Generator>{
ProcessManager: () => mockProcessManager,
});
testUsingContext('detects at recommended version', () async {
pretendPodVersionIs('1.5.0');
expect(await cocoaPodsUnderTest.evaluateCocoaPodsInstallation, CocoaPodsStatus.recommended);
}, overrides: <Type, Generator>{
ProcessManager: () => mockProcessManager,
});
testUsingContext('detects above recommended version', () async {
pretendPodVersionIs('1.5.1');
expect(await cocoaPodsUnderTest.evaluateCocoaPodsInstallation, CocoaPodsStatus.recommended);
}, overrides: <Type, Generator>{
ProcessManager: () => mockProcessManager,
});
}); });
group('Setup Podfile', () { group('Setup Podfile', () {
File podFile; File podfile;
File debugConfigFile; File debugConfigFile;
File releaseConfigFile; File releaseConfigFile;
setUp(() { setUp(() {
debugConfigFile = fs.file(fs.path.join('project', 'ios', 'Flutter', 'Debug.xcconfig')); debugConfigFile = fs.file(fs.path.join('project', 'ios', 'Flutter', 'Debug.xcconfig'));
releaseConfigFile = fs.file(fs.path.join('project', 'ios', 'Flutter', 'Release.xcconfig')); releaseConfigFile = fs.file(fs.path.join('project', 'ios', 'Flutter', 'Release.xcconfig'));
podFile = fs.file(fs.path.join('project', 'ios', 'Podfile')); podfile = fs.file(fs.path.join('project', 'ios', 'Podfile'));
}); });
testUsingContext('creates objective-c Podfile when not present', () { testUsingContext('creates objective-c Podfile when not present', () {
cocoaPodsUnderTest.setupPodfile('project'); cocoaPodsUnderTest.setupPodfile('project');
expect(podFile.readAsStringSync(), 'Objective-C podfile template'); expect(podfile.readAsStringSync(), 'Objective-C podfile template');
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fs, FileSystem: () => fs,
}); });
...@@ -135,18 +77,18 @@ void main() { ...@@ -135,18 +77,18 @@ void main() {
cocoaPodsUnderTest.setupPodfile('project'); cocoaPodsUnderTest.setupPodfile('project');
expect(podFile.readAsStringSync(), 'Swift podfile template'); expect(podfile.readAsStringSync(), 'Swift podfile template');
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fs, FileSystem: () => fs,
XcodeProjectInterpreter: () => mockXcodeProjectInterpreter, XcodeProjectInterpreter: () => mockXcodeProjectInterpreter,
}); });
testUsingContext('does not recreate Podfile when already present', () { testUsingContext('does not recreate Podfile when already present', () {
podFile..createSync()..writeAsStringSync('Existing Podfile'); podfile..createSync()..writeAsStringSync('Existing Podfile');
cocoaPodsUnderTest.setupPodfile('project'); cocoaPodsUnderTest.setupPodfile('project');
expect(podFile.readAsStringSync(), 'Existing Podfile'); expect(podfile.readAsStringSync(), 'Existing Podfile');
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fs, FileSystem: () => fs,
}); });
...@@ -156,14 +98,14 @@ void main() { ...@@ -156,14 +98,14 @@ void main() {
cocoaPodsUnderTest.setupPodfile('project'); cocoaPodsUnderTest.setupPodfile('project');
expect(podFile.existsSync(), false); expect(podfile.existsSync(), false);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fs, FileSystem: () => fs,
XcodeProjectInterpreter: () => mockXcodeProjectInterpreter, XcodeProjectInterpreter: () => mockXcodeProjectInterpreter,
}); });
testUsingContext('includes Pod config in xcconfig files, if not present', () { testUsingContext('includes Pod config in xcconfig files, if not present', () {
podFile..createSync()..writeAsStringSync('Existing Podfile'); podfile..createSync()..writeAsStringSync('Existing Podfile');
debugConfigFile..createSync(recursive: true)..writeAsStringSync('Existing debug config'); debugConfigFile..createSync(recursive: true)..writeAsStringSync('Existing debug config');
releaseConfigFile..createSync(recursive: true)..writeAsStringSync('Existing release config'); releaseConfigFile..createSync(recursive: true)..writeAsStringSync('Existing release config');
...@@ -184,14 +126,14 @@ void main() { ...@@ -184,14 +126,14 @@ void main() {
group('Process pods', () { group('Process pods', () {
testUsingContext('prints error, if CocoaPods is not installed', () async { testUsingContext('prints error, if CocoaPods is not installed', () async {
pretendPodIsNotInstalled();
projectUnderTest.childFile('Podfile').createSync(); projectUnderTest.childFile('Podfile').createSync();
cocoaPodsUnderTest = const TestCocoaPods(false);
await cocoaPodsUnderTest.processPods( await cocoaPodsUnderTest.processPods(
appIosDirectory: projectUnderTest, appIosDirectory: projectUnderTest,
iosEngineDir: 'engine/path', iosEngineDir: 'engine/path',
); );
verifyNever(mockProcessManager.run( verifyNever(mockProcessManager.run(
argThat(containsAllInOrder(<String>['pod', 'install'])), typed<List<String>>(any),
workingDirectory: any, workingDirectory: any,
environment: typed<Map<String, String>>(any, named: 'environment'), environment: typed<Map<String, String>>(any, named: 'environment'),
)); ));
...@@ -203,6 +145,7 @@ void main() { ...@@ -203,6 +145,7 @@ void main() {
}); });
testUsingContext('throws, if Podfile is missing.', () async { testUsingContext('throws, if Podfile is missing.', () async {
cocoaPodsUnderTest = const TestCocoaPods(true);
try { try {
await cocoaPodsUnderTest.processPods( await cocoaPodsUnderTest.processPods(
appIosDirectory: projectUnderTest, appIosDirectory: projectUnderTest,
...@@ -212,7 +155,7 @@ void main() { ...@@ -212,7 +155,7 @@ void main() {
} catch(e) { } catch(e) {
expect(e, const isInstanceOf<ToolExit>()); expect(e, const isInstanceOf<ToolExit>());
verifyNever(mockProcessManager.run( verifyNever(mockProcessManager.run(
argThat(containsAllInOrder(<String>['pod', 'install'])), typed<List<String>>(any),
workingDirectory: any, workingDirectory: any,
environment: typed<Map<String, String>>(any, named: 'environment'), environment: typed<Map<String, String>>(any, named: 'environment'),
)); ));
...@@ -225,7 +168,7 @@ void main() { ...@@ -225,7 +168,7 @@ void main() {
testUsingContext('throws, if specs repo is outdated.', () async { testUsingContext('throws, if specs repo is outdated.', () async {
fs.file(fs.path.join('project', 'ios', 'Podfile')) fs.file(fs.path.join('project', 'ios', 'Podfile'))
..createSync() ..createSync()
..writeAsStringSync('Existing Podfile'); ..writeAsString('Existing Podfile');
when(mockProcessManager.run( when(mockProcessManager.run(
<String>['pod', 'install', '--verbose'], <String>['pod', 'install', '--verbose'],
...@@ -234,7 +177,9 @@ void main() { ...@@ -234,7 +177,9 @@ void main() {
'FLUTTER_FRAMEWORK_DIR': 'engine/path', 'FLUTTER_FRAMEWORK_DIR': 'engine/path',
'COCOAPODS_DISABLE_STATS': 'true', 'COCOAPODS_DISABLE_STATS': 'true',
}, },
)).thenAnswer((_) async => exitsWithError( )).thenAnswer((_) => new Future<ProcessResult>.value(new ProcessResult(
1,
1,
''' '''
[!] Unable to satisfy the following requirements: [!] Unable to satisfy the following requirements:
...@@ -249,7 +194,8 @@ You have either: ...@@ -249,7 +194,8 @@ You have either:
* not added the source repo that hosts the Podspec to your Podfile. * not added the source repo that hosts the Podspec to your Podfile.
Note: as of CocoaPods 1.0, `pod repo update` does not happen on `pod install` by default.''', Note: as of CocoaPods 1.0, `pod repo update` does not happen on `pod install` by default.''',
)); '',
)));
try { try {
await cocoaPodsUnderTest.processPods( await cocoaPodsUnderTest.processPods(
appIosDirectory: projectUnderTest, appIosDirectory: projectUnderTest,
...@@ -271,10 +217,10 @@ Note: as of CocoaPods 1.0, `pod repo update` does not happen on `pod install` by ...@@ -271,10 +217,10 @@ Note: as of CocoaPods 1.0, `pod repo update` does not happen on `pod install` by
testUsingContext('run pod install, if Podfile.lock is missing', () async { testUsingContext('run pod install, if Podfile.lock is missing', () async {
projectUnderTest.childFile('Podfile') projectUnderTest.childFile('Podfile')
..createSync() ..createSync()
..writeAsStringSync('Existing Podfile'); ..writeAsString('Existing Podfile');
projectUnderTest.childFile('Pods/Manifest.lock') projectUnderTest.childFile('Pods/Manifest.lock')
..createSync(recursive: true) ..createSync(recursive: true)
..writeAsStringSync('Existing lock file.'); ..writeAsString('Existing lock file.');
await cocoaPodsUnderTest.processPods( await cocoaPodsUnderTest.processPods(
appIosDirectory: projectUnderTest, appIosDirectory: projectUnderTest,
iosEngineDir: 'engine/path', iosEngineDir: 'engine/path',
...@@ -293,10 +239,10 @@ Note: as of CocoaPods 1.0, `pod repo update` does not happen on `pod install` by ...@@ -293,10 +239,10 @@ Note: as of CocoaPods 1.0, `pod repo update` does not happen on `pod install` by
testUsingContext('runs pod install, if Manifest.lock is missing', () async { testUsingContext('runs pod install, if Manifest.lock is missing', () async {
projectUnderTest.childFile('Podfile') projectUnderTest.childFile('Podfile')
..createSync() ..createSync()
..writeAsStringSync('Existing Podfile'); ..writeAsString('Existing Podfile');
projectUnderTest.childFile('Podfile.lock') projectUnderTest.childFile('Podfile.lock')
..createSync() ..createSync()
..writeAsStringSync('Existing lock file.'); ..writeAsString('Existing lock file.');
await cocoaPodsUnderTest.processPods( await cocoaPodsUnderTest.processPods(
appIosDirectory: projectUnderTest, appIosDirectory: projectUnderTest,
iosEngineDir: 'engine/path', iosEngineDir: 'engine/path',
...@@ -318,13 +264,13 @@ Note: as of CocoaPods 1.0, `pod repo update` does not happen on `pod install` by ...@@ -318,13 +264,13 @@ Note: as of CocoaPods 1.0, `pod repo update` does not happen on `pod install` by
testUsingContext('runs pod install, if Manifest.lock different from Podspec.lock', () async { testUsingContext('runs pod install, if Manifest.lock different from Podspec.lock', () async {
projectUnderTest.childFile('Podfile') projectUnderTest.childFile('Podfile')
..createSync() ..createSync()
..writeAsStringSync('Existing Podfile'); ..writeAsString('Existing Podfile');
projectUnderTest.childFile('Podfile.lock') projectUnderTest.childFile('Podfile.lock')
..createSync() ..createSync()
..writeAsStringSync('Existing lock file.'); ..writeAsString('Existing lock file.');
projectUnderTest.childFile('Pods/Manifest.lock') projectUnderTest.childFile('Pods/Manifest.lock')
..createSync(recursive: true) ..createSync(recursive: true)
..writeAsStringSync('Different lock file.'); ..writeAsString('Different lock file.');
await cocoaPodsUnderTest.processPods( await cocoaPodsUnderTest.processPods(
appIosDirectory: projectUnderTest, appIosDirectory: projectUnderTest,
iosEngineDir: 'engine/path', iosEngineDir: 'engine/path',
...@@ -346,13 +292,13 @@ Note: as of CocoaPods 1.0, `pod repo update` does not happen on `pod install` by ...@@ -346,13 +292,13 @@ Note: as of CocoaPods 1.0, `pod repo update` does not happen on `pod install` by
testUsingContext('runs pod install, if flutter framework changed', () async { testUsingContext('runs pod install, if flutter framework changed', () async {
projectUnderTest.childFile('Podfile') projectUnderTest.childFile('Podfile')
..createSync() ..createSync()
..writeAsStringSync('Existing Podfile'); ..writeAsString('Existing Podfile');
projectUnderTest.childFile('Podfile.lock') projectUnderTest.childFile('Podfile.lock')
..createSync() ..createSync()
..writeAsStringSync('Existing lock file.'); ..writeAsString('Existing lock file.');
projectUnderTest.childFile('Pods/Manifest.lock') projectUnderTest.childFile('Pods/Manifest.lock')
..createSync(recursive: true) ..createSync(recursive: true)
..writeAsStringSync('Existing lock file.'); ..writeAsString('Existing lock file.');
await cocoaPodsUnderTest.processPods( await cocoaPodsUnderTest.processPods(
appIosDirectory: projectUnderTest, appIosDirectory: projectUnderTest,
iosEngineDir: 'engine/path', iosEngineDir: 'engine/path',
...@@ -371,54 +317,23 @@ Note: as of CocoaPods 1.0, `pod repo update` does not happen on `pod install` by ...@@ -371,54 +317,23 @@ Note: as of CocoaPods 1.0, `pod repo update` does not happen on `pod install` by
ProcessManager: () => mockProcessManager, ProcessManager: () => mockProcessManager,
}); });
testUsingContext('runs pod install, if Podfile.lock is older than Podfile', () async {
projectUnderTest.childFile('Podfile')
..createSync()
..writeAsStringSync('Existing Podfile');
projectUnderTest.childFile('Podfile.lock')
..createSync()
..writeAsStringSync('Existing lock file.');
projectUnderTest.childFile('Pods/Manifest.lock')
..createSync(recursive: true)
..writeAsStringSync('Existing lock file.');
await new Future<void>.delayed(const Duration(milliseconds: 10));
projectUnderTest.childFile('Podfile')
..writeAsStringSync('Updated Podfile');
await cocoaPodsUnderTest.processPods(
appIosDirectory: projectUnderTest,
iosEngineDir: 'engine/path',
flutterPodChanged: false,
);
verify(mockProcessManager.run(
<String>['pod', 'install', '--verbose'],
workingDirectory: 'project/ios',
environment: <String, String>{
'FLUTTER_FRAMEWORK_DIR': 'engine/path',
'COCOAPODS_DISABLE_STATS': 'true',
},
));
}, overrides: <Type, Generator>{
FileSystem: () => fs,
ProcessManager: () => mockProcessManager,
});
testUsingContext('skips pod install, if nothing changed', () async { testUsingContext('skips pod install, if nothing changed', () async {
projectUnderTest.childFile('Podfile') projectUnderTest.childFile('Podfile')
..createSync() ..createSync()
..writeAsStringSync('Existing Podfile'); ..writeAsString('Existing Podfile');
projectUnderTest.childFile('Podfile.lock') projectUnderTest.childFile('Podfile.lock')
..createSync() ..createSync()
..writeAsStringSync('Existing lock file.'); ..writeAsString('Existing lock file.');
projectUnderTest.childFile('Pods/Manifest.lock') projectUnderTest.childFile('Pods/Manifest.lock')
..createSync(recursive: true) ..createSync(recursive: true)
..writeAsStringSync('Existing lock file.'); ..writeAsString('Existing lock file.');
await cocoaPodsUnderTest.processPods( await cocoaPodsUnderTest.processPods(
appIosDirectory: projectUnderTest, appIosDirectory: projectUnderTest,
iosEngineDir: 'engine/path', iosEngineDir: 'engine/path',
flutterPodChanged: false, flutterPodChanged: false,
); );
verifyNever(mockProcessManager.run( verifyNever(mockProcessManager.run(
argThat(containsAllInOrder(<String>['pod', 'install'])), typed<List<String>>(any),
workingDirectory: any, workingDirectory: any,
environment: typed<Map<String, String>>(any, named: 'environment'), environment: typed<Map<String, String>>(any, named: 'environment'),
)); ));
...@@ -430,13 +345,13 @@ Note: as of CocoaPods 1.0, `pod repo update` does not happen on `pod install` by ...@@ -430,13 +345,13 @@ Note: as of CocoaPods 1.0, `pod repo update` does not happen on `pod install` by
testUsingContext('a failed pod install deletes Pods/Manifest.lock', () async { testUsingContext('a failed pod install deletes Pods/Manifest.lock', () async {
projectUnderTest.childFile('Podfile') projectUnderTest.childFile('Podfile')
..createSync() ..createSync()
..writeAsStringSync('Existing Podfile'); ..writeAsString('Existing Podfile');
projectUnderTest.childFile('Podfile.lock') projectUnderTest.childFile('Podfile.lock')
..createSync() ..createSync()
..writeAsStringSync('Existing lock file.'); ..writeAsString('Existing lock file.');
projectUnderTest.childFile('Pods/Manifest.lock') projectUnderTest.childFile('Pods/Manifest.lock')
..createSync(recursive: true) ..createSync(recursive: true)
..writeAsStringSync('Existing lock file.'); ..writeAsString('Existing lock file.');
when(mockProcessManager.run( when(mockProcessManager.run(
<String>['pod', 'install', '--verbose'], <String>['pod', 'install', '--verbose'],
...@@ -446,7 +361,9 @@ Note: as of CocoaPods 1.0, `pod repo update` does not happen on `pod install` by ...@@ -446,7 +361,9 @@ Note: as of CocoaPods 1.0, `pod repo update` does not happen on `pod install` by
'COCOAPODS_DISABLE_STATS': 'true', 'COCOAPODS_DISABLE_STATS': 'true',
}, },
)).thenAnswer( )).thenAnswer(
(_) async => exitsWithError() (_) => new Future<ProcessResult>.value(
new ProcessResult(1, 1, 'fails for some reason', '')
)
); );
try { try {
...@@ -469,5 +386,24 @@ Note: as of CocoaPods 1.0, `pod repo update` does not happen on `pod install` by ...@@ -469,5 +386,24 @@ Note: as of CocoaPods 1.0, `pod repo update` does not happen on `pod install` by
class MockProcessManager extends Mock implements ProcessManager {} class MockProcessManager extends Mock implements ProcessManager {}
class MockXcodeProjectInterpreter extends Mock implements XcodeProjectInterpreter {} class MockXcodeProjectInterpreter extends Mock implements XcodeProjectInterpreter {}
ProcessResult exitsWithError([String stdout = '']) => new ProcessResult(1, 1, stdout, ''); class TestCocoaPods extends CocoaPods {
ProcessResult exitsHappy([String stdout = '']) => new ProcessResult(1, 0, stdout, ''); const TestCocoaPods([this._hasCocoaPods = true]);
\ No newline at end of file
final bool _hasCocoaPods;
@override
Future<bool> get hasCocoaPods => new Future<bool>.value(_hasCocoaPods);
@override
Future<String> get cocoaPodsVersionText async => new Future<String>.value('1.5.0');
@override
Future<bool> get isCocoaPodsInitialized => new Future<bool>.value(true);
}
final ProcessResult exitsHappy = new ProcessResult(
1, // pid
0, // exitCode
'', // stdout
'', // stderr
);
\ No newline at end of file
...@@ -33,10 +33,10 @@ void main() { ...@@ -33,10 +33,10 @@ void main() {
cocoaPods = new MockCocoaPods(); cocoaPods = new MockCocoaPods();
fs = new MemoryFileSystem(); fs = new MemoryFileSystem();
when(cocoaPods.evaluateCocoaPodsInstallation) when(cocoaPods.isCocoaPodsInstalledAndMeetsVersionCheck)
.thenAnswer((_) async => CocoaPodsStatus.recommended); .thenAnswer((_) => new Future<bool>.value(true));
when(cocoaPods.isCocoaPodsInitialized).thenAnswer((_) async => true); when(cocoaPods.isCocoaPodsInitialized)
when(cocoaPods.cocoaPodsVersionText).thenAnswer((_) async => '1.8.0'); .thenAnswer((_) => new Future<bool>.value(true));
}); });
testUsingContext('Emit missing status when nothing is installed', () async { testUsingContext('Emit missing status when nothing is installed', () async {
...@@ -213,8 +213,9 @@ void main() { ...@@ -213,8 +213,9 @@ void main() {
.thenReturn('Xcode 8.2.1\nBuild version 8C1002\n'); .thenReturn('Xcode 8.2.1\nBuild version 8C1002\n');
when(xcode.isInstalledAndMeetsVersionCheck).thenReturn(true); when(xcode.isInstalledAndMeetsVersionCheck).thenReturn(true);
when(xcode.eulaSigned).thenReturn(true); when(xcode.eulaSigned).thenReturn(true);
when(cocoaPods.evaluateCocoaPodsInstallation) when(cocoaPods.isCocoaPodsInstalledAndMeetsVersionCheck)
.thenAnswer((_) async => CocoaPodsStatus.notInstalled); .thenAnswer((_) => new Future<bool>.value(false));
when(cocoaPods.hasCocoaPods).thenAnswer((_) => new Future<bool>.value(false));
when(xcode.isSimctlInstalled).thenReturn(true); when(xcode.isSimctlInstalled).thenReturn(true);
final IOSWorkflowTestTarget workflow = new IOSWorkflowTestTarget(); final IOSWorkflowTestTarget workflow = new IOSWorkflowTestTarget();
final ValidationResult result = await workflow.validate(); final ValidationResult result = await workflow.validate();
...@@ -231,8 +232,11 @@ void main() { ...@@ -231,8 +232,11 @@ void main() {
.thenReturn('Xcode 8.2.1\nBuild version 8C1002\n'); .thenReturn('Xcode 8.2.1\nBuild version 8C1002\n');
when(xcode.isInstalledAndMeetsVersionCheck).thenReturn(true); when(xcode.isInstalledAndMeetsVersionCheck).thenReturn(true);
when(xcode.eulaSigned).thenReturn(true); when(xcode.eulaSigned).thenReturn(true);
when(cocoaPods.evaluateCocoaPodsInstallation) when(cocoaPods.isCocoaPodsInstalledAndMeetsVersionCheck)
.thenAnswer((_) async => CocoaPodsStatus.belowRecommendedVersion); .thenAnswer((_) => new Future<bool>.value(false));
when(cocoaPods.hasCocoaPods).thenAnswer((_) => new Future<bool>.value(true));
when(cocoaPods.cocoaPodsVersionText)
.thenAnswer((_) => new Future<String>.value('0.39.0'));
when(xcode.isSimctlInstalled).thenReturn(true); when(xcode.isSimctlInstalled).thenReturn(true);
final IOSWorkflowTestTarget workflow = new IOSWorkflowTestTarget(); final IOSWorkflowTestTarget workflow = new IOSWorkflowTestTarget();
final ValidationResult result = await workflow.validate(); final ValidationResult result = await workflow.validate();
...@@ -249,6 +253,8 @@ void main() { ...@@ -249,6 +253,8 @@ void main() {
.thenReturn('Xcode 8.2.1\nBuild version 8C1002\n'); .thenReturn('Xcode 8.2.1\nBuild version 8C1002\n');
when(xcode.isInstalledAndMeetsVersionCheck).thenReturn(true); when(xcode.isInstalledAndMeetsVersionCheck).thenReturn(true);
when(xcode.eulaSigned).thenReturn(true); when(xcode.eulaSigned).thenReturn(true);
when(cocoaPods.isCocoaPodsInstalledAndMeetsVersionCheck).thenAnswer((_) async => false);
when(cocoaPods.hasCocoaPods).thenAnswer((_) async => true);
when(cocoaPods.isCocoaPodsInitialized).thenAnswer((_) async => false); when(cocoaPods.isCocoaPodsInitialized).thenAnswer((_) async => false);
when(xcode.isSimctlInstalled).thenReturn(true); when(xcode.isSimctlInstalled).thenReturn(true);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment