mirror of
https://github.com/flutter/packages.git
synced 2025-08-06 17:28:42 +08:00

Switches `analyze` to the new base command that handles the boilerplate of looping over target packages. This will change the output format slightly, but shoudn't have any functional change. Updates tests to use runCapturingPrint so that test run output isn't mixed with command output. Part of https://github.com/flutter/flutter/issues/83413
175 lines
6.1 KiB
Dart
175 lines
6.1 KiB
Dart
// Copyright 2013 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:file/file.dart';
|
|
import 'package:file/memory.dart';
|
|
import 'package:flutter_plugin_tools/src/analyze_command.dart';
|
|
import 'package:flutter_plugin_tools/src/common/core.dart';
|
|
import 'package:test/test.dart';
|
|
|
|
import 'mocks.dart';
|
|
import 'util.dart';
|
|
|
|
void main() {
|
|
late FileSystem fileSystem;
|
|
late Directory packagesDir;
|
|
late RecordingProcessRunner processRunner;
|
|
late CommandRunner<void> runner;
|
|
|
|
setUp(() {
|
|
fileSystem = MemoryFileSystem();
|
|
packagesDir = createPackagesDirectory(fileSystem: fileSystem);
|
|
processRunner = RecordingProcessRunner();
|
|
final AnalyzeCommand analyzeCommand =
|
|
AnalyzeCommand(packagesDir, processRunner: processRunner);
|
|
|
|
runner = CommandRunner<void>('analyze_command', 'Test for analyze_command');
|
|
runner.addCommand(analyzeCommand);
|
|
});
|
|
|
|
test('analyzes all packages', () async {
|
|
final Directory plugin1Dir = createFakePlugin('a', packagesDir);
|
|
final Directory plugin2Dir = createFakePlugin('b', packagesDir);
|
|
|
|
final MockProcess mockProcess = MockProcess();
|
|
mockProcess.exitCodeCompleter.complete(0);
|
|
processRunner.processToReturn = mockProcess;
|
|
await runCapturingPrint(runner, <String>['analyze']);
|
|
|
|
expect(
|
|
processRunner.recordedCalls,
|
|
orderedEquals(<ProcessCall>[
|
|
ProcessCall(
|
|
'flutter', const <String>['packages', 'get'], plugin1Dir.path),
|
|
ProcessCall(
|
|
'flutter', const <String>['packages', 'get'], plugin2Dir.path),
|
|
ProcessCall('dart', const <String>['analyze', '--fatal-infos'],
|
|
plugin1Dir.path),
|
|
ProcessCall('dart', const <String>['analyze', '--fatal-infos'],
|
|
plugin2Dir.path),
|
|
]));
|
|
});
|
|
|
|
test('skips flutter pub get for examples', () async {
|
|
final Directory plugin1Dir = createFakePlugin('a', packagesDir);
|
|
|
|
final MockProcess mockProcess = MockProcess();
|
|
mockProcess.exitCodeCompleter.complete(0);
|
|
processRunner.processToReturn = mockProcess;
|
|
await runCapturingPrint(runner, <String>['analyze']);
|
|
|
|
expect(
|
|
processRunner.recordedCalls,
|
|
orderedEquals(<ProcessCall>[
|
|
ProcessCall(
|
|
'flutter', const <String>['packages', 'get'], plugin1Dir.path),
|
|
ProcessCall('dart', const <String>['analyze', '--fatal-infos'],
|
|
plugin1Dir.path),
|
|
]));
|
|
});
|
|
|
|
test('don\'t elide a non-contained example package', () async {
|
|
final Directory plugin1Dir = createFakePlugin('a', packagesDir);
|
|
final Directory plugin2Dir = createFakePlugin('example', packagesDir);
|
|
|
|
final MockProcess mockProcess = MockProcess();
|
|
mockProcess.exitCodeCompleter.complete(0);
|
|
processRunner.processToReturn = mockProcess;
|
|
await runCapturingPrint(runner, <String>['analyze']);
|
|
|
|
expect(
|
|
processRunner.recordedCalls,
|
|
orderedEquals(<ProcessCall>[
|
|
ProcessCall(
|
|
'flutter', const <String>['packages', 'get'], plugin1Dir.path),
|
|
ProcessCall(
|
|
'flutter', const <String>['packages', 'get'], plugin2Dir.path),
|
|
ProcessCall('dart', const <String>['analyze', '--fatal-infos'],
|
|
plugin1Dir.path),
|
|
ProcessCall('dart', const <String>['analyze', '--fatal-infos'],
|
|
plugin2Dir.path),
|
|
]));
|
|
});
|
|
|
|
test('uses a separate analysis sdk', () async {
|
|
final Directory pluginDir = createFakePlugin('a', packagesDir);
|
|
|
|
final MockProcess mockProcess = MockProcess();
|
|
mockProcess.exitCodeCompleter.complete(0);
|
|
processRunner.processToReturn = mockProcess;
|
|
await runCapturingPrint(
|
|
runner, <String>['analyze', '--analysis-sdk', 'foo/bar/baz']);
|
|
|
|
expect(
|
|
processRunner.recordedCalls,
|
|
orderedEquals(<ProcessCall>[
|
|
ProcessCall(
|
|
'flutter',
|
|
const <String>['packages', 'get'],
|
|
pluginDir.path,
|
|
),
|
|
ProcessCall(
|
|
'foo/bar/baz/bin/dart',
|
|
const <String>['analyze', '--fatal-infos'],
|
|
pluginDir.path,
|
|
),
|
|
]),
|
|
);
|
|
});
|
|
|
|
group('verifies analysis settings', () {
|
|
test('fails analysis_options.yaml', () async {
|
|
createFakePlugin('foo', packagesDir,
|
|
extraFiles: <String>['analysis_options.yaml']);
|
|
|
|
await expectLater(() => runCapturingPrint(runner, <String>['analyze']),
|
|
throwsA(const TypeMatcher<ToolExit>()));
|
|
});
|
|
|
|
test('fails .analysis_options', () async {
|
|
createFakePlugin('foo', packagesDir,
|
|
extraFiles: <String>['.analysis_options']);
|
|
|
|
await expectLater(() => runCapturingPrint(runner, <String>['analyze']),
|
|
throwsA(const TypeMatcher<ToolExit>()));
|
|
});
|
|
|
|
test('takes an allow list', () async {
|
|
final Directory pluginDir = createFakePlugin('foo', packagesDir,
|
|
extraFiles: <String>['analysis_options.yaml']);
|
|
|
|
final MockProcess mockProcess = MockProcess();
|
|
mockProcess.exitCodeCompleter.complete(0);
|
|
processRunner.processToReturn = mockProcess;
|
|
await runCapturingPrint(
|
|
runner, <String>['analyze', '--custom-analysis', 'foo']);
|
|
|
|
expect(
|
|
processRunner.recordedCalls,
|
|
orderedEquals(<ProcessCall>[
|
|
ProcessCall(
|
|
'flutter', const <String>['packages', 'get'], pluginDir.path),
|
|
ProcessCall('dart', const <String>['analyze', '--fatal-infos'],
|
|
pluginDir.path),
|
|
]));
|
|
});
|
|
|
|
// See: https://github.com/flutter/flutter/issues/78994
|
|
test('takes an empty allow list', () async {
|
|
createFakePlugin('foo', packagesDir,
|
|
extraFiles: <String>['analysis_options.yaml']);
|
|
|
|
final MockProcess mockProcess = MockProcess();
|
|
mockProcess.exitCodeCompleter.complete(0);
|
|
processRunner.processToReturn = mockProcess;
|
|
|
|
await expectLater(
|
|
() => runCapturingPrint(
|
|
runner, <String>['analyze', '--custom-analysis', '']),
|
|
throwsA(const TypeMatcher<ToolExit>()));
|
|
});
|
|
});
|
|
}
|