// 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/doctor_validator.dart'; import 'package:flutter_tools/src/windows/windows_version_validator.dart'; import '../src/common.dart'; import '../src/fake_process_manager.dart'; /// Example output from `systeminfo` from a Windows 10 host const String validWindows10StdOut = r''' Host Name: XXXXXXXXXXXX OS Name: Microsoft Windows 10 Enterprise OS Version: 10.0.19044 N/A Build 19044 OS Manufacturer: Microsoft Corporation OS Configuration: Member Workstation OS Build Type: Multiprocessor Free Registered Owner: N/A Registered Organization: N/A Product ID: XXXXXXXXXXXX Original Install Date: 8/4/2022, 2:51:28 PM System Boot Time: 8/10/2022, 1:03:10 PM System Manufacturer: Google System Model: Google Compute Engine System Type: x64-based PC Processor(s): 1 Processor(s) Installed. [01]: AMD64 Family 23 Model 49 Stepping 0 AuthenticAMD ~2250 Mhz BIOS Version: Google Google, 6/29/2022 Windows Directory: C:\\Windows System Directory: C:\\Windows\\system32 Boot Device: \\Device\\HarddiskVolume2 System Locale: en-us;English (United States) Input Locale: en-us;English (United States) Time Zone: (UTC-08:00) Pacific Time (US & Canada) Total Physical Memory: 32,764 MB Available Physical Memory: 17,852 MB Virtual Memory: Max Size: 33,788 MB Virtual Memory: Available: 18,063 MB Virtual Memory: In Use: 15,725 MB Page File Location(s): C:\\pagefile.sys Domain: ad.corp.google.com Logon Server: \\CBF-DC-8 Hotfix(s): 7 Hotfix(s) Installed. [01]: KB5013624 [02]: KB5003791 [03]: KB5012170 [04]: KB5016616 [05]: KB5014032 [06]: KB5014671 [07]: KB5015895 Hyper-V Requirements: A hypervisor has been detected. Features required for Hyper-V will not be displayed. '''; /// Example output from `systeminfo` from version != 10 const String invalidWindowsStdOut = r''' Host Name: XXXXXXXXXXXX OS Name: Microsoft Windows 8.1 Enterprise OS Version: 6.3.9600 Build 9600 OS Manufacturer: Microsoft Corporation OS Configuration: Member Workstation OS Build Type: Multiprocessor Free Registered Owner: N/A Registered Organization: N/A Product ID: XXXXXXXXXXXX Original Install Date: 8/4/2022, 2:51:28 PM System Boot Time: 8/10/2022, 1:03:10 PM System Manufacturer: Google System Model: Google Compute Engine System Type: x64-based PC Processor(s): 1 Processor(s) Installed. [01]: AMD64 Family 23 Model 49 Stepping 0 AuthenticAMD ~2250 Mhz BIOS Version: Google Google, 6/29/2022 Windows Directory: C:\\Windows System Directory: C:\\Windows\\system32 Boot Device: \\Device\\HarddiskVolume2 System Locale: en-us;English (United States) Input Locale: en-us;English (United States) Time Zone: (UTC-08:00) Pacific Time (US & Canada) Total Physical Memory: 32,764 MB Available Physical Memory: 17,852 MB Virtual Memory: Max Size: 33,788 MB Virtual Memory: Available: 18,063 MB Virtual Memory: In Use: 15,725 MB Page File Location(s): C:\\pagefile.sys Domain: ad.corp.google.com Logon Server: \\CBF-DC-8 Hotfix(s): 7 Hotfix(s) Installed. [01]: KB5013624 [02]: KB5003791 [03]: KB5012170 [04]: KB5016616 [05]: KB5014032 [06]: KB5014671 [07]: KB5015895 Hyper-V Requirements: A hypervisor has been detected. Features required for Hyper-V will not be displayed. '''; /// The expected validation result object for /// a passing windows version test const ValidationResult validWindows10ValidationResult = ValidationResult( ValidationType.installed, <ValidationMessage>[], statusInfo: 'Installed version of Windows is version 10 or higher', ); /// The expected validation result object for /// a failing exit code (!= 0) const ValidationResult failedValidationResult = ValidationResult( ValidationType.missing, <ValidationMessage>[], statusInfo: 'Exit status from running `systeminfo` was unsuccessful', ); /// 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', ); /// Expected return from a nonzero exitcode when /// running systeminfo const ValidationResult invalidExitCodeValidationResult = ValidationResult( ValidationType.missing, <ValidationMessage>[], statusInfo: 'Exit status from running `systeminfo` was unsuccessful', ); void main() { testWithoutContext('Successfully running windows version check on windows 10', () async { final WindowsVersionValidator windowsVersionValidator = WindowsVersionValidator( processManager: FakeProcessManager.list( <FakeCommand>[ const FakeCommand( command: <String>['systeminfo'], stdout: validWindows10StdOut, ), ], ), ); 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('Failing to invoke the `systeminfo` command', () async { final WindowsVersionValidator windowsVersionValidator = WindowsVersionValidator( processManager: FakeProcessManager.list( <FakeCommand>[ const FakeCommand( command: <String>['systeminfo'], stdout: validWindows10StdOut, exitCode: 1, ), ], ), ); final ValidationResult result = await windowsVersionValidator.validate(); expect(result.type, failedValidationResult.type, reason: 'The ValidationResult type should be the same (missing)'); expect(result.statusInfo, failedValidationResult.statusInfo, reason: 'The ValidationResult statusInfo messages should be the same'); }); testWithoutContext('Identifying a windows version before 10', () async { final WindowsVersionValidator windowsVersionValidator = WindowsVersionValidator( processManager: FakeProcessManager.list( <FakeCommand>[ const FakeCommand( command: <String>['systeminfo'], stdout: invalidWindowsStdOut, ), ], ), ); final ValidationResult result = await windowsVersionValidator.validate(); expect(result.type, invalidWindowsValidationResult.type, reason: 'The ValidationResult type should be the same (missing)'); expect(result.statusInfo, invalidWindowsValidationResult.statusInfo, reason: 'The ValidationResult statusInfo messages should be the same'); }); testWithoutContext( 'Running into an nonzero exit code from systeminfo command', () async { final WindowsVersionValidator windowsVersionValidator = WindowsVersionValidator( processManager: FakeProcessManager.list( <FakeCommand>[ const FakeCommand(command: <String>['systeminfo'], exitCode: 1), ], ), ); final ValidationResult result = await windowsVersionValidator.validate(); expect(result.type, invalidExitCodeValidationResult.type, reason: 'The ValidationResult type should be the same (missing)'); expect(result.statusInfo, invalidExitCodeValidationResult.statusInfo, reason: 'The ValidationResult statusInfo messages should be the same'); }); 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 OS 6Version: 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 '''; final RegExp regex = RegExp(kWindowsOSVersionSemVerPattern, multiLine: true); final Iterable<RegExpMatch> matches = regex.allMatches(testStr); expect(matches.length, 2, reason: 'There should be only two matches for the pattern provided'); }); }