Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
F
Front-End
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
abdullh.alsoleman
Front-End
Commits
305a855f
Unverified
Commit
305a855f
authored
Oct 20, 2021
by
Jenn Magder
Committed by
GitHub
Oct 20, 2021
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Migrate integration test shard test data to null safety (#92147)
parent
12ec91a5
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
156 additions
and
156 deletions
+156
-156
deferred_components_config.dart
...tegration.shard/test_data/deferred_components_config.dart
+4
-5
test_driver.dart
...ges/flutter_tools/test/integration.shard/test_driver.dart
+146
-142
test_utils.dart
...ages/flutter_tools/test/integration.shard/test_utils.dart
+6
-9
No files found.
packages/flutter_tools/test/integration.shard/test_data/deferred_components_config.dart
View file @
305a855f
...
...
@@ -2,15 +2,13 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import
'package:file/file.dart'
;
import
'../test_utils.dart'
;
abstract
class
DeferredComponentsConfig
{
String
get
deferredLibrary
;
String
get
deferredComponentsGolden
;
String
?
get
deferredComponentsGolden
;
String
get
androidSettings
;
String
get
androidBuild
;
String
get
androidLocalProperties
;
...
...
@@ -30,8 +28,9 @@ abstract class DeferredComponentsConfig {
if
(
deferredLibrary
!=
null
)
{
writeFile
(
fileSystem
.
path
.
join
(
dir
.
path
,
'lib'
,
'deferred_library.dart'
),
deferredLibrary
);
}
if
(
deferredComponentsGolden
!=
null
)
{
writeFile
(
fileSystem
.
path
.
join
(
dir
.
path
,
'deferred_components_loading_units.yaml'
),
deferredComponentsGolden
);
final
String
?
golden
=
deferredComponentsGolden
;
if
(
golden
!=
null
)
{
writeFile
(
fileSystem
.
path
.
join
(
dir
.
path
,
'deferred_components_loading_units.yaml'
),
golden
);
}
if
(
androidSettings
!=
null
)
{
writeFile
(
fileSystem
.
path
.
join
(
dir
.
path
,
'android'
,
'settings.gradle'
),
androidSettings
);
...
...
packages/flutter_tools/test/integration.shard/test_driver.dart
View file @
305a855f
...
...
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import
'dart:async'
;
import
'dart:convert'
;
import
'dart:io'
as
io
;
// flutter_ignore: dart_io_import
...
...
@@ -13,7 +11,6 @@ import 'package:flutter_tools/src/base/common.dart';
import
'package:flutter_tools/src/base/file_system.dart'
;
import
'package:flutter_tools/src/base/io.dart'
;
import
'package:flutter_tools/src/base/utils.dart'
;
import
'package:meta/meta.dart'
;
import
'package:process/process.dart'
;
import
'package:vm_service/vm_service.dart'
;
import
'package:vm_service/vm_service_io.dart'
;
...
...
@@ -42,28 +39,28 @@ const Duration quitTimeout = Duration(seconds: 10);
abstract
class
FlutterTestDriver
{
FlutterTestDriver
(
this
.
_projectFolder
,
{
String
logPrefix
,
String
?
logPrefix
,
})
:
_logPrefix
=
logPrefix
!=
null
?
'
$logPrefix
: '
:
''
;
final
Directory
_projectFolder
;
final
String
_logPrefix
;
Process
_process
;
int
_processPid
;
Process
?
_process
;
int
?
_processPid
;
final
StreamController
<
String
>
_stdout
=
StreamController
<
String
>.
broadcast
();
final
StreamController
<
String
>
_stderr
=
StreamController
<
String
>.
broadcast
();
final
StreamController
<
String
>
_allMessages
=
StreamController
<
String
>.
broadcast
();
final
StringBuffer
_errorBuffer
=
StringBuffer
();
String
_lastResponse
;
Uri
_vmServiceWsUri
;
int
_attachPort
;
String
?
_lastResponse
;
Uri
?
_vmServiceWsUri
;
int
?
_attachPort
;
bool
_hasExited
=
false
;
VmService
_vmService
;
VmService
?
_vmService
;
String
get
lastErrorInfo
=>
_errorBuffer
.
toString
();
Stream
<
String
>
get
stdout
=>
_stdout
.
stream
;
int
get
vmServicePort
=>
_vmServiceWsUri
.
port
;
int
?
get
vmServicePort
=>
_vmServiceWsUri
?
.
port
;
bool
get
hasExited
=>
_hasExited
;
Uri
get
vmServiceWsUri
=>
_vmServiceWsUri
;
Uri
?
get
vmServiceWsUri
=>
_vmServiceWsUri
;
String
lastTime
=
''
;
void
_debugPrint
(
String
message
,
{
String
topic
=
''
})
{
...
...
@@ -89,7 +86,7 @@ abstract class FlutterTestDriver {
Future
<
void
>
_setupProcess
(
List
<
String
>
arguments
,
{
String
script
,
String
?
script
,
bool
withDebugger
=
false
,
bool
singleWidgetReloads
=
false
,
})
async
{
...
...
@@ -122,12 +119,12 @@ abstract class FlutterTestDriver {
// This class doesn't use the result of the future. It's made available
// via a getter for external uses.
unawaited
(
_process
.
exitCode
.
then
((
int
code
)
{
unawaited
(
_process
!
.
exitCode
.
then
((
int
code
)
{
_debugPrint
(
'Process exited (
$code
)'
);
_hasExited
=
true
;
}));
transformToLines
(
_process
.
stdout
).
listen
(
_stdout
.
add
);
transformToLines
(
_process
.
stderr
).
listen
(
_stderr
.
add
);
transformToLines
(
_process
!
.
stdout
).
listen
(
_stdout
.
add
);
transformToLines
(
_process
!
.
stderr
).
listen
(
_stderr
.
add
);
// Capture stderr to a buffer so we can show it all if any requests fail.
_stderr
.
stream
.
listen
(
_errorBuffer
.
writeln
);
...
...
@@ -137,18 +134,18 @@ abstract class FlutterTestDriver {
_stderr
.
stream
.
listen
((
String
message
)
=>
_debugPrint
(
message
,
topic:
'<=stderr='
));
}
Future
<
void
>
get
done
=>
_process
.
exitCode
;
Future
<
void
>
get
done
async
=>
_process
?
.
exitCode
;
Future
<
void
>
connectToVmService
({
bool
pauseOnExceptions
=
false
})
async
{
_vmService
=
await
vmServiceConnectUri
(
'
$_vmServiceWsUri
'
);
_vmService
.
onSend
.
listen
((
String
s
)
=>
_debugPrint
(
s
,
topic:
'=vm=>'
));
_vmService
.
onReceive
.
listen
((
String
s
)
=>
_debugPrint
(
s
,
topic:
'<=vm='
));
_vmService
!
.
onSend
.
listen
((
String
s
)
=>
_debugPrint
(
s
,
topic:
'=vm=>'
));
_vmService
!
.
onReceive
.
listen
((
String
s
)
=>
_debugPrint
(
s
,
topic:
'<=vm='
));
final
Completer
<
void
>
isolateStarted
=
Completer
<
void
>();
_vmService
.
onIsolateEvent
.
listen
((
Event
event
)
{
_vmService
!
.
onIsolateEvent
.
listen
((
Event
event
)
{
if
(
event
.
kind
==
EventKind
.
kIsolateStart
)
{
isolateStarted
.
complete
();
}
else
if
(
event
.
kind
==
EventKind
.
kIsolateExit
&&
event
.
isolate
.
id
==
_flutterIsolateId
)
{
}
else
if
(
event
.
kind
==
EventKind
.
kIsolateExit
&&
event
.
isolate
?
.
id
==
_flutterIsolateId
)
{
// Hot restarts cause all the isolates to exit, so we need to refresh
// our idea of what the Flutter isolate ID is.
_flutterIsolateId
=
null
;
...
...
@@ -156,17 +153,17 @@ abstract class FlutterTestDriver {
});
await
Future
.
wait
(<
Future
<
Success
>>[
_vmService
.
streamListen
(
'Isolate'
),
_vmService
.
streamListen
(
'Debug'
),
_vmService
!
.
streamListen
(
'Isolate'
),
_vmService
!
.
streamListen
(
'Debug'
),
]);
if
((
await
_vmService
.
getVM
()).
isolates
.
isEmpty
)
{
if
((
await
_vmService
!.
getVM
()).
isolates
?.
isEmpty
!=
false
)
{
await
isolateStarted
.
future
;
}
await
waitForPause
();
if
(
pauseOnExceptions
)
{
await
_vmService
.
setExceptionPauseMode
(
await
_vmService
!
.
setExceptionPauseMode
(
await
_getFlutterIsolateId
(),
ExceptionPauseMode
.
kUnhandled
,
);
...
...
@@ -175,9 +172,9 @@ abstract class FlutterTestDriver {
Future
<
Response
>
callServiceExtension
(
String
extension
,
{
Map
<
String
,
dynamic
>
args
=
const
<
String
,
dynamic
>{},
Map
<
String
,
Object
?>
args
=
const
<
String
,
Object
>{},
})
async
{
final
int
port
=
_vmServiceWsUri
!=
null
?
vmServicePort
:
_attachPort
;
final
int
?
port
=
_vmServiceWsUri
!=
null
?
vmServicePort
:
_attachPort
;
final
VmService
vmService
=
await
vmServiceConnectUri
(
'ws://localhost:
$port
/ws'
);
final
Isolate
isolate
=
await
waitForExtension
(
vmService
,
extension
);
return
vmService
.
callServiceExtension
(
...
...
@@ -203,29 +200,29 @@ abstract class FlutterTestDriver {
});
_debugPrint
(
'Sending SIGTERM to
$_processPid
..'
);
io
.
Process
.
killPid
(
_processPid
,
io
.
ProcessSignal
.
sigterm
);
return
_process
.
exitCode
.
timeout
(
quitTimeout
,
onTimeout:
_killForcefully
);
io
.
Process
.
killPid
(
_processPid
!
);
return
_process
!
.
exitCode
.
timeout
(
quitTimeout
,
onTimeout:
_killForcefully
);
}
Future
<
int
>
_killForcefully
()
{
_debugPrint
(
'Sending SIGKILL to
$_processPid
..'
);
ProcessSignal
.
sigkill
.
send
(
_processPid
);
return
_process
.
exitCode
;
ProcessSignal
.
sigkill
.
send
(
_processPid
!
);
return
_process
!
.
exitCode
;
}
String
_flutterIsolateId
;
String
?
_flutterIsolateId
;
Future
<
String
>
_getFlutterIsolateId
()
async
{
// Currently these tests only have a single isolate. If this
// ceases to be the case, this code will need changing.
if
(
_flutterIsolateId
==
null
)
{
final
VM
vm
=
await
_vmService
.
getVM
();
_flutterIsolateId
=
vm
.
isolates
.
single
.
id
;
final
VM
vm
=
await
_vmService
!
.
getVM
();
_flutterIsolateId
=
vm
.
isolates
!
.
single
.
id
;
}
return
_flutterIsolateId
;
return
_flutterIsolateId
!
;
}
Future
<
Isolate
>
getFlutterIsolate
()
async
{
final
Isolate
isolate
=
await
_vmService
.
getIsolate
(
await
_getFlutterIsolateId
());
final
Isolate
isolate
=
await
_vmService
!
.
getIsolate
(
await
_getFlutterIsolateId
());
return
isolate
;
}
...
...
@@ -247,7 +244,7 @@ abstract class FlutterTestDriver {
Future
<
void
>
addBreakpoint
(
Uri
uri
,
int
line
)
async
{
_debugPrint
(
'Sending breakpoint for:
$uri
:
$line
'
);
await
_vmService
.
addBreakpointWithScriptUri
(
await
_vmService
!
.
addBreakpointWithScriptUri
(
await
_getFlutterIsolateId
(),
uri
.
toString
(),
line
,
...
...
@@ -286,10 +283,10 @@ abstract class FlutterTestDriver {
Future
<
Event
>
subscribeToDebugEvent
(
String
kind
,
String
isolateId
)
{
_debugPrint
(
'Start listening for
$kind
events'
);
return
_vmService
.
onDebugEvent
return
_vmService
!
.
onDebugEvent
.
where
((
Event
event
)
{
return
event
.
isolate
.
id
==
isolateId
&&
event
.
kind
.
startsWith
(
kind
)
;
return
event
.
isolate
?
.
id
==
isolateId
&&
event
.
kind
?.
startsWith
(
kind
)
==
true
;
}).
first
;
}
...
...
@@ -302,85 +299,87 @@ abstract class FlutterTestDriver {
// But also check if the isolate was already at the state we need (only after we've
// set up the subscription) to avoid races. If it already in the desired state, we
// don't need to wait for the event.
final
Isolate
isolate
=
await
_vmService
.
getIsolate
(
isolateId
);
if
(
isolate
.
pauseEvent
.
kind
.
startsWith
(
kind
))
{
_debugPrint
(
'Isolate was already at "
$kind
" (
${isolate.pauseEvent.kind}
).'
);
final
VmService
vmService
=
_vmService
!;
final
Isolate
isolate
=
await
vmService
.
getIsolate
(
isolateId
);
if
(
isolate
.
pauseEvent
?.
kind
?.
startsWith
(
kind
)
==
true
)
{
_debugPrint
(
'Isolate was already at "
$kind
" (
${isolate.pauseEvent!.kind}
).'
);
event
.
ignore
();
}
else
{
_debugPrint
(
'Waiting for "
$kind
" event to arrive...'
);
await
event
;
}
return
_
vmService
.
getIsolate
(
isolateId
);
return
vmService
.
getIsolate
(
isolateId
);
},
task:
'Waiting for isolate to
$kind
'
,
);
}
Future
<
Isolate
>
resume
({
bool
waitForNextPause
=
false
})
=>
_resume
(
null
,
waitForNextPause
);
Future
<
Isolate
>
stepOver
({
bool
waitForNextPause
=
true
})
=>
_resume
(
StepOption
.
kOver
,
waitForNextPause
);
Future
<
Isolate
>
stepOverAsync
({
bool
waitForNextPause
=
true
})
=>
_resume
(
StepOption
.
kOverAsyncSuspension
,
waitForNextPause
);
Future
<
Isolate
>
stepInto
({
bool
waitForNextPause
=
true
})
=>
_resume
(
StepOption
.
kInto
,
waitForNextPause
);
Future
<
Isolate
>
stepOut
({
bool
waitForNextPause
=
true
})
=>
_resume
(
StepOption
.
kOut
,
waitForNextPause
);
Future
<
Isolate
?
>
resume
({
bool
waitForNextPause
=
false
})
=>
_resume
(
null
,
waitForNextPause
);
Future
<
Isolate
?
>
stepOver
({
bool
waitForNextPause
=
true
})
=>
_resume
(
StepOption
.
kOver
,
waitForNextPause
);
Future
<
Isolate
?
>
stepOverAsync
({
bool
waitForNextPause
=
true
})
=>
_resume
(
StepOption
.
kOverAsyncSuspension
,
waitForNextPause
);
Future
<
Isolate
?
>
stepInto
({
bool
waitForNextPause
=
true
})
=>
_resume
(
StepOption
.
kInto
,
waitForNextPause
);
Future
<
Isolate
?
>
stepOut
({
bool
waitForNextPause
=
true
})
=>
_resume
(
StepOption
.
kOut
,
waitForNextPause
);
Future
<
bool
>
isAtAsyncSuspension
()
async
{
final
Isolate
isolate
=
await
getFlutterIsolate
();
return
isolate
.
pauseEvent
.
atAsyncSuspension
==
true
;
return
isolate
.
pauseEvent
?
.
atAsyncSuspension
==
true
;
}
Future
<
Isolate
>
stepOverOrOverAsyncSuspension
({
bool
waitForNextPause
=
true
})
async
{
Future
<
Isolate
?
>
stepOverOrOverAsyncSuspension
({
bool
waitForNextPause
=
true
})
async
{
if
(
await
isAtAsyncSuspension
())
{
return
stepOverAsync
(
waitForNextPause:
waitForNextPause
);
}
return
stepOver
(
waitForNextPause:
waitForNextPause
);
}
Future
<
Isolate
>
_resume
(
String
step
,
bool
waitForNextPause
)
async
{
Future
<
Isolate
?>
_resume
(
String
?
step
,
bool
waitForNextPause
)
async
{
assert
(
waitForNextPause
!=
null
);
final
String
isolateId
=
await
_getFlutterIsolateId
();
final
Future
<
Event
>
resume
=
subscribeToResumeEvent
(
isolateId
);
final
Future
<
Event
>
pause
=
subscribeToPauseEvent
(
isolateId
);
await
_timeoutWithMessages
<
dynamic
>(
()
async
=>
_vmService
.
resume
(
isolateId
,
step:
step
),
await
_timeoutWithMessages
<
Object
?
>(
()
async
=>
_vmService
!
.
resume
(
isolateId
,
step:
step
),
task:
'Resuming isolate (step=
$step
)'
,
);
await
waitForResumeEvent
(
isolateId
,
resume
);
return
waitForNextPause
?
waitForPauseEvent
(
isolateId
,
pause
)
:
null
;
return
waitForNextPause
?
waitForPauseEvent
(
isolateId
,
pause
)
:
null
;
}
Future
<
ObjRef
>
evaluateInFrame
(
String
expression
)
async
{
return
_timeoutWithMessages
<
ObjRef
>(
()
async
=>
await
_vmService
.
evaluateInFrame
(
await
_getFlutterIsolateId
(),
0
,
expression
)
as
ObjRef
,
()
async
=>
await
_vmService
!
.
evaluateInFrame
(
await
_getFlutterIsolateId
(),
0
,
expression
)
as
ObjRef
,
task:
'Evaluating expression (
$expression
)'
,
);
}
Future
<
InstanceRef
>
evaluate
(
String
targetId
,
String
expression
)
async
{
return
_timeoutWithMessages
<
InstanceRef
>(
()
async
=>
await
_vmService
.
evaluate
(
await
_getFlutterIsolateId
(),
targetId
,
expression
)
as
InstanceRef
,
()
async
=>
await
_vmService
!
.
evaluate
(
await
_getFlutterIsolateId
(),
targetId
,
expression
)
as
InstanceRef
,
task:
'Evaluating expression (
$expression
for
$targetId
)'
,
);
}
Future
<
Frame
>
getTopStackFrame
()
async
{
final
String
flutterIsolateId
=
await
_getFlutterIsolateId
();
final
Stack
stack
=
await
_vmService
.
getStack
(
flutterIsolateId
);
if
(
stack
.
frames
.
isEmpty
)
{
final
Stack
stack
=
await
_vmService
!.
getStack
(
flutterIsolateId
);
final
List
<
Frame
>?
frames
=
stack
.
frames
;
if
(
frames
==
null
||
frames
.
isEmpty
)
{
throw
Exception
(
'Stack is empty'
);
}
return
stack
.
frames
.
first
;
return
frames
.
first
;
}
Future
<
SourcePosition
>
getSourceLocation
()
async
{
Future
<
SourcePosition
?
>
getSourceLocation
()
async
{
final
String
flutterIsolateId
=
await
_getFlutterIsolateId
();
final
Frame
frame
=
await
getTopStackFrame
();
final
Script
script
=
await
_vmService
.
getObject
(
flutterIsolateId
,
frame
.
location
.
script
.
id
)
as
Script
;
return
_lookupTokenPos
(
script
.
tokenPosTable
,
frame
.
location
.
tokenPos
);
final
Script
script
=
await
_vmService
!.
getObject
(
flutterIsolateId
,
frame
.
location
!.
script
!.
id
!
)
as
Script
;
return
_lookupTokenPos
(
script
.
tokenPosTable
!,
frame
.
location
!.
tokenPos
!
);
}
SourcePosition
_lookupTokenPos
(
List
<
List
<
int
>>
table
,
int
tokenPos
)
{
SourcePosition
?
_lookupTokenPos
(
List
<
List
<
int
>>
table
,
int
tokenPos
)
{
for
(
final
List
<
int
>
row
in
table
)
{
final
int
lineNumber
=
row
[
0
];
int
index
=
1
;
...
...
@@ -395,9 +394,9 @@ abstract class FlutterTestDriver {
return
null
;
}
Future
<
Map
<
String
,
dynamic
>>
_waitFor
({
String
event
,
int
id
,
Future
<
Map
<
String
,
Object
?
>>
_waitFor
({
String
?
event
,
int
?
id
,
Duration
timeout
=
defaultTimeout
,
bool
ignoreAppStopEvent
=
false
,
})
async
{
...
...
@@ -405,30 +404,31 @@ abstract class FlutterTestDriver {
assert
(
event
!=
null
||
id
!=
null
);
assert
(
event
==
null
||
id
==
null
);
final
String
interestingOccurrence
=
event
!=
null
?
'
$event
event'
:
'response to request
$id
'
;
final
Completer
<
Map
<
String
,
dynamic
>>
response
=
Completer
<
Map
<
String
,
dynamic
>>();
StreamSubscription
<
String
>
subscription
;
final
Completer
<
Map
<
String
,
Object
?>>
response
=
Completer
<
Map
<
String
,
Object
?
>>();
StreamSubscription
<
String
>
?
subscription
;
subscription
=
_stdout
.
stream
.
listen
((
String
line
)
async
{
final
Map
<
String
,
dynamic
>
json
=
parseFlutterResponse
(
line
);
final
Map
<
String
,
Object
?>?
json
=
parseFlutterResponse
(
line
);
_lastResponse
=
line
;
if
(
json
==
null
)
{
return
;
}
if
((
event
!=
null
&&
json
[
'event'
]
==
event
)
||
(
id
!=
null
&&
json
[
'id'
]
==
id
))
{
await
subscription
.
cancel
();
await
subscription
?
.
cancel
();
_debugPrint
(
'OK (
$interestingOccurrence
)'
);
response
.
complete
(
json
);
}
else
if
(!
ignoreAppStopEvent
&&
json
[
'event'
]
==
'app.stop'
)
{
await
subscription
.
cancel
();
await
subscription
?
.
cancel
();
final
StringBuffer
error
=
StringBuffer
();
error
.
write
(
'Received app.stop event while waiting for
$interestingOccurrence
\n\n
$_errorBuffer
'
);
if
(
json
[
'params'
]
!=
null
)
{
final
Map
<
String
,
dynamic
>
params
=
json
[
'params'
]
as
Map
<
String
,
dynamic
>;
if
(
p
arams
[
'error'
]
!=
null
)
{
error
.
write
(
'
${
p
arams['error']}
\n\n
'
);
final
Object
?
jsonParams
=
json
[
'params'
];
if
(
jsonParams
is
Map
<
String
,
Object
?>)
{
if
(
jsonP
arams
[
'error'
]
!=
null
)
{
error
.
write
(
'
${
jsonP
arams['error']}
\n\n
'
);
}
if
(
json
[
'params'
]
!=
null
&&
params
[
'trace'
]
!=
null
)
{
error
.
write
(
'
${params['trace']}
\n\n
'
);
final
Object
?
trace
=
jsonParams
[
'trace'
];
if
(
trace
!=
null
)
{
error
.
write
(
'
$trace
\n\n
'
);
}
}
response
.
completeError
(
Exception
(
error
.
toString
()));
...
...
@@ -444,7 +444,7 @@ abstract class FlutterTestDriver {
Future
<
T
>
_timeoutWithMessages
<
T
>(
Future
<
T
>
Function
()
callback
,
{
@
required
String
task
,
required
String
task
,
Duration
timeout
=
defaultTimeout
,
})
{
assert
(
task
!=
null
);
...
...
@@ -476,7 +476,7 @@ abstract class FlutterTestDriver {
});
final
Future
<
T
>
future
=
callback
().
whenComplete
(
longWarning
.
cancel
);
return
future
.
catchError
((
dynamic
error
)
{
return
future
.
catchError
((
Object
error
)
{
if
(!
timeoutExpired
)
{
timeoutExpired
=
true
;
_debugPrint
(
messages
.
toString
());
...
...
@@ -489,11 +489,11 @@ abstract class FlutterTestDriver {
class
FlutterRunTestDriver
extends
FlutterTestDriver
{
FlutterRunTestDriver
(
Directory
projectFolder
,
{
String
logPrefix
,
String
?
logPrefix
,
this
.
spawnDdsInstance
=
true
,
})
:
super
(
projectFolder
,
logPrefix:
logPrefix
);
String
_currentRunningAppId
;
String
?
_currentRunningAppId
;
Future
<
void
>
run
({
bool
withDebugger
=
false
,
...
...
@@ -503,8 +503,8 @@ class FlutterRunTestDriver extends FlutterTestDriver {
bool
expressionEvaluation
=
true
,
bool
structuredErrors
=
false
,
bool
singleWidgetReloads
=
false
,
String
script
,
List
<
String
>
additionalCommandArgs
,
String
?
script
,
List
<
String
>
?
additionalCommandArgs
,
})
async
{
await
_setupProcess
(
<
String
>[
...
...
@@ -541,7 +541,7 @@ class FlutterRunTestDriver extends FlutterTestDriver {
bool
startPaused
=
false
,
bool
pauseOnExceptions
=
false
,
bool
singleWidgetReloads
=
false
,
List
<
String
>
additionalCommandArgs
,
List
<
String
>
?
additionalCommandArgs
,
})
async
{
_attachPort
=
port
;
await
_setupProcess
(
...
...
@@ -568,12 +568,12 @@ class FlutterRunTestDriver extends FlutterTestDriver {
@override
Future
<
void
>
_setupProcess
(
List
<
String
>
args
,
{
String
script
,
String
?
script
,
bool
withDebugger
=
false
,
bool
startPaused
=
false
,
bool
pauseOnExceptions
=
false
,
bool
singleWidgetReloads
=
false
,
int
attachPort
,
int
?
attachPort
,
})
async
{
assert
(!
startPaused
||
withDebugger
);
await
super
.
_setupProcess
(
...
...
@@ -589,7 +589,7 @@ class FlutterRunTestDriver extends FlutterTestDriver {
// exited prematurely. This causes the currently suspended `await` to
// deadlock until the test times out. Instead, this causes the test to fail
// fast.
unawaited
(
_process
.
exitCode
.
then
((
_
)
{
unawaited
(
_process
?
.
exitCode
.
then
((
_
)
{
if
(!
prematureExitGuard
.
isCompleted
)
{
prematureExitGuard
.
completeError
(
Exception
(
'Process exited prematurely:
${args.join(' ')}
:
$_errorBuffer
'
));
}
...
...
@@ -600,16 +600,16 @@ class FlutterRunTestDriver extends FlutterTestDriver {
// Stash the PID so that we can terminate the VM more reliably than using
// _process.kill() (`flutter` is a shell script so _process itself is a
// shell, not the flutter tool's Dart process).
final
Map
<
String
,
dynamic
>
connected
=
await
_waitFor
(
event:
'daemon.connected'
);
_processPid
=
(
connected
[
'params'
]
as
Map
<
String
,
dynamic
>)[
'pid'
]
as
int
;
final
Map
<
String
,
Object
?
>
connected
=
await
_waitFor
(
event:
'daemon.connected'
);
_processPid
=
(
connected
[
'params'
]
as
Map
<
String
,
Object
?>?)?[
'pid'
]
as
int
?
;
// Set this up now, but we don't wait it yet. We want to make sure we don't
// miss it while waiting for debugPort below.
final
Future
<
Map
<
String
,
dynamic
>>
started
=
_waitFor
(
event:
'app.started'
,
timeout:
appStartTimeout
);
final
Future
<
Map
<
String
,
Object
?
>>
started
=
_waitFor
(
event:
'app.started'
,
timeout:
appStartTimeout
);
if
(
withDebugger
)
{
final
Map
<
String
,
dynamic
>
debugPort
=
await
_waitFor
(
event:
'app.debugPort'
,
timeout:
appStartTimeout
);
final
String
wsUriString
=
(
debugPort
[
'params'
]
as
Map
<
String
,
dynamic
>)[
'wsUri'
]
as
String
;
final
Map
<
String
,
Object
?
>
debugPort
=
await
_waitFor
(
event:
'app.debugPort'
,
timeout:
appStartTimeout
);
final
String
wsUriString
=
(
debugPort
[
'params'
]
!
as
Map
<
String
,
Object
?>)[
'wsUri'
]!
as
String
;
_vmServiceWsUri
=
Uri
.
parse
(
wsUriString
);
await
connectToVmService
(
pauseOnExceptions:
pauseOnExceptions
);
if
(!
startPaused
)
{
...
...
@@ -626,7 +626,7 @@ class FlutterRunTestDriver extends FlutterTestDriver {
// Now await the started event; if it had already happened the future will
// have already completed.
_currentRunningAppId
=
((
await
started
)[
'params'
]
as
Map
<
String
,
dynamic
>)[
'appId'
]
as
String
;
_currentRunningAppId
=
((
await
started
)[
'params'
]
as
Map
<
String
,
Object
?>?)?[
'appId'
]
as
String
?
;
prematureExitGuard
.
complete
();
}
on
Exception
catch
(
error
,
stackTrace
)
{
prematureExitGuard
.
completeError
(
Exception
(
error
.
toString
()),
stackTrace
);
...
...
@@ -637,7 +637,7 @@ class FlutterRunTestDriver extends FlutterTestDriver {
}
Future
<
void
>
hotRestart
({
bool
pause
=
false
,
bool
debounce
=
false
})
=>
_restart
(
fullRestart:
true
,
pause:
pause
);
Future
<
void
>
hotReload
({
bool
debounce
=
false
,
int
debounceDurationOverrideMs
})
=>
Future
<
void
>
hotReload
({
bool
debounce
=
false
,
int
?
debounceDurationOverrideMs
})
=>
_restart
(
debounce:
debounce
,
debounceDurationOverrideMs:
debounceDurationOverrideMs
);
Future
<
void
>
scheduleFrame
()
async
{
...
...
@@ -646,20 +646,20 @@ class FlutterRunTestDriver extends FlutterTestDriver {
}
await
_sendRequest
(
'app.callServiceExtension'
,
<
String
,
dynamic
>{
'appId'
:
_currentRunningAppId
,
'methodName'
:
'ext.ui.window.scheduleFrame'
},
<
String
,
Object
?
>{
'appId'
:
_currentRunningAppId
,
'methodName'
:
'ext.ui.window.scheduleFrame'
},
);
}
Future
<
void
>
_restart
({
bool
fullRestart
=
false
,
bool
pause
=
false
,
bool
debounce
=
false
,
int
debounceDurationOverrideMs
})
async
{
Future
<
void
>
_restart
({
bool
fullRestart
=
false
,
bool
pause
=
false
,
bool
debounce
=
false
,
int
?
debounceDurationOverrideMs
})
async
{
if
(
_currentRunningAppId
==
null
)
{
throw
Exception
(
'App has not started yet'
);
}
_debugPrint
(
'Performing
${ pause ? "paused " : "" }${ fullRestart ? "hot restart" : "hot reload" }
...'
);
final
Map
<
String
,
dynamic
>
hotReloadResponse
=
await
_sendRequest
(
final
Map
<
String
,
Object
?>?
hotReloadResponse
=
await
_sendRequest
(
'app.restart'
,
<
String
,
dynamic
>{
'appId'
:
_currentRunningAppId
,
'fullRestart'
:
fullRestart
,
'pause'
:
pause
,
'debounce'
:
debounce
,
'debounceDurationOverrideMs'
:
debounceDurationOverrideMs
},
)
as
Map
<
String
,
dynamic
>
;
<
String
,
Object
?
>{
'appId'
:
_currentRunningAppId
,
'fullRestart'
:
fullRestart
,
'pause'
:
pause
,
'debounce'
:
debounce
,
'debounceDurationOverrideMs'
:
debounceDurationOverrideMs
},
)
as
Map
<
String
,
Object
?>?
;
_debugPrint
(
'
${fullRestart ? "Hot restart" : "Hot reload"}
complete.'
);
if
(
hotReloadResponse
==
null
||
hotReloadResponse
[
'code'
]
!=
0
)
{
...
...
@@ -668,20 +668,22 @@ class FlutterRunTestDriver extends FlutterTestDriver {
}
Future
<
int
>
detach
()
async
{
if
(
_process
==
null
)
{
final
Process
?
process
=
_process
;
if
(
process
==
null
)
{
return
0
;
}
if
(
_vmService
!=
null
)
{
final
VmService
?
vmService
=
_vmService
;
if
(
vmService
!=
null
)
{
_debugPrint
(
'Closing VM service...'
);
await
_
vmService
.
dispose
();
await
vmService
.
dispose
();
}
if
(
_currentRunningAppId
!=
null
)
{
_debugPrint
(
'Detaching from app...'
);
await
Future
.
any
<
void
>(<
Future
<
void
>>[
_
process
.
exitCode
,
process
.
exitCode
,
_sendRequest
(
'app.detach'
,
<
String
,
dynamic
>{
'appId'
:
_currentRunningAppId
},
<
String
,
Object
?
>{
'appId'
:
_currentRunningAppId
},
),
]).
timeout
(
quitTimeout
,
...
...
@@ -690,21 +692,23 @@ class FlutterRunTestDriver extends FlutterTestDriver {
_currentRunningAppId
=
null
;
}
_debugPrint
(
'Waiting for process to end...'
);
return
_
process
.
exitCode
.
timeout
(
quitTimeout
,
onTimeout:
_killGracefully
);
return
process
.
exitCode
.
timeout
(
quitTimeout
,
onTimeout:
_killGracefully
);
}
Future
<
int
>
stop
()
async
{
if
(
_vmService
!=
null
)
{
final
VmService
?
vmService
=
_vmService
;
if
(
vmService
!=
null
)
{
_debugPrint
(
'Closing VM service...'
);
await
_
vmService
.
dispose
();
await
vmService
.
dispose
();
}
final
Process
?
process
=
_process
;
if
(
_currentRunningAppId
!=
null
)
{
_debugPrint
(
'Stopping application...'
);
await
Future
.
any
<
void
>(<
Future
<
void
>>[
_process
.
exitCode
,
process
!
.
exitCode
,
_sendRequest
(
'app.stop'
,
<
String
,
dynamic
>{
'appId'
:
_currentRunningAppId
},
<
String
,
Object
?
>{
'appId'
:
_currentRunningAppId
},
),
]).
timeout
(
quitTimeout
,
...
...
@@ -712,33 +716,33 @@ class FlutterRunTestDriver extends FlutterTestDriver {
);
_currentRunningAppId
=
null
;
}
if
(
_
process
!=
null
)
{
if
(
process
!=
null
)
{
_debugPrint
(
'Waiting for process to end...'
);
return
_
process
.
exitCode
.
timeout
(
quitTimeout
,
onTimeout:
_killGracefully
);
return
process
.
exitCode
.
timeout
(
quitTimeout
,
onTimeout:
_killGracefully
);
}
return
0
;
}
int
id
=
1
;
Future
<
dynamic
>
_sendRequest
(
String
method
,
dynamic
params
)
async
{
Future
<
Object
?>
_sendRequest
(
String
method
,
Object
?
params
)
async
{
final
int
requestId
=
id
++;
final
Map
<
String
,
dynamic
>
request
=
<
String
,
dynamic
>{
final
Map
<
String
,
Object
?>
request
=
<
String
,
Object
?
>{
'id'
:
requestId
,
'method'
:
method
,
'params'
:
params
,
};
final
String
jsonEncoded
=
json
.
encode
(<
Map
<
String
,
dynamic
>>[
request
]);
final
String
jsonEncoded
=
json
.
encode
(<
Map
<
String
,
Object
?
>>[
request
]);
_debugPrint
(
jsonEncoded
,
topic:
'=stdin=>'
);
// Set up the response future before we send the request to avoid any
// races. If the method we're calling is app.stop then we tell _waitFor not
// to throw if it sees an app.stop event before the response to this request.
final
Future
<
Map
<
String
,
dynamic
>>
responseFuture
=
_waitFor
(
final
Future
<
Map
<
String
,
Object
?
>>
responseFuture
=
_waitFor
(
id:
requestId
,
ignoreAppStopEvent:
method
==
'app.stop'
,
);
_process
.
stdin
.
writeln
(
jsonEncoded
);
final
Map
<
String
,
dynamic
>
response
=
await
responseFuture
;
_process
?
.
stdin
.
writeln
(
jsonEncoded
);
final
Map
<
String
,
Object
?
>
response
=
await
responseFuture
;
if
(
response
[
'error'
]
!=
null
||
response
[
'result'
]
==
null
)
{
_throwErrorResponse
(
'Unexpected error response'
);
...
...
@@ -755,7 +759,7 @@ class FlutterRunTestDriver extends FlutterTestDriver {
}
class
FlutterTestTestDriver
extends
FlutterTestDriver
{
FlutterTestTestDriver
(
Directory
_projectFolder
,
{
String
logPrefix
})
FlutterTestTestDriver
(
Directory
_projectFolder
,
{
String
?
logPrefix
})
:
super
(
_projectFolder
,
logPrefix:
logPrefix
);
Future
<
void
>
test
({
...
...
@@ -763,7 +767,7 @@ class FlutterTestTestDriver extends FlutterTestDriver {
bool
withDebugger
=
false
,
bool
pauseOnExceptions
=
false
,
bool
coverage
=
false
,
Future
<
void
>
Function
()
beforeStart
,
Future
<
void
>
Function
()
?
beforeStart
,
})
async
{
await
_setupProcess
(<
String
>[
'test'
,
...
...
@@ -778,10 +782,10 @@ class FlutterTestTestDriver extends FlutterTestDriver {
@override
Future
<
void
>
_setupProcess
(
List
<
String
>
args
,
{
String
script
,
String
?
script
,
bool
withDebugger
=
false
,
bool
pauseOnExceptions
=
false
,
Future
<
void
>
Function
()
beforeStart
,
Future
<
void
>
Function
()
?
beforeStart
,
bool
singleWidgetReloads
=
false
,
})
async
{
await
super
.
_setupProcess
(
...
...
@@ -794,13 +798,13 @@ class FlutterTestTestDriver extends FlutterTestDriver {
// Stash the PID so that we can terminate the VM more reliably than using
// _proc.kill() (because _proc is a shell, because `flutter` is a shell
// script).
final
Map
<
String
,
dynamic
>
version
=
await
_waitForJson
();
_processPid
=
version
[
'pid'
]
as
int
;
final
Map
<
String
,
Object
?>?
version
=
await
_waitForJson
();
_processPid
=
version
?[
'pid'
]
as
int
?
;
if
(
withDebugger
)
{
final
Map
<
String
,
dynamic
>
startedProcessParams
=
(
await
_waitFor
(
event:
'test.startedProcess'
,
timeout:
appStartTimeout
))[
'params'
]
as
Map
<
String
,
dynamic
>;
final
String
vmServiceHttpString
=
startedProcessParams
[
'observatoryUri'
]
as
String
;
final
Map
<
String
,
Object
?
>
startedProcessParams
=
(
await
_waitFor
(
event:
'test.startedProcess'
,
timeout:
appStartTimeout
))[
'params'
]
!
as
Map
<
String
,
Object
?
>;
final
String
vmServiceHttpString
=
startedProcessParams
[
'observatoryUri'
]
!
as
String
;
_vmServiceWsUri
=
Uri
.
parse
(
vmServiceHttpString
).
replace
(
scheme:
'ws'
,
path:
'/ws'
);
await
connectToVmService
(
pauseOnExceptions:
pauseOnExceptions
);
// Allow us to run code before we start, eg. to set up breakpoints.
...
...
@@ -811,19 +815,19 @@ class FlutterTestTestDriver extends FlutterTestDriver {
}
}
Future
<
Map
<
String
,
dynamic
>
>
_waitForJson
({
Future
<
Map
<
String
,
Object
?>?
>
_waitForJson
({
Duration
timeout
=
defaultTimeout
,
})
async
{
assert
(
timeout
!=
null
);
return
_timeoutWithMessages
<
Map
<
String
,
dynamic
>
>(
()
=>
_stdout
.
stream
.
map
<
Map
<
String
,
dynamic
>
>(
_parseJsonResponse
)
.
firstWhere
((
Map
<
String
,
dynamic
>
output
)
=>
output
!=
null
),
return
_timeoutWithMessages
<
Map
<
String
,
Object
?>?
>(
()
=>
_stdout
.
stream
.
map
<
Map
<
String
,
Object
?>?
>(
_parseJsonResponse
)
.
firstWhere
((
Map
<
String
,
Object
?>?
output
)
=>
output
!=
null
),
timeout:
timeout
,
task:
'Waiting for JSON'
,
);
}
Map
<
String
,
dynamic
>
_parseJsonResponse
(
String
line
)
{
Map
<
String
,
Object
?>?
_parseJsonResponse
(
String
line
)
{
try
{
return
castStringKeyedMap
(
json
.
decode
(
line
));
}
on
Exception
{
...
...
@@ -838,7 +842,7 @@ class FlutterTestTestDriver extends FlutterTestDriver {
// end of test run.
final
StreamSubscription
<
String
>
subscription
=
_stdout
.
stream
.
listen
(
(
String
line
)
async
{
final
Map
<
String
,
dynamic
>
json
=
_parseJsonResponse
(
line
);
final
Map
<
String
,
Object
?>?
json
=
_parseJsonResponse
(
line
);
if
(
json
!=
null
&&
json
[
'type'
]
!=
null
&&
json
[
'success'
]
!=
null
)
{
done
.
complete
(
json
[
'type'
]
==
'done'
&&
json
[
'success'
]
==
true
);
}
...
...
@@ -846,9 +850,9 @@ class FlutterTestTestDriver extends FlutterTestDriver {
await
resume
();
final
Future
<
dynamic
>
timeoutFuture
=
Future
<
dynamic
>.
delayed
(
defaultTimeout
);
await
Future
.
any
<
dynamic
>(<
Future
<
dynamic
>>[
done
.
future
,
timeoutFuture
]);
final
Future
<
Object
>
timeoutFuture
=
Future
<
Object
>.
delayed
(
defaultTimeout
);
await
Future
.
any
<
Object
>(<
Future
<
Object
>>[
done
.
future
,
timeoutFuture
]);
await
subscription
.
cancel
();
if
(!
done
.
isCompleted
)
{
await
quit
();
...
...
@@ -860,10 +864,10 @@ Stream<String> transformToLines(Stream<List<int>> byteStream) {
return
byteStream
.
transform
<
String
>(
utf8
.
decoder
).
transform
<
String
>(
const
LineSplitter
());
}
Map
<
String
,
dynamic
>
parseFlutterResponse
(
String
line
)
{
Map
<
String
,
Object
?>?
parseFlutterResponse
(
String
line
)
{
if
(
line
.
startsWith
(
'['
)
&&
line
.
endsWith
(
']'
)
&&
line
.
length
>
2
)
{
try
{
final
Map
<
String
,
dynamic
>
response
=
castStringKeyedMap
((
json
.
decode
(
line
)
as
List
<
dynamic
>)[
0
]);
final
Map
<
String
,
Object
?>?
response
=
castStringKeyedMap
((
json
.
decode
(
line
)
as
List
<
Object
?
>)[
0
]);
return
response
;
}
on
FormatException
{
// Not valid JSON, so likely some other output that was surrounded by [brackets]
...
...
@@ -888,13 +892,13 @@ Future<Isolate> waitForExtension(VmService vmService, String extension) async {
// Do nothing, already subscribed.
}
vmService
.
onExtensionEvent
.
listen
((
Event
event
)
{
if
(
event
.
json
[
'extensionKind'
]
==
'Flutter.FrameworkInitialization'
)
{
if
(
event
.
json
?
[
'extensionKind'
]
==
'Flutter.FrameworkInitialization'
)
{
completer
.
complete
();
}
});
final
IsolateRef
isolateRef
=
(
await
vmService
.
getVM
()).
isolates
.
first
;
final
Isolate
isolate
=
await
vmService
.
getIsolate
(
isolateRef
.
id
);
if
(
isolate
.
extensionRPCs
.
contains
(
extension
))
{
final
IsolateRef
isolateRef
=
(
await
vmService
.
getVM
()).
isolates
!
.
first
;
final
Isolate
isolate
=
await
vmService
.
getIsolate
(
isolateRef
.
id
!
);
if
(
isolate
.
extensionRPCs
!
.
contains
(
extension
))
{
return
isolate
;
}
await
completer
.
future
;
...
...
packages/flutter_tools/test/integration.shard/test_utils.dart
View file @
305a855f
...
...
@@ -2,13 +2,10 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import
'package:file/file.dart'
;
import
'package:file/local.dart'
;
import
'package:flutter_tools/src/base/io.dart'
;
import
'package:flutter_tools/src/base/platform.dart'
;
import
'package:meta/meta.dart'
;
import
'package:process/process.dart'
;
import
'package:vm_service/vm_service.dart'
;
...
...
@@ -91,18 +88,18 @@ List<String> getLocalEngineArguments() {
}
Future
<
void
>
pollForServiceExtensionValue
<
T
>({
@
required
FlutterTestDriver
testDriver
,
@
required
String
extension
,
@
required
T
continuePollingValue
,
@
required
Matcher
matches
,
required
FlutterTestDriver
testDriver
,
required
String
extension
,
required
T
continuePollingValue
,
required
Matcher
matches
,
String
valueKey
=
'value'
,
})
async
{
for
(
int
i
=
0
;
i
<
10
;
i
++)
{
final
Response
response
=
await
testDriver
.
callServiceExtension
(
extension
);
if
(
response
.
json
[
valueKey
]
as
T
==
continuePollingValue
)
{
if
(
response
.
json
?
[
valueKey
]
as
T
==
continuePollingValue
)
{
await
Future
<
void
>.
delayed
(
const
Duration
(
seconds:
1
));
}
else
{
expect
(
response
.
json
[
valueKey
]
as
T
,
matches
);
expect
(
response
.
json
?
[
valueKey
]
as
T
,
matches
);
return
;
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment