diff --git a/packages/flutter_tools/BUILD.gn b/packages/flutter_tools/BUILD.gn index d2831023ea..7a1a87f42a 100644 --- a/packages/flutter_tools/BUILD.gn +++ b/packages/flutter_tools/BUILD.gn @@ -2,15 +2,14 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/dart/dart_package.gni") import("//build/dart/dart_tool.gni") -dart_tool("flutter_tools") { +dart_package("flutter_tools") { package_name = "flutter_tools" source_dir = "lib" - main_dart = "bin/fuchsia_builder.dart" - deps = [ "//dart/pkg/analyzer", "//dart/third_party/pkg/linter", @@ -39,3 +38,23 @@ dart_tool("flutter_tools") { "//third_party/dart-pkg/pub/yaml", ] } + +dart_tool("fuchsia_builder") { + main_dart = "bin/fuchsia_builder.dart" + + deps = [ + ":flutter_tools", + ] +} + +dart_tool("fuchsia_tester") { + main_dart = "bin/fuchsia_tester.dart" + + deps = [ + ":flutter_tools", + ] + + non_dart_deps = [ + "//flutter/shell", + ] +} diff --git a/packages/flutter_tools/bin/fuchsia_tester.dart b/packages/flutter_tools/bin/fuchsia_tester.dart new file mode 100644 index 0000000000..42577a94f1 --- /dev/null +++ b/packages/flutter_tools/bin/fuchsia_tester.dart @@ -0,0 +1,104 @@ +// Copyright 2015 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 'package:args/args.dart'; +import 'package:process/process.dart'; +import 'package:test/src/executable.dart' + as test; // ignore: implementation_imports + +import '../lib/src/base/common.dart'; +import '../lib/src/base/config.dart'; +import '../lib/src/base/context.dart'; +import '../lib/src/base/file_system.dart'; +import '../lib/src/base/io.dart'; +import '../lib/src/base/logger.dart'; +import '../lib/src/base/os.dart'; +import '../lib/src/base/platform.dart'; +import '../lib/src/cache.dart'; +import '../lib/src/dart/package_map.dart'; +import '../lib/src/globals.dart'; +import '../lib/src/test/flutter_platform.dart' as loader; +import '../lib/src/usage.dart'; + +// Note: this was largely inspired by lib/src/commands/test.dart. + +const String _kOptionPackages = "packages"; +const String _kOptionShell = "shell"; +const String _kOptionTestDirectory = "test-directory"; +const String _kOptionFlutterRoot = "flutter-root"; +const List _kRequiredOptions = const [ + _kOptionPackages, + _kOptionShell, + _kOptionTestDirectory, + _kOptionFlutterRoot, +]; + +Future main(List args) async { + final AppContext executableContext = new AppContext(); + executableContext.setVariable(Logger, new StdoutLogger()); + executableContext.runInZone(() { + // Initialize the context with some defaults. + context.putIfAbsent(Platform, () => const LocalPlatform()); + context.putIfAbsent(FileSystem, () => const LocalFileSystem()); + context.putIfAbsent(ProcessManager, () => const LocalProcessManager()); + context.putIfAbsent(Logger, () => new StdoutLogger()); + context.putIfAbsent(Cache, () => new Cache()); + context.putIfAbsent(Config, () => new Config()); + context.putIfAbsent(OperatingSystemUtils, () => new OperatingSystemUtils()); + context.putIfAbsent(Usage, () => new Usage()); + return run(args); + }); +} + +Iterable _findTests(Directory directory) { + return directory + .listSync(recursive: true, followLinks: false) + .where((FileSystemEntity entity) => + entity.path.endsWith('_test.dart') && fs.isFileSync(entity.path)) + .map((FileSystemEntity entity) => fs.path.absolute(entity.path)); +} + +Future run(List args) async { + final ArgParser parser = new ArgParser() + ..addOption(_kOptionPackages, help: 'The .packages file') + ..addOption(_kOptionShell, help: 'The Flutter shell binary') + ..addOption(_kOptionTestDirectory, help: 'Directory containing the tests') + ..addOption(_kOptionFlutterRoot, help: 'Flutter root'); + final ArgResults argResults = parser.parse(args); + if (_kRequiredOptions + .any((String option) => !argResults.options.contains(option))) { + printError('Missing option! All options must be specified.'); + exit(1); + } + // TODO(pylaligand): use a temp directory instead. + Cache.flutterRoot = argResults[_kOptionFlutterRoot]; + final Directory testDirectory = + fs.directory(argResults[_kOptionTestDirectory]); + final Iterable tests = _findTests(testDirectory); + + final List testArgs = []; + testArgs.add('--'); + testArgs.addAll(tests); + + final String shellPath = argResults[_kOptionShell]; + if (!fs.isFileSync(shellPath)) { + throwToolExit('Cannot find Flutter shell at $shellPath'); + } + loader.installHook( + shellPath: shellPath, + debuggerMode: false, + ); + + PackageMap.globalPackagesPath = + fs.path.normalize(fs.path.absolute(argResults[_kOptionPackages])); + fs.currentDirectory = testDirectory; + + await test.main(testArgs); + + if (exitCode != 0) { + exit(exitCode); + } +}