Unverified Commit 6498f643 authored by Jenn Magder's avatar Jenn Magder Committed by GitHub

Catch and display version check errors during doctor (#44868)

parent dfffb15c
...@@ -10,7 +10,7 @@ UserMessages get userMessages => context.get<UserMessages>(); ...@@ -10,7 +10,7 @@ UserMessages get userMessages => context.get<UserMessages>();
class UserMessages { class UserMessages {
// Messages used in FlutterValidator // Messages used in FlutterValidator
String flutterStatusInfo(String channel, String version, String os, String locale) => String flutterStatusInfo(String channel, String version, String os, String locale) =>
'Channel $channel, v$version, on $os, locale $locale'; 'Channel ${channel ?? 'unknown'}, v${version ?? 'Unknown'}, on $os, locale $locale';
String flutterVersion(String version, String flutterRoot) => String flutterVersion(String version, String flutterRoot) =>
'Flutter version $version at $flutterRoot'; 'Flutter version $version at $flutterRoot';
String flutterRevision(String revision, String age, String date) => String flutterRevision(String revision, String age, String date) =>
......
...@@ -587,13 +587,22 @@ class FlutterValidator extends DoctorValidator { ...@@ -587,13 +587,22 @@ class FlutterValidator extends DoctorValidator {
Future<ValidationResult> validate() async { Future<ValidationResult> validate() async {
final List<ValidationMessage> messages = <ValidationMessage>[]; final List<ValidationMessage> messages = <ValidationMessage>[];
ValidationType valid = ValidationType.installed; ValidationType valid = ValidationType.installed;
String versionChannel;
String frameworkVersion;
final FlutterVersion version = FlutterVersion.instance; try {
final FlutterVersion version = FlutterVersion.instance;
versionChannel = version.channel;
frameworkVersion = version.frameworkVersion;
messages.add(ValidationMessage(userMessages.flutterVersion(frameworkVersion, Cache.flutterRoot)));
messages.add(ValidationMessage(userMessages.flutterRevision(version.frameworkRevisionShort, version.frameworkAge, version.frameworkDate)));
messages.add(ValidationMessage(userMessages.engineRevision(version.engineRevisionShort)));
messages.add(ValidationMessage(userMessages.dartRevision(version.dartSdkVersion)));
} on VersionCheckError catch (e) {
messages.add(ValidationMessage.error(e.message));
valid = ValidationType.partial;
}
messages.add(ValidationMessage(userMessages.flutterVersion(version.frameworkVersion, Cache.flutterRoot)));
messages.add(ValidationMessage(userMessages.flutterRevision(version.frameworkRevisionShort, version.frameworkAge, version.frameworkDate)));
messages.add(ValidationMessage(userMessages.engineRevision(version.engineRevisionShort)));
messages.add(ValidationMessage(userMessages.dartRevision(version.dartSdkVersion)));
final String genSnapshotPath = final String genSnapshotPath =
artifacts.getArtifactPath(Artifact.genSnapshot); artifacts.getArtifactPath(Artifact.genSnapshot);
...@@ -609,7 +618,7 @@ class FlutterValidator extends DoctorValidator { ...@@ -609,7 +618,7 @@ class FlutterValidator extends DoctorValidator {
} }
return ValidationResult(valid, messages, return ValidationResult(valid, messages,
statusInfo: userMessages.flutterStatusInfo(version.channel, version.frameworkVersion, os.name, platform.localeName), statusInfo: userMessages.flutterStatusInfo(versionChannel, frameworkVersion, os.name, platform.localeName),
); );
} }
} }
......
...@@ -20,6 +20,7 @@ import 'package:flutter_tools/src/reporting/reporting.dart'; ...@@ -20,6 +20,7 @@ import 'package:flutter_tools/src/reporting/reporting.dart';
import 'package:flutter_tools/src/vscode/vscode.dart'; import 'package:flutter_tools/src/vscode/vscode.dart';
import 'package:flutter_tools/src/vscode/vscode_validator.dart'; import 'package:flutter_tools/src/vscode/vscode_validator.dart';
import 'package:flutter_tools/src/web/workflow.dart'; import 'package:flutter_tools/src/web/workflow.dart';
import 'package:flutter_tools/src/version.dart';
import 'package:mockito/mockito.dart'; import 'package:mockito/mockito.dart';
import 'package:process/process.dart'; import 'package:process/process.dart';
import 'package:quiver/testing/async.dart'; import 'package:quiver/testing/async.dart';
...@@ -35,9 +36,11 @@ final Map<Type, Generator> noColorTerminalOverride = <Type, Generator>{ ...@@ -35,9 +36,11 @@ final Map<Type, Generator> noColorTerminalOverride = <Type, Generator>{
void main() { void main() {
MockProcessManager mockProcessManager; MockProcessManager mockProcessManager;
MockFlutterVersion mockFlutterVersion;
setUp(() { setUp(() {
mockProcessManager = MockProcessManager(); mockProcessManager = MockProcessManager();
mockFlutterVersion = MockFlutterVersion();
}); });
group('doctor', () { group('doctor', () {
...@@ -507,6 +510,34 @@ void main() { ...@@ -507,6 +510,34 @@ void main() {
ProcessManager: () => mockProcessManager, ProcessManager: () => mockProcessManager,
Platform: _kNoColorOutputPlatform, Platform: _kNoColorOutputPlatform,
}); });
testUsingContext('version checking does not work', () async {
final VersionCheckError versionCheckError = VersionCheckError('version error');
when(mockFlutterVersion.channel).thenReturn('unknown');
when(mockFlutterVersion.frameworkVersion).thenReturn('0.0.0');
when(mockFlutterVersion.frameworkDate).thenThrow(versionCheckError);
when(mockProcessManager.runSync(
<String>[artifacts.getArtifactPath(Artifact.genSnapshot)],
workingDirectory: anyNamed('workingDirectory'),
environment: anyNamed('environment'),
)).thenReturn(ProcessResult(101, 255, '', ''));
expect(await FlutterValidatorDoctor().diagnose(verbose: false), isTrue);
expect(testLogger.statusText, equals(
'Doctor summary (to see all details, run flutter doctor -v):\n'
'[!] Flutter (Channel unknown, v0.0.0, on fake OS name and version, locale en-US)\n'
' ✗ version error\n\n'
'! Doctor found issues in 1 category.\n'
));
}, overrides: <Type, Generator>{
OutputPreferences: () => OutputPreferences(wrapText: false),
ProcessManager: () => mockProcessManager,
Platform: _kNoColorOutputPlatform,
FlutterVersion: () => mockFlutterVersion,
});
}); });
testUsingContext('validate non-verbose output wrapping', () async { testUsingContext('validate non-verbose output wrapping', () async {
...@@ -1018,3 +1049,4 @@ class VsCodeValidatorTestTargets extends VsCodeValidator { ...@@ -1018,3 +1049,4 @@ class VsCodeValidatorTestTargets extends VsCodeValidator {
} }
class MockProcessManager extends Mock implements ProcessManager {} class MockProcessManager extends Mock implements ProcessManager {}
class MockFlutterVersion extends Mock implements FlutterVersion {}
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