blob: e1d4241e64c9f708131b98492d3dd6017afbc3b1 [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:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/io.dart';
import 'package:flutter_tools/src/convert.dart';
import '../src/common.dart';
import 'test_data/basic_project.dart';
import 'test_utils.dart';
Future<int> getFreePort() async {
int port = 0;
final ServerSocket serverSocket = await ServerSocket.bind(InternetAddress.loopbackIPv4, 0);
port = serverSocket.port;
await serverSocket.close();
return port;
}
Future<void> waitForObservatoryMessage(Process process, int port) async {
final Completer<void> completer = Completer<void>();
process.stdout
.transform(utf8.decoder)
.listen((String line) {
printOnFailure(line);
if (line.contains('An Observatory debugger and profiler on Flutter test device is available at')) {
if (line.contains('http://127.0.0.1:$port')) {
completer.complete();
} else {
completer.completeError(Exception('Did not forward to provided port $port, instead found $line'));
}
}
});
process.stderr
.transform(utf8.decoder)
.listen(printOnFailure);
return completer.future;
}
void main() {
late Directory tempDir;
final BasicProject project = BasicProject();
setUp(() async {
tempDir = createResolvedTempDirectorySync('run_test.');
await project.setUpIn(tempDir);
});
tearDown(() async {
tryToDelete(tempDir);
});
testWithoutContext('flutter run --observatory-port', () async {
final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter');
final int port = await getFreePort();
// If only --observatory-port is provided, --observatory-port will be used by DDS
// and the VM service will bind to a random port.
final Process process = await processManager.start(<String>[
flutterBin,
'run',
'--show-test-device',
'--observatory-port=$port',
'-d',
'flutter-tester',
], workingDirectory: tempDir.path);
await waitForObservatoryMessage(process, port);
process.kill();
await process.exitCode;
});
testWithoutContext('flutter run --dds-port --observatory-port', () async {
final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter');
final int observatoryPort = await getFreePort();
int ddsPort = await getFreePort();
while(ddsPort == observatoryPort) {
ddsPort = await getFreePort();
}
// If both --dds-port and --observatory-port are provided, --dds-port will be used by
// DDS and --observatory-port will be used by the VM service.
final Process process = await processManager.start(<String>[
flutterBin,
'run',
'--show-test-device',
'--observatory-port=$observatoryPort',
'--dds-port=$ddsPort',
'-d',
'flutter-tester',
], workingDirectory: tempDir.path);
await waitForObservatoryMessage(process, ddsPort);
process.kill();
await process.exitCode;
});
testWithoutContext('flutter run --dds-port', () async {
final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter');
final int ddsPort = await getFreePort();
// If only --dds-port is provided, --dds-port will be used by DDS and the VM service
// will bind to a random port.
final Process process = await processManager.start(<String>[
flutterBin,
'run',
'--show-test-device',
'--dds-port=$ddsPort',
'-d',
'flutter-tester',
], workingDirectory: tempDir.path);
await waitForObservatoryMessage(process, ddsPort);
process.kill();
await process.exitCode;
});
}