blob: f6ebb9d7a9f29f4cc0339abf6e3eb651db655986 [file] [log] [blame]
// 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:flutter_tools/src/base/io.dart';
import 'package:flutter_tools/src/base/os.dart';
import 'package:flutter_tools/src/doctor_validator.dart';
import 'package:flutter_tools/src/windows/windows_version_validator.dart';
import 'package:test/fake.dart';
import '../src/common.dart';
/// Fake [_WindowsUtils] to use for testing
class FakeValidOperatingSystemUtils extends Fake
implements OperatingSystemUtils {
FakeValidOperatingSystemUtils(
[this.name = 'Microsoft Windows [Version 11.0.22621.963]']);
@override
final String name;
}
class FakeProcessLister extends Fake implements ProcessLister {
FakeProcessLister({required this.result, this.exitCode = 0});
final String result;
final int exitCode;
@override
Future<ProcessResult> getProcessesWithPath() async {
return ProcessResult(0, exitCode, result, null);
}
}
FakeProcessLister ofdRunning() {
return FakeProcessLister(result: r'Path: "C:\Program Files\Topaz OFD\Warsaw\core.exe"');
}
FakeProcessLister ofdNotRunning() {
return FakeProcessLister(result: r'Path: "C:\Program Files\Google\Chrome\Application\chrome.exe');
}
FakeProcessLister failure() {
return FakeProcessLister(result: r'Path: "C:\Program Files\Google\Chrome\Application\chrome.exe', exitCode: 10);
}
/// The expected validation result object for
/// a passing windows version test
const ValidationResult validWindows10ValidationResult = ValidationResult(
ValidationType.success,
<ValidationMessage>[],
statusInfo: 'Installed version of Windows is version 10 or higher',
);
/// The expected validation result object for
/// a passing windows version test
const ValidationResult invalidWindowsValidationResult = ValidationResult(
ValidationType.missing,
<ValidationMessage>[],
statusInfo: 'Unable to confirm if installed Windows version is 10 or greater',
);
const ValidationResult ofdFoundRunning = ValidationResult(
ValidationType.partial,
<ValidationMessage>[
ValidationMessage.hint(
'The Topaz OFD Security Module was detected on your machine. '
'You may need to disable it to build Flutter applications.',
),
],
statusInfo: 'Problem detected with Windows installation',
);
const ValidationResult getProcessFailed = ValidationResult(
ValidationType.partial,
<ValidationMessage>[
ValidationMessage.hint('Get-Process failed to complete'),
],
statusInfo: 'Problem detected with Windows installation',
);
void main() {
testWithoutContext('Successfully running windows version check on windows 10',
() async {
final WindowsVersionValidator windowsVersionValidator =
WindowsVersionValidator(
operatingSystemUtils: FakeValidOperatingSystemUtils(),
processLister: ofdNotRunning());
final ValidationResult result = await windowsVersionValidator.validate();
expect(result.type, validWindows10ValidationResult.type,
reason: 'The ValidationResult type should be the same (installed)');
expect(result.statusInfo, validWindows10ValidationResult.statusInfo,
reason: 'The ValidationResult statusInfo messages should be the same');
});
testWithoutContext(
'Successfully running windows version check on windows 10 for BR',
() async {
final WindowsVersionValidator windowsVersionValidator =
WindowsVersionValidator(
operatingSystemUtils: FakeValidOperatingSystemUtils(
'Microsoft Windows [versão 10.0.22621.1105]'),
processLister: ofdNotRunning());
final ValidationResult result = await windowsVersionValidator.validate();
expect(result.type, validWindows10ValidationResult.type,
reason: 'The ValidationResult type should be the same (installed)');
expect(result.statusInfo, validWindows10ValidationResult.statusInfo,
reason: 'The ValidationResult statusInfo messages should be the same');
});
testWithoutContext('Identifying a windows version before 10', () async {
final WindowsVersionValidator windowsVersionValidator =
WindowsVersionValidator(
operatingSystemUtils: FakeValidOperatingSystemUtils(
'Microsoft Windows [Version 8.0.22621.1105]'),
processLister: ofdNotRunning());
final ValidationResult result = await windowsVersionValidator.validate();
expect(result.type, invalidWindowsValidationResult.type,
reason: 'The ValidationResult type should be the same (missing)');
});
testWithoutContext('Unit testing on a regex pattern validator', () async {
const String testStr = r'''
OS Version: 10.0.19044 N/A Build 19044
OSz Version: 10.0.19044 N/A Build 19044
OxS Version: 10.0.19044 N/A Build 19044
OS Version: 10.19044 N/A Build 19044
OS Version: 10.x.19044 N/A Build 19044
OS Version: 10.0.19044 N/A Build 19044
OS Version: .0.19044 N/A Build 19044
OS 版本: 10.0.22621 暂缺 Build 22621
''';
final RegExp regex = RegExp(
kWindowsOSVersionSemVerPattern,
multiLine: true,
);
final Iterable<RegExpMatch> matches = regex.allMatches(testStr);
expect(matches.length, 5,
reason: 'There should be only 5 matches for the pattern provided');
});
testWithoutContext('Successfully checks for Topaz OFD when it is running', () async {
final WindowsVersionValidator validator =
WindowsVersionValidator(
operatingSystemUtils: FakeValidOperatingSystemUtils(),
processLister: ofdRunning());
final ValidationResult result = await validator.validate();
expect(result.type, ofdFoundRunning.type, reason: 'The ValidationResult type should be the same (partial)');
expect(result.statusInfo, ofdFoundRunning.statusInfo, reason: 'The ValidationResult statusInfo should be the same');
expect(result.messages.length, 1, reason: 'The ValidationResult should have precisely 1 message');
expect(result.messages[0].message, ofdFoundRunning.messages[0].message, reason: 'The ValidationMessage message should be the same');
});
testWithoutContext('Reports failure of Get-Process', () async {
final WindowsVersionValidator validator =
WindowsVersionValidator(
operatingSystemUtils: FakeValidOperatingSystemUtils(),
processLister: failure());
final ValidationResult result = await validator.validate();
expect(result.type, getProcessFailed.type, reason: 'The ValidationResult type should be the same (partial)');
expect(result.statusInfo, getProcessFailed.statusInfo, reason: 'The ValidationResult statusInfo should be the same');
expect(result.messages.length, 1, reason: 'The ValidationResult should have precisely 1 message');
expect(result.messages[0].message, getProcessFailed.messages[0].message, reason: 'The ValidationMessage message should be the same');
});
}