// 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 'dart:async'; import 'dart:convert'; import 'dart:io'; import 'package:flutter_tools/src/base/io.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/version.dart'; import 'package:mockito/mockito.dart'; import 'package:process/process.dart'; import '../src/common.dart'; import '../src/context.dart'; import '../src/mocks.dart' show MockProcess; void main() { group('version', () { setUpAll(() { Cache.disableLocking(); }); testUsingContext('version ls', () async { final VersionCommand command = VersionCommand(); await createTestCommandRunner(command).run(['version']); expect(testLogger.statusText, equals('v10.0.0\r\nv20.0.0\n' '')); }, overrides: { ProcessManager: () => MockProcessManager(), }); testUsingContext('version switch', () async { const String version = '10.0.0'; final VersionCommand command = VersionCommand(); final Future runCommand = createTestCommandRunner(command).run(['version', version]); await Future.wait(>[runCommand]); expect(testLogger.statusText, contains('Switching Flutter to version $version')); }, overrides: { ProcessManager: () => MockProcessManager(), }); testUsingContext('switch to not supported version without force', () async { const String version = '1.1.5'; final VersionCommand command = VersionCommand(); final Future runCommand = createTestCommandRunner(command).run(['version', version]); await Future.wait(>[runCommand]); expect(testLogger.errorText, contains('Version command is not supported in')); }, overrides: { ProcessManager: () => MockProcessManager(), }); testUsingContext('switch to not supported version with force', () async { const String version = '1.1.5'; final VersionCommand command = VersionCommand(); final Future runCommand = createTestCommandRunner(command).run(['version', '--force', version]); await Future.wait(>[runCommand]); expect(testLogger.statusText, contains('Switching Flutter to version $version with force')); }, overrides: { ProcessManager: () => MockProcessManager(), }); }); } class MockProcessManager extends Mock implements ProcessManager { String version = ''; @override Future run( List command, { String workingDirectory, Map environment, bool includeParentEnvironment = true, bool runInShell = false, Encoding stdoutEncoding = systemEncoding, Encoding stderrEncoding = systemEncoding, }) async { if (command[0] == 'git' && command[1] == 'tag') { return ProcessResult(0, 0, 'v10.0.0\r\nv20.0.0', ''); } if (command[0] == 'git' && command[1] == 'checkout') { version = command[2]; } return ProcessResult(0, 0, '', ''); } @override ProcessResult runSync( List command, { String workingDirectory, Map environment, bool includeParentEnvironment = true, bool runInShell = false, Encoding stdoutEncoding = systemEncoding, Encoding stderrEncoding = systemEncoding, }) { final String commandStr = command.join(' '); if (commandStr == 'git log -n 1 --pretty=format:%H') { return ProcessResult(0, 0, '000000000000000000000', ''); } if (commandStr == 'git describe --match v*.*.* --first-parent --long --tags') { if (version.isNotEmpty) { return ProcessResult(0, 0, '$version-0-g00000000', ''); } } return ProcessResult(0, 0, '', ''); } @override Future start( List command, { String workingDirectory, Map environment, bool includeParentEnvironment = true, bool runInShell = false, ProcessStartMode mode = ProcessStartMode.normal, }) { final Completer completer = Completer(); completer.complete(MockProcess()); return completer.future; } }