Unverified Commit e00d424d authored by Jonah Williams's avatar Jonah Williams Committed by GitHub

[flutter_tools] clean-ups to linux doctor test (#51593)

parent fef2d6cc
...@@ -81,7 +81,9 @@ class _DefaultDoctorValidatorsProvider implements DoctorValidatorsProvider { ...@@ -81,7 +81,9 @@ class _DefaultDoctorValidatorsProvider implements DoctorValidatorsProvider {
fileSystem: globals.fs, fileSystem: globals.fs,
), ),
if (linuxWorkflow.appliesToHostPlatform) if (linuxWorkflow.appliesToHostPlatform)
LinuxDoctorValidator(), LinuxDoctorValidator(
processManager: globals.processManager,
),
if (windowsWorkflow.appliesToHostPlatform) if (windowsWorkflow.appliesToHostPlatform)
visualStudioValidator, visualStudioValidator,
if (ideValidators.isNotEmpty) if (ideValidators.isNotEmpty)
......
...@@ -2,14 +2,21 @@ ...@@ -2,14 +2,21 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
import 'package:meta/meta.dart';
import 'package:process/process.dart';
import '../base/io.dart'; import '../base/io.dart';
import '../base/version.dart'; import '../base/version.dart';
import '../doctor.dart'; import '../doctor.dart';
import '../globals.dart' as globals;
/// A validator that checks for Clang and Make build dependencies /// A validator that checks for Clang and Make build dependencies
class LinuxDoctorValidator extends DoctorValidator { class LinuxDoctorValidator extends DoctorValidator {
LinuxDoctorValidator() : super('Linux toolchain - develop for Linux desktop'); LinuxDoctorValidator({
@required ProcessManager processManager,
}) : _processManager = processManager,
super('Linux toolchain - develop for Linux desktop');
final ProcessManager _processManager;
/// The minimum version of clang supported. /// The minimum version of clang supported.
final Version minimumClangVersion = Version(3, 4, 0); final Version minimumClangVersion = Version(3, 4, 0);
...@@ -21,7 +28,7 @@ class LinuxDoctorValidator extends DoctorValidator { ...@@ -21,7 +28,7 @@ class LinuxDoctorValidator extends DoctorValidator {
/// Check for a minimum version of Clang. /// Check for a minimum version of Clang.
ProcessResult clangResult; ProcessResult clangResult;
try { try {
clangResult = await globals.processManager.run(const <String>[ clangResult = await _processManager.run(const <String>[
'clang++', 'clang++',
'--version', '--version',
]); ]);
...@@ -48,7 +55,7 @@ class LinuxDoctorValidator extends DoctorValidator { ...@@ -48,7 +55,7 @@ class LinuxDoctorValidator extends DoctorValidator {
// a better idea about what is supported. // a better idea about what is supported.
ProcessResult makeResult; ProcessResult makeResult;
try { try {
makeResult = await globals.processManager.run(const <String>[ makeResult = await _processManager.run(const <String>[
'make', 'make',
'--version', '--version',
]); ]);
......
...@@ -3,157 +3,121 @@ ...@@ -3,157 +3,121 @@
// found in the LICENSE file. // found in the LICENSE file.
import 'package:flutter_tools/src/doctor.dart'; import 'package:flutter_tools/src/doctor.dart';
import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:flutter_tools/src/linux/linux_doctor.dart'; import 'package:flutter_tools/src/linux/linux_doctor.dart';
import 'package:mockito/mockito.dart';
import 'package:process/process.dart'; import 'package:process/process.dart';
import '../../src/common.dart'; import '../../src/common.dart';
import '../../src/context.dart'; import '../../src/context.dart';
import '../../src/mocks.dart';
void main() { void main() {
group(LinuxDoctorValidator, () { testWithoutContext('Full validation when clang++ and Make are available',() async {
ProcessManager processManager; final ProcessManager processManager = FakeProcessManager.list(<FakeCommand>[
LinuxDoctorValidator linuxDoctorValidator; const FakeCommand(
command: <String>['clang++', '--version'],
setUp(() { stdout: 'clang version 4.0.1-10 (tags/RELEASE_401/final)\njunk',
processManager = MockProcessManager(); ),
linuxDoctorValidator = LinuxDoctorValidator(); const FakeCommand(
}); command: <String>['make', '--version'],
stdout: 'GNU Make 4.1\njunk',
testUsingContext('Returns full validation when clang++ and make are availibe', () async { ),
when(globals.processManager.run(<String>['clang++', '--version'])).thenAnswer((_) async { ]);
return FakeProcessResult( final DoctorValidator linuxDoctorValidator = LinuxDoctorValidator(
stdout: 'clang version 4.0.1-10 (tags/RELEASE_401/final)\njunk', processManager: processManager,
exitCode: 0, );
); final ValidationResult result = await linuxDoctorValidator.validate();
});
when(globals.processManager.run(<String>[ expect(result.type, ValidationType.installed);
'make', expect(result.messages, <ValidationMessage>[
'--version', ValidationMessage('clang++ 4.0.1'),
])).thenAnswer((_) async { ValidationMessage('GNU Make 4.1'),
return FakeProcessResult( ]);
stdout: 'GNU Make 4.1\njunk', });
exitCode: 0,
);
});
final ValidationResult result = await linuxDoctorValidator.validate();
expect(result.type, ValidationType.installed);
expect(result.messages, <ValidationMessage>[
ValidationMessage('clang++ 4.0.1'),
ValidationMessage('GNU Make 4.1'),
]);
}, overrides: <Type, Generator>{
ProcessManager: () => processManager,
});
testUsingContext('Returns partial validation when clang++ version is too old', () async {
when(globals.processManager.run(<String>['clang++', '--version'])).thenAnswer((_) async {
return FakeProcessResult(
stdout: 'clang version 2.0.1-10 (tags/RELEASE_401/final)\njunk',
exitCode: 0,
);
});
when(globals.processManager.run(<String>[
'make',
'--version',
])).thenAnswer((_) async {
return FakeProcessResult(
stdout: 'GNU Make 4.1\njunk',
exitCode: 0,
);
});
final ValidationResult result = await linuxDoctorValidator.validate();
expect(result.type, ValidationType.partial);
expect(result.messages, <ValidationMessage>[
ValidationMessage.error('clang++ 2.0.1 is below minimum version of 3.4.0'),
ValidationMessage('GNU Make 4.1'),
]);
}, overrides: <Type, Generator>{
ProcessManager: () => processManager,
});
testUsingContext('Returns mising validation when make is not availible', () async {
when(globals.processManager.run(<String>['clang++', '--version'])).thenAnswer((_) async {
return FakeProcessResult(
stdout: 'clang version 4.0.1-10 (tags/RELEASE_401/final)\njunk',
exitCode: 0,
);
});
when(globals.processManager.run(<String>[
'make',
'--version',
])).thenAnswer((_) async {
return FakeProcessResult(
stdout: '',
exitCode: 1,
);
});
final ValidationResult result = await linuxDoctorValidator.validate();
expect(result.type, ValidationType.missing);
expect(result.messages, <ValidationMessage>[
ValidationMessage('clang++ 4.0.1'),
ValidationMessage.error('make is not installed'),
]);
}, overrides: <Type, Generator>{
ProcessManager: () => processManager,
});
testUsingContext('Returns mising validation when clang++ is not availible', () async {
when(globals.processManager.run(<String>['clang++', '--version'])).thenAnswer((_) async {
return FakeProcessResult(
stdout: '',
exitCode: 1,
);
});
when(globals.processManager.run(<String>[
'make',
'--version',
])).thenAnswer((_) async {
return FakeProcessResult(
stdout: 'GNU Make 4.1\njunk',
exitCode: 0,
);
});
final ValidationResult result = await linuxDoctorValidator.validate(); testWithoutContext('Partial validation when clang++ version is too old', () async {
expect(result.type, ValidationType.missing); final ProcessManager processManager = FakeProcessManager.list(<FakeCommand>[
expect(result.messages, <ValidationMessage>[ const FakeCommand(
ValidationMessage.error('clang++ is not installed'), command: <String>['clang++', '--version'],
ValidationMessage('GNU Make 4.1'), stdout: 'clang version 2.0.1-10 (tags/RELEASE_401/final)\njunk',
]); ),
}, overrides: <Type, Generator>{ const FakeCommand(
ProcessManager: () => processManager, command: <String>['make', '--version'],
}); stdout: 'GNU Make 4.1\njunk',
),
]);
final DoctorValidator linuxDoctorValidator = LinuxDoctorValidator(
processManager: processManager,
);
final ValidationResult result = await linuxDoctorValidator.validate();
expect(result.type, ValidationType.partial);
expect(result.messages, <ValidationMessage>[
ValidationMessage.error('clang++ 2.0.1 is below minimum version of 3.4.0'),
ValidationMessage('GNU Make 4.1'),
]);
});
testWithoutContext('Missing validation when Make is not available', () async {
final ProcessManager processManager = FakeProcessManager.list(<FakeCommand>[
const FakeCommand(
command: <String>['clang++', '--version'],
stdout: 'clang version 4.0.1-10 (tags/RELEASE_401/final)\njunk',
),
const FakeCommand(
command: <String>['make', '--version'],
exitCode: 1,
),
]);
final DoctorValidator linuxDoctorValidator = LinuxDoctorValidator(
processManager: processManager,
);
final ValidationResult result = await linuxDoctorValidator.validate();
expect(result.type, ValidationType.missing);
expect(result.messages, <ValidationMessage>[
ValidationMessage('clang++ 4.0.1'),
ValidationMessage.error('make is not installed'),
]);
});
testUsingContext('Returns missing validation when clang and make are not availible', () async { testWithoutContext('Missing validation when clang++ is not available', () async {
when(globals.processManager.run(<String>['clang++', '--version'])).thenAnswer((_) async { final ProcessManager processManager = FakeProcessManager.list(<FakeCommand>[
return FakeProcessResult( const FakeCommand(
stdout: '', command: <String>['clang++', '--version'],
exitCode: 1, exitCode: 1
); ),
}); const FakeCommand(
when(globals.processManager.run(<String>[ command: <String>['make', '--version'],
'make', stdout: 'GNU Make 4.1\njunk'
'--version', ),
])).thenAnswer((_) async { ]);
return FakeProcessResult( final DoctorValidator linuxDoctorValidator = LinuxDoctorValidator(
stdout: '', processManager: processManager,
exitCode: 1, );
); final ValidationResult result = await linuxDoctorValidator.validate();
});
expect(result.type, ValidationType.missing);
expect(result.messages, <ValidationMessage>[
ValidationMessage.error('clang++ is not installed'),
ValidationMessage('GNU Make 4.1'),
]);
});
final ValidationResult result = await linuxDoctorValidator.validate(); testWithoutContext('Missing validation when clang++ and Make are not available', () async {
expect(result.type, ValidationType.missing); final ProcessManager processManager = FakeProcessManager.list(<FakeCommand>[
}, overrides: <Type, Generator>{ const FakeCommand(
ProcessManager: () => processManager, command: <String>['clang++', '--version'],
}); exitCode: 1,
),
const FakeCommand(
command: <String>['make', '--version'],
exitCode: 1,
),
]);
final DoctorValidator linuxDoctorValidator = LinuxDoctorValidator(
processManager: processManager,
);
final ValidationResult result = await linuxDoctorValidator.validate();
expect(result.type, ValidationType.missing);
}); });
} }
class MockProcessManager extends Mock implements ProcessManager {}
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