devtools_launcher_test.dart 4.87 KB
Newer Older
1 2 3 4 5 6 7 8
// 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/io.dart';
import 'package:flutter_tools/src/base/logger.dart';
9
import 'package:flutter_tools/src/cache.dart';
10 11 12 13
import 'package:flutter_tools/src/devtools_launcher.dart';
import 'package:flutter_tools/src/resident_runner.dart';

import '../src/common.dart';
14
import '../src/fake_process_manager.dart';
15
import '../src/fakes.dart';
16 17

void main() {
18
  late BufferLogger logger;
19

20 21
  Cache.flutterRoot = '';

22 23 24 25
  setUp(() {
    logger = BufferLogger.test();
  });

26
  testWithoutContext('DevtoolsLauncher launches DevTools from the SDK and saves the URI', () async {
27 28
    final Completer<void> completer = Completer<void>();
    final DevtoolsLauncher launcher = DevtoolsServerLauncher(
29
      dartExecutable: 'dart',
30
      logger: logger,
31
      botDetector: const FakeBotDetector(false),
32
      processManager: FakeProcessManager.list(<FakeCommand>[
33 34
        FakeCommand(
          command: const <String>[
35
            'dart',
36
            'devtools',
37
            '--no-launch-browser',
38 39 40 41 42 43 44
          ],
          stdout: 'Serving DevTools at http://127.0.0.1:9100\n',
          completer: completer,
        ),
      ]),
    );

45 46 47
    final DevToolsServerAddress? address = await launcher.serve();
    expect(address?.host, '127.0.0.1');
    expect(address?.port, 9100);
48 49
  });

50 51 52
  testWithoutContext('DevtoolsLauncher does not launch a new DevTools instance if one is already active', () async {
    final Completer<void> completer = Completer<void>();
    final DevtoolsLauncher launcher = DevtoolsServerLauncher(
53
      dartExecutable: 'dart',
54
      logger: logger,
55
      botDetector: const FakeBotDetector(false),
56 57 58
      processManager: FakeProcessManager.list(<FakeCommand>[
        FakeCommand(
          command: const <String>[
59
            'dart',
60 61 62 63 64 65 66 67 68
            'devtools',
            '--no-launch-browser',
          ],
          stdout: 'Serving DevTools at http://127.0.0.1:9100\n',
          completer: completer,
        ),
      ]),
    );

69 70 71
    DevToolsServerAddress? address = await launcher.serve();
    expect(address?.host, '127.0.0.1');
    expect(address?.port, 9100);
72 73 74

    // Call `serve` again and verify that the already running server is returned.
    address = await launcher.serve();
75 76
    expect(address?.host, '127.0.0.1');
    expect(address?.port, 9100);
77 78
  });

79 80 81 82
  testWithoutContext('DevtoolsLauncher can launch devtools with a memory profile', () async {
    final FakeProcessManager processManager = FakeProcessManager.list(<FakeCommand>[
      const FakeCommand(
        command: <String>[
83
          'dart',
84 85 86
          'devtools',
          '--no-launch-browser',
          '--vm-uri=localhost:8181/abcdefg',
87
          '--profile-memory=foo',
88 89 90 91 92
        ],
        stdout: 'Serving DevTools at http://127.0.0.1:9100\n',
      ),
    ]);
    final DevtoolsLauncher launcher = DevtoolsServerLauncher(
93
      dartExecutable: 'dart',
94
      logger: logger,
95
      botDetector: const FakeBotDetector(false),
96 97 98 99 100 101 102 103 104
      processManager: processManager,
    );

    await launcher.launch(Uri.parse('localhost:8181/abcdefg'), additionalArguments: <String>['--profile-memory=foo']);

    expect(launcher.processStart, completes);
    expect(processManager, hasNoRemainingExpectations);
  });

105 106
  testWithoutContext('DevtoolsLauncher prints error if exception is thrown during launch', () async {
    final DevtoolsLauncher launcher = DevtoolsServerLauncher(
107
      dartExecutable: 'dart',
108
      logger: logger,
109
      botDetector: const FakeBotDetector(false),
110 111 112
      processManager: FakeProcessManager.list(<FakeCommand>[
        const FakeCommand(
          command: <String>[
113
            'dart',
114 115 116 117 118
            'devtools',
            '--no-launch-browser',
            '--vm-uri=http://127.0.0.1:1234/abcdefg',
          ],
          exception: ProcessException('pub', <String>[]),
119
        ),
120 121 122 123 124 125 126
      ]),
    );

    await launcher.launch(Uri.parse('http://127.0.0.1:1234/abcdefg'));

    expect(logger.errorText, contains('Failed to launch DevTools: ProcessException'));
  });
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151

  testWithoutContext('DevtoolsLauncher handles failure of DevTools process on a bot', () async {
    final Completer<void> completer = Completer<void>();
    final DevtoolsServerLauncher launcher = DevtoolsServerLauncher(
      dartExecutable: 'dart',
      logger: logger,
      botDetector: const FakeBotDetector(true),
      processManager: FakeProcessManager.list(<FakeCommand>[
        FakeCommand(
          command: const <String>[
            'dart',
            'devtools',
            '--no-launch-browser',
          ],
          stdout: 'Serving DevTools at http://127.0.0.1:9100\n',
          completer: completer,
          exitCode: 255,
        ),
      ]),
    );

    await launcher.launch(null);
    completer.complete();
    expect(launcher.devToolsProcessExit, throwsToolExit());
  });
152
}