2019-11-27 23:04:02 +00:00
// Copyright 2014 The Flutter Authors. All rights reserved.
2017-05-21 22:15:44 +00:00
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import ' dart:async ' ;
2019-07-09 20:10:26 +00:00
2020-07-29 17:05:40 +00:00
import ' package:flutter_tools/src/base/dds.dart ' ;
2020-07-20 21:03:44 +00:00
import ' package:flutter_tools/src/base/platform.dart ' ;
2020-09-19 18:02:04 +00:00
import ' package:flutter_tools/src/features.dart ' ;
2020-07-20 21:03:44 +00:00
import ' package:meta/meta.dart ' ;
import ' package:package_config/package_config.dart ' ;
2020-04-16 22:48:21 +00:00
import ' package:vm_service/vm_service.dart ' as vm_service ;
2019-10-15 20:05:47 +00:00
import ' package:file/memory.dart ' ;
2020-05-29 22:43:03 +00:00
import ' package:file_testing/file_testing.dart ' ;
2019-10-23 03:35:05 +00:00
import ' package:flutter_tools/src/artifacts.dart ' ;
2020-01-09 16:18:03 +00:00
import ' package:flutter_tools/src/base/command_help.dart ' ;
2019-07-13 23:02:09 +00:00
import ' package:flutter_tools/src/base/common.dart ' ;
2019-07-18 17:40:40 +00:00
import ' package:flutter_tools/src/base/context.dart ' ;
import ' package:flutter_tools/src/base/file_system.dart ' ;
2019-11-01 21:37:17 +00:00
import ' package:flutter_tools/src/base/io.dart ' as io ;
2019-04-16 04:02:20 +00:00
import ' package:flutter_tools/src/build_info.dart ' ;
2019-10-23 03:35:05 +00:00
import ' package:flutter_tools/src/compile.dart ' ;
2020-04-07 19:17:39 +00:00
import ' package:flutter_tools/src/convert.dart ' ;
2019-07-09 20:10:26 +00:00
import ' package:flutter_tools/src/devfs.dart ' ;
2017-05-21 22:15:44 +00:00
import ' package:flutter_tools/src/device.dart ' ;
2020-01-06 19:04:20 +00:00
import ' package:flutter_tools/src/globals.dart ' as globals ;
2019-07-29 14:24:02 +00:00
import ' package:flutter_tools/src/reporting/reporting.dart ' ;
2017-05-21 22:15:44 +00:00
import ' package:flutter_tools/src/resident_runner.dart ' ;
2019-10-15 20:05:47 +00:00
import ' package:flutter_tools/src/run_cold.dart ' ;
2019-07-09 20:10:26 +00:00
import ' package:flutter_tools/src/run_hot.dart ' ;
import ' package:flutter_tools/src/vmservice.dart ' ;
2017-05-21 22:15:44 +00:00
import ' package:mockito/mockito.dart ' ;
2019-07-13 18:51:44 +00:00
import ' ../src/common.dart ' ;
2019-07-18 22:29:06 +00:00
import ' ../src/context.dart ' ;
2019-07-13 18:51:44 +00:00
import ' ../src/testbed.dart ' ;
2017-05-21 22:15:44 +00:00
2020-04-28 00:41:42 +00:00
final vm_service . Isolate fakeUnpausedIsolate = vm_service . Isolate (
id: ' 1 ' ,
pauseEvent: vm_service . Event (
kind: vm_service . EventKind . kResume ,
timestamp: 0
) ,
breakpoints: < vm_service . Breakpoint > [ ] ,
exceptionPauseMode: null ,
2020-07-20 21:03:44 +00:00
libraries: < vm_service . LibraryRef > [
vm_service . LibraryRef (
id: ' 1 ' ,
uri: ' file:///hello_world/main.dart ' ,
name: ' ' ,
) ,
] ,
2020-04-28 00:41:42 +00:00
livePorts: 0 ,
name: ' test ' ,
number: ' 1 ' ,
pauseOnExit: false ,
runnable: true ,
startTime: 0 ,
2020-10-27 20:55:32 +00:00
isSystemIsolate: false ,
2020-11-18 00:03:18 +00:00
isolateFlags: < vm_service . IsolateFlag > [ ] ,
2020-04-28 00:41:42 +00:00
) ;
final vm_service . Isolate fakePausedIsolate = vm_service . Isolate (
id: ' 1 ' ,
pauseEvent: vm_service . Event (
kind: vm_service . EventKind . kPauseException ,
timestamp: 0
) ,
2020-07-24 22:34:55 +00:00
breakpoints: < vm_service . Breakpoint > [
vm_service . Breakpoint (
breakpointNumber: 123 ,
id: ' test-breakpoint ' ,
location: vm_service . SourceLocation (
tokenPos: 0 ,
2020-10-12 16:47:41 +00:00
script: vm_service . ScriptRef ( id: ' test-script ' , uri: ' foo.dart ' ) ,
2020-07-24 22:34:55 +00:00
) ,
resolved: true ,
) ,
] ,
2020-04-28 00:41:42 +00:00
exceptionPauseMode: null ,
libraries: < vm_service . LibraryRef > [ ] ,
livePorts: 0 ,
name: ' test ' ,
number: ' 1 ' ,
pauseOnExit: false ,
runnable: true ,
startTime: 0 ,
2020-10-27 20:55:32 +00:00
isSystemIsolate: false ,
2020-11-18 00:03:18 +00:00
isolateFlags: < vm_service . IsolateFlag > [ ] ,
2020-04-28 00:41:42 +00:00
) ;
2020-07-20 21:03:44 +00:00
final vm_service . VM fakeVM = vm_service . VM (
isolates: < vm_service . IsolateRef > [ fakeUnpausedIsolate ] ,
pid: 1 ,
hostCPU: ' ' ,
isolateGroups: < vm_service . IsolateGroupRef > [ ] ,
targetCPU: ' ' ,
startTime: 0 ,
name: ' dart ' ,
architectureBits: 64 ,
operatingSystem: ' ' ,
version: ' ' ,
2020-10-27 20:55:32 +00:00
systemIsolateGroups: < vm_service . IsolateGroupRef > [ ] ,
systemIsolates: < vm_service . IsolateRef > [ ] ,
2020-07-20 21:03:44 +00:00
) ;
2020-04-28 00:41:42 +00:00
final FlutterView fakeFlutterView = FlutterView (
id: ' a ' ,
uiIsolate: fakeUnpausedIsolate ,
) ;
2020-05-05 19:09:51 +00:00
final FakeVmServiceRequest listViews = FakeVmServiceRequest (
method: kListViewsMethod ,
jsonResponse: < String , Object > {
' views ' : < Object > [
fakeFlutterView . toJson ( ) ,
] ,
} ,
) ;
2020-10-27 16:20:05 +00:00
const FakeVmServiceRequest setAssetBundlePath = FakeVmServiceRequest (
method: ' _flutter.setAssetBundlePath ' ,
args: < String , Object > {
' viewId ' : ' a ' ,
' assetDirectory ' : ' build/flutter_assets ' ,
' isolateId ' : ' 1 ' ,
}
) ;
2019-07-09 20:10:26 +00:00
void main ( ) {
2019-07-18 17:40:40 +00:00
final Uri testUri = Uri . parse ( ' foo://bar ' ) ;
Testbed testbed ;
MockFlutterDevice mockFlutterDevice ;
MockVMService mockVMService ;
MockDevFS mockDevFS ;
ResidentRunner residentRunner ;
MockDevice mockDevice ;
2020-04-20 22:15:54 +00:00
FakeVmServiceHost fakeVmServiceHost ;
2020-07-29 02:46:05 +00:00
MockDevtoolsLauncher mockDevtoolsLauncher ;
2019-07-18 17:40:40 +00:00
setUp ( ( ) {
testbed = Testbed ( setup: ( ) {
2020-06-25 19:52:14 +00:00
globals . fs . file ( ' .packages ' )
. writeAsStringSync ( ' \n ' ) ;
2020-01-06 19:04:20 +00:00
globals . fs . file ( globals . fs . path . join ( ' build ' , ' app.dill ' ) )
2019-09-12 19:45:53 +00:00
. . createSync ( recursive: true )
. . writeAsStringSync ( ' ABC ' ) ;
2019-07-18 17:40:40 +00:00
residentRunner = HotRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
debuggingOptions: DebuggingOptions . enabled ( BuildInfo . debug ) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2019-07-18 17:40:40 +00:00
) ;
} ) ;
mockFlutterDevice = MockFlutterDevice ( ) ;
mockDevice = MockDevice ( ) ;
mockVMService = MockVMService ( ) ;
mockDevFS = MockDevFS ( ) ;
2020-07-29 02:46:05 +00:00
mockDevtoolsLauncher = MockDevtoolsLauncher ( ) ;
2020-04-28 00:41:42 +00:00
2019-07-18 17:40:40 +00:00
// DevFS Mocks
when ( mockDevFS . lastCompiled ) . thenReturn ( DateTime ( 2000 ) ) ;
when ( mockDevFS . sources ) . thenReturn ( < Uri > [ ] ) ;
2019-07-30 19:18:15 +00:00
when ( mockDevFS . baseUri ) . thenReturn ( Uri ( ) ) ;
2019-07-18 17:40:40 +00:00
when ( mockDevFS . destroy ( ) ) . thenAnswer ( ( Invocation invocation ) async { } ) ;
2019-07-29 14:24:02 +00:00
when ( mockDevFS . assetPathsToEvict ) . thenReturn ( < String > { } ) ;
2019-07-18 17:40:40 +00:00
// FlutterDevice Mocks.
when ( mockFlutterDevice . updateDevFS (
2020-04-20 21:02:49 +00:00
invalidatedFiles: anyNamed ( ' invalidatedFiles ' ) ,
mainUri: anyNamed ( ' mainUri ' ) ,
2019-07-18 17:40:40 +00:00
target: anyNamed ( ' target ' ) ,
bundle: anyNamed ( ' bundle ' ) ,
firstBuildTime: anyNamed ( ' firstBuildTime ' ) ,
bundleFirstUpload: anyNamed ( ' bundleFirstUpload ' ) ,
bundleDirty: anyNamed ( ' bundleDirty ' ) ,
fullRestart: anyNamed ( ' fullRestart ' ) ,
projectRootPath: anyNamed ( ' projectRootPath ' ) ,
pathToReload: anyNamed ( ' pathToReload ' ) ,
2019-07-31 23:19:22 +00:00
dillOutputPath: anyNamed ( ' dillOutputPath ' ) ,
2020-04-20 21:02:49 +00:00
packageConfig: anyNamed ( ' packageConfig ' ) ,
2019-07-18 17:40:40 +00:00
) ) . thenAnswer ( ( Invocation invocation ) async {
return UpdateFSReport (
success: true ,
syncedBytes: 0 ,
2020-10-27 16:20:05 +00:00
invalidatedSourcesCount: 1 ,
2019-07-18 17:40:40 +00:00
) ;
} ) ;
when ( mockFlutterDevice . devFS ) . thenReturn ( mockDevFS ) ;
when ( mockFlutterDevice . device ) . thenReturn ( mockDevice ) ;
when ( mockFlutterDevice . stopEchoingDeviceLog ( ) ) . thenAnswer ( ( Invocation invocation ) async { } ) ;
2019-11-21 02:51:25 +00:00
when ( mockFlutterDevice . observatoryUris ) . thenAnswer ( ( _ ) = > Stream < Uri > . value ( testUri ) ) ;
2019-07-18 17:40:40 +00:00
when ( mockFlutterDevice . connect (
reloadSources: anyNamed ( ' reloadSources ' ) ,
restart: anyNamed ( ' restart ' ) ,
2019-09-24 06:06:09 +00:00
compileExpression: anyNamed ( ' compileExpression ' ) ,
2020-05-27 17:10:41 +00:00
getSkSLMethod: anyNamed ( ' getSkSLMethod ' ) ,
2019-07-18 17:40:40 +00:00
) ) . thenAnswer ( ( Invocation invocation ) async { } ) ;
2020-11-11 21:50:41 +00:00
when ( mockFlutterDevice . setupDevFS ( any , any ) )
2019-07-18 17:40:40 +00:00
. thenAnswer ( ( Invocation invocation ) async {
return testUri ;
2019-07-09 20:10:26 +00:00
} ) ;
2020-04-20 22:15:54 +00:00
when ( mockFlutterDevice . vmService ) . thenAnswer ( ( Invocation invocation ) {
2020-09-03 00:33:41 +00:00
return fakeVmServiceHost ? . vmService ;
2020-04-20 22:15:54 +00:00
} ) ;
2019-07-18 17:40:40 +00:00
} ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' ResidentRunner can attach to device successfully ' , ( ) = > testbed . run ( ( ) async {
2020-05-05 19:09:51 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
listViews ,
listViews ,
2020-10-27 16:20:05 +00:00
setAssetBundlePath ,
2020-05-05 19:09:51 +00:00
] ) ;
2019-07-18 17:40:40 +00:00
final Completer < DebugConnectionInfo > onConnectionInfo = Completer < DebugConnectionInfo > . sync ( ) ;
final Completer < void > onAppStart = Completer < void > . sync ( ) ;
2019-12-10 18:26:14 +00:00
final Future < int > result = residentRunner . attach (
appStartedCompleter: onAppStart ,
connectionInfoCompleter: onConnectionInfo ,
) ;
final Future < DebugConnectionInfo > connectionInfo = onConnectionInfo . future ;
expect ( await result , 0 ) ;
verify ( mockFlutterDevice . initLogReader ( ) ) . called ( 1 ) ;
expect ( onConnectionInfo . isCompleted , true ) ;
expect ( ( await connectionInfo ) . baseUri , ' foo://bar ' ) ;
expect ( onAppStart . isCompleted , true ) ;
2020-05-05 19:09:51 +00:00
expect ( fakeVmServiceHost . hasRemainingExpectations , false ) ;
2019-12-10 18:26:14 +00:00
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' ResidentRunner suppresses errors for the initial compilation ' , ( ) = > testbed . run ( ( ) async {
2020-06-03 19:00:03 +00:00
globals . fs . file ( globals . fs . path . join ( ' lib ' , ' main.dart ' ) )
. createSync ( recursive: true ) ;
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
listViews ,
listViews ,
2020-10-27 16:20:05 +00:00
setAssetBundlePath ,
2020-06-03 19:00:03 +00:00
] ) ;
final MockResidentCompiler residentCompiler = MockResidentCompiler ( ) ;
residentRunner = HotRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
debuggingOptions: DebuggingOptions . enabled ( BuildInfo . debug ) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2020-06-03 19:00:03 +00:00
) ;
when ( mockFlutterDevice . generator ) . thenReturn ( residentCompiler ) ;
when ( residentCompiler . recompile (
any ,
any ,
outputPath: anyNamed ( ' outputPath ' ) ,
packageConfig: anyNamed ( ' packageConfig ' ) ,
suppressErrors: true ,
) ) . thenAnswer ( ( Invocation invocation ) async {
return const CompilerOutput ( ' foo ' , 0 , < Uri > [ ] ) ;
} ) ;
when ( mockFlutterDevice . runHot (
hotRunner: anyNamed ( ' hotRunner ' ) ,
route: anyNamed ( ' route ' ) ,
) ) . thenAnswer ( ( Invocation invocation ) async {
return 0 ;
} ) ;
expect ( await residentRunner . run ( ) , 0 ) ;
verify ( residentCompiler . recompile (
any ,
any ,
outputPath: anyNamed ( ' outputPath ' ) ,
packageConfig: anyNamed ( ' packageConfig ' ) ,
suppressErrors: true ,
) ) . called ( 1 ) ;
expect ( fakeVmServiceHost . hasRemainingExpectations , false ) ;
} ) ) ;
2020-06-30 19:26:18 +00:00
// Regression test for https://github.com/flutter/flutter/issues/60613
testUsingContext ( ' ResidentRunner calls appFailedToStart if initial compilation fails ' , ( ) = > testbed . run ( ( ) async {
globals . fs . file ( globals . fs . path . join ( ' lib ' , ' main.dart ' ) )
. createSync ( recursive: true ) ;
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
final MockResidentCompiler residentCompiler = MockResidentCompiler ( ) ;
residentRunner = HotRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
debuggingOptions: DebuggingOptions . enabled ( BuildInfo . debug ) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2020-06-30 19:26:18 +00:00
) ;
when ( mockFlutterDevice . generator ) . thenReturn ( residentCompiler ) ;
when ( residentCompiler . recompile (
any ,
any ,
outputPath: anyNamed ( ' outputPath ' ) ,
packageConfig: anyNamed ( ' packageConfig ' ) ,
suppressErrors: true ,
) ) . thenAnswer ( ( Invocation invocation ) async {
return const CompilerOutput ( ' foo ' , 1 , < Uri > [ ] ) ;
} ) ;
when ( mockFlutterDevice . runHot (
hotRunner: anyNamed ( ' hotRunner ' ) ,
route: anyNamed ( ' route ' ) ,
) ) . thenAnswer ( ( Invocation invocation ) async {
return 0 ;
} ) ;
expect ( await residentRunner . run ( ) , 1 ) ;
// Completing this future ensures that the daemon can exit correctly.
expect ( await residentRunner . waitForAppToFinish ( ) , 1 ) ;
} ) ) ;
// Regression test for https://github.com/flutter/flutter/issues/60613
testUsingContext ( ' ResidentRunner calls appFailedToStart if initial compilation fails - cold mode ' , ( ) = > testbed . run ( ( ) async {
globals . fs . file ( globals . fs . path . join ( ' lib ' , ' main.dart ' ) )
. createSync ( recursive: true ) ;
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
residentRunner = ColdRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
debuggingOptions: DebuggingOptions . enabled ( BuildInfo . release ) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2020-06-30 19:26:18 +00:00
) ;
when ( mockFlutterDevice . runCold (
coldRunner: anyNamed ( ' coldRunner ' ) ,
route: anyNamed ( ' route ' ) ,
) ) . thenAnswer ( ( Invocation invocation ) async {
return 1 ;
} ) ;
expect ( await residentRunner . run ( ) , 1 ) ;
// Completing this future ensures that the daemon can exit correctly.
expect ( await residentRunner . waitForAppToFinish ( ) , 1 ) ;
} ) ) ;
// Regression test for https://github.com/flutter/flutter/issues/60613
testUsingContext ( ' ResidentRunner calls appFailedToStart if exception is thrown - cold mode ' , ( ) = > testbed . run ( ( ) async {
globals . fs . file ( globals . fs . path . join ( ' lib ' , ' main.dart ' ) )
. createSync ( recursive: true ) ;
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
residentRunner = ColdRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
debuggingOptions: DebuggingOptions . enabled ( BuildInfo . release ) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2020-06-30 19:26:18 +00:00
) ;
when ( mockFlutterDevice . runCold (
coldRunner: anyNamed ( ' coldRunner ' ) ,
route: anyNamed ( ' route ' ) ,
) ) . thenAnswer ( ( Invocation invocation ) async {
throw Exception ( ' BAD STUFF ' ) ;
} ) ;
expect ( await residentRunner . run ( ) , 1 ) ;
// Completing this future ensures that the daemon can exit correctly.
expect ( await residentRunner . waitForAppToFinish ( ) , 1 ) ;
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' ResidentRunner does not suppressErrors if running with an applicationBinary ' , ( ) = > testbed . run ( ( ) async {
2020-06-03 19:00:03 +00:00
globals . fs . file ( globals . fs . path . join ( ' lib ' , ' main.dart ' ) )
. createSync ( recursive: true ) ;
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
listViews ,
listViews ,
2020-10-27 16:20:05 +00:00
setAssetBundlePath ,
2020-06-03 19:00:03 +00:00
] ) ;
final MockResidentCompiler residentCompiler = MockResidentCompiler ( ) ;
residentRunner = HotRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
applicationBinary: globals . fs . file ( ' app.apk ' ) ,
stayResident: false ,
debuggingOptions: DebuggingOptions . enabled ( BuildInfo . debug ) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2020-06-03 19:00:03 +00:00
) ;
when ( mockFlutterDevice . generator ) . thenReturn ( residentCompiler ) ;
when ( residentCompiler . recompile (
any ,
any ,
outputPath: anyNamed ( ' outputPath ' ) ,
packageConfig: anyNamed ( ' packageConfig ' ) ,
suppressErrors: false ,
) ) . thenAnswer ( ( Invocation invocation ) async {
return const CompilerOutput ( ' foo ' , 0 , < Uri > [ ] ) ;
} ) ;
when ( mockFlutterDevice . runHot (
hotRunner: anyNamed ( ' hotRunner ' ) ,
route: anyNamed ( ' route ' ) ,
) ) . thenAnswer ( ( Invocation invocation ) async {
return 0 ;
} ) ;
expect ( await residentRunner . run ( ) , 0 ) ;
verify ( residentCompiler . recompile (
any ,
any ,
outputPath: anyNamed ( ' outputPath ' ) ,
packageConfig: anyNamed ( ' packageConfig ' ) ,
suppressErrors: false ,
) ) . called ( 1 ) ;
expect ( fakeVmServiceHost . hasRemainingExpectations , false ) ;
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' ResidentRunner can attach to device successfully with --fast-start ' , ( ) = > testbed . run ( ( ) async {
2020-04-20 22:15:54 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
2020-05-05 19:09:51 +00:00
listViews ,
listViews ,
2020-10-27 16:20:05 +00:00
setAssetBundlePath ,
2020-05-05 19:09:51 +00:00
listViews ,
2020-04-28 00:41:42 +00:00
FakeVmServiceRequest (
method: ' getIsolate ' ,
args: < String , Object > {
' isolateId ' : fakeUnpausedIsolate . id ,
} ,
jsonResponse: fakeUnpausedIsolate . toJson ( ) ,
) ,
FakeVmServiceRequest (
method: ' getVM ' ,
jsonResponse: vm_service . VM . parse ( < String , Object > { } ) . toJson ( ) ,
) ,
2020-05-05 19:09:51 +00:00
listViews ,
2020-04-28 00:41:42 +00:00
const FakeVmServiceRequest (
2020-04-20 22:15:54 +00:00
method: ' streamListen ' ,
args: < String , Object > {
' streamId ' : ' Isolate ' ,
}
) ,
2020-04-28 00:41:42 +00:00
FakeVmServiceRequest (
2020-04-20 22:15:54 +00:00
method: kRunInViewMethod ,
args: < String , Object > {
2020-04-28 00:41:42 +00:00
' viewId ' : fakeFlutterView . id ,
2020-10-12 16:47:41 +00:00
' mainScript ' : ' main.dart.dill ' ,
2020-04-20 22:15:54 +00:00
' assetDirectory ' : ' build/flutter_assets ' ,
}
) ,
FakeVmServiceStreamResponse (
streamId: ' Isolate ' ,
event: vm_service . Event (
timestamp: 0 ,
kind: vm_service . EventKind . kIsolateRunnable ,
)
) ,
] ) ;
2019-12-10 18:26:14 +00:00
when ( mockDevice . supportsHotRestart ) . thenReturn ( true ) ;
when ( mockDevice . sdkNameAndVersion ) . thenAnswer ( ( Invocation invocation ) async {
return ' Example ' ;
} ) ;
when ( mockDevice . targetPlatform ) . thenAnswer ( ( Invocation invocation ) async {
return TargetPlatform . android_arm ;
} ) ;
when ( mockDevice . isLocalEmulator ) . thenAnswer ( ( Invocation invocation ) async {
return false ;
} ) ;
residentRunner = HotRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
2020-04-20 22:15:54 +00:00
debuggingOptions: DebuggingOptions . enabled (
BuildInfo . debug ,
fastStart: true ,
startPaused: true ,
) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2019-12-10 18:26:14 +00:00
) ;
final Completer < DebugConnectionInfo > onConnectionInfo = Completer < DebugConnectionInfo > . sync ( ) ;
final Completer < void > onAppStart = Completer < void > . sync ( ) ;
2019-07-18 17:40:40 +00:00
final Future < int > result = residentRunner . attach (
appStartedCompleter: onAppStart ,
connectionInfoCompleter: onConnectionInfo ,
) ;
final Future < DebugConnectionInfo > connectionInfo = onConnectionInfo . future ;
expect ( await result , 0 ) ;
verify ( mockFlutterDevice . initLogReader ( ) ) . called ( 1 ) ;
expect ( onConnectionInfo . isCompleted , true ) ;
expect ( ( await connectionInfo ) . baseUri , ' foo://bar ' ) ;
expect ( onAppStart . isCompleted , true ) ;
2020-05-05 19:09:51 +00:00
expect ( fakeVmServiceHost . hasRemainingExpectations , false ) ;
2019-07-18 17:40:40 +00:00
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' ResidentRunner can handle an RPC exception from hot reload ' , ( ) = > testbed . run ( ( ) async {
2020-05-05 19:09:51 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
listViews ,
listViews ,
2020-10-27 16:20:05 +00:00
setAssetBundlePath ,
2020-05-05 19:09:51 +00:00
listViews ,
] ) ;
2019-07-18 17:40:40 +00:00
when ( mockDevice . sdkNameAndVersion ) . thenAnswer ( ( Invocation invocation ) async {
return ' Example ' ;
} ) ;
when ( mockDevice . targetPlatform ) . thenAnswer ( ( Invocation invocation ) async {
return TargetPlatform . android_arm ;
} ) ;
when ( mockDevice . isLocalEmulator ) . thenAnswer ( ( Invocation invocation ) async {
return false ;
} ) ;
final Completer < DebugConnectionInfo > onConnectionInfo = Completer < DebugConnectionInfo > . sync ( ) ;
final Completer < void > onAppStart = Completer < void > . sync ( ) ;
unawaited ( residentRunner . attach (
appStartedCompleter: onAppStart ,
connectionInfoCompleter: onConnectionInfo ,
) ) ;
await onAppStart . future ;
when ( mockFlutterDevice . updateDevFS (
2020-04-20 21:02:49 +00:00
mainUri: anyNamed ( ' mainUri ' ) ,
2019-07-18 17:40:40 +00:00
target: anyNamed ( ' target ' ) ,
bundle: anyNamed ( ' bundle ' ) ,
firstBuildTime: anyNamed ( ' firstBuildTime ' ) ,
bundleFirstUpload: anyNamed ( ' bundleFirstUpload ' ) ,
bundleDirty: anyNamed ( ' bundleDirty ' ) ,
fullRestart: anyNamed ( ' fullRestart ' ) ,
projectRootPath: anyNamed ( ' projectRootPath ' ) ,
pathToReload: anyNamed ( ' pathToReload ' ) ,
invalidatedFiles: anyNamed ( ' invalidatedFiles ' ) ,
2019-07-31 23:19:22 +00:00
dillOutputPath: anyNamed ( ' dillOutputPath ' ) ,
2020-04-20 21:02:49 +00:00
packageConfig: anyNamed ( ' packageConfig ' ) ,
2020-04-08 19:33:33 +00:00
) ) . thenThrow ( vm_service . RPCError ( ' something bad happened ' , 666 , ' ' ) ) ;
2019-07-18 17:40:40 +00:00
final OperationResult result = await residentRunner . restart ( fullRestart: false ) ;
expect ( result . fatal , true ) ;
expect ( result . code , 1 ) ;
2020-03-06 20:14:29 +00:00
verify ( globals . flutterUsage . sendEvent ( ' hot ' , ' exception ' , parameters: < String , String > {
2019-07-29 14:24:02 +00:00
cdKey ( CustomDimensions . hotEventTargetPlatform ) :
getNameForTargetPlatform ( TargetPlatform . android_arm ) ,
cdKey ( CustomDimensions . hotEventSdkName ) : ' Example ' ,
cdKey ( CustomDimensions . hotEventEmulator ) : ' false ' ,
cdKey ( CustomDimensions . hotEventFullRestart ) : ' false ' ,
2019-07-18 17:40:40 +00:00
} ) ) . called ( 1 ) ;
2020-05-05 19:09:51 +00:00
expect ( fakeVmServiceHost . hasRemainingExpectations , false ) ;
2019-07-18 17:40:40 +00:00
} , overrides: < Type , Generator > {
Usage: ( ) = > MockUsage ( ) ,
} ) ) ;
2020-10-27 16:20:05 +00:00
testUsingContext ( ' ResidentRunner can handle an reload-barred exception from hot reload ' , ( ) = > testbed . run ( ( ) async {
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
listViews ,
listViews ,
setAssetBundlePath ,
listViews ,
] ) ;
when ( mockDevice . sdkNameAndVersion ) . thenAnswer ( ( Invocation invocation ) async {
return ' Example ' ;
} ) ;
when ( mockDevice . targetPlatform ) . thenAnswer ( ( Invocation invocation ) async {
return TargetPlatform . android_arm ;
} ) ;
when ( mockDevice . isLocalEmulator ) . thenAnswer ( ( Invocation invocation ) async {
return false ;
} ) ;
final Completer < DebugConnectionInfo > onConnectionInfo = Completer < DebugConnectionInfo > . sync ( ) ;
final Completer < void > onAppStart = Completer < void > . sync ( ) ;
unawaited ( residentRunner . attach (
appStartedCompleter: onAppStart ,
connectionInfoCompleter: onConnectionInfo ,
) ) ;
await onAppStart . future ;
when ( mockFlutterDevice . updateDevFS (
mainUri: anyNamed ( ' mainUri ' ) ,
target: anyNamed ( ' target ' ) ,
bundle: anyNamed ( ' bundle ' ) ,
firstBuildTime: anyNamed ( ' firstBuildTime ' ) ,
bundleFirstUpload: anyNamed ( ' bundleFirstUpload ' ) ,
bundleDirty: anyNamed ( ' bundleDirty ' ) ,
fullRestart: anyNamed ( ' fullRestart ' ) ,
projectRootPath: anyNamed ( ' projectRootPath ' ) ,
pathToReload: anyNamed ( ' pathToReload ' ) ,
invalidatedFiles: anyNamed ( ' invalidatedFiles ' ) ,
dillOutputPath: anyNamed ( ' dillOutputPath ' ) ,
packageConfig: anyNamed ( ' packageConfig ' ) ,
) ) . thenThrow ( vm_service . RPCError ( ' something bad happened ' , kIsolateReloadBarred , ' ' ) ) ;
final OperationResult result = await residentRunner . restart ( fullRestart: false ) ;
expect ( result . fatal , true ) ;
expect ( result . code , kIsolateReloadBarred ) ;
expect ( result . message , contains ( ' Unable to hot reload application due to an unrecoverable error ' ) ) ;
verify ( globals . flutterUsage . sendEvent ( ' hot ' , ' reload-barred ' , parameters: < String , String > {
cdKey ( CustomDimensions . hotEventTargetPlatform ) :
getNameForTargetPlatform ( TargetPlatform . android_arm ) ,
cdKey ( CustomDimensions . hotEventSdkName ) : ' Example ' ,
cdKey ( CustomDimensions . hotEventEmulator ) : ' false ' ,
cdKey ( CustomDimensions . hotEventFullRestart ) : ' false ' ,
} ) ) . called ( 1 ) ;
expect ( fakeVmServiceHost . hasRemainingExpectations , false ) ;
} , overrides: < Type , Generator > {
Usage: ( ) = > MockUsage ( ) ,
} ) ) ;
2020-06-23 00:05:01 +00:00
testUsingContext ( ' ResidentRunner reports hot reload event with null safety analytics ' , ( ) = > testbed . run ( ( ) async {
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
listViews ,
listViews ,
2020-10-27 16:20:05 +00:00
setAssetBundlePath ,
2020-06-23 00:05:01 +00:00
listViews ,
] ) ;
residentRunner = HotRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2020-06-23 00:05:01 +00:00
debuggingOptions: DebuggingOptions . enabled ( const BuildInfo (
BuildMode . debug , ' ' , treeShakeIcons: false , extraFrontEndOptions: < String > [
' --enable-experiment=non-nullable ' ,
] ,
) ) ,
) ;
when ( mockDevice . sdkNameAndVersion ) . thenAnswer ( ( Invocation invocation ) async {
return ' Example ' ;
} ) ;
when ( mockDevice . targetPlatform ) . thenAnswer ( ( Invocation invocation ) async {
return TargetPlatform . android_arm ;
} ) ;
when ( mockDevice . isLocalEmulator ) . thenAnswer ( ( Invocation invocation ) async {
return false ;
} ) ;
final Completer < DebugConnectionInfo > onConnectionInfo = Completer < DebugConnectionInfo > . sync ( ) ;
final Completer < void > onAppStart = Completer < void > . sync ( ) ;
unawaited ( residentRunner . attach (
appStartedCompleter: onAppStart ,
connectionInfoCompleter: onConnectionInfo ,
) ) ;
await onAppStart . future ;
when ( mockFlutterDevice . updateDevFS (
mainUri: anyNamed ( ' mainUri ' ) ,
target: anyNamed ( ' target ' ) ,
bundle: anyNamed ( ' bundle ' ) ,
firstBuildTime: anyNamed ( ' firstBuildTime ' ) ,
bundleFirstUpload: anyNamed ( ' bundleFirstUpload ' ) ,
bundleDirty: anyNamed ( ' bundleDirty ' ) ,
fullRestart: anyNamed ( ' fullRestart ' ) ,
projectRootPath: anyNamed ( ' projectRootPath ' ) ,
pathToReload: anyNamed ( ' pathToReload ' ) ,
invalidatedFiles: anyNamed ( ' invalidatedFiles ' ) ,
dillOutputPath: anyNamed ( ' dillOutputPath ' ) ,
packageConfig: anyNamed ( ' packageConfig ' ) ,
) ) . thenThrow ( vm_service . RPCError ( ' something bad happened ' , 666 , ' ' ) ) ;
final OperationResult result = await residentRunner . restart ( fullRestart: false ) ;
expect ( result . fatal , true ) ;
expect ( result . code , 1 ) ;
verify ( globals . flutterUsage . sendEvent ( ' hot ' , ' exception ' , parameters: < String , String > {
cdKey ( CustomDimensions . hotEventTargetPlatform ) :
getNameForTargetPlatform ( TargetPlatform . android_arm ) ,
cdKey ( CustomDimensions . hotEventSdkName ) : ' Example ' ,
cdKey ( CustomDimensions . hotEventEmulator ) : ' false ' ,
cdKey ( CustomDimensions . hotEventFullRestart ) : ' false ' ,
} ) ) . called ( 1 ) ;
expect ( fakeVmServiceHost . hasRemainingExpectations , false ) ;
} , overrides: < Type , Generator > {
Usage: ( ) = > MockUsage ( ) ,
} ) ) ;
2020-11-04 19:15:30 +00:00
testUsingContext ( ' ResidentRunner does not reload sources if no sources changed ' , ( ) = > testbed . run ( ( ) async {
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
listViews ,
listViews ,
setAssetBundlePath ,
listViews ,
FakeVmServiceRequest (
method: ' getIsolate ' ,
args: < String , Object > {
' isolateId ' : ' 1 ' ,
} ,
jsonResponse: fakeUnpausedIsolate . toJson ( ) ,
) ,
FakeVmServiceRequest (
method: ' ext.flutter.reassemble ' ,
args: < String , Object > {
' isolateId ' : fakeUnpausedIsolate . id ,
} ,
) ,
] ) ;
residentRunner = HotRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
debuggingOptions: DebuggingOptions . enabled ( BuildInfo . debug ) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2020-11-04 19:15:30 +00:00
) ;
when ( mockDevice . sdkNameAndVersion ) . thenAnswer ( ( Invocation invocation ) async {
return ' Example ' ;
} ) ;
when ( mockDevice . targetPlatform ) . thenAnswer ( ( Invocation invocation ) async {
return TargetPlatform . android_arm ;
} ) ;
when ( mockDevice . isLocalEmulator ) . thenAnswer ( ( Invocation invocation ) async {
return false ;
} ) ;
final Completer < DebugConnectionInfo > onConnectionInfo = Completer < DebugConnectionInfo > . sync ( ) ;
final Completer < void > onAppStart = Completer < void > . sync ( ) ;
unawaited ( residentRunner . attach (
appStartedCompleter: onAppStart ,
connectionInfoCompleter: onConnectionInfo ,
) ) ;
await onAppStart . future ;
when ( mockFlutterDevice . updateDevFS (
mainUri: anyNamed ( ' mainUri ' ) ,
target: anyNamed ( ' target ' ) ,
bundle: anyNamed ( ' bundle ' ) ,
firstBuildTime: anyNamed ( ' firstBuildTime ' ) ,
bundleFirstUpload: anyNamed ( ' bundleFirstUpload ' ) ,
bundleDirty: anyNamed ( ' bundleDirty ' ) ,
fullRestart: anyNamed ( ' fullRestart ' ) ,
projectRootPath: anyNamed ( ' projectRootPath ' ) ,
pathToReload: anyNamed ( ' pathToReload ' ) ,
invalidatedFiles: anyNamed ( ' invalidatedFiles ' ) ,
dillOutputPath: anyNamed ( ' dillOutputPath ' ) ,
packageConfig: anyNamed ( ' packageConfig ' ) ,
) ) . thenAnswer ( ( Invocation _ ) async {
return UpdateFSReport ( success: true , invalidatedSourcesCount: 0 ) ;
} ) ;
final OperationResult result = await residentRunner . restart ( fullRestart: false ) ;
expect ( result . code , 0 ) ;
expect ( fakeVmServiceHost . hasRemainingExpectations , false ) ;
} ) ) ;
2020-08-05 22:11:15 +00:00
testUsingContext ( ' ResidentRunner reports error with missing entrypoint file ' , ( ) = > testbed . run ( ( ) async {
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
listViews ,
listViews ,
2020-10-27 16:20:05 +00:00
setAssetBundlePath ,
2020-08-05 22:11:15 +00:00
listViews ,
2020-10-09 22:44:52 +00:00
FakeVmServiceRequest (
method: ' getVM ' ,
jsonResponse: vm_service . VM . parse ( < String , Object > {
' isolates ' : < Object > [
fakeUnpausedIsolate . toJson ( ) ,
] ,
} ) . toJson ( ) ,
) ,
const FakeVmServiceRequest (
method: ' reloadSources ' ,
args: < String , Object > {
' isolateId ' : ' 1 ' ,
' pause ' : false ,
2020-10-12 16:47:41 +00:00
' rootLibUri ' : ' main.dart.incremental.dill '
2020-10-09 22:44:52 +00:00
} ,
jsonResponse: < String , Object > {
' type ' : ' ReloadReport ' ,
' success ' : true ,
' details ' : < String , Object > {
' loadedLibraryCount ' : 1 ,
} ,
} ,
) ,
2020-08-05 22:11:15 +00:00
FakeVmServiceRequest (
method: ' getIsolate ' ,
args: < String , Object > {
' isolateId ' : ' 1 ' ,
} ,
jsonResponse: fakeUnpausedIsolate . toJson ( ) ,
) ,
FakeVmServiceRequest (
method: ' ext.flutter.reassemble ' ,
args: < String , Object > {
' isolateId ' : fakeUnpausedIsolate . id ,
} ,
) ,
] ) ;
when ( mockDevice . sdkNameAndVersion ) . thenAnswer ( ( Invocation invocation ) async {
return ' Example ' ;
} ) ;
when ( mockDevice . targetPlatform ) . thenAnswer ( ( Invocation invocation ) async {
return TargetPlatform . android_arm ;
} ) ;
when ( mockDevice . isLocalEmulator ) . thenAnswer ( ( Invocation invocation ) async {
return false ;
} ) ;
final Completer < DebugConnectionInfo > onConnectionInfo = Completer < DebugConnectionInfo > . sync ( ) ;
final Completer < void > onAppStart = Completer < void > . sync ( ) ;
unawaited ( residentRunner . attach (
appStartedCompleter: onAppStart ,
connectionInfoCompleter: onConnectionInfo ,
) ) ;
await onAppStart . future ;
when ( mockFlutterDevice . updateDevFS (
mainUri: anyNamed ( ' mainUri ' ) ,
target: anyNamed ( ' target ' ) ,
bundle: anyNamed ( ' bundle ' ) ,
firstBuildTime: anyNamed ( ' firstBuildTime ' ) ,
bundleFirstUpload: anyNamed ( ' bundleFirstUpload ' ) ,
bundleDirty: anyNamed ( ' bundleDirty ' ) ,
fullRestart: anyNamed ( ' fullRestart ' ) ,
projectRootPath: anyNamed ( ' projectRootPath ' ) ,
pathToReload: anyNamed ( ' pathToReload ' ) ,
invalidatedFiles: anyNamed ( ' invalidatedFiles ' ) ,
dillOutputPath: anyNamed ( ' dillOutputPath ' ) ,
packageConfig: anyNamed ( ' packageConfig ' ) ,
) ) . thenAnswer ( ( Invocation invocation ) async {
2020-10-27 16:20:05 +00:00
return UpdateFSReport ( success: true , invalidatedSourcesCount: 1 ) ;
2020-08-05 22:11:15 +00:00
} ) ;
final OperationResult result = await residentRunner . restart ( fullRestart: false ) ;
expect ( globals . fs . file ( globals . fs . path . join ( ' lib ' , ' main.dart ' ) ) , isNot ( exists ) ) ;
expect ( testLogger . errorText , contains ( ' The entrypoint file (i.e. the file with main()) ' ) ) ;
expect ( result . fatal , false ) ;
expect ( result . code , 0 ) ;
} ) ) ;
2020-10-09 22:44:52 +00:00
testUsingContext ( ' ResidentRunner resets compilation time on reload reject ' , ( ) = > testbed . run ( ( ) async {
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
listViews ,
listViews ,
2020-10-27 16:20:05 +00:00
setAssetBundlePath ,
2020-10-09 22:44:52 +00:00
listViews ,
FakeVmServiceRequest (
method: ' getVM ' ,
jsonResponse: vm_service . VM . parse ( < String , Object > {
' isolates ' : < Object > [
fakeUnpausedIsolate . toJson ( ) ,
] ,
} ) . toJson ( ) ,
) ,
const FakeVmServiceRequest (
method: ' reloadSources ' ,
args: < String , Object > {
' isolateId ' : ' 1 ' ,
' pause ' : false ,
2020-10-12 16:47:41 +00:00
' rootLibUri ' : ' main.dart.incremental.dill '
2020-10-09 22:44:52 +00:00
} ,
jsonResponse: < String , Object > {
' type ' : ' ReloadReport ' ,
' success ' : false ,
' notices ' : < Object > [
< String , Object > {
' message ' : ' Failed to hot reload '
}
] ,
' details ' : < String , Object > { } ,
} ,
) ,
listViews ,
FakeVmServiceRequest (
method: ' getIsolate ' ,
args: < String , Object > {
' isolateId ' : ' 1 ' ,
} ,
jsonResponse: fakeUnpausedIsolate . toJson ( ) ,
) ,
FakeVmServiceRequest (
method: ' ext.flutter.reassemble ' ,
args: < String , Object > {
' isolateId ' : fakeUnpausedIsolate . id ,
} ,
) ,
] ) ;
when ( mockDevice . sdkNameAndVersion ) . thenAnswer ( ( Invocation invocation ) async {
return ' Example ' ;
} ) ;
when ( mockDevice . targetPlatform ) . thenAnswer ( ( Invocation invocation ) async {
return TargetPlatform . android_arm ;
} ) ;
when ( mockDevice . isLocalEmulator ) . thenAnswer ( ( Invocation invocation ) async {
return false ;
} ) ;
final Completer < DebugConnectionInfo > onConnectionInfo = Completer < DebugConnectionInfo > . sync ( ) ;
final Completer < void > onAppStart = Completer < void > . sync ( ) ;
unawaited ( residentRunner . attach (
appStartedCompleter: onAppStart ,
connectionInfoCompleter: onConnectionInfo ,
) ) ;
await onAppStart . future ;
when ( mockFlutterDevice . updateDevFS (
mainUri: anyNamed ( ' mainUri ' ) ,
target: anyNamed ( ' target ' ) ,
bundle: anyNamed ( ' bundle ' ) ,
firstBuildTime: anyNamed ( ' firstBuildTime ' ) ,
bundleFirstUpload: anyNamed ( ' bundleFirstUpload ' ) ,
bundleDirty: anyNamed ( ' bundleDirty ' ) ,
fullRestart: anyNamed ( ' fullRestart ' ) ,
projectRootPath: anyNamed ( ' projectRootPath ' ) ,
pathToReload: anyNamed ( ' pathToReload ' ) ,
invalidatedFiles: anyNamed ( ' invalidatedFiles ' ) ,
dillOutputPath: anyNamed ( ' dillOutputPath ' ) ,
packageConfig: anyNamed ( ' packageConfig ' ) ,
) ) . thenAnswer ( ( Invocation invocation ) async {
2020-10-27 16:20:05 +00:00
return UpdateFSReport ( success: true , invalidatedSourcesCount: 1 ) ;
2020-10-09 22:44:52 +00:00
} ) ;
final OperationResult result = await residentRunner . restart ( fullRestart: false ) ;
expect ( result . fatal , false ) ;
expect ( result . message , contains ( ' Reload rejected: Failed to hot reload ' ) ) ; // contains error message from reload report.
expect ( result . code , 1 ) ;
verify ( mockDevFS . resetLastCompiled ( ) ) . called ( 1 ) ; // compilation time is reset.
} ) ) ;
2020-06-23 00:05:01 +00:00
2020-06-08 18:28:02 +00:00
testUsingContext ( ' ResidentRunner can send target platform to analytics from hot reload ' , ( ) = > testbed . run ( ( ) async {
2020-04-20 22:15:54 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
2020-05-05 19:09:51 +00:00
listViews ,
listViews ,
2020-10-27 16:20:05 +00:00
setAssetBundlePath ,
2020-11-11 23:31:07 +00:00
listViews ,
2020-10-09 22:44:52 +00:00
FakeVmServiceRequest (
method: ' getVM ' ,
jsonResponse: vm_service . VM . parse ( < String , Object > {
' isolates ' : < Object > [
fakeUnpausedIsolate . toJson ( ) ,
] ,
} ) . toJson ( ) ,
) ,
const FakeVmServiceRequest (
method: ' reloadSources ' ,
args: < String , Object > {
' isolateId ' : ' 1 ' ,
' pause ' : false ,
2020-10-12 16:47:41 +00:00
' rootLibUri ' : ' main.dart.incremental.dill '
2020-10-09 22:44:52 +00:00
} ,
jsonResponse: < String , Object > {
' type ' : ' ReloadReport ' ,
' success ' : true ,
' details ' : < String , Object > {
' loadedLibraryCount ' : 1 ,
} ,
} ,
) ,
2020-04-28 00:41:42 +00:00
FakeVmServiceRequest (
method: ' getIsolate ' ,
args: < String , Object > {
' isolateId ' : ' 1 ' ,
} ,
jsonResponse: fakeUnpausedIsolate . toJson ( ) ,
) ,
FakeVmServiceRequest (
2020-04-20 22:15:54 +00:00
method: ' ext.flutter.reassemble ' ,
args: < String , Object > {
2020-04-28 00:41:42 +00:00
' isolateId ' : fakeUnpausedIsolate . id ,
2020-04-20 22:15:54 +00:00
} ,
) ,
] ) ;
2019-07-29 14:24:02 +00:00
when ( mockDevice . sdkNameAndVersion ) . thenAnswer ( ( Invocation invocation ) async {
return ' Example ' ;
} ) ;
when ( mockDevice . targetPlatform ) . thenAnswer ( ( Invocation invocation ) async {
return TargetPlatform . android_arm ;
} ) ;
when ( mockDevice . isLocalEmulator ) . thenAnswer ( ( Invocation invocation ) async {
return false ;
} ) ;
final Completer < DebugConnectionInfo > onConnectionInfo = Completer < DebugConnectionInfo > . sync ( ) ;
final Completer < void > onAppStart = Completer < void > . sync ( ) ;
unawaited ( residentRunner . attach (
appStartedCompleter: onAppStart ,
connectionInfoCompleter: onConnectionInfo ,
) ) ;
2020-11-11 23:31:07 +00:00
await onAppStart . future ;
2019-07-29 14:24:02 +00:00
final OperationResult result = await residentRunner . restart ( fullRestart: false ) ;
expect ( result . fatal , false ) ;
expect ( result . code , 0 ) ;
2020-03-06 20:14:29 +00:00
expect ( verify ( globals . flutterUsage . sendEvent ( ' hot ' , ' reload ' ,
2019-07-29 14:24:02 +00:00
parameters: captureAnyNamed ( ' parameters ' ) ) ) . captured [ 0 ] ,
containsPair ( cdKey ( CustomDimensions . hotEventTargetPlatform ) ,
2019-09-24 06:06:09 +00:00
getNameForTargetPlatform ( TargetPlatform . android_arm ) ) ,
2019-07-29 14:24:02 +00:00
) ;
} , overrides: < Type , Generator > {
Usage: ( ) = > MockUsage ( ) ,
} ) ) ;
2020-07-20 21:03:44 +00:00
testUsingContext ( ' ResidentRunner can perform fast reassemble ' , ( ) = > testbed . run ( ( ) async {
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
listViews ,
FakeVmServiceRequest (
method: ' getVM ' ,
jsonResponse: fakeVM . toJson ( ) ,
) ,
listViews ,
2020-11-11 23:31:07 +00:00
setAssetBundlePath ,
2020-07-20 21:03:44 +00:00
listViews ,
FakeVmServiceRequest (
method: ' getVM ' ,
jsonResponse: fakeVM . toJson ( ) ,
) ,
const FakeVmServiceRequest (
method: ' reloadSources ' ,
args: < String , Object > {
' isolateId ' : ' 1 ' ,
' pause ' : false ,
2020-10-12 16:47:41 +00:00
' rootLibUri ' : ' main.dart.incremental.dill ' ,
2020-07-20 21:03:44 +00:00
} ,
jsonResponse: < String , Object > {
' type ' : ' ReloadReport ' ,
' success ' : true ,
' details ' : < String , Object > {
' loadedLibraryCount ' : 1 ,
} ,
} ,
) ,
FakeVmServiceRequest (
method: ' getIsolate ' ,
args: < String , Object > {
' isolateId ' : ' 1 ' ,
} ,
jsonResponse: fakeUnpausedIsolate . toJson ( ) ,
) ,
FakeVmServiceRequest (
method: ' ext.flutter.fastReassemble ' ,
args: < String , Object > {
' isolateId ' : fakeUnpausedIsolate . id ,
2020-09-19 18:02:04 +00:00
' className ' : ' FOO ' ,
2020-07-20 21:03:44 +00:00
} ,
) ,
] ) ;
final FakeFlutterDevice flutterDevice = FakeFlutterDevice (
mockDevice ,
BuildInfo . debug ,
FakeResidentCompiler ( ) ,
mockDevFS ,
) . . vmService = fakeVmServiceHost . vmService ;
residentRunner = HotRunner (
< FlutterDevice > [
flutterDevice ,
] ,
stayResident: false ,
debuggingOptions: DebuggingOptions . enabled ( BuildInfo . debug ) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2020-07-20 21:03:44 +00:00
) ;
when ( mockDevice . sdkNameAndVersion ) . thenAnswer ( ( Invocation invocation ) async {
return ' Example ' ;
} ) ;
when ( mockDevice . targetPlatform ) . thenAnswer ( ( Invocation invocation ) async {
return TargetPlatform . android_arm ;
} ) ;
when ( mockDevice . isLocalEmulator ) . thenAnswer ( ( Invocation invocation ) async {
return false ;
} ) ;
when ( mockDevice . getLogReader ( app: anyNamed ( ' app ' ) ) ) . thenReturn ( NoOpDeviceLogReader ( ' test ' ) ) ;
when ( mockDevFS . update (
mainUri: anyNamed ( ' mainUri ' ) ,
target: anyNamed ( ' target ' ) ,
bundle: anyNamed ( ' bundle ' ) ,
firstBuildTime: anyNamed ( ' firstBuildTime ' ) ,
bundleFirstUpload: anyNamed ( ' bundleFirstUpload ' ) ,
generator: anyNamed ( ' generator ' ) ,
fullRestart: anyNamed ( ' fullRestart ' ) ,
dillOutputPath: anyNamed ( ' dillOutputPath ' ) ,
trackWidgetCreation: anyNamed ( ' trackWidgetCreation ' ) ,
projectRootPath: anyNamed ( ' projectRootPath ' ) ,
pathToReload: anyNamed ( ' pathToReload ' ) ,
invalidatedFiles: anyNamed ( ' invalidatedFiles ' ) ,
packageConfig: anyNamed ( ' packageConfig ' ) ,
) ) . thenAnswer ( ( Invocation invocation ) async {
2020-10-27 16:20:05 +00:00
return UpdateFSReport (
success: true ,
fastReassembleClassName: ' FOO ' ,
invalidatedSourcesCount: 1 ,
) ;
2020-07-20 21:03:44 +00:00
} ) ;
final Completer < DebugConnectionInfo > onConnectionInfo = Completer < DebugConnectionInfo > . sync ( ) ;
final Completer < void > onAppStart = Completer < void > . sync ( ) ;
unawaited ( residentRunner . attach (
appStartedCompleter: onAppStart ,
connectionInfoCompleter: onConnectionInfo ,
) ) ;
2020-11-11 23:31:07 +00:00
await onAppStart . future ;
2020-07-20 21:03:44 +00:00
final OperationResult result = await residentRunner . restart ( fullRestart: false ) ;
expect ( result . fatal , false ) ;
expect ( result . code , 0 ) ;
2020-09-19 18:02:04 +00:00
verify ( globals . flutterUsage . sendEvent ( ' hot ' , ' reload ' , parameters: argThat (
containsPair ( ' cd48 ' , ' true ' ) ,
named: ' parameters ' ,
) ) ) . called ( 1 ) ;
2020-07-20 21:03:44 +00:00
} , overrides: < Type , Generator > {
FileSystem: ( ) = > MemoryFileSystem . test ( ) ,
Platform: ( ) = > FakePlatform ( operatingSystem: ' linux ' ) ,
ProjectFileInvalidator: ( ) = > FakeProjectFileInvalidator ( ) ,
2020-09-19 18:02:04 +00:00
Usage: ( ) = > MockUsage ( ) ,
FeatureFlags: ( ) = > TestFeatureFlags ( isSingleWidgetReloadEnabled: true ) ,
2020-07-20 21:03:44 +00:00
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' ResidentRunner can send target platform to analytics from full restart ' , ( ) = > testbed . run ( ( ) async {
2020-04-20 22:15:54 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
2020-05-05 19:09:51 +00:00
listViews ,
listViews ,
listViews ,
2020-10-27 16:20:05 +00:00
setAssetBundlePath ,
2020-04-28 00:41:42 +00:00
FakeVmServiceRequest (
method: ' getIsolate ' ,
args: < String , Object > {
' isolateId ' : fakeUnpausedIsolate . id ,
} ,
jsonResponse: fakeUnpausedIsolate . toJson ( ) ,
) ,
FakeVmServiceRequest (
method: ' getVM ' ,
jsonResponse: vm_service . VM . parse ( < String , Object > { } ) . toJson ( ) ,
) ,
2020-05-05 19:09:51 +00:00
listViews ,
2020-04-28 00:41:42 +00:00
const FakeVmServiceRequest (
2020-04-20 22:15:54 +00:00
method: ' streamListen ' ,
args: < String , Object > {
' streamId ' : ' Isolate ' ,
} ,
) ,
2020-04-28 00:41:42 +00:00
FakeVmServiceRequest (
2020-04-20 22:15:54 +00:00
method: kRunInViewMethod ,
args: < String , Object > {
2020-04-28 00:41:42 +00:00
' viewId ' : fakeFlutterView . id ,
2020-10-12 16:47:41 +00:00
' mainScript ' : ' main.dart.dill ' ,
2020-04-20 22:15:54 +00:00
' assetDirectory ' : ' build/flutter_assets ' ,
} ,
) ,
FakeVmServiceStreamResponse (
streamId: ' Isolate ' ,
event: vm_service . Event (
timestamp: 0 ,
kind: vm_service . EventKind . kIsolateRunnable ,
)
)
] ) ;
2019-07-30 19:18:15 +00:00
when ( mockDevice . sdkNameAndVersion ) . thenAnswer ( ( Invocation invocation ) async {
return ' Example ' ;
} ) ;
when ( mockDevice . targetPlatform ) . thenAnswer ( ( Invocation invocation ) async {
return TargetPlatform . android_arm ;
} ) ;
when ( mockDevice . isLocalEmulator ) . thenAnswer ( ( Invocation invocation ) async {
return false ;
} ) ;
when ( mockDevice . supportsHotRestart ) . thenReturn ( true ) ;
final Completer < DebugConnectionInfo > onConnectionInfo = Completer < DebugConnectionInfo > . sync ( ) ;
final Completer < void > onAppStart = Completer < void > . sync ( ) ;
unawaited ( residentRunner . attach (
appStartedCompleter: onAppStart ,
connectionInfoCompleter: onConnectionInfo ,
) ) ;
final OperationResult result = await residentRunner . restart ( fullRestart: true ) ;
expect ( result . fatal , false ) ;
expect ( result . code , 0 ) ;
2020-03-06 20:14:29 +00:00
expect ( verify ( globals . flutterUsage . sendEvent ( ' hot ' , ' restart ' ,
2019-07-30 19:18:15 +00:00
parameters: captureAnyNamed ( ' parameters ' ) ) ) . captured [ 0 ] ,
containsPair ( cdKey ( CustomDimensions . hotEventTargetPlatform ) ,
2019-09-24 06:06:09 +00:00
getNameForTargetPlatform ( TargetPlatform . android_arm ) ) ,
2019-07-30 19:18:15 +00:00
) ;
2020-05-05 19:09:51 +00:00
expect ( fakeVmServiceHost . hasRemainingExpectations , false ) ;
2019-07-30 19:18:15 +00:00
} , overrides: < Type , Generator > {
Usage: ( ) = > MockUsage ( ) ,
} ) ) ;
2020-07-24 22:34:55 +00:00
testUsingContext ( ' ResidentRunner can remove breakpoints from paused isolate during hot restart ' , ( ) = > testbed . run ( ( ) async {
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
listViews ,
listViews ,
listViews ,
2020-10-27 16:20:05 +00:00
setAssetBundlePath ,
2020-07-24 22:34:55 +00:00
FakeVmServiceRequest (
method: ' getIsolate ' ,
args: < String , Object > {
' isolateId ' : fakeUnpausedIsolate . id ,
} ,
jsonResponse: fakePausedIsolate . toJson ( ) ,
) ,
FakeVmServiceRequest (
method: ' getVM ' ,
jsonResponse: vm_service . VM . parse ( < String , Object > { } ) . toJson ( ) ,
) ,
const FakeVmServiceRequest (
method: ' removeBreakpoint ' ,
args: < String , String > {
' isolateId ' : ' 1 ' ,
' breakpointId ' : ' test-breakpoint ' ,
}
) ,
const FakeVmServiceRequest (
method: ' resume ' ,
args: < String , String > {
' isolateId ' : ' 1 ' ,
}
) ,
listViews ,
const FakeVmServiceRequest (
method: ' streamListen ' ,
args: < String , Object > {
' streamId ' : ' Isolate ' ,
} ,
) ,
FakeVmServiceRequest (
method: kRunInViewMethod ,
args: < String , Object > {
' viewId ' : fakeFlutterView . id ,
2020-10-12 16:47:41 +00:00
' mainScript ' : ' main.dart.dill ' ,
2020-07-24 22:34:55 +00:00
' assetDirectory ' : ' build/flutter_assets ' ,
} ,
) ,
FakeVmServiceStreamResponse (
streamId: ' Isolate ' ,
event: vm_service . Event (
timestamp: 0 ,
kind: vm_service . EventKind . kIsolateRunnable ,
)
)
] ) ;
when ( mockDevice . sdkNameAndVersion ) . thenAnswer ( ( Invocation invocation ) async {
return ' Example ' ;
} ) ;
when ( mockDevice . targetPlatform ) . thenAnswer ( ( Invocation invocation ) async {
return TargetPlatform . android_arm ;
} ) ;
when ( mockDevice . isLocalEmulator ) . thenAnswer ( ( Invocation invocation ) async {
return false ;
} ) ;
when ( mockDevice . supportsHotRestart ) . thenReturn ( true ) ;
final Completer < DebugConnectionInfo > onConnectionInfo = Completer < DebugConnectionInfo > . sync ( ) ;
final Completer < void > onAppStart = Completer < void > . sync ( ) ;
unawaited ( residentRunner . attach (
appStartedCompleter: onAppStart ,
connectionInfoCompleter: onConnectionInfo ,
) ) ;
final OperationResult result = await residentRunner . restart ( fullRestart: true ) ;
expect ( result . isOk , true ) ;
expect ( fakeVmServiceHost . hasRemainingExpectations , false ) ;
} ) ) ;
2020-09-09 22:56:25 +00:00
testUsingContext ( ' ResidentRunner will alternative the name of the dill file uploaded for a hot restart ' , ( ) = > testbed . run ( ( ) async {
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
listViews ,
listViews ,
listViews ,
2020-10-27 16:20:05 +00:00
setAssetBundlePath ,
2020-09-09 22:56:25 +00:00
FakeVmServiceRequest (
method: ' getIsolate ' ,
args: < String , Object > {
' isolateId ' : fakeUnpausedIsolate . id ,
} ,
jsonResponse: fakeUnpausedIsolate . toJson ( ) ,
) ,
FakeVmServiceRequest (
method: ' getVM ' ,
jsonResponse: vm_service . VM . parse ( < String , Object > { } ) . toJson ( ) ,
) ,
listViews ,
const FakeVmServiceRequest (
method: ' streamListen ' ,
args: < String , Object > {
' streamId ' : ' Isolate ' ,
} ,
) ,
FakeVmServiceRequest (
method: kRunInViewMethod ,
args: < String , Object > {
' viewId ' : fakeFlutterView . id ,
2020-10-12 16:47:41 +00:00
' mainScript ' : ' main.dart.dill ' ,
2020-09-09 22:56:25 +00:00
' assetDirectory ' : ' build/flutter_assets ' ,
} ,
) ,
FakeVmServiceStreamResponse (
streamId: ' Isolate ' ,
event: vm_service . Event (
timestamp: 0 ,
kind: vm_service . EventKind . kIsolateRunnable ,
) ,
) ,
listViews ,
FakeVmServiceRequest (
method: ' getIsolate ' ,
args: < String , Object > {
' isolateId ' : fakeUnpausedIsolate . id ,
} ,
jsonResponse: fakeUnpausedIsolate . toJson ( ) ,
) ,
FakeVmServiceRequest (
method: ' getVM ' ,
jsonResponse: vm_service . VM . parse ( < String , Object > { } ) . toJson ( ) ,
) ,
listViews ,
const FakeVmServiceRequest (
method: ' streamListen ' ,
args: < String , Object > {
' streamId ' : ' Isolate ' ,
} ,
) ,
FakeVmServiceRequest (
method: kRunInViewMethod ,
args: < String , Object > {
' viewId ' : fakeFlutterView . id ,
2020-10-12 16:47:41 +00:00
' mainScript ' : ' main.dart.swap.dill ' ,
2020-09-09 22:56:25 +00:00
' assetDirectory ' : ' build/flutter_assets ' ,
} ,
) ,
FakeVmServiceStreamResponse (
streamId: ' Isolate ' ,
event: vm_service . Event (
timestamp: 0 ,
kind: vm_service . EventKind . kIsolateRunnable ,
) ,
) ,
listViews ,
FakeVmServiceRequest (
method: ' getIsolate ' ,
args: < String , Object > {
' isolateId ' : fakeUnpausedIsolate . id ,
} ,
jsonResponse: fakeUnpausedIsolate . toJson ( ) ,
) ,
FakeVmServiceRequest (
method: ' getVM ' ,
jsonResponse: vm_service . VM . parse ( < String , Object > { } ) . toJson ( ) ,
) ,
listViews ,
const FakeVmServiceRequest (
method: ' streamListen ' ,
args: < String , Object > {
' streamId ' : ' Isolate ' ,
} ,
) ,
FakeVmServiceRequest (
method: kRunInViewMethod ,
args: < String , Object > {
' viewId ' : fakeFlutterView . id ,
2020-10-12 16:47:41 +00:00
' mainScript ' : ' main.dart.dill ' ,
2020-09-09 22:56:25 +00:00
' assetDirectory ' : ' build/flutter_assets ' ,
} ,
) ,
FakeVmServiceStreamResponse (
streamId: ' Isolate ' ,
event: vm_service . Event (
timestamp: 0 ,
kind: vm_service . EventKind . kIsolateRunnable ,
) ,
)
] ) ;
when ( mockDevice . sdkNameAndVersion ) . thenAnswer ( ( Invocation invocation ) async {
return ' Example ' ;
} ) ;
when ( mockDevice . targetPlatform ) . thenAnswer ( ( Invocation invocation ) async {
return TargetPlatform . android_arm ;
} ) ;
when ( mockDevice . isLocalEmulator ) . thenAnswer ( ( Invocation invocation ) async {
return false ;
} ) ;
when ( mockDevice . supportsHotRestart ) . thenReturn ( true ) ;
final Completer < DebugConnectionInfo > onConnectionInfo = Completer < DebugConnectionInfo > . sync ( ) ;
final Completer < void > onAppStart = Completer < void > . sync ( ) ;
unawaited ( residentRunner . attach (
appStartedCompleter: onAppStart ,
connectionInfoCompleter: onConnectionInfo ,
) ) ;
await residentRunner . restart ( fullRestart: true ) ;
await residentRunner . restart ( fullRestart: true ) ;
await residentRunner . restart ( fullRestart: true ) ;
expect ( fakeVmServiceHost . hasRemainingExpectations , false ) ;
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' ResidentRunner Can handle an RPC exception from hot restart ' , ( ) = > testbed . run ( ( ) async {
2020-05-05 19:09:51 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
listViews ,
listViews ,
2020-10-27 16:20:05 +00:00
setAssetBundlePath ,
2020-05-05 19:09:51 +00:00
] ) ;
2019-07-18 17:40:40 +00:00
when ( mockDevice . sdkNameAndVersion ) . thenAnswer ( ( Invocation invocation ) async {
return ' Example ' ;
} ) ;
when ( mockDevice . targetPlatform ) . thenAnswer ( ( Invocation invocation ) async {
return TargetPlatform . android_arm ;
} ) ;
when ( mockDevice . isLocalEmulator ) . thenAnswer ( ( Invocation invocation ) async {
return false ;
} ) ;
when ( mockDevice . supportsHotRestart ) . thenReturn ( true ) ;
final Completer < DebugConnectionInfo > onConnectionInfo = Completer < DebugConnectionInfo > . sync ( ) ;
final Completer < void > onAppStart = Completer < void > . sync ( ) ;
unawaited ( residentRunner . attach (
appStartedCompleter: onAppStart ,
connectionInfoCompleter: onConnectionInfo ,
) ) ;
await onAppStart . future ;
when ( mockFlutterDevice . updateDevFS (
2020-04-20 21:02:49 +00:00
mainUri: anyNamed ( ' mainUri ' ) ,
2019-07-18 17:40:40 +00:00
target: anyNamed ( ' target ' ) ,
bundle: anyNamed ( ' bundle ' ) ,
firstBuildTime: anyNamed ( ' firstBuildTime ' ) ,
bundleFirstUpload: anyNamed ( ' bundleFirstUpload ' ) ,
bundleDirty: anyNamed ( ' bundleDirty ' ) ,
fullRestart: anyNamed ( ' fullRestart ' ) ,
projectRootPath: anyNamed ( ' projectRootPath ' ) ,
pathToReload: anyNamed ( ' pathToReload ' ) ,
invalidatedFiles: anyNamed ( ' invalidatedFiles ' ) ,
2019-07-31 23:19:22 +00:00
dillOutputPath: anyNamed ( ' dillOutputPath ' ) ,
2020-04-20 21:02:49 +00:00
packageConfig: anyNamed ( ' packageConfig ' ) ,
2020-04-08 19:33:33 +00:00
) ) . thenThrow ( vm_service . RPCError ( ' something bad happened ' , 666 , ' ' ) ) ;
2019-07-18 17:40:40 +00:00
final OperationResult result = await residentRunner . restart ( fullRestart: true ) ;
expect ( result . fatal , true ) ;
expect ( result . code , 1 ) ;
2020-03-06 20:14:29 +00:00
verify ( globals . flutterUsage . sendEvent ( ' hot ' , ' exception ' , parameters: < String , String > {
2019-07-29 14:24:02 +00:00
cdKey ( CustomDimensions . hotEventTargetPlatform ) :
getNameForTargetPlatform ( TargetPlatform . android_arm ) ,
cdKey ( CustomDimensions . hotEventSdkName ) : ' Example ' ,
cdKey ( CustomDimensions . hotEventEmulator ) : ' false ' ,
cdKey ( CustomDimensions . hotEventFullRestart ) : ' true ' ,
2019-07-18 17:40:40 +00:00
} ) ) . called ( 1 ) ;
2020-05-05 19:09:51 +00:00
expect ( fakeVmServiceHost . hasRemainingExpectations , false ) ;
2019-07-18 17:40:40 +00:00
} , overrides: < Type , Generator > {
Usage: ( ) = > MockUsage ( ) ,
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' ResidentRunner uses temp directory when there is no output dill path ' , ( ) = > testbed . run ( ( ) {
2020-04-20 22:15:54 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
2019-10-07 23:43:04 +00:00
expect ( residentRunner . artifactDirectory . path , contains ( ' flutter_tool. ' ) ) ;
2019-09-11 19:57:43 +00:00
final ResidentRunner otherRunner = HotRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
debuggingOptions: DebuggingOptions . enabled ( BuildInfo . debug ) ,
2020-01-06 19:04:20 +00:00
dillOutputPath: globals . fs . path . join ( ' foobar ' , ' app.dill ' ) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2019-09-11 19:57:43 +00:00
) ;
expect ( otherRunner . artifactDirectory . path , contains ( ' foobar ' ) ) ;
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' ResidentRunner deletes artifact directory on preExit ' , ( ) = > testbed . run ( ( ) async {
2020-05-29 22:43:03 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
2020-06-04 17:17:43 +00:00
residentRunner . artifactDirectory . childFile ( ' app.dill ' ) . createSync ( ) ;
2020-05-29 22:43:03 +00:00
await residentRunner . preExit ( ) ;
2020-06-04 17:17:43 +00:00
expect ( residentRunner . artifactDirectory , isNot ( exists ) ) ;
2020-05-29 22:43:03 +00:00
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' ResidentRunner can run source generation ' , ( ) = > testbed . run ( ( ) async {
2020-09-03 16:26:58 +00:00
final File arbFile = globals . fs . file ( globals . fs . path . join ( ' lib ' , ' l10n ' , ' app_en.arb ' ) )
. . createSync ( recursive: true ) ;
2020-10-15 22:37:04 +00:00
arbFile . writeAsStringSync ( '''
{
2020-09-03 16:26:58 +00:00
" helloWorld " : " Hello, World! " ,
" @helloWorld " : {
" description " : " Sample description "
}
} ''' );
2020-05-18 19:47:18 +00:00
globals . fs . file ( ' l10n.yaml ' ) . createSync ( ) ;
2020-08-31 05:19:41 +00:00
globals . fs . file ( ' pubspec.yaml ' ) . writeAsStringSync ( ' flutter: \n generate: true \n ' ) ;
2020-05-18 19:47:18 +00:00
await residentRunner . runSourceGenerators ( ) ;
expect ( testLogger . errorText , isEmpty ) ;
2020-11-06 00:24:02 +00:00
expect ( testLogger . statusText , isEmpty ) ;
2020-05-18 19:47:18 +00:00
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' ResidentRunner can run source generation - generation fails ' , ( ) = > testbed . run ( ( ) async {
2020-09-03 16:26:58 +00:00
// Intentionally define arb file with wrong name. generate_localizations defaults
// to app_en.arb.
final File arbFile = globals . fs . file ( globals . fs . path . join ( ' lib ' , ' l10n ' , ' foo.arb ' ) )
. . createSync ( recursive: true ) ;
2020-10-15 22:37:04 +00:00
arbFile . writeAsStringSync ( '''
{
2020-09-03 16:26:58 +00:00
" helloWorld " : " Hello, World! " ,
" @helloWorld " : {
" description " : " Sample description "
}
} ''' );
2020-05-18 19:47:18 +00:00
globals . fs . file ( ' l10n.yaml ' ) . createSync ( ) ;
2020-08-31 05:19:41 +00:00
globals . fs . file ( ' pubspec.yaml ' ) . writeAsStringSync ( ' flutter: \n generate: true \n ' ) ;
2020-05-18 19:47:18 +00:00
await residentRunner . runSourceGenerators ( ) ;
2020-09-03 16:26:58 +00:00
expect ( testLogger . errorText , allOf ( contains ( ' Exception ' ) ) ) ;
expect ( testLogger . statusText , isEmpty ) ;
2020-05-18 19:47:18 +00:00
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' ResidentRunner printHelpDetails ' , ( ) = > testbed . run ( ( ) {
2020-04-20 22:15:54 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
2019-07-18 17:40:40 +00:00
when ( mockDevice . supportsHotRestart ) . thenReturn ( true ) ;
when ( mockDevice . supportsScreenshot ) . thenReturn ( true ) ;
residentRunner . printHelp ( details: true ) ;
2020-01-11 00:53:01 +00:00
final CommandHelp commandHelp = residentRunner . commandHelp ;
2019-07-18 17:40:40 +00:00
// supports service protocol
expect ( residentRunner . supportsServiceProtocol , true ) ;
// isRunningDebug
expect ( residentRunner . isRunningDebug , true ) ;
2020-04-07 19:17:39 +00:00
// does support SkSL
expect ( residentRunner . supportsWriteSkSL , true ) ;
2020-01-09 16:18:03 +00:00
// commands
expect ( testLogger . statusText , equals (
< dynamic > [
' Flutter run key commands. ' ,
2020-01-11 00:53:01 +00:00
commandHelp . r ,
commandHelp . R ,
commandHelp . h ,
2020-02-06 23:53:04 +00:00
commandHelp . c ,
2020-01-11 00:53:01 +00:00
commandHelp . q ,
commandHelp . s ,
2020-06-18 17:32:43 +00:00
commandHelp . b ,
2020-01-11 00:53:01 +00:00
commandHelp . w ,
commandHelp . t ,
commandHelp . L ,
commandHelp . S ,
commandHelp . U ,
commandHelp . i ,
2020-07-13 21:03:23 +00:00
commandHelp . I ,
2020-01-11 00:53:01 +00:00
commandHelp . p ,
commandHelp . o ,
commandHelp . z ,
2020-05-18 19:47:18 +00:00
commandHelp . g ,
2020-04-07 19:17:39 +00:00
commandHelp . M ,
2020-04-05 02:51:01 +00:00
commandHelp . v ,
2020-01-11 00:53:01 +00:00
commandHelp . P ,
commandHelp . a ,
2020-01-09 16:18:03 +00:00
' An Observatory debugger and profiler on null is available at: null ' ,
2020-11-20 19:53:02 +00:00
' \n 💪 Running with sound null safety 💪 ' ,
2020-01-09 16:18:03 +00:00
' '
] . join ( ' \n ' )
) ) ;
2019-07-18 17:40:40 +00:00
} ) ) ;
2020-09-03 00:33:41 +00:00
testUsingContext ( ' ResidentRunner printHelpDetails cold runner ' , ( ) = > testbed . run ( ( ) {
when ( mockDevice . supportsHotRestart ) . thenReturn ( true ) ;
when ( mockDevice . supportsScreenshot ) . thenReturn ( true ) ;
fakeVmServiceHost = null ;
residentRunner = ColdRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
debuggingOptions: DebuggingOptions . disabled ( BuildInfo . release ) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2020-09-03 00:33:41 +00:00
) ;
residentRunner . printHelp ( details: true ) ;
final CommandHelp commandHelp = residentRunner . commandHelp ;
// does not supports service protocol
expect ( residentRunner . supportsServiceProtocol , false ) ;
// isRunningDebug
expect ( residentRunner . isRunningDebug , false ) ;
// does support SkSL
expect ( residentRunner . supportsWriteSkSL , false ) ;
// commands
expect ( testLogger . statusText , equals (
< dynamic > [
' Flutter run key commands. ' ,
commandHelp . s ,
commandHelp . h ,
commandHelp . c ,
commandHelp . q ,
' '
] . join ( ' \n ' )
) ) ;
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' ResidentRunner handles writeSkSL returning no data ' , ( ) = > testbed . run ( ( ) async {
2020-04-20 22:15:54 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
2020-05-05 19:09:51 +00:00
listViews ,
FakeVmServiceRequest (
2020-04-20 22:15:54 +00:00
method: kGetSkSLsMethod ,
args: < String , Object > {
2020-04-28 00:41:42 +00:00
' viewId ' : fakeFlutterView . id ,
2020-04-20 22:15:54 +00:00
} ,
jsonResponse: < String , Object > {
' SkSLs ' : < String , Object > { }
}
2020-05-05 19:09:51 +00:00
) ,
2020-04-20 22:15:54 +00:00
] ) ;
2020-04-07 19:17:39 +00:00
await residentRunner . writeSkSL ( ) ;
2020-10-12 16:31:02 +00:00
expect ( testLogger . statusText , contains ( ' No data was received ' ) ) ;
2020-05-05 19:09:51 +00:00
expect ( fakeVmServiceHost . hasRemainingExpectations , false ) ;
2020-04-07 19:17:39 +00:00
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' ResidentRunner can write SkSL data to a unique file with engine revision, platform, and device name ' , ( ) = > testbed . run ( ( ) async {
2020-04-20 22:15:54 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
2020-05-05 19:09:51 +00:00
listViews ,
2020-04-28 00:41:42 +00:00
FakeVmServiceRequest (
2020-04-20 22:15:54 +00:00
method: kGetSkSLsMethod ,
args: < String , Object > {
2020-04-28 00:41:42 +00:00
' viewId ' : fakeFlutterView . id ,
2020-04-20 22:15:54 +00:00
} ,
jsonResponse: < String , Object > {
' SkSLs ' : < String , Object > {
' A ' : ' B ' ,
}
}
)
] ) ;
2020-04-07 19:17:39 +00:00
when ( mockDevice . targetPlatform ) . thenAnswer ( ( Invocation invocation ) async {
return TargetPlatform . android_arm ;
} ) ;
when ( mockDevice . name ) . thenReturn ( ' test device ' ) ;
await residentRunner . writeSkSL ( ) ;
2020-05-08 16:44:03 +00:00
expect ( testLogger . statusText , contains ( ' flutter_01.sksl.json ' ) ) ;
expect ( globals . fs . file ( ' flutter_01.sksl.json ' ) , exists ) ;
expect ( json . decode ( globals . fs . file ( ' flutter_01.sksl.json ' ) . readAsStringSync ( ) ) , < String , Object > {
2020-04-30 20:39:08 +00:00
' platform ' : ' android ' ,
2020-04-07 19:17:39 +00:00
' name ' : ' test device ' ,
' engineRevision ' : ' 42.2 ' , // From FakeFlutterVersion
' data ' : < String , Object > { ' A ' : ' B ' }
} ) ;
2020-04-20 22:15:54 +00:00
expect ( fakeVmServiceHost . hasRemainingExpectations , false ) ;
2020-06-24 17:23:59 +00:00
} , overrides: < Type , Generator > {
FileSystemUtils: ( ) = > FileSystemUtils (
fileSystem: globals . fs ,
platform: globals . platform ,
)
2020-04-07 19:17:39 +00:00
} ) ) ;
2020-07-29 02:46:05 +00:00
testUsingContext ( ' ResidentRunner invokes DevtoolsLauncher when launching and shutting down Devtools ' , ( ) = > testbed . run ( ( ) async {
when ( mockFlutterDevice . vmService ) . thenReturn ( fakeVmServiceHost . vmService ) ;
setHttpAddress ( testUri , fakeVmServiceHost . vmService ) ;
await residentRunner . launchDevTools ( ) ;
verify ( mockDevtoolsLauncher . launch ( testUri ) ) . called ( 1 ) ;
await residentRunner . shutdownDevtools ( ) ;
verify ( mockDevtoolsLauncher . close ( ) ) . called ( 1 ) ;
} ) , overrides: < Type , Generator > {
DevtoolsLauncher: ( ) = > mockDevtoolsLauncher ,
} ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' ResidentRunner can take screenshot on debug device ' , ( ) = > testbed . run ( ( ) async {
2020-04-20 22:15:54 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
2020-05-05 19:09:51 +00:00
listViews ,
2020-04-28 00:41:42 +00:00
FakeVmServiceRequest (
2020-04-20 22:15:54 +00:00
method: ' ext.flutter.debugAllowBanner ' ,
args: < String , Object > {
2020-04-28 00:41:42 +00:00
' isolateId ' : fakeUnpausedIsolate . id ,
2020-04-20 22:15:54 +00:00
' enabled ' : ' false ' ,
} ,
) ,
2020-04-28 00:41:42 +00:00
FakeVmServiceRequest (
2020-04-20 22:15:54 +00:00
method: ' ext.flutter.debugAllowBanner ' ,
args: < String , Object > {
2020-04-28 00:41:42 +00:00
' isolateId ' : fakeUnpausedIsolate . id ,
2020-04-20 22:15:54 +00:00
' enabled ' : ' true ' ,
} ,
)
] ) ;
2019-07-18 17:40:40 +00:00
when ( mockDevice . supportsScreenshot ) . thenReturn ( true ) ;
when ( mockDevice . takeScreenshot ( any ) )
2019-09-24 19:03:37 +00:00
. thenAnswer ( ( Invocation invocation ) async {
2019-11-24 05:54:43 +00:00
final File file = invocation . positionalArguments . first as File ;
2019-09-24 19:03:37 +00:00
file . writeAsBytesSync ( List < int > . generate ( 1024 , ( int i ) = > i ) ) ;
} ) ;
2017-05-21 22:15:44 +00:00
2019-07-18 17:40:40 +00:00
await residentRunner . screenshot ( mockFlutterDevice ) ;
2019-01-18 18:09:44 +00:00
2019-11-24 05:54:43 +00:00
expect ( testLogger . statusText , contains ( ' 1kB ' ) ) ;
2020-04-20 22:15:54 +00:00
expect ( fakeVmServiceHost . hasRemainingExpectations , false ) ;
2019-07-18 17:40:40 +00:00
} ) ) ;
2017-05-21 22:15:44 +00:00
2020-09-03 00:33:41 +00:00
testUsingContext ( ' ResidentRunner can take screenshot on release device ' , ( ) = > testbed . run ( ( ) async {
when ( mockDevice . supportsScreenshot ) . thenReturn ( true ) ;
when ( mockDevice . takeScreenshot ( any ) )
. thenAnswer ( ( Invocation invocation ) async {
final File file = invocation . positionalArguments . first as File ;
file . writeAsBytesSync ( List < int > . generate ( 1024 , ( int i ) = > i ) ) ;
} ) ;
residentRunner = ColdRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
debuggingOptions: DebuggingOptions . disabled ( BuildInfo . release ) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2020-09-03 00:33:41 +00:00
) ;
await residentRunner . screenshot ( mockFlutterDevice ) ;
expect ( testLogger . statusText , contains ( ' 1kB ' ) ) ;
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' ResidentRunner clears the screen when it should ' , ( ) = > testbed . run ( ( ) async {
2020-04-20 22:15:54 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
2020-02-06 23:53:04 +00:00
const String message = ' This should be cleared ' ;
expect ( testLogger . statusText , equals ( ' ' ) ) ;
testLogger . printStatus ( message ) ;
expect ( testLogger . statusText , equals ( message + ' \n ' ) ) ; // printStatus makes a newline
residentRunner . clearScreen ( ) ;
expect ( testLogger . statusText , equals ( ' ' ) ) ;
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' ResidentRunner bails taking screenshot on debug device if debugAllowBanner throws RpcError ' , ( ) = > testbed . run ( ( ) async {
2020-04-20 22:15:54 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
2020-05-05 19:09:51 +00:00
listViews ,
2020-04-28 00:41:42 +00:00
FakeVmServiceRequest (
2020-04-20 22:15:54 +00:00
method: ' ext.flutter.debugAllowBanner ' ,
args: < String , Object > {
2020-04-28 00:41:42 +00:00
' isolateId ' : fakeUnpausedIsolate . id ,
2020-04-20 22:15:54 +00:00
' enabled ' : ' false ' ,
} ,
// Failed response,
errorCode: RPCErrorCodes . kInternalError ,
)
] ) ;
2019-07-18 17:40:40 +00:00
when ( mockDevice . supportsScreenshot ) . thenReturn ( true ) ;
2020-04-20 22:15:54 +00:00
await residentRunner . screenshot ( mockFlutterDevice ) ;
2019-07-18 17:40:40 +00:00
2020-04-20 22:15:54 +00:00
expect ( testLogger . errorText , contains ( ' Error ' ) ) ;
expect ( fakeVmServiceHost . hasRemainingExpectations , false ) ;
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' ResidentRunner bails taking screenshot on debug device if debugAllowBanner during second request ' , ( ) = > testbed . run ( ( ) async {
2020-04-20 22:15:54 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
2020-05-05 19:09:51 +00:00
listViews ,
2020-04-28 00:41:42 +00:00
FakeVmServiceRequest (
2020-04-20 22:15:54 +00:00
method: ' ext.flutter.debugAllowBanner ' ,
args: < String , Object > {
2020-04-28 00:41:42 +00:00
' isolateId ' : fakeUnpausedIsolate . id ,
2020-04-20 22:15:54 +00:00
' enabled ' : ' false ' ,
} ,
) ,
2020-04-28 00:41:42 +00:00
FakeVmServiceRequest (
2020-04-20 22:15:54 +00:00
method: ' ext.flutter.debugAllowBanner ' ,
args: < String , Object > {
2020-04-28 00:41:42 +00:00
' isolateId ' : fakeUnpausedIsolate . id ,
2020-04-20 22:15:54 +00:00
' enabled ' : ' true ' ,
} ,
// Failed response,
errorCode: RPCErrorCodes . kInternalError ,
)
] ) ;
when ( mockDevice . supportsScreenshot ) . thenReturn ( true ) ;
2019-07-18 17:40:40 +00:00
await residentRunner . screenshot ( mockFlutterDevice ) ;
2019-11-24 05:54:43 +00:00
expect ( testLogger . errorText , contains ( ' Error ' ) ) ;
2020-05-05 19:09:51 +00:00
expect ( fakeVmServiceHost . hasRemainingExpectations , false ) ;
2019-07-18 17:40:40 +00:00
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' ResidentRunner bails taking screenshot on debug device if takeScreenshot throws ' , ( ) = > testbed . run ( ( ) async {
2020-04-20 22:15:54 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
2020-05-05 19:09:51 +00:00
listViews ,
2020-04-28 00:41:42 +00:00
FakeVmServiceRequest (
2020-04-20 22:15:54 +00:00
method: ' ext.flutter.debugAllowBanner ' ,
args: < String , Object > {
2020-04-28 00:41:42 +00:00
' isolateId ' : fakeUnpausedIsolate . id ,
2020-04-20 22:15:54 +00:00
' enabled ' : ' false ' ,
} ,
) ,
2020-04-28 00:41:42 +00:00
FakeVmServiceRequest (
2020-04-20 22:15:54 +00:00
method: ' ext.flutter.debugAllowBanner ' ,
args: < String , Object > {
2020-04-28 00:41:42 +00:00
' isolateId ' : fakeUnpausedIsolate . id ,
2020-04-20 22:15:54 +00:00
' enabled ' : ' true ' ,
} ,
) ,
] ) ;
2019-07-18 17:40:40 +00:00
when ( mockDevice . supportsScreenshot ) . thenReturn ( true ) ;
when ( mockDevice . takeScreenshot ( any ) ) . thenThrow ( Exception ( ) ) ;
await residentRunner . screenshot ( mockFlutterDevice ) ;
2019-11-24 05:54:43 +00:00
expect ( testLogger . errorText , contains ( ' Error ' ) ) ;
2019-07-18 17:40:40 +00:00
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( " ResidentRunner can't take screenshot on device without support " , ( ) = > testbed . run ( ( ) {
2020-04-20 22:15:54 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
2019-07-18 17:40:40 +00:00
when ( mockDevice . supportsScreenshot ) . thenReturn ( false ) ;
expect ( ( ) = > residentRunner . screenshot ( mockFlutterDevice ) ,
2020-01-27 22:36:02 +00:00
throwsAssertionError ) ;
2020-05-05 19:09:51 +00:00
expect ( fakeVmServiceHost . hasRemainingExpectations , false ) ;
2019-07-18 17:40:40 +00:00
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' ResidentRunner does not toggle banner in non-debug mode ' , ( ) = > testbed . run ( ( ) async {
2020-09-03 00:33:41 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
2019-07-18 17:40:40 +00:00
residentRunner = HotRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
debuggingOptions: DebuggingOptions . disabled ( BuildInfo . release ) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2019-07-18 17:40:40 +00:00
) ;
when ( mockDevice . supportsScreenshot ) . thenReturn ( true ) ;
when ( mockDevice . takeScreenshot ( any ) )
2019-09-24 19:03:37 +00:00
. thenAnswer ( ( Invocation invocation ) async {
2019-11-24 05:54:43 +00:00
final File file = invocation . positionalArguments . first as File ;
2019-09-24 19:03:37 +00:00
file . writeAsBytesSync ( List < int > . generate ( 1024 , ( int i ) = > i ) ) ;
} ) ;
2019-07-18 17:40:40 +00:00
await residentRunner . screenshot ( mockFlutterDevice ) ;
2019-11-24 05:54:43 +00:00
expect ( testLogger . statusText , contains ( ' 1kB ' ) ) ;
2020-04-20 22:15:54 +00:00
expect ( fakeVmServiceHost . hasRemainingExpectations , false ) ;
2019-07-18 17:40:40 +00:00
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' FlutterDevice will not exit a paused isolate ' , ( ) = > testbed . run ( ( ) async {
2020-04-28 00:41:42 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
FakeVmServiceRequest (
method: ' _flutter.listViews ' ,
jsonResponse: < String , Object > {
' views ' : < Object > [
fakeFlutterView . toJson ( ) ,
] ,
} ,
) ,
FakeVmServiceRequest (
method: ' getIsolate ' ,
args: < String , Object > {
' isolateId ' : fakeUnpausedIsolate . id ,
} ,
jsonResponse: fakePausedIsolate . toJson ( ) ,
) ,
] ) ;
2019-07-18 17:40:40 +00:00
final TestFlutterDevice flutterDevice = TestFlutterDevice (
mockDevice ,
) ;
2020-04-20 22:15:54 +00:00
flutterDevice . vmService = fakeVmServiceHost . vmService ;
2019-07-18 17:40:40 +00:00
when ( mockDevice . supportsFlutterExit ) . thenReturn ( true ) ;
await flutterDevice . exitApps ( ) ;
2020-06-08 18:28:02 +00:00
verify ( mockDevice . stopApp ( any , userIdentifier: anyNamed ( ' userIdentifier ' ) ) ) . called ( 1 ) ;
2020-04-20 22:15:54 +00:00
expect ( fakeVmServiceHost . hasRemainingExpectations , false ) ;
2019-07-18 17:40:40 +00:00
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' FlutterDevice can exit from a release mode isolate with no VmService ' , ( ) = > testbed . run ( ( ) async {
2020-05-05 19:09:51 +00:00
final TestFlutterDevice flutterDevice = TestFlutterDevice (
mockDevice ,
) ;
when ( mockDevice . supportsFlutterExit ) . thenReturn ( true ) ;
await flutterDevice . exitApps ( ) ;
2020-06-08 18:28:02 +00:00
verify ( mockDevice . stopApp ( any , userIdentifier: anyNamed ( ' userIdentifier ' ) ) ) . called ( 1 ) ;
2020-05-05 19:09:51 +00:00
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' FlutterDevice will call stopApp if the exit request times out ' , ( ) = > testbed . run ( ( ) async {
2020-04-29 22:08:34 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
FakeVmServiceRequest (
method: ' _flutter.listViews ' ,
jsonResponse: < String , Object > {
' views ' : < Object > [
fakeFlutterView . toJson ( ) ,
] ,
} ,
) ,
FakeVmServiceRequest (
method: ' getIsolate ' ,
args: < String , Object > {
' isolateId ' : fakeUnpausedIsolate . id ,
} ,
jsonResponse: fakeUnpausedIsolate . toJson ( ) ,
) ,
FakeVmServiceRequest (
method: ' ext.flutter.exit ' ,
args: < String , Object > {
' isolateId ' : fakeUnpausedIsolate . id ,
} ,
// Intentionally do not close isolate.
close: false ,
)
] ) ;
final TestFlutterDevice flutterDevice = TestFlutterDevice (
mockDevice ,
) ;
flutterDevice . vmService = fakeVmServiceHost . vmService ;
when ( mockDevice . supportsFlutterExit ) . thenReturn ( true ) ;
await flutterDevice . exitApps (
timeoutDelay: Duration . zero ,
) ;
2020-06-08 18:28:02 +00:00
verify ( mockDevice . stopApp ( any , userIdentifier: anyNamed ( ' userIdentifier ' ) ) ) . called ( 1 ) ;
2020-04-29 22:08:34 +00:00
expect ( fakeVmServiceHost . hasRemainingExpectations , false ) ;
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' FlutterDevice will exit an un-paused isolate ' , ( ) = > testbed . run ( ( ) async {
2020-04-20 22:15:54 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
2020-04-28 00:41:42 +00:00
FakeVmServiceRequest (
method: kListViewsMethod ,
jsonResponse: < String , Object > {
' views ' : < Object > [
fakeFlutterView . toJson ( ) ,
] ,
} ,
) ,
FakeVmServiceRequest (
method: ' getIsolate ' ,
args: < String , Object > {
' isolateId ' : fakeUnpausedIsolate . id
} ,
jsonResponse: fakeUnpausedIsolate . toJson ( ) ,
) ,
FakeVmServiceRequest (
2020-04-20 22:15:54 +00:00
method: ' ext.flutter.exit ' ,
args: < String , Object > {
2020-04-28 00:41:42 +00:00
' isolateId ' : fakeUnpausedIsolate . id ,
2020-04-20 22:15:54 +00:00
} ,
2020-04-28 00:41:42 +00:00
close: true ,
2020-04-20 22:15:54 +00:00
)
] ) ;
2019-07-18 17:40:40 +00:00
final TestFlutterDevice flutterDevice = TestFlutterDevice (
mockDevice ,
) ;
2020-04-20 22:15:54 +00:00
flutterDevice . vmService = fakeVmServiceHost . vmService ;
2019-07-18 17:40:40 +00:00
when ( mockDevice . supportsFlutterExit ) . thenReturn ( true ) ;
2020-04-28 00:41:42 +00:00
final Future < void > exitFuture = flutterDevice . exitApps ( ) ;
await expectLater ( exitFuture , completes ) ;
2020-04-20 22:15:54 +00:00
expect ( fakeVmServiceHost . hasRemainingExpectations , false ) ;
2019-07-18 17:40:40 +00:00
} ) ) ;
2019-07-23 22:38:52 +00:00
2020-06-08 18:28:02 +00:00
testUsingContext ( ' ResidentRunner debugDumpApp calls flutter device ' , ( ) = > testbed . run ( ( ) async {
2020-04-20 22:15:54 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
2019-07-23 22:38:52 +00:00
2020-09-25 01:56:07 +00:00
expect ( await residentRunner . debugDumpApp ( ) , true ) ;
2019-07-23 22:38:52 +00:00
verify ( mockFlutterDevice . debugDumpApp ( ) ) . called ( 1 ) ;
} ) ) ;
2020-09-25 01:56:07 +00:00
testUsingContext ( ' ResidentRunner debugDumpApp does not call flutter device if service protocol is unsupported ' , ( ) = > testbed . run ( ( ) async {
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
residentRunner = HotRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
debuggingOptions: DebuggingOptions . disabled ( BuildInfo . release ) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2020-09-25 01:56:07 +00:00
) ;
expect ( await residentRunner . debugDumpApp ( ) , false ) ;
verifyNever ( mockFlutterDevice . debugDumpApp ( ) ) ;
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' ResidentRunner debugDumpRenderTree calls flutter device ' , ( ) = > testbed . run ( ( ) async {
2020-04-20 22:15:54 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
2019-07-23 22:38:52 +00:00
2020-09-25 01:56:07 +00:00
expect ( await residentRunner . debugDumpRenderTree ( ) , true ) ;
2019-07-23 22:38:52 +00:00
verify ( mockFlutterDevice . debugDumpRenderTree ( ) ) . called ( 1 ) ;
} ) ) ;
2020-09-25 01:56:07 +00:00
testUsingContext ( ' ResidentRunner debugDumpRenderTree does not call flutter device if service protocol is unsupported ' , ( ) = > testbed . run ( ( ) async {
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
residentRunner = HotRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
debuggingOptions: DebuggingOptions . disabled ( BuildInfo . release ) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2020-09-25 01:56:07 +00:00
) ;
expect ( await residentRunner . debugDumpRenderTree ( ) , false ) ;
verifyNever ( mockFlutterDevice . debugDumpRenderTree ( ) ) ;
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' ResidentRunner debugDumpLayerTree calls flutter device ' , ( ) = > testbed . run ( ( ) async {
2020-04-20 22:15:54 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
2019-07-23 22:38:52 +00:00
2020-09-25 01:56:07 +00:00
expect ( await residentRunner . debugDumpLayerTree ( ) , true ) ;
2019-07-23 22:38:52 +00:00
verify ( mockFlutterDevice . debugDumpLayerTree ( ) ) . called ( 1 ) ;
} ) ) ;
2020-09-25 01:56:07 +00:00
testUsingContext ( ' ResidentRunner debugDumpLayerTree does not call flutter device if service protocol is unsupported ' , ( ) = > testbed . run ( ( ) async {
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
residentRunner = HotRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
debuggingOptions: DebuggingOptions . disabled ( BuildInfo . release ) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2020-09-25 01:56:07 +00:00
) ;
expect ( await residentRunner . debugDumpLayerTree ( ) , false ) ;
verifyNever ( mockFlutterDevice . debugDumpLayerTree ( ) ) ;
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' ResidentRunner debugDumpSemanticsTreeInTraversalOrder calls flutter device ' , ( ) = > testbed . run ( ( ) async {
2020-04-20 22:15:54 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
2019-07-23 22:38:52 +00:00
2020-09-25 01:56:07 +00:00
expect ( await residentRunner . debugDumpSemanticsTreeInTraversalOrder ( ) , true ) ;
2019-07-23 22:38:52 +00:00
verify ( mockFlutterDevice . debugDumpSemanticsTreeInTraversalOrder ( ) ) . called ( 1 ) ;
} ) ) ;
2020-09-25 01:56:07 +00:00
testUsingContext ( ' ResidentRunner debugDumpSemanticsTreeInTraversalOrder does not call flutter device if service protocol is unsupported ' , ( ) = > testbed . run ( ( ) async {
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
residentRunner = HotRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
debuggingOptions: DebuggingOptions . disabled ( BuildInfo . release ) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2020-09-25 01:56:07 +00:00
) ;
expect ( await residentRunner . debugDumpSemanticsTreeInTraversalOrder ( ) , false ) ;
verifyNever ( mockFlutterDevice . debugDumpSemanticsTreeInTraversalOrder ( ) ) ;
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' ResidentRunner debugDumpSemanticsTreeInInverseHitTestOrder calls flutter device ' , ( ) = > testbed . run ( ( ) async {
2020-04-20 22:15:54 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
2019-07-23 22:38:52 +00:00
2020-09-25 01:56:07 +00:00
expect ( await residentRunner . debugDumpSemanticsTreeInInverseHitTestOrder ( ) , true ) ;
2019-07-23 22:38:52 +00:00
verify ( mockFlutterDevice . debugDumpSemanticsTreeInInverseHitTestOrder ( ) ) . called ( 1 ) ;
} ) ) ;
2020-09-25 01:56:07 +00:00
testUsingContext ( ' ResidentRunner debugDumpSemanticsTreeInInverseHitTestOrder does not call flutter device if service protocol is unsupported ' , ( ) = > testbed . run ( ( ) async {
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
residentRunner = HotRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
debuggingOptions: DebuggingOptions . disabled ( BuildInfo . release ) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2020-09-25 01:56:07 +00:00
) ;
expect ( await residentRunner . debugDumpSemanticsTreeInInverseHitTestOrder ( ) , false ) ;
verifyNever ( mockFlutterDevice . debugDumpSemanticsTreeInInverseHitTestOrder ( ) ) ;
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' ResidentRunner debugToggleDebugPaintSizeEnabled calls flutter device ' , ( ) = > testbed . run ( ( ) async {
2020-04-20 22:15:54 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
2019-07-23 22:38:52 +00:00
2020-09-25 01:56:07 +00:00
expect ( await residentRunner . debugToggleDebugPaintSizeEnabled ( ) , true ) ;
2019-07-23 22:38:52 +00:00
verify ( mockFlutterDevice . toggleDebugPaintSizeEnabled ( ) ) . called ( 1 ) ;
} ) ) ;
2020-09-25 01:56:07 +00:00
testUsingContext ( ' ResidentRunner debugToggleDebugPaintSizeEnabled does not call flutter device if service protocol is unsupported ' , ( ) = > testbed . run ( ( ) async {
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
residentRunner = HotRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
debuggingOptions: DebuggingOptions . disabled ( BuildInfo . release ) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2020-09-25 01:56:07 +00:00
) ;
expect ( await residentRunner . debugToggleDebugPaintSizeEnabled ( ) , false ) ;
verifyNever ( mockFlutterDevice . toggleDebugPaintSizeEnabled ( ) ) ;
} ) ) ;
2020-06-18 17:32:43 +00:00
testUsingContext ( ' ResidentRunner debugToggleBrightness calls flutter device ' , ( ) = > testbed . run ( ( ) async {
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
2020-09-25 01:56:07 +00:00
expect ( await residentRunner . debugToggleBrightness ( ) , true ) ;
2020-06-18 17:32:43 +00:00
verify ( mockFlutterDevice . toggleBrightness ( ) ) . called ( 2 ) ;
} ) ) ;
2020-09-25 01:56:07 +00:00
testUsingContext ( ' ResidentRunner debugToggleBrightness does not call flutter device if service protocol is unsupported ' , ( ) = > testbed . run ( ( ) async {
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
residentRunner = HotRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
debuggingOptions: DebuggingOptions . disabled ( BuildInfo . release ) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2020-09-25 01:56:07 +00:00
) ;
expect ( await residentRunner . debugToggleBrightness ( ) , false ) ;
verifyNever ( mockFlutterDevice . toggleBrightness ( ) ) ;
} ) ) ;
2020-06-18 17:32:43 +00:00
testUsingContext ( ' FlutterDevice.toggleBrightness invokes correct VM service request ' , ( ) = > testbed . run ( ( ) async {
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
listViews ,
const FakeVmServiceRequest (
method: ' ext.flutter.brightnessOverride ' ,
args: < String , Object > {
' isolateId ' : ' 1 ' ,
} ,
jsonResponse: < String , Object > {
' value ' : ' Brightness.dark '
} ,
) ,
] ) ;
final FlutterDevice device = FlutterDevice (
mockDevice ,
buildInfo: BuildInfo . debug ,
) ;
device . vmService = fakeVmServiceHost . vmService ;
expect ( await device . toggleBrightness ( ) , Brightness . dark ) ;
expect ( fakeVmServiceHost . hasRemainingExpectations , false ) ;
} ) ) ;
2020-07-13 21:03:23 +00:00
testUsingContext ( ' ResidentRunner debugToggleInvertOversizedImages calls flutter device ' , ( ) = > testbed . run ( ( ) async {
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
2020-09-25 01:56:07 +00:00
expect ( await residentRunner . debugToggleInvertOversizedImages ( ) , true ) ;
2020-07-13 21:03:23 +00:00
verify ( mockFlutterDevice . toggleInvertOversizedImages ( ) ) . called ( 1 ) ;
} ) ) ;
2020-09-25 01:56:07 +00:00
testUsingContext ( ' ResidentRunner debugToggleInvertOversizedImages does not call flutter device if service protocol is unsupported ' , ( ) = > testbed . run ( ( ) async {
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
residentRunner = HotRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
debuggingOptions: DebuggingOptions . disabled ( BuildInfo . release ) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2020-09-25 01:56:07 +00:00
) ;
expect ( await residentRunner . debugToggleInvertOversizedImages ( ) , false ) ;
verifyNever ( mockFlutterDevice . toggleInvertOversizedImages ( ) ) ;
} ) ) ;
testUsingContext ( ' ResidentRunner debugToggleInvertOversizedImages does not call flutter device if in profile mode ' , ( ) = > testbed . run ( ( ) async {
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
residentRunner = HotRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
debuggingOptions: DebuggingOptions . enabled ( BuildInfo . profile ) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2020-09-25 01:56:07 +00:00
) ;
expect ( await residentRunner . debugToggleInvertOversizedImages ( ) , false ) ;
verifyNever ( mockFlutterDevice . toggleInvertOversizedImages ( ) ) ;
} ) ) ;
2020-07-13 21:03:23 +00:00
testUsingContext ( ' FlutterDevice.toggleInvertOversizedImages invokes correct VM service request ' , ( ) = > testbed . run ( ( ) async {
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
listViews ,
const FakeVmServiceRequest (
method: ' ext.flutter.invertOversizedImages ' ,
args: < String , Object > {
' isolateId ' : ' 1 ' ,
} ,
jsonResponse: < String , Object > {
' value ' : ' false '
} ,
) ,
] ) ;
final FlutterDevice device = FlutterDevice (
mockDevice ,
buildInfo: BuildInfo . debug ,
) ;
device . vmService = fakeVmServiceHost . vmService ;
await device . toggleInvertOversizedImages ( ) ;
expect ( fakeVmServiceHost . hasRemainingExpectations , false ) ;
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' ResidentRunner debugToggleDebugCheckElevationsEnabled calls flutter device ' , ( ) = > testbed . run ( ( ) async {
2020-04-20 22:15:54 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
2019-07-23 22:38:52 +00:00
2020-09-25 01:56:07 +00:00
expect ( await residentRunner . debugToggleDebugCheckElevationsEnabled ( ) , true ) ;
2019-07-23 22:38:52 +00:00
verify ( mockFlutterDevice . toggleDebugCheckElevationsEnabled ( ) ) . called ( 1 ) ;
} ) ) ;
2020-09-25 01:56:07 +00:00
testUsingContext ( ' ResidentRunner debugToggleDebugCheckElevationsEnabled does not call flutter device if service protocol is unsupported ' , ( ) = > testbed . run ( ( ) async {
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
residentRunner = HotRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
debuggingOptions: DebuggingOptions . disabled ( BuildInfo . release ) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2020-09-25 01:56:07 +00:00
) ;
expect ( await residentRunner . debugToggleDebugCheckElevationsEnabled ( ) , false ) ;
verifyNever ( mockFlutterDevice . toggleDebugCheckElevationsEnabled ( ) ) ;
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' ResidentRunner debugTogglePerformanceOverlayOverride calls flutter device ' , ( ) = > testbed . run ( ( ) async {
2020-04-20 22:15:54 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
2019-07-23 22:38:52 +00:00
2020-09-25 01:56:07 +00:00
expect ( await residentRunner . debugTogglePerformanceOverlayOverride ( ) , true ) ;
2019-07-23 22:38:52 +00:00
verify ( mockFlutterDevice . debugTogglePerformanceOverlayOverride ( ) ) . called ( 1 ) ;
} ) ) ;
2020-09-25 01:56:07 +00:00
testUsingContext ( ' ResidentRunner debugTogglePerformanceOverlayOverride does not call flutter device if service protocol is unsupported ' , ( ) = > testbed . run ( ( ) async {
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
residentRunner = HotRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
debuggingOptions: DebuggingOptions . disabled ( BuildInfo . release ) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2020-09-25 01:56:07 +00:00
) ;
expect ( await residentRunner . debugTogglePerformanceOverlayOverride ( ) , false ) ;
verifyNever ( mockFlutterDevice . debugTogglePerformanceOverlayOverride ( ) ) ;
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' ResidentRunner debugToggleWidgetInspector calls flutter device ' , ( ) = > testbed . run ( ( ) async {
2020-04-20 22:15:54 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
2019-07-23 22:38:52 +00:00
2020-09-25 01:56:07 +00:00
expect ( await residentRunner . debugToggleWidgetInspector ( ) , true ) ;
2019-07-23 22:38:52 +00:00
verify ( mockFlutterDevice . toggleWidgetInspector ( ) ) . called ( 1 ) ;
} ) ) ;
2020-09-25 01:56:07 +00:00
testUsingContext ( ' ResidentRunner debugToggleWidgetInspector does not call flutter device if service protocol is unsupported ' , ( ) = > testbed . run ( ( ) async {
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
residentRunner = HotRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
debuggingOptions: DebuggingOptions . disabled ( BuildInfo . release ) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2020-09-25 01:56:07 +00:00
) ;
expect ( await residentRunner . debugToggleWidgetInspector ( ) , false ) ;
verifyNever ( mockFlutterDevice . toggleWidgetInspector ( ) ) ;
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' ResidentRunner debugToggleProfileWidgetBuilds calls flutter device ' , ( ) = > testbed . run ( ( ) async {
2020-04-20 22:15:54 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
2019-07-23 22:38:52 +00:00
await residentRunner . debugToggleProfileWidgetBuilds ( ) ;
verify ( mockFlutterDevice . toggleProfileWidgetBuilds ( ) ) . called ( 1 ) ;
} ) ) ;
2019-10-15 20:05:47 +00:00
2020-09-25 01:56:07 +00:00
testUsingContext ( ' ResidentRunner debugToggleProfileWidgetBuilds does not call flutter device if service protocol is unsupported ' , ( ) = > testbed . run ( ( ) async {
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
residentRunner = HotRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
debuggingOptions: DebuggingOptions . disabled ( BuildInfo . release ) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2020-09-25 01:56:07 +00:00
) ;
expect ( await residentRunner . debugToggleProfileWidgetBuilds ( ) , false ) ;
verifyNever ( mockFlutterDevice . toggleProfileWidgetBuilds ( ) ) ;
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' HotRunner writes vm service file when providing debugging option ' , ( ) = > testbed . run ( ( ) async {
2020-05-05 19:09:51 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
listViews ,
listViews ,
2020-10-27 16:20:05 +00:00
setAssetBundlePath ,
2020-05-05 19:09:51 +00:00
] ) ;
2020-04-29 18:52:46 +00:00
setWsAddress ( testUri , fakeVmServiceHost . vmService ) ;
2020-01-06 19:04:20 +00:00
globals . fs . file ( globals . fs . path . join ( ' lib ' , ' main.dart ' ) ) . createSync ( recursive: true ) ;
2019-10-15 20:05:47 +00:00
residentRunner = HotRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
debuggingOptions: DebuggingOptions . enabled ( BuildInfo . debug , vmserviceOutFile: ' foo ' ) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2019-10-15 20:05:47 +00:00
) ;
when ( mockFlutterDevice . runHot (
hotRunner: anyNamed ( ' hotRunner ' ) ,
route: anyNamed ( ' route ' ) ,
) ) . thenAnswer ( ( Invocation invocation ) async {
return 0 ;
} ) ;
await residentRunner . run ( ) ;
2020-01-06 19:04:20 +00:00
expect ( await globals . fs . file ( ' foo ' ) . readAsString ( ) , testUri . toString ( ) ) ;
2019-10-15 20:05:47 +00:00
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' HotRunner copies compiled app.dill to cache during startup ' , ( ) = > testbed . run ( ( ) async {
2020-06-04 17:17:43 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
listViews ,
listViews ,
2020-10-27 16:20:05 +00:00
setAssetBundlePath ,
2020-06-04 17:17:43 +00:00
] ) ;
setWsAddress ( testUri , fakeVmServiceHost . vmService ) ;
globals . fs . file ( globals . fs . path . join ( ' lib ' , ' main.dart ' ) ) . createSync ( recursive: true ) ;
residentRunner = HotRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
debuggingOptions: DebuggingOptions . enabled ( BuildInfo . debug ) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2020-06-04 17:17:43 +00:00
) ;
residentRunner . artifactDirectory . childFile ( ' app.dill ' ) . writeAsStringSync ( ' ABC ' ) ;
when ( mockFlutterDevice . runHot (
hotRunner: anyNamed ( ' hotRunner ' ) ,
route: anyNamed ( ' route ' ) ,
) ) . thenAnswer ( ( Invocation invocation ) async {
return 0 ;
} ) ;
await residentRunner . run ( ) ;
expect ( await globals . fs . file ( globals . fs . path . join ( ' build ' , ' cache.dill ' ) ) . readAsString ( ) , ' ABC ' ) ;
} ) ) ;
2020-06-09 19:03:28 +00:00
testUsingContext ( ' HotRunner copies compiled app.dill to cache during startup with dart defines ' , ( ) = > testbed . run ( ( ) async {
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
listViews ,
listViews ,
2020-10-27 16:20:05 +00:00
setAssetBundlePath ,
2020-06-09 19:03:28 +00:00
] ) ;
setWsAddress ( testUri , fakeVmServiceHost . vmService ) ;
globals . fs . file ( globals . fs . path . join ( ' lib ' , ' main.dart ' ) ) . createSync ( recursive: true ) ;
residentRunner = HotRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
debuggingOptions: DebuggingOptions . enabled (
const BuildInfo (
BuildMode . debug ,
' ' ,
treeShakeIcons: false ,
dartDefines: < String > [ ' a ' , ' b ' ] ,
)
) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2020-06-09 19:03:28 +00:00
) ;
residentRunner . artifactDirectory . childFile ( ' app.dill ' ) . writeAsStringSync ( ' ABC ' ) ;
when ( mockFlutterDevice . runHot (
hotRunner: anyNamed ( ' hotRunner ' ) ,
route: anyNamed ( ' route ' ) ,
) ) . thenAnswer ( ( Invocation invocation ) async {
return 0 ;
} ) ;
await residentRunner . run ( ) ;
expect ( await globals . fs . file ( globals . fs . path . join (
' build ' , ' 187ef4436122d1cc2f40dc2b92f0eba0.cache.dill ' ) ) . readAsString ( ) , ' ABC ' ) ;
} ) ) ;
2020-06-30 22:49:31 +00:00
testUsingContext ( ' HotRunner copies compiled app.dill to cache during startup with null safety ' , ( ) = > testbed . run ( ( ) async {
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
listViews ,
listViews ,
2020-10-27 16:20:05 +00:00
setAssetBundlePath ,
2020-06-30 22:49:31 +00:00
] ) ;
setWsAddress ( testUri , fakeVmServiceHost . vmService ) ;
globals . fs . file ( globals . fs . path . join ( ' lib ' , ' main.dart ' ) ) . createSync ( recursive: true ) ;
residentRunner = HotRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
debuggingOptions: DebuggingOptions . enabled (
const BuildInfo (
BuildMode . debug ,
' ' ,
treeShakeIcons: false ,
extraFrontEndOptions: < String > [ ' --enable-experiment=non-nullable> ' ]
)
) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2020-06-30 22:49:31 +00:00
) ;
residentRunner . artifactDirectory . childFile ( ' app.dill ' ) . writeAsStringSync ( ' ABC ' ) ;
when ( mockFlutterDevice . runHot (
hotRunner: anyNamed ( ' hotRunner ' ) ,
route: anyNamed ( ' route ' ) ,
) ) . thenAnswer ( ( Invocation invocation ) async {
return 0 ;
} ) ;
await residentRunner . run ( ) ;
expect ( await globals . fs . file ( globals . fs . path . join (
' build ' , ' 3416d3007730479552122f01c01e326d.cache.dill ' ) ) . readAsString ( ) , ' ABC ' ) ;
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' HotRunner does not copy app.dill if a dillOutputPath is given ' , ( ) = > testbed . run ( ( ) async {
2020-06-04 17:17:43 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
listViews ,
listViews ,
2020-10-27 16:20:05 +00:00
setAssetBundlePath ,
2020-06-04 17:17:43 +00:00
] ) ;
setWsAddress ( testUri , fakeVmServiceHost . vmService ) ;
globals . fs . file ( globals . fs . path . join ( ' lib ' , ' main.dart ' ) ) . createSync ( recursive: true ) ;
residentRunner = HotRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
dillOutputPath: ' test ' ,
debuggingOptions: DebuggingOptions . enabled ( BuildInfo . debug ) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2020-06-04 17:17:43 +00:00
) ;
residentRunner . artifactDirectory . childFile ( ' app.dill ' ) . writeAsStringSync ( ' ABC ' ) ;
when ( mockFlutterDevice . runHot (
hotRunner: anyNamed ( ' hotRunner ' ) ,
route: anyNamed ( ' route ' ) ,
) ) . thenAnswer ( ( Invocation invocation ) async {
return 0 ;
} ) ;
await residentRunner . run ( ) ;
expect ( globals . fs . file ( globals . fs . path . join ( ' build ' , ' cache.dill ' ) ) , isNot ( exists ) ) ;
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' HotRunner copies compiled app.dill to cache during startup with --track-widget-creation ' , ( ) = > testbed . run ( ( ) async {
2020-06-04 17:17:43 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
listViews ,
listViews ,
2020-10-27 16:20:05 +00:00
setAssetBundlePath ,
2020-06-04 17:17:43 +00:00
] ) ;
setWsAddress ( testUri , fakeVmServiceHost . vmService ) ;
globals . fs . file ( globals . fs . path . join ( ' lib ' , ' main.dart ' ) ) . createSync ( recursive: true ) ;
residentRunner = HotRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
debuggingOptions: DebuggingOptions . enabled ( const BuildInfo (
BuildMode . debug ,
' ' ,
treeShakeIcons: false ,
trackWidgetCreation: true ,
) ) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2020-06-04 17:17:43 +00:00
) ;
residentRunner . artifactDirectory . childFile ( ' app.dill ' ) . writeAsStringSync ( ' ABC ' ) ;
when ( mockFlutterDevice . runHot (
hotRunner: anyNamed ( ' hotRunner ' ) ,
route: anyNamed ( ' route ' ) ,
) ) . thenAnswer ( ( Invocation invocation ) async {
return 0 ;
} ) ;
await residentRunner . run ( ) ;
expect ( await globals . fs . file ( globals . fs . path . join ( ' build ' , ' cache.dill.track.dill ' ) ) . readAsString ( ) , ' ABC ' ) ;
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' HotRunner unforwards device ports ' , ( ) = > testbed . run ( ( ) async {
2020-05-05 19:09:51 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
listViews ,
listViews ,
2020-10-27 16:20:05 +00:00
setAssetBundlePath ,
2020-05-05 19:09:51 +00:00
] ) ;
2019-12-05 16:48:00 +00:00
final MockDevicePortForwarder mockPortForwarder = MockDevicePortForwarder ( ) ;
when ( mockDevice . portForwarder ) . thenReturn ( mockPortForwarder ) ;
2020-01-06 19:04:20 +00:00
globals . fs . file ( globals . fs . path . join ( ' lib ' , ' main.dart ' ) ) . createSync ( recursive: true ) ;
2019-12-05 16:48:00 +00:00
residentRunner = HotRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
debuggingOptions: DebuggingOptions . enabled ( BuildInfo . debug ) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2019-12-05 16:48:00 +00:00
) ;
when ( mockFlutterDevice . runHot (
hotRunner: anyNamed ( ' hotRunner ' ) ,
route: anyNamed ( ' route ' ) ,
) ) . thenAnswer ( ( Invocation invocation ) async {
return 0 ;
} ) ;
when ( mockDevice . dispose ( ) ) . thenAnswer ( ( Invocation invocation ) async {
await mockDevice . portForwarder . dispose ( ) ;
} ) ;
await residentRunner . run ( ) ;
verify ( mockPortForwarder . dispose ( ) ) . called ( 1 ) ;
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' HotRunner handles failure to write vmservice file ' , ( ) = > testbed . run ( ( ) async {
2020-05-05 19:09:51 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
listViews ,
listViews ,
2020-10-27 16:20:05 +00:00
setAssetBundlePath ,
2020-05-05 19:09:51 +00:00
] ) ;
2020-01-06 19:04:20 +00:00
globals . fs . file ( globals . fs . path . join ( ' lib ' , ' main.dart ' ) ) . createSync ( recursive: true ) ;
2019-10-15 20:05:47 +00:00
residentRunner = HotRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
debuggingOptions: DebuggingOptions . enabled ( BuildInfo . debug , vmserviceOutFile: ' foo ' ) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2019-10-15 20:05:47 +00:00
) ;
when ( mockFlutterDevice . runHot (
hotRunner: anyNamed ( ' hotRunner ' ) ,
route: anyNamed ( ' route ' ) ,
) ) . thenAnswer ( ( Invocation invocation ) async {
return 0 ;
} ) ;
await residentRunner . run ( ) ;
2019-11-24 05:54:43 +00:00
expect ( testLogger . errorText , contains ( ' Failed to write vmservice-out-file at foo ' ) ) ;
2020-05-05 19:09:51 +00:00
expect ( fakeVmServiceHost . hasRemainingExpectations , false ) ;
2019-10-15 20:05:47 +00:00
} , overrides: < Type , Generator > {
2020-09-30 00:50:33 +00:00
FileSystem: ( ) = > ThrowingForwardingFileSystem ( MemoryFileSystem . test ( ) ) ,
2019-10-15 20:05:47 +00:00
} ) ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' ColdRunner writes vm service file when providing debugging option ' , ( ) = > testbed . run ( ( ) async {
2020-05-05 19:09:51 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [
listViews ,
] ) ;
2020-01-06 19:04:20 +00:00
globals . fs . file ( globals . fs . path . join ( ' lib ' , ' main.dart ' ) ) . createSync ( recursive: true ) ;
2020-04-29 18:52:46 +00:00
setWsAddress ( testUri , fakeVmServiceHost . vmService ) ;
2019-10-15 20:05:47 +00:00
residentRunner = ColdRunner (
< FlutterDevice > [
mockFlutterDevice ,
] ,
stayResident: false ,
debuggingOptions: DebuggingOptions . enabled ( BuildInfo . profile , vmserviceOutFile: ' foo ' ) ,
2020-11-20 22:17:11 +00:00
target: ' main.dart ' ,
2019-10-15 20:05:47 +00:00
) ;
when ( mockFlutterDevice . runCold (
coldRunner: anyNamed ( ' coldRunner ' ) ,
route: anyNamed ( ' route ' ) ,
) ) . thenAnswer ( ( Invocation invocation ) async {
return 0 ;
} ) ;
await residentRunner . run ( ) ;
2020-01-06 19:04:20 +00:00
expect ( await globals . fs . file ( ' foo ' ) . readAsString ( ) , testUri . toString ( ) ) ;
2020-05-05 19:09:51 +00:00
expect ( fakeVmServiceHost . hasRemainingExpectations , false ) ;
2019-10-15 20:05:47 +00:00
} ) ) ;
2019-10-23 03:35:05 +00:00
2020-06-30 19:29:42 +00:00
testUsingContext ( ' FlutterDevice uses dartdevc configuration when targeting web ' , ( ) async {
2020-04-20 22:15:54 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
2019-10-23 03:35:05 +00:00
final MockDevice mockDevice = MockDevice ( ) ;
when ( mockDevice . targetPlatform ) . thenAnswer ( ( Invocation invocation ) async {
return TargetPlatform . web_javascript ;
} ) ;
final DefaultResidentCompiler residentCompiler = ( await FlutterDevice . create (
mockDevice ,
2020-06-30 19:29:42 +00:00
buildInfo: const BuildInfo (
BuildMode . debug ,
' ' ,
treeShakeIcons: false ,
nullSafetyMode: NullSafetyMode . unsound ,
) ,
2019-10-23 03:35:05 +00:00
target: null ,
2020-09-23 14:03:59 +00:00
platform: FakePlatform ( operatingSystem: ' linux ' ) ,
2019-11-24 05:54:43 +00:00
) ) . generator as DefaultResidentCompiler ;
2019-10-23 03:35:05 +00:00
2020-05-29 22:43:03 +00:00
expect ( residentCompiler . initializeFromDill ,
2020-11-13 17:41:11 +00:00
globals . fs . path . join ( getBuildDirectory ( ) , ' fbbe6a61fb7a1de317d381f8df4814e5.cache.dill ' ) ) ;
2020-02-28 19:26:02 +00:00
expect ( residentCompiler . librariesSpec ,
globals . fs . file ( globals . artifacts . getArtifactPath ( Artifact . flutterWebLibrariesJson ) )
. uri . toString ( ) ) ;
2019-10-23 03:35:05 +00:00
expect ( residentCompiler . targetModel , TargetModel . dartdevc ) ;
expect ( residentCompiler . sdkRoot ,
2020-01-06 19:04:20 +00:00
globals . artifacts . getArtifactPath ( Artifact . flutterWebSdk , mode: BuildMode . debug ) + ' / ' ) ;
2020-06-30 19:29:42 +00:00
expect ( residentCompiler . platformDill , ' file:///Artifact.webPlatformKernelDill.debug ' ) ;
} , overrides: < Type , Generator > {
Artifacts: ( ) = > Artifacts . test ( ) ,
FileSystem: ( ) = > MemoryFileSystem . test ( ) ,
ProcessManager: ( ) = > FakeProcessManager . any ( ) ,
} ) ;
testUsingContext ( ' FlutterDevice uses dartdevc configuration when targeting web with null-safety autodetected ' , ( ) async {
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
final MockDevice mockDevice = MockDevice ( ) ;
when ( mockDevice . targetPlatform ) . thenAnswer ( ( Invocation invocation ) async {
return TargetPlatform . web_javascript ;
} ) ;
final DefaultResidentCompiler residentCompiler = ( await FlutterDevice . create (
mockDevice ,
buildInfo: const BuildInfo (
BuildMode . debug ,
' ' ,
treeShakeIcons: false ,
extraFrontEndOptions: < String > [ ' --enable-experiment=non-nullable ' ] ,
) ,
target: null ,
2020-09-23 14:03:59 +00:00
platform: FakePlatform ( operatingSystem: ' linux ' ) ,
2020-06-30 19:29:42 +00:00
) ) . generator as DefaultResidentCompiler ;
expect ( residentCompiler . initializeFromDill ,
2020-06-30 22:49:31 +00:00
globals . fs . path . join ( getBuildDirectory ( ) , ' 825b8f791aa86c5057fff6f064542c54.cache.dill ' ) ) ;
2020-06-30 19:29:42 +00:00
expect ( residentCompiler . librariesSpec ,
globals . fs . file ( globals . artifacts . getArtifactPath ( Artifact . flutterWebLibrariesJson ) )
. uri . toString ( ) ) ;
expect ( residentCompiler . targetModel , TargetModel . dartdevc ) ;
expect ( residentCompiler . sdkRoot ,
globals . artifacts . getArtifactPath ( Artifact . flutterWebSdk , mode: BuildMode . debug ) + ' / ' ) ;
expect ( residentCompiler . platformDill , ' file:///Artifact.webPlatformSoundKernelDill.debug ' ) ;
} , overrides: < Type , Generator > {
Artifacts: ( ) = > Artifacts . test ( ) ,
FileSystem: ( ) = > MemoryFileSystem . test ( ) ,
ProcessManager: ( ) = > FakeProcessManager . any ( ) ,
2020-10-30 20:42:54 +00:00
} , skip: true ) ; // TODO(jonahwilliams): null safe autodetection does not work on the web.
2019-11-01 21:37:17 +00:00
2020-09-19 18:02:04 +00:00
testUsingContext ( ' FlutterDevice passes flutter-widget-cache flag when feature is enabled ' , ( ) async {
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
final MockDevice mockDevice = MockDevice ( ) ;
when ( mockDevice . targetPlatform ) . thenAnswer ( ( Invocation invocation ) async {
return TargetPlatform . android_arm ;
} ) ;
final DefaultResidentCompiler residentCompiler = ( await FlutterDevice . create (
mockDevice ,
buildInfo: const BuildInfo (
BuildMode . debug ,
' ' ,
treeShakeIcons: false ,
extraFrontEndOptions: < String > [ ] ,
) ,
2020-09-23 14:03:59 +00:00
target: null , platform: null ,
2020-09-19 18:02:04 +00:00
) ) . generator as DefaultResidentCompiler ;
expect ( residentCompiler . extraFrontEndOptions ,
contains ( ' --flutter-widget-cache ' ) ) ;
} , overrides: < Type , Generator > {
Artifacts: ( ) = > Artifacts . test ( ) ,
FileSystem: ( ) = > MemoryFileSystem . test ( ) ,
ProcessManager: ( ) = > FakeProcessManager . any ( ) ,
FeatureFlags: ( ) = > TestFeatureFlags ( isSingleWidgetReloadEnabled: true )
} ) ;
2020-06-08 18:28:02 +00:00
testUsingContext ( ' connect sets up log reader ' , ( ) = > testbed . run ( ( ) async {
2020-04-20 22:15:54 +00:00
fakeVmServiceHost = FakeVmServiceHost ( requests: < VmServiceExpectation > [ ] ) ;
2019-11-01 21:37:17 +00:00
final MockDevice mockDevice = MockDevice ( ) ;
2020-07-29 17:05:40 +00:00
final MockDartDevelopmentService mockDds = MockDartDevelopmentService ( ) ;
2019-11-01 21:37:17 +00:00
final MockDeviceLogReader mockLogReader = MockDeviceLogReader ( ) ;
2020-09-29 17:28:17 +00:00
final Completer < void > noopCompleter = Completer < void > ( ) ;
2019-11-01 21:37:17 +00:00
when ( mockDevice . getLogReader ( app: anyNamed ( ' app ' ) ) ) . thenReturn ( mockLogReader ) ;
2020-07-29 17:05:40 +00:00
when ( mockDevice . dds ) . thenReturn ( mockDds ) ;
2020-09-16 23:27:42 +00:00
when ( mockDds . startDartDevelopmentService ( any , any , any , any ) ) . thenReturn ( null ) ;
when ( mockDds . uri ) . thenReturn ( Uri . parse ( ' http://localhost:8181 ' ) ) ;
2020-09-29 17:28:17 +00:00
when ( mockDds . done ) . thenAnswer ( ( _ ) = > noopCompleter . future ) ;
2019-11-01 21:37:17 +00:00
final TestFlutterDevice flutterDevice = TestFlutterDevice (
mockDevice ,
2019-11-21 02:51:25 +00:00
observatoryUris: Stream < Uri > . value ( testUri ) ,
2019-11-01 21:37:17 +00:00
) ;
await flutterDevice . connect ( ) ;
2019-11-27 21:11:04 +00:00
verify ( mockLogReader . connectedVMService = mockVMService ) ;
2019-11-01 21:37:17 +00:00
} , overrides: < Type , Generator > {
2019-11-26 22:49:56 +00:00
VMServiceConnector: ( ) = > ( Uri httpUri , {
ReloadSources reloadSources ,
Restart restart ,
CompileExpression compileExpression ,
2020-05-27 17:10:41 +00:00
GetSkSLMethod getSkSLMethod ,
2020-06-09 18:18:03 +00:00
PrintStructuredErrorLogMethod printStructuredErrorLogMethod ,
2019-11-26 22:49:56 +00:00
io . CompressionOptions compression ,
Device device ,
} ) async = > mockVMService ,
2019-11-01 21:37:17 +00:00
} ) ) ;
2019-12-12 23:20:52 +00:00
2020-06-08 18:28:02 +00:00
testUsingContext ( ' nextPlatform moves through expected platforms ' , ( ) {
2019-12-12 23:20:52 +00:00
expect ( nextPlatform ( ' android ' , TestFeatureFlags ( ) ) , ' iOS ' ) ;
expect ( nextPlatform ( ' iOS ' , TestFeatureFlags ( ) ) , ' fuchsia ' ) ;
expect ( nextPlatform ( ' fuchsia ' , TestFeatureFlags ( ) ) , ' android ' ) ;
expect ( nextPlatform ( ' fuchsia ' , TestFeatureFlags ( isMacOSEnabled: true ) ) , ' macOS ' ) ;
2020-01-27 22:36:02 +00:00
expect ( ( ) = > nextPlatform ( ' unknown ' , TestFeatureFlags ( ) ) , throwsAssertionError ) ;
2019-12-12 23:20:52 +00:00
} ) ;
2017-05-21 22:15:44 +00:00
}
2019-07-13 23:02:09 +00:00
class MockFlutterDevice extends Mock implements FlutterDevice { }
2020-07-29 17:05:40 +00:00
class MockDartDevelopmentService extends Mock implements DartDevelopmentService { }
2020-04-29 18:52:46 +00:00
class MockVMService extends Mock implements vm_service . VmService { }
2019-07-09 20:10:26 +00:00
class MockDevFS extends Mock implements DevFS { }
2019-07-13 23:02:09 +00:00
class MockDevice extends Mock implements Device { }
2019-11-01 21:37:17 +00:00
class MockDeviceLogReader extends Mock implements DeviceLogReader { }
2019-12-05 16:48:00 +00:00
class MockDevicePortForwarder extends Mock implements DevicePortForwarder { }
2020-07-29 02:46:05 +00:00
class MockDevtoolsLauncher extends Mock implements DevtoolsLauncher { }
2019-07-13 23:02:09 +00:00
class MockUsage extends Mock implements Usage { }
2019-10-23 03:35:05 +00:00
class MockProcessManager extends Mock implements ProcessManager { }
2020-06-03 19:00:03 +00:00
class MockResidentCompiler extends Mock implements ResidentCompiler { }
2020-04-28 00:41:42 +00:00
2019-07-15 22:44:58 +00:00
class TestFlutterDevice extends FlutterDevice {
2020-05-05 19:09:51 +00:00
TestFlutterDevice ( Device device , { Stream < Uri > observatoryUris } )
2020-03-06 22:53:36 +00:00
: super ( device , buildInfo: BuildInfo . debug ) {
2019-11-01 21:37:17 +00:00
_observatoryUris = observatoryUris ;
}
2019-07-15 22:44:58 +00:00
2019-11-01 21:37:17 +00:00
@ override
2019-11-21 02:51:25 +00:00
Stream < Uri > get observatoryUris = > _observatoryUris ;
Stream < Uri > _observatoryUris ;
2019-07-15 22:44:58 +00:00
}
2019-10-15 20:05:47 +00:00
class ThrowingForwardingFileSystem extends ForwardingFileSystem {
ThrowingForwardingFileSystem ( FileSystem delegate ) : super ( delegate ) ;
@ override
File file ( dynamic path ) {
if ( path = = ' foo ' ) {
throw const FileSystemException ( ) ;
}
return delegate . file ( path ) ;
}
}
2020-07-20 21:03:44 +00:00
class FakeFlutterDevice extends FlutterDevice {
FakeFlutterDevice (
Device device ,
BuildInfo buildInfo ,
ResidentCompiler residentCompiler ,
this . fakeDevFS ,
2020-09-19 18:02:04 +00:00
) : super ( device , buildInfo: buildInfo , generator: residentCompiler ) ;
2020-07-20 21:03:44 +00:00
@ override
Future < void > connect ( {
ReloadSources reloadSources ,
Restart restart ,
2020-07-29 17:05:40 +00:00
bool disableDds = false ,
2020-09-16 23:27:42 +00:00
bool disableServiceAuthCodes = false ,
2020-07-29 17:05:40 +00:00
bool ipv6 = false ,
2020-07-20 21:03:44 +00:00
CompileExpression compileExpression ,
GetSkSLMethod getSkSLMethod ,
2020-09-16 23:27:42 +00:00
int hostVmServicePort ,
int ddsPort ,
2020-07-20 21:03:44 +00:00
PrintStructuredErrorLogMethod printStructuredErrorLogMethod ,
} ) async { }
final DevFS fakeDevFS ;
@ override
DevFS get devFS = > fakeDevFS ;
@ override
set devFS ( DevFS value ) { }
}
class FakeResidentCompiler extends Fake implements ResidentCompiler {
@ override
Future < CompilerOutput > recompile (
Uri mainUri ,
List < Uri > invalidatedFiles , {
@ required String outputPath ,
@ required PackageConfig packageConfig ,
bool suppressErrors = false ,
} ) async {
return const CompilerOutput ( ' foo.dill ' , 0 , < Uri > [ ] ) ;
}
@ override
void accept ( ) { }
@ override
void reset ( ) { }
}
class FakeProjectFileInvalidator extends Fake implements ProjectFileInvalidator {
@ override
Future < InvalidationResult > findInvalidated ( {
@ required DateTime lastCompiled ,
@ required List < Uri > urisToMonitor ,
@ required String packagesPath ,
@ required PackageConfig packageConfig ,
bool asyncScanning = false ,
} ) async {
return InvalidationResult (
packageConfig: packageConfig ? ? PackageConfig . empty ,
uris: < Uri > [ Uri . parse ( ' file:///hello_world/main.dart ' ) ,
] ) ;
}
}
2020-10-09 22:44:52 +00:00
class FakeDevice extends Fake implements Device {
FakeDevice ( {
String sdkNameAndVersion = ' Android ' ,
TargetPlatform targetPlatform = TargetPlatform . android_arm ,
bool isLocalEmulator = false ,
this . supportsHotRestart = true ,
} ) : _isLocalEmulator = isLocalEmulator ,
_targetPlatform = targetPlatform ,
_sdkNameAndVersion = sdkNameAndVersion ;
final bool _isLocalEmulator ;
final TargetPlatform _targetPlatform ;
final String _sdkNameAndVersion ;
@ override
final bool supportsHotRestart ;
@ override
Future < String > get sdkNameAndVersion async = > _sdkNameAndVersion ;
@ override
Future < TargetPlatform > get targetPlatform async = > _targetPlatform ;
@ override
Future < bool > get isLocalEmulator async = > _isLocalEmulator ;
@ override
String get name = > ' FakeDevice ' ;
@ override
Future < void > dispose ( ) async { }
}