resident_web_runner_cold_test.dart 5.11 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1
// Copyright 2014 The Flutter Authors. All rights reserved.
2 3 4 5 6 7 8
// 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:dwds/dwds.dart';
import 'package:flutter_tools/src/base/common.dart';
9
import 'package:flutter_tools/src/base/logger.dart';
10
import 'package:flutter_tools/src/base/terminal.dart';
11
import 'package:flutter_tools/src/base/net.dart';
12 13
import 'package:flutter_tools/src/build_info.dart';
import 'package:flutter_tools/src/device.dart';
14
import 'package:flutter_tools/src/globals.dart' as globals;
15 16
import 'package:flutter_tools/src/project.dart';
import 'package:flutter_tools/src/resident_runner.dart';
17 18
import 'package:flutter_tools/src/build_runner/resident_web_runner.dart';
import 'package:flutter_tools/src/build_runner/web_fs.dart';
19 20
import 'package:meta/meta.dart';
import 'package:mockito/mockito.dart';
21
import 'package:platform/platform.dart';
22
import 'package:vm_service/vm_service.dart';
23 24 25 26 27 28 29 30

import '../src/common.dart';
import '../src/testbed.dart';

void main() {
  Testbed testbed;
  MockFlutterWebFs mockWebFs;
  ResidentWebRunner residentWebRunner;
31
  MockFlutterDevice mockFlutterDevice;
32 33 34 35

  setUp(() {
    mockWebFs = MockFlutterWebFs();
    final MockWebDevice mockWebDevice = MockWebDevice();
36 37
    mockFlutterDevice = MockFlutterDevice();
    when(mockFlutterDevice.device).thenReturn(mockWebDevice);
38 39
    testbed = Testbed(
      setup: () {
40
        residentWebRunner = residentWebRunner = DwdsWebRunnerFactory().createWebRunner(
41
          mockFlutterDevice,
42 43 44
          flutterProject: FlutterProject.current(),
          debuggingOptions: DebuggingOptions.disabled(BuildInfo.release),
          ipv6: true,
45
          stayResident: true,
46
          dartDefines: const <String>[],
47
          urlTunneller: null,
48
        ) as ResidentWebRunner;
49 50
      },
      overrides: <Type, Generator>{
51 52 53 54 55 56 57 58
        WebFsFactory: () => ({
          @required String target,
          @required FlutterProject flutterProject,
          @required BuildInfo buildInfo,
          @required bool skipDwds,
          @required bool initializePlatform,
          @required String hostname,
          @required String port,
59
          @required UrlTunneller urlTunneller,
60
          @required List<String> dartDefines,
61 62 63
        }) async {
          return mockWebFs;
        },
64
      },
65
    );
66 67
  });

68
  void _setupMocks() {
69 70 71
    globals.fs.file('pubspec.yaml').createSync();
    globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true);
    globals.fs.file(globals.fs.path.join('web', 'index.html')).createSync(recursive: true);
72
    when(mockWebFs.connect(any)).thenThrow(StateError('debugging not supported'));
73 74 75 76
  }

  test('Can successfully run and connect without vmservice', () => testbed.run(() async {
    _setupMocks();
77
    final DelegateLogger delegateLogger = globals.logger as DelegateLogger;
78 79
    final MockStatus mockStatus = MockStatus();
    delegateLogger.status = mockStatus;
80 81 82 83 84 85 86
    final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>();
    unawaited(residentWebRunner.run(
      connectionInfoCompleter: connectionInfoCompleter,
    ));
    final DebugConnectionInfo debugConnectionInfo = await connectionInfoCompleter.future;

    expect(debugConnectionInfo.wsUri, null);
87 88
    verify(mockStatus.stop()).called(1);
  }, overrides: <Type, Generator>{
89 90 91 92 93 94 95
    Logger: () => DelegateLogger(BufferLogger(
      terminal: AnsiTerminal(
        stdio: null,
        platform: const LocalPlatform(),
      ),
      outputPreferences: OutputPreferences.test(),
    )),
96 97 98 99 100
  }));

  test('Can full restart after attaching', () => testbed.run(() async {
    _setupMocks();
    final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>();
101
    unawaited(residentWebRunner.run(
102 103 104 105 106 107 108 109 110 111 112 113 114 115
      connectionInfoCompleter: connectionInfoCompleter,
    ));
    await connectionInfoCompleter.future;
    when(mockWebFs.recompile()).thenAnswer((Invocation _) async {
      return true;
    });
    final OperationResult result = await residentWebRunner.restart(fullRestart: true);

    expect(result.code, 0);
  }));

  test('Fails on compilation errors in hot restart', () => testbed.run(() async {
    _setupMocks();
    final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>();
116
    unawaited(residentWebRunner.run(
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
      connectionInfoCompleter: connectionInfoCompleter,
    ));
    await connectionInfoCompleter.future;
    when(mockWebFs.recompile()).thenAnswer((Invocation _) async {
      return false;
    });
    final OperationResult result = await residentWebRunner.restart(fullRestart: true);

    expect(result.code, 1);
    expect(result.message, contains('Failed to recompile application.'));
  }));

}

class MockWebDevice extends Mock implements Device {}
class MockBuildDaemonCreator extends Mock implements BuildDaemonCreator {}
class MockFlutterWebFs extends Mock implements WebFs {}
class MockDebugConnection extends Mock implements DebugConnection {}
class MockVmService extends Mock implements VmService {}
136
class MockStatus extends Mock implements Status {}
137
class MockFlutterDevice extends Mock implements FlutterDevice {}