mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00

* [tools]some ui polish for build ipa validation * do not print out a few success validations * rename installed type to success for more general usage * forgot nit after reverting custom validation types and re-use doctor types
648 lines
25 KiB
Dart
648 lines
25 KiB
Dart
// Copyright 2014 The Flutter Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
import 'package:file/file.dart';
|
|
import 'package:file/memory.dart';
|
|
import 'package:flutter_tools/src/artifacts.dart';
|
|
import 'package:flutter_tools/src/base/os.dart';
|
|
import 'package:flutter_tools/src/base/platform.dart';
|
|
import 'package:flutter_tools/src/base/user_messages.dart';
|
|
import 'package:flutter_tools/src/doctor.dart';
|
|
import 'package:flutter_tools/src/doctor_validator.dart';
|
|
import 'package:flutter_tools/src/version.dart';
|
|
import 'package:test/fake.dart';
|
|
|
|
import '../src/common.dart';
|
|
import '../src/fake_process_manager.dart';
|
|
import '../src/fakes.dart';
|
|
|
|
/// Matches a doctor validation result.
|
|
Matcher _matchDoctorValidation({
|
|
required ValidationType validationType,
|
|
required String statusInfo,
|
|
required Object messages
|
|
}) {
|
|
return const TypeMatcher<ValidationResult>()
|
|
.having((ValidationResult result) => result.type, 'type', validationType)
|
|
.having((ValidationResult result) => result.statusInfo, 'statusInfo', statusInfo)
|
|
.having((ValidationResult result) => result.messages, 'messages', messages);
|
|
}
|
|
|
|
void main() {
|
|
testWithoutContext('FlutterValidator shows an error message if gen_snapshot is '
|
|
'downloaded and exits with code 1', () async {
|
|
final FakeFlutterVersion flutterVersion = FakeFlutterVersion(
|
|
frameworkVersion: '1.0.0',
|
|
channel: 'beta',
|
|
);
|
|
final MemoryFileSystem fileSystem = MemoryFileSystem.test();
|
|
final Artifacts artifacts = Artifacts.test();
|
|
final FlutterValidator flutterValidator = FlutterValidator(
|
|
platform: FakePlatform(
|
|
localeName: 'en_US.UTF-8',
|
|
environment: <String, String>{},
|
|
),
|
|
flutterVersion: () => flutterVersion,
|
|
devToolsVersion: () => '2.8.0',
|
|
userMessages: UserMessages(),
|
|
artifacts: artifacts,
|
|
fileSystem: fileSystem,
|
|
flutterRoot: () => '/sdk/flutter',
|
|
operatingSystemUtils: FakeOperatingSystemUtils(name: 'Linux'),
|
|
processManager: FakeProcessManager.list(<FakeCommand>[
|
|
const FakeCommand(
|
|
command: <String>['Artifact.genSnapshot'],
|
|
exitCode: 1,
|
|
),
|
|
])
|
|
);
|
|
fileSystem.file(artifacts.getArtifactPath(Artifact.genSnapshot)).createSync(recursive: true);
|
|
|
|
|
|
expect(await flutterValidator.validate(), _matchDoctorValidation(
|
|
validationType: ValidationType.partial,
|
|
statusInfo: 'Channel beta, 1.0.0, on Linux, locale en_US.UTF-8',
|
|
messages: containsAll(const <ValidationMessage>[
|
|
ValidationMessage.error(
|
|
'Downloaded executables cannot execute on host.\n'
|
|
'See https://github.com/flutter/flutter/issues/6207 for more information.\n'
|
|
'On Debian/Ubuntu/Mint: sudo apt-get install lib32stdc++6\n'
|
|
'On Fedora: dnf install libstdc++.i686\n'
|
|
'On Arch: pacman -S lib32-gcc-libs\n',
|
|
),
|
|
])),
|
|
);
|
|
});
|
|
|
|
testWithoutContext('FlutterValidator shows an error message if Rosetta is needed', () async {
|
|
final FakeFlutterVersion flutterVersion = FakeFlutterVersion(
|
|
frameworkVersion: '1.0.0',
|
|
channel: 'beta',
|
|
);
|
|
final MemoryFileSystem fileSystem = MemoryFileSystem.test();
|
|
final Artifacts artifacts = Artifacts.test();
|
|
final FlutterValidator flutterValidator = FlutterValidator(
|
|
platform: FakePlatform(
|
|
operatingSystem: 'macos',
|
|
localeName: 'en_US.UTF-8',
|
|
environment: <String, String>{},
|
|
),
|
|
flutterVersion: () => flutterVersion,
|
|
devToolsVersion: () => '2.8.0',
|
|
userMessages: UserMessages(),
|
|
artifacts: artifacts,
|
|
fileSystem: fileSystem,
|
|
flutterRoot: () => 'sdk/flutter',
|
|
operatingSystemUtils: FakeOperatingSystemUtils(name: 'macOS', hostPlatform: HostPlatform.darwin_arm64),
|
|
processManager: FakeProcessManager.list(<FakeCommand>[
|
|
const FakeCommand(
|
|
command: <String>['Artifact.genSnapshot'],
|
|
exitCode: 1,
|
|
),
|
|
])
|
|
);
|
|
fileSystem.file(artifacts.getArtifactPath(Artifact.genSnapshot)).createSync(recursive: true);
|
|
|
|
expect(await flutterValidator.validate(), _matchDoctorValidation(
|
|
validationType: ValidationType.partial,
|
|
statusInfo: 'Channel beta, 1.0.0, on macOS, locale en_US.UTF-8',
|
|
messages: containsAll(const <ValidationMessage>[
|
|
ValidationMessage.error(
|
|
'Downloaded executables cannot execute on host.\n'
|
|
'See https://github.com/flutter/flutter/issues/6207 for more information.\n'
|
|
'Flutter requires the Rosetta translation environment on ARM Macs. Try running:\n'
|
|
' sudo softwareupdate --install-rosetta --agree-to-license\n'
|
|
),
|
|
])),
|
|
);
|
|
});
|
|
|
|
testWithoutContext('FlutterValidator does not run gen_snapshot binary check if it is not already downloaded', () async {
|
|
final FakeFlutterVersion flutterVersion = FakeFlutterVersion(
|
|
frameworkVersion: '1.0.0',
|
|
channel: 'beta',
|
|
);
|
|
final FlutterValidator flutterValidator = FlutterValidator(
|
|
platform: FakePlatform(
|
|
operatingSystem: 'windows',
|
|
localeName: 'en_US.UTF-8',
|
|
environment: <String, String>{},
|
|
),
|
|
flutterVersion: () => flutterVersion,
|
|
devToolsVersion: () => '2.8.0',
|
|
userMessages: UserMessages(),
|
|
artifacts: Artifacts.test(),
|
|
fileSystem: MemoryFileSystem.test(),
|
|
operatingSystemUtils: FakeOperatingSystemUtils(name: 'Windows'),
|
|
processManager: FakeProcessManager.empty(),
|
|
flutterRoot: () => '/sdk/flutter',
|
|
);
|
|
|
|
// gen_snapshot is downloaded on demand, and the doctor should not
|
|
// fail if the gen_snapshot binary is not present.
|
|
expect(await flutterValidator.validate(), _matchDoctorValidation(
|
|
validationType: ValidationType.success,
|
|
statusInfo: 'Channel beta, 1.0.0, on Windows, locale en_US.UTF-8',
|
|
messages: anything,
|
|
));
|
|
});
|
|
|
|
testWithoutContext('FlutterValidator handles exception thrown by version checking', () async {
|
|
final FlutterValidator flutterValidator = FlutterValidator(
|
|
platform: FakePlatform(operatingSystem: 'windows', localeName: 'en_US.UTF-8'),
|
|
flutterVersion: () => FakeThrowingFlutterVersion(),
|
|
devToolsVersion: () => '2.8.0',
|
|
userMessages: UserMessages(),
|
|
artifacts: Artifacts.test(),
|
|
fileSystem: MemoryFileSystem.test(),
|
|
operatingSystemUtils: FakeOperatingSystemUtils(name: 'Windows'),
|
|
processManager: FakeProcessManager.empty(),
|
|
flutterRoot: () => '/sdk/flutter',
|
|
);
|
|
|
|
expect(await flutterValidator.validate(), _matchDoctorValidation(
|
|
validationType: ValidationType.partial,
|
|
statusInfo: 'Channel beta, 0.0.0, on Windows, locale en_US.UTF-8',
|
|
messages: containsAll(const <ValidationMessage>[
|
|
ValidationMessage('Flutter version 0.0.0 on channel beta at /sdk/flutter'),
|
|
ValidationMessage.error('version error'),
|
|
]),
|
|
));
|
|
});
|
|
|
|
testWithoutContext('FlutterValidator shows mirrors on pub and flutter cloud storage', () async {
|
|
final FakeFlutterVersion flutterVersion = FakeFlutterVersion(
|
|
frameworkVersion: '1.0.0',
|
|
channel: 'beta',
|
|
);
|
|
final Platform platform = FakePlatform(
|
|
operatingSystem: 'windows',
|
|
localeName: 'en_US.UTF-8',
|
|
environment: <String, String>{
|
|
'PUB_HOSTED_URL': 'https://example.com/pub',
|
|
'FLUTTER_STORAGE_BASE_URL': 'https://example.com/flutter',
|
|
},
|
|
);
|
|
final MemoryFileSystem fileSystem = MemoryFileSystem.test();
|
|
final Artifacts artifacts = Artifacts.test();
|
|
final FlutterValidator flutterValidator = FlutterValidator(
|
|
platform: platform,
|
|
flutterVersion: () => flutterVersion,
|
|
devToolsVersion: () => '2.8.0',
|
|
userMessages: UserMessages(),
|
|
artifacts: artifacts,
|
|
fileSystem: fileSystem,
|
|
processManager: FakeProcessManager.any(),
|
|
operatingSystemUtils: FakeOperatingSystemUtils(name: 'Windows'),
|
|
flutterRoot: () => '/sdk/flutter'
|
|
);
|
|
|
|
expect(await flutterValidator.validate(), _matchDoctorValidation(
|
|
validationType: ValidationType.success,
|
|
statusInfo: 'Channel beta, 1.0.0, on Windows, locale en_US.UTF-8',
|
|
messages: containsAll(const <ValidationMessage>[
|
|
ValidationMessage('Pub download mirror https://example.com/pub'),
|
|
ValidationMessage('Flutter download mirror https://example.com/flutter'),
|
|
])
|
|
));
|
|
});
|
|
|
|
testWithoutContext('FlutterValidator shows FLUTTER_GIT_URL when set and fails if upstream is not the same', () async {
|
|
final FlutterValidator flutterValidator = FlutterValidator(
|
|
platform: FakePlatform(
|
|
localeName: 'en_US.UTF-8',
|
|
environment: <String, String> {
|
|
'FLUTTER_GIT_URL': 'https://githubmirror.com/flutter.git',
|
|
},
|
|
),
|
|
flutterVersion: () => FakeFlutterVersion(
|
|
frameworkVersion: '1.0.0',
|
|
channel: 'beta'
|
|
),
|
|
devToolsVersion: () => '2.8.0',
|
|
userMessages: UserMessages(),
|
|
artifacts: Artifacts.test(),
|
|
fileSystem: MemoryFileSystem.test(),
|
|
processManager: FakeProcessManager.any(),
|
|
operatingSystemUtils: FakeOperatingSystemUtils(name: 'Linux'),
|
|
flutterRoot: () => '/sdk/flutter',
|
|
);
|
|
|
|
expect(await flutterValidator.validate(), _matchDoctorValidation(
|
|
validationType: ValidationType.partial,
|
|
statusInfo: 'Channel beta, 1.0.0, on Linux, locale en_US.UTF-8',
|
|
messages: containsAll(const <ValidationMessage>[
|
|
ValidationMessage.hint('Upstream repository https://github.com/flutter/flutter.git is not the same as FLUTTER_GIT_URL'),
|
|
ValidationMessage('FLUTTER_GIT_URL = https://githubmirror.com/flutter.git'),
|
|
ValidationMessage(
|
|
'If those were intentional, you can disregard the above warnings; however it is '
|
|
'recommended to use "git" directly to perform update checks and upgrades.'
|
|
),
|
|
]),
|
|
));
|
|
});
|
|
|
|
testWithoutContext('FlutterValidator fails when channel is unknown', () async {
|
|
final FlutterValidator flutterValidator = FlutterValidator(
|
|
platform: FakePlatform(localeName: 'en_US.UTF-8'),
|
|
flutterVersion: () => FakeFlutterVersion(
|
|
frameworkVersion: '1.0.0',
|
|
// channel is unknown by default
|
|
),
|
|
devToolsVersion: () => '2.8.0',
|
|
userMessages: UserMessages(),
|
|
artifacts: Artifacts.test(),
|
|
fileSystem: MemoryFileSystem.test(),
|
|
processManager: FakeProcessManager.any(),
|
|
operatingSystemUtils: FakeOperatingSystemUtils(name: 'Linux'),
|
|
flutterRoot: () => '/sdk/flutter',
|
|
);
|
|
|
|
expect(await flutterValidator.validate(), _matchDoctorValidation(
|
|
validationType: ValidationType.partial,
|
|
statusInfo: 'Channel unknown, 1.0.0, on Linux, locale en_US.UTF-8',
|
|
messages: containsAll(<ValidationMessage>[
|
|
const ValidationMessage.hint(
|
|
'Flutter version 1.0.0 on channel unknown at /sdk/flutter\n'
|
|
'Currently on an unknown channel. Run `flutter channel` to switch to an official channel.\n'
|
|
"If that doesn't fix the issue, reinstall Flutter by following instructions at https://flutter.dev/docs/get-started/install."
|
|
),
|
|
const ValidationMessage(
|
|
'If those were intentional, you can disregard the above warnings; however it is '
|
|
'recommended to use "git" directly to perform update checks and upgrades.'
|
|
),
|
|
]),
|
|
));
|
|
});
|
|
|
|
testWithoutContext('FlutterValidator fails when framework version is unknown', () async {
|
|
final FlutterValidator flutterValidator = FlutterValidator(
|
|
platform: FakePlatform(localeName: 'en_US.UTF-8'),
|
|
flutterVersion: () => FakeFlutterVersion(
|
|
frameworkVersion: '0.0.0-unknown',
|
|
channel: 'beta',
|
|
),
|
|
devToolsVersion: () => '2.8.0',
|
|
userMessages: UserMessages(),
|
|
artifacts: Artifacts.test(),
|
|
fileSystem: MemoryFileSystem.test(),
|
|
processManager: FakeProcessManager.any(),
|
|
operatingSystemUtils: FakeOperatingSystemUtils(name: 'Linux'),
|
|
flutterRoot: () => '/sdk/flutter',
|
|
);
|
|
|
|
expect(await flutterValidator.validate(), _matchDoctorValidation(
|
|
validationType: ValidationType.partial,
|
|
statusInfo: 'Channel beta, 0.0.0-unknown, on Linux, locale en_US.UTF-8',
|
|
messages: containsAll(<ValidationMessage>[
|
|
const ValidationMessage.hint(
|
|
'Flutter version 0.0.0-unknown on channel beta at /sdk/flutter\n'
|
|
'Cannot resolve current version, possibly due to local changes.\n'
|
|
'Reinstall Flutter by following instructions at https://flutter.dev/docs/get-started/install.'
|
|
),
|
|
const ValidationMessage(
|
|
'If those were intentional, you can disregard the above warnings; however it is '
|
|
'recommended to use "git" directly to perform update checks and upgrades.'
|
|
),
|
|
]),
|
|
));
|
|
});
|
|
|
|
group('FlutterValidator shows flutter upstream remote', () {
|
|
testWithoutContext('standard url', () async {
|
|
final FlutterValidator flutterValidator = FlutterValidator(
|
|
platform: FakePlatform(localeName: 'en_US.UTF-8'),
|
|
flutterVersion: () => FakeFlutterVersion(
|
|
frameworkVersion: '1.0.0',
|
|
channel: 'beta'
|
|
),
|
|
devToolsVersion: () => '2.8.0',
|
|
userMessages: UserMessages(),
|
|
artifacts: Artifacts.test(),
|
|
fileSystem: MemoryFileSystem.test(),
|
|
processManager: FakeProcessManager.any(),
|
|
operatingSystemUtils: FakeOperatingSystemUtils(name: 'Linux'),
|
|
flutterRoot: () => '/sdk/flutter',
|
|
);
|
|
|
|
expect(await flutterValidator.validate(), _matchDoctorValidation(
|
|
validationType: ValidationType.success,
|
|
statusInfo: 'Channel beta, 1.0.0, on Linux, locale en_US.UTF-8',
|
|
messages: contains(const ValidationMessage('Upstream repository https://github.com/flutter/flutter.git')),
|
|
));
|
|
});
|
|
|
|
testWithoutContext('non-standard url', () async {
|
|
final FlutterValidator flutterValidator = FlutterValidator(
|
|
platform: FakePlatform(localeName: 'en_US.UTF-8'),
|
|
flutterVersion: () => FakeFlutterVersion(
|
|
frameworkVersion: '1.0.0',
|
|
channel: 'beta',
|
|
repositoryUrl: 'https://githubmirror.com/flutter.git'
|
|
),
|
|
devToolsVersion: () => '2.8.0',
|
|
userMessages: UserMessages(),
|
|
artifacts: Artifacts.test(),
|
|
fileSystem: MemoryFileSystem.test(),
|
|
processManager: FakeProcessManager.any(),
|
|
operatingSystemUtils: FakeOperatingSystemUtils(name: 'Linux'),
|
|
flutterRoot: () => 'sdk/flutter',
|
|
);
|
|
|
|
expect(await flutterValidator.validate(), _matchDoctorValidation(
|
|
validationType: ValidationType.partial,
|
|
statusInfo: 'Channel beta, 1.0.0, on Linux, locale en_US.UTF-8',
|
|
messages: containsAll(<ValidationMessage>[
|
|
const ValidationMessage.hint(
|
|
'Upstream repository https://githubmirror.com/flutter.git is not a standard remote.\n'
|
|
'Set environment variable "FLUTTER_GIT_URL" to '
|
|
'https://githubmirror.com/flutter.git to dismiss this error.'
|
|
),
|
|
const ValidationMessage(
|
|
'If those were intentional, you can disregard the above warnings; however it is '
|
|
'recommended to use "git" directly to perform update checks and upgrades.'
|
|
),
|
|
]),
|
|
));
|
|
});
|
|
|
|
testWithoutContext('as unknown if upstream is null', () async {
|
|
final FlutterValidator flutterValidator = FlutterValidator(
|
|
platform: FakePlatform(localeName: 'en_US.UTF-8'),
|
|
flutterVersion: () => FakeFlutterVersion(
|
|
frameworkVersion: '1.0.0',
|
|
channel: 'beta',
|
|
repositoryUrl: null,
|
|
),
|
|
devToolsVersion: () => '2.8.0',
|
|
userMessages: UserMessages(),
|
|
artifacts: Artifacts.test(),
|
|
fileSystem: MemoryFileSystem.test(),
|
|
processManager: FakeProcessManager.any(),
|
|
operatingSystemUtils: FakeOperatingSystemUtils(name: 'Linux'),
|
|
flutterRoot: () => 'sdk/flutter',
|
|
);
|
|
|
|
expect(await flutterValidator.validate(), _matchDoctorValidation(
|
|
validationType: ValidationType.partial,
|
|
statusInfo: 'Channel beta, 1.0.0, on Linux, locale en_US.UTF-8',
|
|
messages: containsAll(<ValidationMessage>[
|
|
const ValidationMessage.hint(
|
|
'Unknown upstream repository.\n'
|
|
'Reinstall Flutter by following instructions at https://flutter.dev/docs/get-started/install.'
|
|
),
|
|
const ValidationMessage(
|
|
'If those were intentional, you can disregard the above warnings; however it is '
|
|
'recommended to use "git" directly to perform update checks and upgrades.'
|
|
),
|
|
]),
|
|
));
|
|
});
|
|
});
|
|
|
|
testWithoutContext('Do not show the message for intentional errors if FlutterValidator passes', () async {
|
|
final FlutterValidator flutterValidator = FlutterValidator(
|
|
platform: FakePlatform(localeName: 'en_US.UTF-8'),
|
|
flutterVersion: () => FakeFlutterVersion(
|
|
frameworkVersion: '1.0.0',
|
|
channel: 'beta'
|
|
),
|
|
devToolsVersion: () => '2.8.0',
|
|
userMessages: UserMessages(),
|
|
artifacts: Artifacts.test(),
|
|
fileSystem: MemoryFileSystem.test(),
|
|
processManager: FakeProcessManager.any(),
|
|
operatingSystemUtils: FakeOperatingSystemUtils(name: 'Linux'),
|
|
flutterRoot: () => '/sdk/flutter',
|
|
);
|
|
|
|
expect(await flutterValidator.validate(), _matchDoctorValidation(
|
|
validationType: ValidationType.success,
|
|
statusInfo: 'Channel beta, 1.0.0, on Linux, locale en_US.UTF-8',
|
|
messages: isNot(
|
|
contains(const ValidationMessage(
|
|
'If those were intentional, you can disregard the above warnings; however it is '
|
|
'recommended to use "git" directly to perform update checks and upgrades.'
|
|
)),
|
|
),
|
|
));
|
|
});
|
|
|
|
testWithoutContext('detects no flutter and dart on path', () async {
|
|
const String flutterRoot = 'sdk/flutter';
|
|
final FlutterValidator flutterValidator = FlutterValidator(
|
|
platform: FakePlatform(localeName: 'en_US.UTF-8'),
|
|
flutterVersion: () => FakeFlutterVersion(
|
|
frameworkVersion: '1.0.0',
|
|
channel: 'beta'
|
|
),
|
|
devToolsVersion: () => '2.8.0',
|
|
userMessages: UserMessages(),
|
|
artifacts: Artifacts.test(),
|
|
fileSystem: MemoryFileSystem.test(),
|
|
processManager: FakeProcessManager.any(),
|
|
operatingSystemUtils: FakeOperatingSystemUtils(
|
|
name: 'Linux',
|
|
whichLookup: const <String, File>{},
|
|
),
|
|
flutterRoot: () => flutterRoot,
|
|
);
|
|
|
|
expect(await flutterValidator.validate(), _matchDoctorValidation(
|
|
validationType: ValidationType.partial,
|
|
statusInfo: 'Channel beta, 1.0.0, on Linux, locale en_US.UTF-8',
|
|
messages: contains(const ValidationMessage.hint(
|
|
'The flutter binary is not on your path. Consider adding $flutterRoot/bin to your path.',
|
|
)),
|
|
));
|
|
});
|
|
|
|
testWithoutContext('allows case differences in paths on Windows', () async {
|
|
const String flutterRoot = r'c:\path\to\flutter-sdk';
|
|
const String osName = 'Microsoft Windows';
|
|
final MemoryFileSystem fs = MemoryFileSystem.test(
|
|
style: FileSystemStyle.windows,
|
|
);
|
|
// The windows' file system is not case sensitive, so changing the case
|
|
// here should not matter.
|
|
final File flutterBinary = fs.file('${flutterRoot.toUpperCase()}\\bin\\flutter')
|
|
..createSync(recursive: true);
|
|
final FlutterValidator flutterValidator = FlutterValidator(
|
|
platform: FakePlatform(operatingSystem: 'windows', localeName: 'en_US.UTF-8'),
|
|
flutterVersion: () => FakeFlutterVersion(
|
|
frameworkVersion: '1.0.0',
|
|
channel: 'beta'
|
|
),
|
|
devToolsVersion: () => '2.8.0',
|
|
userMessages: UserMessages(),
|
|
artifacts: Artifacts.test(),
|
|
fileSystem: fs,
|
|
processManager: FakeProcessManager.empty(),
|
|
operatingSystemUtils: FakeOperatingSystemUtils(
|
|
name: osName,
|
|
whichLookup: <String, File>{
|
|
'flutter': flutterBinary,
|
|
},
|
|
),
|
|
flutterRoot: () => flutterRoot,
|
|
);
|
|
|
|
expect(await flutterValidator.validate(), _matchDoctorValidation(
|
|
validationType: ValidationType.partial,
|
|
statusInfo: 'Channel beta, 1.0.0, on $osName, locale en_US.UTF-8',
|
|
messages: everyElement(isA<ValidationMessage>().having(
|
|
(ValidationMessage message) => message.message,
|
|
'message',
|
|
isNot(contains('Warning: `flutter` on your path resolves to')),
|
|
)),
|
|
));
|
|
});
|
|
|
|
testWithoutContext('allows different separator types in paths on Windows', () async {
|
|
const String flutterRoot = r'c:\path\to\flutter-sdk';
|
|
const String osName = 'Microsoft Windows';
|
|
final MemoryFileSystem fs = MemoryFileSystem.test(
|
|
style: FileSystemStyle.windows,
|
|
);
|
|
const String filePath = '$flutterRoot\\bin\\flutter';
|
|
// force posix style path separators
|
|
final File flutterBinary = fs.file(filePath.replaceAll(r'\', '/'))
|
|
..createSync(recursive: true);
|
|
final FlutterValidator flutterValidator = FlutterValidator(
|
|
platform: FakePlatform(operatingSystem: 'windows', localeName: 'en_US.UTF-8'),
|
|
flutterVersion: () => FakeFlutterVersion(
|
|
frameworkVersion: '1.0.0',
|
|
channel: 'beta'
|
|
),
|
|
devToolsVersion: () => '2.8.0',
|
|
userMessages: UserMessages(),
|
|
artifacts: Artifacts.test(),
|
|
fileSystem: fs,
|
|
processManager: FakeProcessManager.empty(),
|
|
operatingSystemUtils: FakeOperatingSystemUtils(
|
|
name: osName,
|
|
whichLookup: <String, File>{
|
|
'flutter': flutterBinary,
|
|
},
|
|
),
|
|
flutterRoot: () => flutterRoot,
|
|
);
|
|
|
|
expect(await flutterValidator.validate(), _matchDoctorValidation(
|
|
validationType: ValidationType.partial,
|
|
statusInfo: 'Channel beta, 1.0.0, on $osName, locale en_US.UTF-8',
|
|
messages: everyElement(isA<ValidationMessage>().having(
|
|
(ValidationMessage message) => message.message,
|
|
'message',
|
|
isNot(contains('Warning: `flutter` on your path resolves to')),
|
|
)),
|
|
));
|
|
});
|
|
|
|
testWithoutContext('detects flutter and dart from outside flutter sdk', () async {
|
|
final FileSystem fs = MemoryFileSystem.test();
|
|
final FlutterValidator flutterValidator = FlutterValidator(
|
|
platform: FakePlatform(localeName: 'en_US.UTF-8'),
|
|
flutterVersion: () => FakeFlutterVersion(
|
|
frameworkVersion: '1.0.0',
|
|
channel: 'beta'
|
|
),
|
|
devToolsVersion: () => '2.8.0',
|
|
userMessages: UserMessages(),
|
|
artifacts: Artifacts.test(),
|
|
fileSystem: fs,
|
|
processManager: FakeProcessManager.any(),
|
|
operatingSystemUtils: FakeOperatingSystemUtils(
|
|
name: 'Linux',
|
|
whichLookup: <String, File>{
|
|
'flutter': fs.file('/sdk/flutter-beta')..createSync(recursive: true),
|
|
'dart': fs.file('/sdk/flutter-beta')..createSync(recursive: true),
|
|
},
|
|
),
|
|
flutterRoot: () => '/sdk/flutter',
|
|
);
|
|
|
|
expect(await flutterValidator.validate(), _matchDoctorValidation(
|
|
validationType: ValidationType.partial,
|
|
statusInfo: 'Channel beta, 1.0.0, on Linux, locale en_US.UTF-8',
|
|
messages: contains(const ValidationMessage.hint(
|
|
'Warning: `flutter` on your path resolves to /sdk/flutter-beta, which '
|
|
'is not inside your current Flutter SDK checkout at /sdk/flutter. '
|
|
'Consider adding /sdk/flutter/bin to the front of your path.',
|
|
)),
|
|
));
|
|
});
|
|
|
|
testWithoutContext('no warnings if flutter & dart binaries are inside the Flutter SDK', () async {
|
|
final FileSystem fs = MemoryFileSystem.test();
|
|
final FlutterValidator flutterValidator = FlutterValidator(
|
|
platform: FakePlatform(localeName: 'en_US.UTF-8'),
|
|
flutterVersion: () => FakeFlutterVersion(
|
|
frameworkVersion: '1.0.0',
|
|
channel: 'beta'
|
|
),
|
|
devToolsVersion: () => '2.8.0',
|
|
userMessages: UserMessages(),
|
|
artifacts: Artifacts.test(),
|
|
fileSystem: fs,
|
|
processManager: FakeProcessManager.any(),
|
|
operatingSystemUtils: FakeOperatingSystemUtils(
|
|
name: 'Linux',
|
|
whichLookup: <String, File>{
|
|
'flutter': fs.file('/sdk/flutter/bin/flutter')..createSync(recursive: true),
|
|
'dart': fs.file('/sdk/flutter/bin/dart')..createSync(recursive: true),
|
|
},
|
|
),
|
|
flutterRoot: () => '/sdk/flutter',
|
|
);
|
|
|
|
expect(await flutterValidator.validate(), _matchDoctorValidation(
|
|
validationType: ValidationType.success,
|
|
statusInfo: 'Channel beta, 1.0.0, on Linux, locale en_US.UTF-8',
|
|
messages: isNot(contains(isA<ValidationMessage>().having(
|
|
(ValidationMessage message) => message.message,
|
|
'message',
|
|
contains('Consider adding /sdk/flutter/bin to the front of your path'),
|
|
))),
|
|
));
|
|
});
|
|
}
|
|
|
|
class FakeOperatingSystemUtils extends Fake implements OperatingSystemUtils {
|
|
FakeOperatingSystemUtils({
|
|
required this.name,
|
|
this.hostPlatform = HostPlatform.linux_x64,
|
|
this.whichLookup,
|
|
FileSystem? fs,
|
|
}) {
|
|
fs ??= MemoryFileSystem.test();
|
|
whichLookup ??= <String, File>{
|
|
'flutter': fs.file('/sdk/flutter/bin/flutter')..createSync(recursive: true),
|
|
'dart': fs.file('/sdk/flutter/bin/dart')..createSync(recursive: true),
|
|
};
|
|
}
|
|
|
|
/// A map of [File]s that calls to [which] will return.
|
|
Map<String, File>? whichLookup;
|
|
|
|
@override
|
|
File? which(String execName) => whichLookup![execName];
|
|
|
|
@override
|
|
final String name;
|
|
|
|
@override
|
|
final HostPlatform hostPlatform;
|
|
}
|
|
|
|
class FakeThrowingFlutterVersion extends FakeFlutterVersion {
|
|
@override
|
|
String get channel => 'beta';
|
|
|
|
@override
|
|
String get frameworkCommitDate {
|
|
throw VersionCheckError('version error');
|
|
}
|
|
}
|