mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00

* Update project.pbxproj files to say Flutter rather than Chromium Also, the templates now have an empty organization so that we don't cause people to give their apps a Flutter copyright. * Update the copyright notice checker to require a standard notice on all files * Update copyrights on Dart files. (This was a mechanical commit.) * Fix weird license headers on Dart files that deviate from our conventions; relicense Shrine. Some were already marked "The Flutter Authors", not clear why. Their dates have been normalized. Some were missing the blank line after the license. Some were randomly different in trivial ways for no apparent reason (e.g. missing the trailing period). * Clean up the copyrights in non-Dart files. (Manual edits.) Also, make sure templates don't have copyrights. * Fix some more ORGANIZATIONNAMEs
152 lines
5.8 KiB
Dart
152 lines
5.8 KiB
Dart
// 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:file/file.dart';
|
|
import 'package:flutter_tools/src/base/common.dart';
|
|
import 'package:flutter_tools/src/base/file_system.dart';
|
|
import 'package:vm_service/vm_service.dart';
|
|
|
|
import '../src/common.dart';
|
|
import 'test_data/hot_reload_project.dart';
|
|
import 'test_driver.dart';
|
|
import 'test_utils.dart';
|
|
|
|
void main() {
|
|
Directory tempDir;
|
|
final HotReloadProject _project = HotReloadProject();
|
|
FlutterRunTestDriver _flutter;
|
|
|
|
setUp(() async {
|
|
tempDir = createResolvedTempDirectorySync('hot_reload_test.');
|
|
await _project.setUpIn(tempDir);
|
|
_flutter = FlutterRunTestDriver(tempDir);
|
|
});
|
|
|
|
tearDown(() async {
|
|
await _flutter?.stop();
|
|
tryToDelete(tempDir);
|
|
});
|
|
|
|
test('hot reload works without error', () async {
|
|
await _flutter.run();
|
|
await _flutter.hotReload();
|
|
});
|
|
|
|
test('newly added code executes during hot reload', () async {
|
|
await _flutter.run();
|
|
_project.uncommentHotReloadPrint();
|
|
final StringBuffer stdout = StringBuffer();
|
|
final StreamSubscription<String> subscription = _flutter.stdout.listen(stdout.writeln);
|
|
try {
|
|
await _flutter.hotReload();
|
|
expect(stdout.toString(), contains('(((((RELOAD WORKED)))))'));
|
|
} finally {
|
|
await subscription.cancel();
|
|
}
|
|
});
|
|
|
|
test('hot restart works without error', () async {
|
|
await _flutter.run();
|
|
await _flutter.hotRestart();
|
|
});
|
|
|
|
test('breakpoints are hit after hot reload', () async {
|
|
Isolate isolate;
|
|
await _flutter.run(withDebugger: true, startPaused: true);
|
|
final Completer<void> sawTick1 = Completer<void>();
|
|
final Completer<void> sawTick3 = Completer<void>();
|
|
final Completer<void> sawDebuggerPausedMessage = Completer<void>();
|
|
final StreamSubscription<String> subscription = _flutter.stdout.listen(
|
|
(String line) {
|
|
if (line.contains('((((TICK 1))))')) {
|
|
expect(sawTick1.isCompleted, isFalse);
|
|
sawTick1.complete();
|
|
}
|
|
if (line.contains('((((TICK 3))))')) {
|
|
expect(sawTick3.isCompleted, isFalse);
|
|
sawTick3.complete();
|
|
}
|
|
if (line.contains('The application is paused in the debugger on a breakpoint.')) {
|
|
expect(sawDebuggerPausedMessage.isCompleted, isFalse);
|
|
sawDebuggerPausedMessage.complete();
|
|
}
|
|
},
|
|
);
|
|
await _flutter.resume(); // we start paused so we can set up our TICK 1 listener before the app starts
|
|
unawaited(sawTick1.future.timeout(
|
|
const Duration(seconds: 5),
|
|
onTimeout: () { print('The test app is taking longer than expected to print its synchronization line...'); },
|
|
));
|
|
await sawTick1.future; // after this, app is in steady state
|
|
await _flutter.addBreakpoint(
|
|
_project.scheduledBreakpointUri,
|
|
_project.scheduledBreakpointLine,
|
|
);
|
|
await _flutter.hotReload(); // reload triggers code which eventually hits the breakpoint
|
|
isolate = await _flutter.waitForPause();
|
|
expect(isolate.pauseEvent.kind, equals(EventKind.kPauseBreakpoint));
|
|
await _flutter.resume();
|
|
await _flutter.addBreakpoint(
|
|
_project.buildBreakpointUri,
|
|
_project.buildBreakpointLine,
|
|
);
|
|
bool reloaded = false;
|
|
final Future<void> reloadFuture = _flutter.hotReload().then((void value) { reloaded = true; });
|
|
await sawTick3.future; // this should happen before it pauses
|
|
isolate = await _flutter.waitForPause();
|
|
expect(isolate.pauseEvent.kind, equals(EventKind.kPauseBreakpoint));
|
|
await sawDebuggerPausedMessage.future;
|
|
expect(reloaded, isFalse);
|
|
await _flutter.resume();
|
|
await reloadFuture;
|
|
expect(reloaded, isTrue);
|
|
reloaded = false;
|
|
await subscription.cancel();
|
|
});
|
|
|
|
test('hot reload doesn\'t reassemble if paused', () async {
|
|
await _flutter.run(withDebugger: true);
|
|
final Completer<void> sawTick2 = Completer<void>();
|
|
final Completer<void> sawTick3 = Completer<void>();
|
|
final Completer<void> sawDebuggerPausedMessage1 = Completer<void>();
|
|
final Completer<void> sawDebuggerPausedMessage2 = Completer<void>();
|
|
final StreamSubscription<String> subscription = _flutter.stdout.listen(
|
|
(String line) {
|
|
if (line.contains('((((TICK 2))))')) {
|
|
expect(sawTick2.isCompleted, isFalse);
|
|
sawTick2.complete();
|
|
}
|
|
if (line.contains('The application is paused in the debugger on a breakpoint.')) {
|
|
expect(sawDebuggerPausedMessage1.isCompleted, isFalse);
|
|
sawDebuggerPausedMessage1.complete();
|
|
}
|
|
if (line.contains('The application is paused in the debugger on a breakpoint; interface might not update.')) {
|
|
expect(sawDebuggerPausedMessage2.isCompleted, isFalse);
|
|
sawDebuggerPausedMessage2.complete();
|
|
}
|
|
},
|
|
);
|
|
await _flutter.addBreakpoint(
|
|
_project.buildBreakpointUri,
|
|
_project.buildBreakpointLine,
|
|
);
|
|
bool reloaded = false;
|
|
final Future<void> reloadFuture = _flutter.hotReload().then((void value) { reloaded = true; });
|
|
await sawTick2.future; // this should happen before it pauses
|
|
final Isolate isolate = await _flutter.waitForPause();
|
|
expect(isolate.pauseEvent.kind, equals(EventKind.kPauseBreakpoint));
|
|
expect(reloaded, isFalse);
|
|
await sawDebuggerPausedMessage1.future; // this is the one where it say "uh, you broke into the debugger while reloading"
|
|
await reloadFuture; // this is the one where it times out because you're in the debugger
|
|
expect(reloaded, isTrue);
|
|
await _flutter.hotReload(); // now we're already paused
|
|
expect(sawTick3.isCompleted, isFalse);
|
|
await sawDebuggerPausedMessage2.future; // so we just get told that nothing is going to happen
|
|
await _flutter.resume();
|
|
await subscription.cancel();
|
|
});
|
|
}
|