// 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:args/command_runner.dart'; import 'package:conductor_core/src/candidates.dart'; import 'package:conductor_core/src/repository.dart'; import 'package:file/memory.dart'; import 'package:platform/platform.dart'; import './common.dart'; void main() { group('candidates command', () { const String flutterRoot = '/flutter'; const String flutterBinPath = '$flutterRoot/bin/flutter'; const String checkoutsParentDirectory = '$flutterRoot/dev/tools/'; const String remoteName = 'origin'; late MemoryFileSystem fileSystem; late FakePlatform platform; late TestStdio stdio; late FakeProcessManager processManager; final String operatingSystem = const LocalPlatform().operatingSystem; setUp(() { stdio = TestStdio(); fileSystem = MemoryFileSystem.test(); }); CommandRunner<void> createRunner({ required Checkouts checkouts, }) { final CandidatesCommand command = CandidatesCommand( checkouts: checkouts, flutterRoot: fileSystem.directory(flutterRoot), ); return CommandRunner<void>('clean-test', '')..addCommand(command); } test('prints only branches from targeted remote', () async { const String currentVersion = '1.2.3'; const String branch = 'flutter-1.3-candidate.0'; processManager = FakeProcessManager.list(<FakeCommand>[ const FakeCommand( command: <String>['git', 'fetch', remoteName], ), const FakeCommand( command: <String>[flutterBinPath, 'help'], ), const FakeCommand( command: <String>[flutterBinPath, '--version', '--machine'], stdout: '{"frameworkVersion": "$currentVersion"}', ), FakeCommand( command: const <String>[ 'git', 'branch', '--no-color', '--remotes', '--list', '$remoteName/*', ], stdout: <String>[ 'other-remote/flutter-5.0-candidate.0', '$remoteName/$branch', ].join('\n'), ), ]); final String pathSeparator = operatingSystem == 'windows' ? r'\' : '/'; platform = FakePlatform( environment: <String, String>{ 'HOME': <String>['path', 'to', 'home'].join(pathSeparator), }, pathSeparator: pathSeparator, ); final Checkouts checkouts = Checkouts( fileSystem: fileSystem, parentDirectory: fileSystem.directory(checkoutsParentDirectory), platform: platform, processManager: processManager, stdio: stdio, ); final CommandRunner<void> runner = createRunner(checkouts: checkouts); await runner.run(<String>['candidates', '--$kRemote', remoteName]); expect(stdio.stdout.contains('currentVersion = $currentVersion'), true); expect(stdio.stdout.contains(branch), true); expect(stdio.stdout.contains('flutter-5.0-candidate.0'), false); }); test('does not print branches older or equal to current version', () async { const String currentVersion = '2.3.0-13.0.pre.48'; const String newBranch = 'flutter-2.4-candidate.0'; const String oldBranch = 'flutter-1.0-candidate.0'; const String currentBranch = 'flutter-2.3-candidate.13'; processManager = FakeProcessManager.list(<FakeCommand>[ const FakeCommand( command: <String>['git', 'fetch', remoteName], ), const FakeCommand( command: <String>[flutterBinPath, 'help'], ), const FakeCommand( command: <String>[flutterBinPath, '--version', '--machine'], stdout: '{"frameworkVersion": "$currentVersion"}', ), FakeCommand( command: const <String>[ 'git', 'branch', '--no-color', '--remotes', '--list', '$remoteName/*', ], stdout: <String>[ '$remoteName/$oldBranch', '$remoteName/$currentBranch', '$remoteName/$newBranch', ].join('\n'), ), ]); final String pathSeparator = operatingSystem == 'windows' ? r'\' : '/'; platform = FakePlatform( environment: <String, String>{ 'HOME': <String>['path', 'to', 'home'].join(pathSeparator), }, pathSeparator: pathSeparator, ); final Checkouts checkouts = Checkouts( fileSystem: fileSystem, parentDirectory: fileSystem.directory(checkoutsParentDirectory), platform: platform, processManager: processManager, stdio: stdio, ); final CommandRunner<void> runner = createRunner(checkouts: checkouts); await runner.run(<String>['candidates', '--$kRemote', remoteName]); expect(stdio.stdout.contains('currentVersion = $currentVersion'), true); expect(stdio.stdout.contains(newBranch), true); expect(stdio.stdout.contains(oldBranch), false); expect(stdio.stdout.contains(currentBranch), false); }); }, onPlatform: <String, dynamic>{ 'windows': const Skip('Flutter Conductor only supported on macos/linux'), }); }