// 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'); }); }