observatory_port_test.dart 3.73 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
// 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) {
28
      printOnFailure(line);
29 30 31 32 33 34 35 36 37 38
      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)
39
    .listen(printOnFailure);
40 41 42 43
  return completer.future;
}

void main() {
44
  late Directory tempDir;
45
  final BasicProject project = BasicProject();
46 47 48

  setUp(() async {
    tempDir = createResolvedTempDirectorySync('run_test.');
49
    await project.setUpIn(tempDir);
50 51 52 53 54 55
  });

  tearDown(() async {
    tryToDelete(tempDir);
  });

56
  testWithoutContext('flutter run --observatory-port', () async {
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
    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;
  });

74
  testWithoutContext('flutter run --dds-port --observatory-port', () async {
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
    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;
  });

97
  testWithoutContext('flutter run --dds-port', () async {
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
    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;
  });

}