// Copyright 2019 The Chromium 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.dart'; import 'package:flutter_tools/src/linux/linux_doctor.dart'; import 'package:mockito/mockito.dart'; import 'package:process/process.dart'; import '../src/common.dart'; import '../src/context.dart'; import '../src/mocks.dart'; void main() { group(LinuxDoctorValidator, () { ProcessManager processManager; LinuxDoctorValidator linuxDoctorValidator; setUp(() { processManager = MockProcessManager(); linuxDoctorValidator = LinuxDoctorValidator(); }); testUsingContext('Returns full validation when clang++ and make are availibe', () async { when(processManager.run(['clang++', '--version'])).thenAnswer((_) async { return FakeProcessResult( stdout: 'clang version 4.0.1-10 (tags/RELEASE_401/final)\njunk', exitCode: 0, ); }); when(processManager.run([ 'make', '--version', ])).thenAnswer((_) async { 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('clang++ 4.0.1'), ValidationMessage('GNU Make 4.1'), ]); }, overrides: { ProcessManager: () => processManager, }); testUsingContext('Returns partial validation when clang++ version is too old', () async { when(processManager.run(['clang++', '--version'])).thenAnswer((_) async { return FakeProcessResult( stdout: 'clang version 2.0.1-10 (tags/RELEASE_401/final)\njunk', exitCode: 0, ); }); when(processManager.run([ '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.error('clang++ 2.0.1 is below minimum version of 3.4.0'), ValidationMessage('GNU Make 4.1'), ]); }, overrides: { ProcessManager: () => processManager, }); testUsingContext('Returns mising validation when make is not availible', () async { when(processManager.run(['clang++', '--version'])).thenAnswer((_) async { return FakeProcessResult( stdout: 'clang version 4.0.1-10 (tags/RELEASE_401/final)\njunk', exitCode: 0, ); }); when(processManager.run([ 'make', '--version', ])).thenAnswer((_) async { return FakeProcessResult( stdout: '', exitCode: 1, ); }); final ValidationResult result = await linuxDoctorValidator.validate(); expect(result.type, ValidationType.missing); expect(result.messages, [ ValidationMessage('clang++ 4.0.1'), ValidationMessage.error('make is not installed') ]); }, overrides: { ProcessManager: () => processManager, }); testUsingContext('Returns mising validation when clang++ is not availible', () async { when(processManager.run(['clang++', '--version'])).thenAnswer((_) async { return FakeProcessResult( stdout: '', exitCode: 1, ); }); when(processManager.run([ 'make', '--version', ])).thenAnswer((_) async { return FakeProcessResult( stdout: 'GNU Make 4.1\njunk', exitCode: 0, ); }); final ValidationResult result = await linuxDoctorValidator.validate(); expect(result.type, ValidationType.missing); expect(result.messages, [ ValidationMessage.error('clang++ is not installed'), ValidationMessage('GNU Make 4.1'), ]); }, overrides: { ProcessManager: () => processManager, }); testUsingContext('Returns missing validation when clang and make are not availible', () async { when(processManager.run(['clang++', '--version'])).thenAnswer((_) async { return FakeProcessResult( stdout: '', exitCode: 1, ); }); when(processManager.run([ 'make', '--version', ])).thenAnswer((_) async { return FakeProcessResult( stdout: '', exitCode: 1, ); }); final ValidationResult result = await linuxDoctorValidator.validate(); expect(result.type, ValidationType.missing); }, overrides: { ProcessManager: () => processManager, }); }); } class MockProcessManager extends Mock implements ProcessManager {}