blob: 1bfdb01ea8ba4b383c345f57adfa90796a928403 [file] [log] [blame]
// 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 'dart:async';
import 'package:args/command_runner.dart';
import 'package:file/file.dart';
import 'package:file/memory.dart';
import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/commands/upgrade.dart';
import 'package:flutter_tools/src/version.dart';
import '../../src/context.dart';
import '../../src/fake_process_manager.dart';
import '../../src/fakes.dart' show FakeFlutterVersion;
import '../../src/test_flutter_command_runner.dart';
void main() {
late FileSystem fileSystem;
late BufferLogger logger;
late FakeProcessManager processManager;
UpgradeCommand command;
late CommandRunner<void> runner;
late FlutterVersion flutterVersion;
setUpAll(() {
Cache.disableLocking();
});
setUp(() {
fileSystem = MemoryFileSystem.test();
logger = BufferLogger.test();
processManager = FakeProcessManager.empty();
command = UpgradeCommand(
verboseHelp: false,
);
runner = createTestCommandRunner(command);
});
testUsingContext('can auto-migrate a user from dev to beta', () async {
const String startingTag = '3.0.0-1.2.pre';
flutterVersion = FakeFlutterVersion(channel: 'dev');
const String latestUpstreamTag = '3.0.0-1.3.pre';
const String upstreamHeadRevision = 'deadbeef';
final Completer<void> reEntryCompleter = Completer<void>();
Future<void> reEnterTool() async {
await runner.run(<String>['upgrade', '--continue', '--no-version-check']);
reEntryCompleter.complete();
}
processManager.addCommands(<FakeCommand>[
const FakeCommand(
command: <String>['git', 'tag', '--points-at', 'HEAD'],
stdout: startingTag,
),
// Ensure we have upstream tags present locally
const FakeCommand(
command: <String>['git', 'fetch', '--tags'],
),
const FakeCommand(
command: <String>['git', 'rev-parse', '--verify', '@{upstream}'],
stdout: upstreamHeadRevision,
),
const FakeCommand(
command: <String>['git', 'tag', '--points-at', upstreamHeadRevision],
stdout: latestUpstreamTag,
),
// check for uncommitted changes; empty stdout means clean checkout
const FakeCommand(
command: <String>['git', 'status', '-s'],
),
// here the tool is upgrading the branch from dev -> beta
const FakeCommand(
command: <String>['git', 'fetch'],
),
// test if there already exists a local beta branch; 0 exit code means yes
const FakeCommand(
command: <String>['git', 'show-ref', '--verify', '--quiet', 'refs/heads/beta'],
),
const FakeCommand(
command: <String>['git', 'checkout', 'beta', '--'],
),
// reset instead of pull since cherrypicks from one release branch will
// not be present on a newer one
const FakeCommand(
command: <String>['git', 'reset', '--hard', upstreamHeadRevision],
),
// re-enter flutter command with the newer version, so that `doctor`
// checks will be up to date
FakeCommand(
command: const <String>['bin/flutter', 'upgrade', '--continue', '--no-version-check'],
onRun: reEnterTool,
completer: reEntryCompleter,
),
// commands following this are from the re-entrant `flutter upgrade --continue` call
const FakeCommand(
command: <String>['git', 'tag', '--points-at', 'HEAD'],
stdout: latestUpstreamTag,
),
const FakeCommand(
command: <String>['bin/flutter', '--no-color', '--no-version-check', 'precache'],
),
const FakeCommand(
command: <String>['bin/flutter', '--no-version-check', 'doctor'],
),
]);
await runner.run(<String>['upgrade']);
expect(processManager, hasNoRemainingExpectations);
expect(logger.statusText, contains("Transitioning from 'dev' to 'beta'..."));
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
FlutterVersion: () => flutterVersion,
Logger: () => logger,
ProcessManager: () => processManager,
});
}