Unverified Commit 02633940 authored by Keerti Parthasarathy's avatar Keerti Parthasarathy Committed by GitHub

Adding back commit #e0f6e626 with fix to test failures (#15212)

* Add to Artifacts, and add optional arguments to entry points for flut… (#15185)

Add to Artifacts, and add optional arguments to entry points for flutter run and test to allow for wiring up the same with preview-dart-2 internally

* Changing packages uri here is not necessary
parent 758b302c
...@@ -26,6 +26,7 @@ enum Artifact { ...@@ -26,6 +26,7 @@ enum Artifact {
flutterPatchedSdkPath, flutterPatchedSdkPath,
frontendServerSnapshotForEngineDartSdk, frontendServerSnapshotForEngineDartSdk,
engineDartSdkPath, engineDartSdkPath,
engineDartBinary,
} }
String _artifactToFileName(Artifact artifact) { String _artifactToFileName(Artifact artifact) {
...@@ -57,6 +58,8 @@ String _artifactToFileName(Artifact artifact) { ...@@ -57,6 +58,8 @@ String _artifactToFileName(Artifact artifact) {
return 'dart-sdk'; return 'dart-sdk';
case Artifact.frontendServerSnapshotForEngineDartSdk: case Artifact.frontendServerSnapshotForEngineDartSdk:
return 'frontend_server.dart.snapshot'; return 'frontend_server.dart.snapshot';
case Artifact.engineDartBinary:
return 'dart';
} }
assert(false, 'Invalid artifact $artifact.'); assert(false, 'Invalid artifact $artifact.');
return null; return null;
...@@ -170,6 +173,8 @@ class CachedArtifacts extends Artifacts { ...@@ -170,6 +173,8 @@ class CachedArtifacts extends Artifacts {
return fs.path.join(engineArtifactsPath, platformDirName, _artifactToFileName(artifact)); return fs.path.join(engineArtifactsPath, platformDirName, _artifactToFileName(artifact));
case Artifact.engineDartSdkPath: case Artifact.engineDartSdkPath:
return dartSdkPath; return dartSdkPath;
case Artifact.engineDartBinary:
return fs.path.join(dartSdkPath,'bin', _artifactToFileName(artifact));
case Artifact.platformKernelDill: case Artifact.platformKernelDill:
return fs.path.join(_getFlutterPatchedSdkPath(), _artifactToFileName(artifact)); return fs.path.join(_getFlutterPatchedSdkPath(), _artifactToFileName(artifact));
case Artifact.platformLibrariesJson: case Artifact.platformLibrariesJson:
...@@ -252,6 +257,8 @@ class LocalEngineArtifacts extends Artifacts { ...@@ -252,6 +257,8 @@ class LocalEngineArtifacts extends Artifacts {
return fs.path.join(_hostEngineOutPath, 'gen', _artifactToFileName(artifact)); return fs.path.join(_hostEngineOutPath, 'gen', _artifactToFileName(artifact));
case Artifact.engineDartSdkPath: case Artifact.engineDartSdkPath:
return fs.path.join(_hostEngineOutPath, 'dart-sdk'); return fs.path.join(_hostEngineOutPath, 'dart-sdk');
case Artifact.engineDartBinary:
return fs.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', _artifactToFileName(artifact));
} }
assert(false, 'Invalid artifact $artifact.'); assert(false, 'Invalid artifact $artifact.');
return null; return null;
......
...@@ -357,6 +357,7 @@ class AppDomain extends Domain { ...@@ -357,6 +357,7 @@ class AppDomain extends Domain {
@required bool trackWidgetCreation, @required bool trackWidgetCreation,
String projectRootPath, String projectRootPath,
String packagesFilePath, String packagesFilePath,
String dillOutputPath,
bool ipv6: false, bool ipv6: false,
}) async { }) async {
if (await device.isLocalEmulator && !options.buildInfo.supportsEmulator) { if (await device.isLocalEmulator && !options.buildInfo.supportsEmulator) {
...@@ -371,6 +372,7 @@ class AppDomain extends Domain { ...@@ -371,6 +372,7 @@ class AppDomain extends Domain {
device, device,
previewDart2: options.buildInfo.previewDart2, previewDart2: options.buildInfo.previewDart2,
trackWidgetCreation: trackWidgetCreation, trackWidgetCreation: trackWidgetCreation,
dillOutputPath: dillOutputPath,
); );
ResidentRunner runner; ResidentRunner runner;
...@@ -384,6 +386,7 @@ class AppDomain extends Domain { ...@@ -384,6 +386,7 @@ class AppDomain extends Domain {
applicationBinary: applicationBinary, applicationBinary: applicationBinary,
projectRootPath: projectRootPath, projectRootPath: projectRootPath,
packagesFilePath: packagesFilePath, packagesFilePath: packagesFilePath,
dillOutputPath: dillOutputPath,
ipv6: ipv6, ipv6: ipv6,
hostIsIde: true, hostIsIde: true,
); );
......
...@@ -147,6 +147,10 @@ class RunCommand extends RunCommandBase { ...@@ -147,6 +147,10 @@ class RunCommand extends RunCommandBase {
'results out to "refresh_benchmark.json", and exit. This flag is\n' 'results out to "refresh_benchmark.json", and exit. This flag is\n'
'intended for use in generating automated flutter benchmarks.'); 'intended for use in generating automated flutter benchmarks.');
argParser.addOption('output-dill',
hide: !verboseHelp,
help: 'Specify the path to frontend server output kernel file.');
argParser.addOption(FlutterOptions.kExtraFrontEndOptions, hide: true); argParser.addOption(FlutterOptions.kExtraFrontEndOptions, hide: true);
argParser.addOption(FlutterOptions.kExtraGenSnapshotOptions, hide: true); argParser.addOption(FlutterOptions.kExtraGenSnapshotOptions, hide: true);
} }
...@@ -262,6 +266,7 @@ class RunCommand extends RunCommandBase { ...@@ -262,6 +266,7 @@ class RunCommand extends RunCommandBase {
trackWidgetCreation: argResults['track-widget-creation'], trackWidgetCreation: argResults['track-widget-creation'],
projectRootPath: argResults['project-root'], projectRootPath: argResults['project-root'],
packagesFilePath: globalResults['packages'], packagesFilePath: globalResults['packages'],
dillOutputPath: argResults['output-dill'],
ipv6: ipv6, ipv6: ipv6,
); );
} catch (error) { } catch (error) {
...@@ -301,6 +306,7 @@ class RunCommand extends RunCommandBase { ...@@ -301,6 +306,7 @@ class RunCommand extends RunCommandBase {
device, device,
previewDart2: argResults['preview-dart-2'], previewDart2: argResults['preview-dart-2'],
trackWidgetCreation: argResults['track-widget-creation'], trackWidgetCreation: argResults['track-widget-creation'],
dillOutputPath: argResults['output-dill'],
); );
}).toList(); }).toList();
...@@ -314,6 +320,7 @@ class RunCommand extends RunCommandBase { ...@@ -314,6 +320,7 @@ class RunCommand extends RunCommandBase {
applicationBinary: argResults['use-application-binary'], applicationBinary: argResults['use-application-binary'],
projectRootPath: argResults['project-root'], projectRootPath: argResults['project-root'],
packagesFilePath: globalResults['packages'], packagesFilePath: globalResults['packages'],
dillOutputPath: argResults['output-dill'],
stayResident: stayResident, stayResident: stayResident,
ipv6: ipv6, ipv6: ipv6,
); );
......
...@@ -8,24 +8,10 @@ import 'dart:convert'; ...@@ -8,24 +8,10 @@ import 'dart:convert';
import 'package:usage/uuid/uuid.dart'; import 'package:usage/uuid/uuid.dart';
import 'artifacts.dart'; import 'artifacts.dart';
import 'base/common.dart';
import 'base/file_system.dart';
import 'base/io.dart'; import 'base/io.dart';
import 'base/process_manager.dart'; import 'base/process_manager.dart';
import 'globals.dart'; import 'globals.dart';
String _dartExecutable() {
final String engineDartSdkPath = artifacts.getArtifactPath(
Artifact.engineDartSdkPath
);
if (!fs.isDirectorySync(engineDartSdkPath)) {
throwToolExit('No dart sdk Flutter host engine build found at $engineDartSdkPath.\n'
'Note that corresponding host engine build is required even when targeting particular device platforms.',
exitCode: 2);
}
return fs.path.join(engineDartSdkPath, 'bin', 'dart');
}
class _StdoutHandler { class _StdoutHandler {
_StdoutHandler() { _StdoutHandler() {
reset(); reset();
...@@ -74,7 +60,7 @@ Future<String> compile( ...@@ -74,7 +60,7 @@ Future<String> compile(
if (!sdkRoot.endsWith('/')) if (!sdkRoot.endsWith('/'))
sdkRoot = '$sdkRoot/'; sdkRoot = '$sdkRoot/';
final List<String> command = <String>[ final List<String> command = <String>[
_dartExecutable(), artifacts.getArtifactPath(Artifact.engineDartBinary),
frontendServer, frontendServer,
'--sdk-root', '--sdk-root',
sdkRoot, sdkRoot,
...@@ -154,13 +140,13 @@ class ResidentCompiler { ...@@ -154,13 +140,13 @@ class ResidentCompiler {
/// Binary file name is returned if compilation was successful, otherwise /// Binary file name is returned if compilation was successful, otherwise
/// null is returned. /// null is returned.
Future<String> recompile(String mainPath, List<String> invalidatedFiles, Future<String> recompile(String mainPath, List<String> invalidatedFiles,
{String outputPath}) async { {String outputPath, String packagesFilePath}) async {
stdoutHandler.reset(); stdoutHandler.reset();
// First time recompile is called we actually have to compile the app from // First time recompile is called we actually have to compile the app from
// scratch ignoring list of invalidated files. // scratch ignoring list of invalidated files.
if (_server == null) if (_server == null)
return _compile(mainPath, outputPath); return _compile(mainPath, outputPath, packagesFilePath);
final String inputKey = new Uuid().generateV4(); final String inputKey = new Uuid().generateV4();
_server.stdin.writeln('recompile ${mainPath != null ? mainPath + " ": ""}$inputKey'); _server.stdin.writeln('recompile ${mainPath != null ? mainPath + " ": ""}$inputKey');
...@@ -170,12 +156,12 @@ class ResidentCompiler { ...@@ -170,12 +156,12 @@ class ResidentCompiler {
return stdoutHandler.outputFilename.future; return stdoutHandler.outputFilename.future;
} }
Future<String> _compile(String scriptFilename, String outputPath) async { Future<String> _compile(String scriptFilename, String outputPath, String packagesFilePath) async {
final String frontendServer = artifacts.getArtifactPath( final String frontendServer = artifacts.getArtifactPath(
Artifact.frontendServerSnapshotForEngineDartSdk Artifact.frontendServerSnapshotForEngineDartSdk
); );
final List<String> args = <String>[ final List<String> args = <String>[
_dartExecutable(), artifacts.getArtifactPath(Artifact.engineDartBinary),
frontendServer, frontendServer,
'--sdk-root', '--sdk-root',
_sdkRoot, _sdkRoot,
...@@ -186,6 +172,9 @@ class ResidentCompiler { ...@@ -186,6 +172,9 @@ class ResidentCompiler {
if (outputPath != null) { if (outputPath != null) {
args.addAll(<String>['--output-dill', outputPath]); args.addAll(<String>['--output-dill', outputPath]);
} }
if (packagesFilePath != null) {
args.addAll(<String>['--packages', packagesFilePath]);
}
if (_trackWidgetCreation) { if (_trackWidgetCreation) {
args.add('--track-widget-creation'); args.add('--track-widget-creation');
} }
......
...@@ -407,6 +407,7 @@ class DevFS { ...@@ -407,6 +407,7 @@ class DevFS {
bool bundleDirty: false, bool bundleDirty: false,
Set<String> fileFilter, Set<String> fileFilter,
ResidentCompiler generator, ResidentCompiler generator,
String dillOutputPath,
bool fullRestart: false, bool fullRestart: false,
}) async { }) async {
// Mark all entries as possibly deleted. // Mark all entries as possibly deleted.
...@@ -500,7 +501,8 @@ class DevFS { ...@@ -500,7 +501,8 @@ class DevFS {
} }
final String compiledBinary = final String compiledBinary =
await generator.recompile(mainPath, invalidatedFiles, await generator.recompile(mainPath, invalidatedFiles,
outputPath: fs.path.join(getBuildDirectory(), 'app.dill')); outputPath: dillOutputPath ?? fs.path.join(getBuildDirectory(), 'app.dill'),
packagesFilePath : _packagesFilePath);
if (compiledBinary != null && compiledBinary.isNotEmpty) if (compiledBinary != null && compiledBinary.isNotEmpty)
dirtyEntries.putIfAbsent( dirtyEntries.putIfAbsent(
Uri.parse(target + '.dill'), Uri.parse(target + '.dill'),
......
...@@ -35,12 +35,14 @@ class FlutterDevice { ...@@ -35,12 +35,14 @@ class FlutterDevice {
DevFS devFS; DevFS devFS;
ApplicationPackage package; ApplicationPackage package;
ResidentCompiler generator; ResidentCompiler generator;
String dillOutputPath;
StreamSubscription<String> _loggingSubscription; StreamSubscription<String> _loggingSubscription;
FlutterDevice(this.device, { FlutterDevice(this.device, {
@required bool previewDart2, @required bool previewDart2,
@required bool trackWidgetCreation, @required bool trackWidgetCreation,
this.dillOutputPath,
}) { }) {
if (previewDart2) { if (previewDart2) {
generator = new ResidentCompiler( generator = new ResidentCompiler(
...@@ -386,7 +388,8 @@ class FlutterDevice { ...@@ -386,7 +388,8 @@ class FlutterDevice {
bundleDirty: bundleDirty, bundleDirty: bundleDirty,
fileFilter: fileFilter, fileFilter: fileFilter,
generator: generator, generator: generator,
fullRestart: fullRestart fullRestart: fullRestart,
dillOutputPath: dillOutputPath,
); );
} on DevFSException { } on DevFSException {
devFSStatus.cancel(); devFSStatus.cancel();
......
...@@ -42,6 +42,7 @@ class HotRunner extends ResidentRunner { ...@@ -42,6 +42,7 @@ class HotRunner extends ResidentRunner {
this.hostIsIde: false, this.hostIsIde: false,
String projectRootPath, String projectRootPath,
String packagesFilePath, String packagesFilePath,
this.dillOutputPath,
bool stayResident: true, bool stayResident: true,
bool ipv6: false, bool ipv6: false,
}) : super(devices, }) : super(devices,
...@@ -57,6 +58,7 @@ class HotRunner extends ResidentRunner { ...@@ -57,6 +58,7 @@ class HotRunner extends ResidentRunner {
final String applicationBinary; final String applicationBinary;
final bool hostIsIde; final bool hostIsIde;
Set<String> _dartDependencies; Set<String> _dartDependencies;
final String dillOutputPath;
final Map<String, List<int>> benchmarkData = <String, List<int>>{}; final Map<String, List<int>> benchmarkData = <String, List<int>>{};
// The initial launch is from a snapshot. // The initial launch is from a snapshot.
...@@ -389,7 +391,10 @@ class HotRunner extends ResidentRunner { ...@@ -389,7 +391,10 @@ class HotRunner extends ResidentRunner {
} }
// We are now running from source. // We are now running from source.
_runningFromSnapshot = false; _runningFromSnapshot = false;
await _launchFromDevFS(debuggingOptions.buildInfo.previewDart2 ? mainPath + '.dill' : mainPath); final String launchPath = debuggingOptions.buildInfo.previewDart2
? dillOutputPath ?? mainPath + '.dill'
: mainPath;
await _launchFromDevFS(launchPath);
restartTimer.stop(); restartTimer.stop();
printTrace('Restart performed in ' printTrace('Restart performed in '
'${getElapsedAsMilliseconds(restartTimer.elapsed)}.'); '${getElapsedAsMilliseconds(restartTimer.elapsed)}.');
......
...@@ -59,6 +59,8 @@ void installHook({ ...@@ -59,6 +59,8 @@ void installHook({
bool machine: false, bool machine: false,
bool startPaused: false, bool startPaused: false,
bool previewDart2: false, bool previewDart2: false,
int port: 0,
String dillFilePath,
int observatoryPort, int observatoryPort,
InternetAddressType serverType: InternetAddressType.IP_V4, InternetAddressType serverType: InternetAddressType.IP_V4,
}) { }) {
...@@ -75,6 +77,8 @@ void installHook({ ...@@ -75,6 +77,8 @@ void installHook({
explicitObservatoryPort: observatoryPort, explicitObservatoryPort: observatoryPort,
host: _kHosts[serverType], host: _kHosts[serverType],
previewDart2: previewDart2, previewDart2: previewDart2,
port: port,
dillFilePath: dillFilePath,
), ),
); );
} }
...@@ -100,6 +104,8 @@ class _FlutterPlatform extends PlatformPlugin { ...@@ -100,6 +104,8 @@ class _FlutterPlatform extends PlatformPlugin {
this.explicitObservatoryPort, this.explicitObservatoryPort,
this.host, this.host,
this.previewDart2, this.previewDart2,
this.port,
this.dillFilePath,
}) : assert(shellPath != null) { }) : assert(shellPath != null) {
compilerController.stream.listen((CompilationRequest request) async { compilerController.stream.listen((CompilationRequest request) async {
final bool isEmpty = compilationQueue.isEmpty; final bool isEmpty = compilationQueue.isEmpty;
...@@ -133,6 +139,8 @@ class _FlutterPlatform extends PlatformPlugin { ...@@ -133,6 +139,8 @@ class _FlutterPlatform extends PlatformPlugin {
final int explicitObservatoryPort; final int explicitObservatoryPort;
final InternetAddress host; final InternetAddress host;
final bool previewDart2; final bool previewDart2;
final int port;
final String dillFilePath;
final StreamController<CompilationRequest> compilerController = final StreamController<CompilationRequest> compilerController =
new StreamController<CompilationRequest>(); new StreamController<CompilationRequest>();
ResidentCompiler compiler = ResidentCompiler compiler =
...@@ -193,7 +201,7 @@ class _FlutterPlatform extends PlatformPlugin { ...@@ -193,7 +201,7 @@ class _FlutterPlatform extends PlatformPlugin {
controller.sink.done.whenComplete(() { controllerSinkClosed = true; }); // ignore: unawaited_futures controller.sink.done.whenComplete(() { controllerSinkClosed = true; }); // ignore: unawaited_futures
// Prepare our WebSocket server to talk to the engine subproces. // Prepare our WebSocket server to talk to the engine subproces.
final HttpServer server = await HttpServer.bind(host, 0); final HttpServer server = await HttpServer.bind(host, port);
finalizers.add(() async { finalizers.add(() async {
printTrace('test $ourTestCount: shutting down test harness socket server'); printTrace('test $ourTestCount: shutting down test harness socket server');
await server.close(force: true); await server.close(force: true);
...@@ -218,56 +226,71 @@ class _FlutterPlatform extends PlatformPlugin { ...@@ -218,56 +226,71 @@ class _FlutterPlatform extends PlatformPlugin {
); );
// Prepare a temporary directory to store the Dart file that will talk to us. // Prepare a temporary directory to store the Dart file that will talk to us.
final Directory temporaryDirectory = fs.systemTempDirectory.createTempSync('dart_test_listener'); // If a kernel file is given, then use that to launch the test.
finalizers.add(() async { File listenerFile;
printTrace('test $ourTestCount: deleting temporary directory'); if (dillFilePath == null) {
temporaryDirectory.deleteSync(recursive: true); final Directory temporaryDirectory = fs.systemTempDirectory
}); .createTempSync('dart_test_listener');
finalizers.add(() async {
// Prepare the Dart file that will talk to us and start the test. printTrace('test $ourTestCount: deleting temporary directory');
final File listenerFile = fs.file('${temporaryDirectory.path}/listener.dart'); temporaryDirectory.deleteSync(recursive: true);
listenerFile.createSync(); });
listenerFile.writeAsStringSync(_generateTestMain(
testUrl: fs.path.toUri(fs.path.absolute(testPath)).toString(),
encodedWebsocketUrl: Uri.encodeComponent(_getWebSocketUrl(server)),
));
// Prepare the Dart file that will talk to us and start the test.
listenerFile = fs.file(
'${temporaryDirectory.path}/listener.dart');
listenerFile.createSync();
listenerFile.writeAsStringSync(_generateTestMain(
testUrl: fs.path.toUri(fs.path.absolute(testPath)).toString(),
encodedWebsocketUrl: Uri.encodeComponent(_getWebSocketUrl(server)),
));
}
// Start the engine subprocess. // Start the engine subprocess.
printTrace('test $ourTestCount: starting shell process${previewDart2? " in preview-dart-2 mode":""}'); printTrace('test $ourTestCount: starting shell process${previewDart2? " in preview-dart-2 mode":""}');
String mainDart = listenerFile.path; String mainDart = listenerFile?.path ?? testPath;
String bundlePath; String bundlePath;
if (previewDart2) { if (previewDart2) {
final Completer<String> completer = new Completer<String>(); if (dillFilePath == null) {
compilerController.add(new CompilationRequest(listenerFile.path, completer)); final Completer<String> completer = new Completer<String>();
mainDart = await completer.future; compilerController.add(
new CompilationRequest(listenerFile.path, completer));
if (mainDart == null) { mainDart = await completer.future;
controller.sink.addError(_getErrorMessage('Compilation failed', testPath, shellPath));
return null; if (mainDart == null) {
} controller.sink.addError(
_getErrorMessage('Compilation failed', testPath, shellPath));
return null;
}
// bundlePath needs to point to a folder with `platform.dill` file. // bundlePath needs to point to a folder with `platform.dill` file.
final Directory tempBundleDirectory = fs.systemTempDirectory final Directory tempBundleDirectory = fs.systemTempDirectory
.createTempSync('flutter_bundle_directory'); .createTempSync('flutter_bundle_directory');
finalizers.add(() async { finalizers.add(() async {
printTrace('test $ourTestCount: deleting temporary bundle directory'); printTrace(
tempBundleDirectory.deleteSync(recursive: true); 'test $ourTestCount: deleting temporary bundle directory');
}); tempBundleDirectory.deleteSync(recursive: true);
});
// copy 'vm_platform_strong.dill' into 'platform.dill'
final File vmPlatformStrongDill = fs.file(
artifacts.getArtifactPath(Artifact.platformKernelDill),
);
final File platformDill = vmPlatformStrongDill.copySync(
tempBundleDirectory
.childFile('platform.dill')
.path,
);
if (!platformDill.existsSync()) {
printError('unexpected error copying platform kernel file');
}
// copy 'vm_platform_strong.dill' into 'platform.dill' bundlePath = tempBundleDirectory.path;
final File vmPlatformStrongDill = fs.file( } else {
artifacts.getArtifactPath(Artifact.platformKernelDill), mainDart = dillFilePath;
); bundlePath = artifacts.getArtifactPath(Artifact.flutterPatchedSdkPath);
final File platformDill = vmPlatformStrongDill.copySync(
tempBundleDirectory.childFile('platform.dill').path,
);
if (!platformDill.existsSync()) {
printError('unexpected error copying platform kernel file');
} }
bundlePath = tempBundleDirectory.path;
} }
final Process process = await _startProcess( final Process process = await _startProcess(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment