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
8edc3f76
Unverified
Commit
8edc3f76
authored
Aug 19, 2019
by
adazh
Committed by
GitHub
Aug 19, 2019
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added a composable waitForCondition Driver/extension API (#37736)
parent
fc20cb31
Changes
7
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
775 additions
and
76 deletions
+775
-76
find.dart
packages/flutter_driver/lib/src/common/find.dart
+0
-46
wait.dart
packages/flutter_driver/lib/src/common/wait.dart
+324
-0
driver.dart
packages/flutter_driver/lib/src/driver/driver.dart
+8
-2
extension.dart
packages/flutter_driver/lib/src/extension/extension.dart
+21
-6
flutter_driver_test.dart
packages/flutter_driver/test/flutter_driver_test.dart
+31
-1
extension_test.dart
packages/flutter_driver/test/src/extension_test.dart
+189
-21
wait_test.dart
packages/flutter_driver/test/src/wait_test.dart
+202
-0
No files found.
packages/flutter_driver/lib/src/common/find.dart
View file @
8edc3f76
...
@@ -106,52 +106,6 @@ class WaitForAbsentResult extends Result {
...
@@ -106,52 +106,6 @@ class WaitForAbsentResult extends Result {
Map
<
String
,
dynamic
>
toJson
()
=>
<
String
,
dynamic
>{};
Map
<
String
,
dynamic
>
toJson
()
=>
<
String
,
dynamic
>{};
}
}
/// A Flutter Driver command that waits until there are no more transient callbacks in the queue.
class
WaitUntilNoTransientCallbacks
extends
Command
{
/// Creates a command that waits for there to be no transient callbacks.
const
WaitUntilNoTransientCallbacks
({
Duration
timeout
})
:
super
(
timeout:
timeout
);
/// Deserializes this command from the value generated by [serialize].
WaitUntilNoTransientCallbacks
.
deserialize
(
Map
<
String
,
String
>
json
)
:
super
.
deserialize
(
json
);
@override
String
get
kind
=>
'waitUntilNoTransientCallbacks'
;
}
/// A Flutter Driver command that waits until the frame is synced.
class
WaitUntilNoPendingFrame
extends
Command
{
/// Creates a command that waits until there's no pending frame scheduled.
const
WaitUntilNoPendingFrame
({
Duration
timeout
})
:
super
(
timeout:
timeout
);
/// Deserializes this command from the value generated by [serialize].
WaitUntilNoPendingFrame
.
deserialize
(
Map
<
String
,
String
>
json
)
:
super
.
deserialize
(
json
);
@override
String
get
kind
=>
'waitUntilNoPendingFrame'
;
}
/// A Flutter Driver command that waits until the Flutter engine rasterizes the
/// first frame.
///
/// {@template flutter.frame_rasterized_vs_presented}
/// Usually, the time that a frame is rasterized is very close to the time that
/// it gets presented on the display. Specifically, rasterization is the last
/// expensive phase of a frame that's still in Flutter's control.
/// {@endtemplate}
class
WaitUntilFirstFrameRasterized
extends
Command
{
/// Creates this command.
const
WaitUntilFirstFrameRasterized
({
Duration
timeout
})
:
super
(
timeout:
timeout
);
/// Deserializes this command from the value generated by [serialize].
WaitUntilFirstFrameRasterized
.
deserialize
(
Map
<
String
,
String
>
json
)
:
super
.
deserialize
(
json
);
@override
String
get
kind
=>
'waitUntilFirstFrameRasterized'
;
}
/// Base class for Flutter Driver finders, objects that describe how the driver
/// Base class for Flutter Driver finders, objects that describe how the driver
/// should search for elements.
/// should search for elements.
abstract
class
SerializableFinder
{
abstract
class
SerializableFinder
{
...
...
packages/flutter_driver/lib/src/common/wait.dart
0 → 100644
View file @
8edc3f76
This diff is collapsed.
Click to expand it.
packages/flutter_driver/lib/src/driver/driver.dart
View file @
8edc3f76
...
@@ -28,6 +28,7 @@ import '../common/render_tree.dart';
...
@@ -28,6 +28,7 @@ import '../common/render_tree.dart';
import
'../common/request_data.dart'
;
import
'../common/request_data.dart'
;
import
'../common/semantics.dart'
;
import
'../common/semantics.dart'
;
import
'../common/text.dart'
;
import
'../common/text.dart'
;
import
'../common/wait.dart'
;
import
'common.dart'
;
import
'common.dart'
;
import
'timeline.dart'
;
import
'timeline.dart'
;
...
@@ -491,12 +492,17 @@ class FlutterDriver {
...
@@ -491,12 +492,17 @@ class FlutterDriver {
await
_sendCommand
(
WaitForAbsent
(
finder
,
timeout:
timeout
));
await
_sendCommand
(
WaitForAbsent
(
finder
,
timeout:
timeout
));
}
}
/// Waits until the given [waitCondition] is satisfied.
Future
<
void
>
waitForCondition
(
WaitCondition
waitCondition
,
{
Duration
timeout
})
async
{
await
_sendCommand
(
WaitForCondition
(
waitCondition
,
timeout:
timeout
));
}
/// Waits until there are no more transient callbacks in the queue.
/// Waits until there are no more transient callbacks in the queue.
///
///
/// Use this method when you need to wait for the moment when the application
/// Use this method when you need to wait for the moment when the application
/// becomes "stable", for example, prior to taking a [screenshot].
/// becomes "stable", for example, prior to taking a [screenshot].
Future
<
void
>
waitUntilNoTransientCallbacks
({
Duration
timeout
})
async
{
Future
<
void
>
waitUntilNoTransientCallbacks
({
Duration
timeout
})
async
{
await
_sendCommand
(
Wait
UntilNoTransientCallbacks
(
timeout:
timeout
));
await
_sendCommand
(
Wait
ForCondition
(
const
NoTransientCallbacksCondition
(),
timeout:
timeout
));
}
}
/// Waits until the next [Window.onReportTimings] is called.
/// Waits until the next [Window.onReportTimings] is called.
...
@@ -504,7 +510,7 @@ class FlutterDriver {
...
@@ -504,7 +510,7 @@ class FlutterDriver {
/// Use this method to wait for the first frame to be rasterized during the
/// Use this method to wait for the first frame to be rasterized during the
/// app launch.
/// app launch.
Future
<
void
>
waitUntilFirstFrameRasterized
()
async
{
Future
<
void
>
waitUntilFirstFrameRasterized
()
async
{
await
_sendCommand
(
const
Wait
UntilFirstFrameRasterized
(
));
await
_sendCommand
(
const
Wait
ForCondition
(
FirstFrameRasterizedCondition
()
));
}
}
Future
<
DriverOffset
>
_getOffset
(
SerializableFinder
finder
,
OffsetType
type
,
{
Duration
timeout
})
async
{
Future
<
DriverOffset
>
_getOffset
(
SerializableFinder
finder
,
OffsetType
type
,
{
Duration
timeout
})
async
{
...
...
packages/flutter_driver/lib/src/extension/extension.dart
View file @
8edc3f76
...
@@ -29,6 +29,7 @@ import '../common/render_tree.dart';
...
@@ -29,6 +29,7 @@ import '../common/render_tree.dart';
import
'../common/request_data.dart'
;
import
'../common/request_data.dart'
;
import
'../common/semantics.dart'
;
import
'../common/semantics.dart'
;
import
'../common/text.dart'
;
import
'../common/text.dart'
;
import
'../common/wait.dart'
;
const
String
_extensionMethodName
=
'driver'
;
const
String
_extensionMethodName
=
'driver'
;
const
String
_extensionMethod
=
'ext.flutter.
$_extensionMethodName
'
;
const
String
_extensionMethod
=
'ext.flutter.
$_extensionMethodName
'
;
...
@@ -112,9 +113,10 @@ class FlutterDriverExtension {
...
@@ -112,9 +113,10 @@ class FlutterDriverExtension {
'tap'
:
_tap
,
'tap'
:
_tap
,
'waitFor'
:
_waitFor
,
'waitFor'
:
_waitFor
,
'waitForAbsent'
:
_waitForAbsent
,
'waitForAbsent'
:
_waitForAbsent
,
'waitUntilNoTransientCallbacks'
:
_waitUntilNoTransientCallbacks
,
'waitForCondition'
:
_waitForCondition
,
'waitUntilNoPendingFrame'
:
_waitUntilNoPendingFrame
,
'waitUntilNoTransientCallbacks'
:
_waitUntilNoTransientCallbacks
,
// ignore: deprecated_member_use_from_same_package
'waitUntilFirstFrameRasterized'
:
_waitUntilFirstFrameRasterized
,
'waitUntilNoPendingFrame'
:
_waitUntilNoPendingFrame
,
// ignore: deprecated_member_use_from_same_package
'waitUntilFirstFrameRasterized'
:
_waitUntilFirstFrameRasterized
,
// ignore: deprecated_member_use_from_same_package
'get_semantics_id'
:
_getSemanticsId
,
'get_semantics_id'
:
_getSemanticsId
,
'get_offset'
:
_getOffset
,
'get_offset'
:
_getOffset
,
'get_diagnostics_tree'
:
_getDiagnosticsTree
,
'get_diagnostics_tree'
:
_getDiagnosticsTree
,
...
@@ -134,9 +136,10 @@ class FlutterDriverExtension {
...
@@ -134,9 +136,10 @@ class FlutterDriverExtension {
'tap'
:
(
Map
<
String
,
String
>
params
)
=>
Tap
.
deserialize
(
params
),
'tap'
:
(
Map
<
String
,
String
>
params
)
=>
Tap
.
deserialize
(
params
),
'waitFor'
:
(
Map
<
String
,
String
>
params
)
=>
WaitFor
.
deserialize
(
params
),
'waitFor'
:
(
Map
<
String
,
String
>
params
)
=>
WaitFor
.
deserialize
(
params
),
'waitForAbsent'
:
(
Map
<
String
,
String
>
params
)
=>
WaitForAbsent
.
deserialize
(
params
),
'waitForAbsent'
:
(
Map
<
String
,
String
>
params
)
=>
WaitForAbsent
.
deserialize
(
params
),
'waitUntilNoTransientCallbacks'
:
(
Map
<
String
,
String
>
params
)
=>
WaitUntilNoTransientCallbacks
.
deserialize
(
params
),
'waitForCondition'
:
(
Map
<
String
,
String
>
params
)
=>
WaitForCondition
.
deserialize
(
params
),
'waitUntilNoPendingFrame'
:
(
Map
<
String
,
String
>
params
)
=>
WaitUntilNoPendingFrame
.
deserialize
(
params
),
'waitUntilNoTransientCallbacks'
:
(
Map
<
String
,
String
>
params
)
=>
WaitUntilNoTransientCallbacks
.
deserialize
(
params
),
// ignore: deprecated_member_use_from_same_package
'waitUntilFirstFrameRasterized'
:
(
Map
<
String
,
String
>
params
)
=>
WaitUntilFirstFrameRasterized
.
deserialize
(
params
),
'waitUntilNoPendingFrame'
:
(
Map
<
String
,
String
>
params
)
=>
WaitUntilNoPendingFrame
.
deserialize
(
params
),
// ignore: deprecated_member_use_from_same_package
'waitUntilFirstFrameRasterized'
:
(
Map
<
String
,
String
>
params
)
=>
WaitUntilFirstFrameRasterized
.
deserialize
(
params
),
// ignore: deprecated_member_use_from_same_package
'get_semantics_id'
:
(
Map
<
String
,
String
>
params
)
=>
GetSemanticsId
.
deserialize
(
params
),
'get_semantics_id'
:
(
Map
<
String
,
String
>
params
)
=>
GetSemanticsId
.
deserialize
(
params
),
'get_offset'
:
(
Map
<
String
,
String
>
params
)
=>
GetOffset
.
deserialize
(
params
),
'get_offset'
:
(
Map
<
String
,
String
>
params
)
=>
GetOffset
.
deserialize
(
params
),
'get_diagnostics_tree'
:
(
Map
<
String
,
String
>
params
)
=>
GetDiagnosticsTree
.
deserialize
(
params
),
'get_diagnostics_tree'
:
(
Map
<
String
,
String
>
params
)
=>
GetDiagnosticsTree
.
deserialize
(
params
),
...
@@ -223,6 +226,7 @@ class FlutterDriverExtension {
...
@@ -223,6 +226,7 @@ class FlutterDriverExtension {
}
}
// This can be used to wait for the first frame being rasterized during app launch.
// This can be used to wait for the first frame being rasterized during app launch.
@Deprecated
(
'This method has been deprecated in favor of _waitForCondition.'
)
Future
<
Result
>
_waitUntilFirstFrameRasterized
(
Command
command
)
async
{
Future
<
Result
>
_waitUntilFirstFrameRasterized
(
Command
command
)
async
{
await
WidgetsBinding
.
instance
.
waitUntilFirstFrameRasterized
;
await
WidgetsBinding
.
instance
.
waitUntilFirstFrameRasterized
;
return
null
;
return
null
;
...
@@ -370,6 +374,14 @@ class FlutterDriverExtension {
...
@@ -370,6 +374,14 @@ class FlutterDriverExtension {
return
const
WaitForAbsentResult
();
return
const
WaitForAbsentResult
();
}
}
Future
<
Result
>
_waitForCondition
(
Command
command
)
async
{
assert
(
command
!=
null
);
final
WaitForCondition
waitForConditionCommand
=
command
;
await
waitForConditionCommand
.
condition
.
wait
();
return
null
;
}
@Deprecated
(
'This method has been deprecated in favor of _waitForCondition.'
)
Future
<
Result
>
_waitUntilNoTransientCallbacks
(
Command
command
)
async
{
Future
<
Result
>
_waitUntilNoTransientCallbacks
(
Command
command
)
async
{
if
(
SchedulerBinding
.
instance
.
transientCallbackCount
!=
0
)
if
(
SchedulerBinding
.
instance
.
transientCallbackCount
!=
0
)
await
_waitUntilFrame
(()
=>
SchedulerBinding
.
instance
.
transientCallbackCount
==
0
);
await
_waitUntilFrame
(()
=>
SchedulerBinding
.
instance
.
transientCallbackCount
==
0
);
...
@@ -393,6 +405,9 @@ class FlutterDriverExtension {
...
@@ -393,6 +405,9 @@ class FlutterDriverExtension {
/// `set_frame_sync` method. See [FlutterDriver.runUnsynchronized] for more
/// `set_frame_sync` method. See [FlutterDriver.runUnsynchronized] for more
/// details on how to do this. Note, disabling frame sync will require the
/// details on how to do this. Note, disabling frame sync will require the
/// test author to use some other method to avoid flakiness.
/// test author to use some other method to avoid flakiness.
///
/// This method has been deprecated in favor of [_waitForCondition].
@Deprecated
(
'This method has been deprecated in favor of _waitForCondition.'
)
Future
<
Result
>
_waitUntilNoPendingFrame
(
Command
command
)
async
{
Future
<
Result
>
_waitUntilNoPendingFrame
(
Command
command
)
async
{
await
_waitUntilFrame
(()
{
await
_waitUntilFrame
(()
{
return
SchedulerBinding
.
instance
.
transientCallbackCount
==
0
return
SchedulerBinding
.
instance
.
transientCallbackCount
==
0
...
...
packages/flutter_driver/test/flutter_driver_test.dart
View file @
8edc3f76
...
@@ -6,6 +6,7 @@ import 'dart:async';
...
@@ -6,6 +6,7 @@ import 'dart:async';
import
'package:flutter_driver/src/common/error.dart'
;
import
'package:flutter_driver/src/common/error.dart'
;
import
'package:flutter_driver/src/common/health.dart'
;
import
'package:flutter_driver/src/common/health.dart'
;
import
'package:flutter_driver/src/common/wait.dart'
;
import
'package:flutter_driver/src/driver/driver.dart'
;
import
'package:flutter_driver/src/driver/driver.dart'
;
import
'package:flutter_driver/src/driver/timeline.dart'
;
import
'package:flutter_driver/src/driver/timeline.dart'
;
import
'package:json_rpc_2/json_rpc_2.dart'
as
rpc
;
import
'package:json_rpc_2/json_rpc_2.dart'
as
rpc
;
...
@@ -248,12 +249,41 @@ void main() {
...
@@ -248,12 +249,41 @@ void main() {
});
});
});
});
group
(
'waitForCondition'
,
()
{
test
(
'sends the wait for NoPendingFrameCondition command'
,
()
async
{
when
(
mockIsolate
.
invokeExtension
(
any
,
any
)).
thenAnswer
((
Invocation
i
)
{
expect
(
i
.
positionalArguments
[
1
],
<
String
,
dynamic
>{
'command'
:
'waitForCondition'
,
'timeout'
:
_kSerializedTestTimeout
,
'conditionName'
:
'NoPendingFrameCondition'
,
});
return
makeMockResponse
(<
String
,
dynamic
>{});
});
await
driver
.
waitForCondition
(
const
NoPendingFrameCondition
(),
timeout:
_kTestTimeout
);
});
test
(
'sends the waitForCondition of combined conditions command'
,
()
async
{
when
(
mockIsolate
.
invokeExtension
(
any
,
any
)).
thenAnswer
((
Invocation
i
)
{
expect
(
i
.
positionalArguments
[
1
],
<
String
,
dynamic
>{
'command'
:
'waitForCondition'
,
'timeout'
:
_kSerializedTestTimeout
,
'conditionName'
:
'CombinedCondition'
,
'conditions'
:
'[{"conditionName":"NoPendingFrameCondition"},{"conditionName":"NoTransientCallbacksCondition"}]'
,
});
return
makeMockResponse
(<
String
,
dynamic
>{});
});
const
WaitCondition
combinedCondition
=
CombinedCondition
(<
WaitCondition
>[
NoPendingFrameCondition
(),
NoTransientCallbacksCondition
()]);
await
driver
.
waitForCondition
(
combinedCondition
,
timeout:
_kTestTimeout
);
});
});
group
(
'waitUntilNoTransientCallbacks'
,
()
{
group
(
'waitUntilNoTransientCallbacks'
,
()
{
test
(
'sends the waitUntilNoTransientCallbacks command'
,
()
async
{
test
(
'sends the waitUntilNoTransientCallbacks command'
,
()
async
{
when
(
mockIsolate
.
invokeExtension
(
any
,
any
)).
thenAnswer
((
Invocation
i
)
{
when
(
mockIsolate
.
invokeExtension
(
any
,
any
)).
thenAnswer
((
Invocation
i
)
{
expect
(
i
.
positionalArguments
[
1
],
<
String
,
dynamic
>{
expect
(
i
.
positionalArguments
[
1
],
<
String
,
dynamic
>{
'command'
:
'wait
UntilNoTransientCallbacks
'
,
'command'
:
'wait
ForCondition
'
,
'timeout'
:
_kSerializedTestTimeout
,
'timeout'
:
_kSerializedTestTimeout
,
'conditionName'
:
'NoTransientCallbacksCondition'
,
});
});
return
makeMockResponse
(<
String
,
dynamic
>{});
return
makeMockResponse
(<
String
,
dynamic
>{});
});
});
...
...
packages/flutter_driver/test/src/extension_test.dart
View file @
8edc3f76
...
@@ -12,6 +12,7 @@ import 'package:flutter_driver/src/common/find.dart';
...
@@ -12,6 +12,7 @@ import 'package:flutter_driver/src/common/find.dart';
import
'package:flutter_driver/src/common/geometry.dart'
;
import
'package:flutter_driver/src/common/geometry.dart'
;
import
'package:flutter_driver/src/common/request_data.dart'
;
import
'package:flutter_driver/src/common/request_data.dart'
;
import
'package:flutter_driver/src/common/text.dart'
;
import
'package:flutter_driver/src/common/text.dart'
;
import
'package:flutter_driver/src/common/wait.dart'
;
import
'package:flutter_driver/src/extension/extension.dart'
;
import
'package:flutter_driver/src/extension/extension.dart'
;
import
'package:flutter_test/flutter_test.dart'
;
import
'package:flutter_test/flutter_test.dart'
;
...
@@ -28,18 +29,18 @@ void main() {
...
@@ -28,18 +29,18 @@ void main() {
});
});
testWidgets
(
'returns immediately when transient callback queue is empty'
,
(
WidgetTester
tester
)
async
{
testWidgets
(
'returns immediately when transient callback queue is empty'
,
(
WidgetTester
tester
)
async
{
extension
.
call
(
const
WaitUntilNoTransientCallbacks
().
serialize
())
extension
.
call
(
const
WaitUntilNoTransientCallbacks
().
serialize
())
// ignore: deprecated_member_use_from_same_package
.
then
<
void
>(
expectAsync1
((
Map
<
String
,
dynamic
>
r
)
{
.
then
<
void
>(
expectAsync1
((
Map
<
String
,
dynamic
>
r
)
{
result
=
r
;
result
=
r
;
}));
}));
await
tester
.
idle
();
await
tester
.
idle
();
expect
(
expect
(
result
,
result
,
<
String
,
dynamic
>{
<
String
,
dynamic
>{
'isError'
:
false
,
'isError'
:
false
,
'response'
:
null
,
'response'
:
null
,
},
},
);
);
});
});
...
@@ -48,10 +49,10 @@ void main() {
...
@@ -48,10 +49,10 @@ void main() {
// Intentionally blank. We only care about existence of a callback.
// Intentionally blank. We only care about existence of a callback.
});
});
extension
.
call
(
const
WaitUntilNoTransientCallbacks
().
serialize
())
extension
.
call
(
const
WaitUntilNoTransientCallbacks
().
serialize
())
// ignore: deprecated_member_use_from_same_package
.
then
<
void
>(
expectAsync1
((
Map
<
String
,
dynamic
>
r
)
{
.
then
<
void
>(
expectAsync1
((
Map
<
String
,
dynamic
>
r
)
{
result
=
r
;
result
=
r
;
}));
}));
// Nothing should happen until the next frame.
// Nothing should happen until the next frame.
await
tester
.
idle
();
await
tester
.
idle
();
...
@@ -60,11 +61,11 @@ void main() {
...
@@ -60,11 +61,11 @@ void main() {
// NOW we should receive the result.
// NOW we should receive the result.
await
tester
.
pump
();
await
tester
.
pump
();
expect
(
expect
(
result
,
result
,
<
String
,
dynamic
>{
<
String
,
dynamic
>{
'isError'
:
false
,
'isError'
:
false
,
'response'
:
null
,
'response'
:
null
,
},
},
);
);
});
});
...
@@ -76,6 +77,173 @@ void main() {
...
@@ -76,6 +77,173 @@ void main() {
});
});
});
});
group
(
'waitForCondition'
,
()
{
FlutterDriverExtension
extension
;
Map
<
String
,
dynamic
>
result
;
int
messageId
=
0
;
final
List
<
String
>
log
=
<
String
>[];
setUp
(()
{
result
=
null
;
extension
=
FlutterDriverExtension
((
String
message
)
async
{
log
.
add
(
message
);
return
(
messageId
+=
1
).
toString
();
},
false
);
});
testWidgets
(
'waiting for NoTransientCallbacksCondition returns immediately when transient callback queue is empty'
,
(
WidgetTester
tester
)
async
{
extension
.
call
(
const
WaitForCondition
(
NoTransientCallbacksCondition
()).
serialize
())
.
then
<
void
>(
expectAsync1
((
Map
<
String
,
dynamic
>
r
)
{
result
=
r
;
}));
await
tester
.
idle
();
expect
(
result
,
<
String
,
dynamic
>{
'isError'
:
false
,
'response'
:
null
,
},
);
});
testWidgets
(
'waiting for NoTransientCallbacksCondition returns until no transient callbacks'
,
(
WidgetTester
tester
)
async
{
SchedulerBinding
.
instance
.
scheduleFrameCallback
((
_
)
{
// Intentionally blank. We only care about existence of a callback.
});
extension
.
call
(
const
WaitForCondition
(
NoTransientCallbacksCondition
()).
serialize
())
.
then
<
void
>(
expectAsync1
((
Map
<
String
,
dynamic
>
r
)
{
result
=
r
;
}));
// Nothing should happen until the next frame.
await
tester
.
idle
();
expect
(
result
,
isNull
);
// NOW we should receive the result.
await
tester
.
pump
();
expect
(
result
,
<
String
,
dynamic
>{
'isError'
:
false
,
'response'
:
null
,
},
);
});
testWidgets
(
'waiting for NoPendingFrameCondition returns immediately when frame is synced'
,
(
WidgetTester
tester
)
async
{
extension
.
call
(
const
WaitForCondition
(
NoPendingFrameCondition
()).
serialize
())
.
then
<
void
>(
expectAsync1
((
Map
<
String
,
dynamic
>
r
)
{
result
=
r
;
}));
await
tester
.
idle
();
expect
(
result
,
<
String
,
dynamic
>{
'isError'
:
false
,
'response'
:
null
,
},
);
});
testWidgets
(
'waiting for NoPendingFrameCondition returns until no pending scheduled frame'
,
(
WidgetTester
tester
)
async
{
SchedulerBinding
.
instance
.
scheduleFrame
();
extension
.
call
(
const
WaitForCondition
(
NoPendingFrameCondition
()).
serialize
())
.
then
<
void
>(
expectAsync1
((
Map
<
String
,
dynamic
>
r
)
{
result
=
r
;
}));
// Nothing should happen until the next frame.
await
tester
.
idle
();
expect
(
result
,
isNull
);
// NOW we should receive the result.
await
tester
.
pump
();
expect
(
result
,
<
String
,
dynamic
>{
'isError'
:
false
,
'response'
:
null
,
},
);
});
testWidgets
(
'waiting for combined conditions returns immediately'
,
(
WidgetTester
tester
)
async
{
const
WaitCondition
combinedCondition
=
CombinedCondition
(<
WaitCondition
>[
NoTransientCallbacksCondition
(),
NoPendingFrameCondition
()]);
extension
.
call
(
const
WaitForCondition
(
combinedCondition
).
serialize
())
.
then
<
void
>(
expectAsync1
((
Map
<
String
,
dynamic
>
r
)
{
result
=
r
;
}));
await
tester
.
idle
();
expect
(
result
,
<
String
,
dynamic
>{
'isError'
:
false
,
'response'
:
null
,
},
);
});
testWidgets
(
'waiting for combined conditions returns until no transient callbacks'
,
(
WidgetTester
tester
)
async
{
SchedulerBinding
.
instance
.
scheduleFrame
();
SchedulerBinding
.
instance
.
scheduleFrameCallback
((
_
)
{
// Intentionally blank. We only care about existence of a callback.
});
const
WaitCondition
combinedCondition
=
CombinedCondition
(<
WaitCondition
>[
NoTransientCallbacksCondition
(),
NoPendingFrameCondition
()]);
extension
.
call
(
const
WaitForCondition
(
combinedCondition
).
serialize
())
.
then
<
void
>(
expectAsync1
((
Map
<
String
,
dynamic
>
r
)
{
result
=
r
;
}));
// Nothing should happen until the next frame.
await
tester
.
idle
();
expect
(
result
,
isNull
);
// NOW we should receive the result.
await
tester
.
pump
();
expect
(
result
,
<
String
,
dynamic
>{
'isError'
:
false
,
'response'
:
null
,
},
);
});
testWidgets
(
'waiting for combined conditions returns until no pending scheduled frame'
,
(
WidgetTester
tester
)
async
{
SchedulerBinding
.
instance
.
scheduleFrame
();
SchedulerBinding
.
instance
.
scheduleFrameCallback
((
_
)
{
// Intentionally blank. We only care about existence of a callback.
});
const
WaitCondition
combinedCondition
=
CombinedCondition
(<
WaitCondition
>[
NoPendingFrameCondition
(),
NoTransientCallbacksCondition
()]);
extension
.
call
(
const
WaitForCondition
(
combinedCondition
).
serialize
())
.
then
<
void
>(
expectAsync1
((
Map
<
String
,
dynamic
>
r
)
{
result
=
r
;
}));
// Nothing should happen until the next frame.
await
tester
.
idle
();
expect
(
result
,
isNull
);
// NOW we should receive the result.
await
tester
.
pump
();
expect
(
result
,
<
String
,
dynamic
>{
'isError'
:
false
,
'response'
:
null
,
},
);
});
});
group
(
'getSemanticsId'
,
()
{
group
(
'getSemanticsId'
,
()
{
FlutterDriverExtension
extension
;
FlutterDriverExtension
extension
;
setUp
(()
{
setUp
(()
{
...
@@ -345,7 +513,7 @@ void main() {
...
@@ -345,7 +513,7 @@ void main() {
testWidgets
(
'returns immediately when frame is synced'
,
(
testWidgets
(
'returns immediately when frame is synced'
,
(
WidgetTester
tester
)
async
{
WidgetTester
tester
)
async
{
extension
.
call
(
const
WaitUntilNoPendingFrame
().
serialize
())
extension
.
call
(
const
WaitUntilNoPendingFrame
().
serialize
())
// ignore: deprecated_member_use_from_same_package
.
then
<
void
>(
expectAsync1
((
Map
<
String
,
dynamic
>
r
)
{
.
then
<
void
>(
expectAsync1
((
Map
<
String
,
dynamic
>
r
)
{
result
=
r
;
result
=
r
;
}));
}));
...
@@ -366,7 +534,7 @@ void main() {
...
@@ -366,7 +534,7 @@ void main() {
// Intentionally blank. We only care about existence of a callback.
// Intentionally blank. We only care about existence of a callback.
});
});
extension
.
call
(
const
WaitUntilNoPendingFrame
().
serialize
())
extension
.
call
(
const
WaitUntilNoPendingFrame
().
serialize
())
// ignore: deprecated_member_use_from_same_package
.
then
<
void
>(
expectAsync1
((
Map
<
String
,
dynamic
>
r
)
{
.
then
<
void
>(
expectAsync1
((
Map
<
String
,
dynamic
>
r
)
{
result
=
r
;
result
=
r
;
}));
}));
...
@@ -390,7 +558,7 @@ void main() {
...
@@ -390,7 +558,7 @@ void main() {
'waits until no pending scheduled frame'
,
(
WidgetTester
tester
)
async
{
'waits until no pending scheduled frame'
,
(
WidgetTester
tester
)
async
{
SchedulerBinding
.
instance
.
scheduleFrame
();
SchedulerBinding
.
instance
.
scheduleFrame
();
extension
.
call
(
const
WaitUntilNoPendingFrame
().
serialize
())
extension
.
call
(
const
WaitUntilNoPendingFrame
().
serialize
())
// ignore: deprecated_member_use_from_same_package
.
then
<
void
>(
expectAsync1
((
Map
<
String
,
dynamic
>
r
)
{
.
then
<
void
>(
expectAsync1
((
Map
<
String
,
dynamic
>
r
)
{
result
=
r
;
result
=
r
;
}));
}));
...
...
packages/flutter_driver/test/src/wait_test.dart
0 → 100644
View file @
8edc3f76
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import
'package:flutter_driver/src/common/wait.dart'
;
import
'../common.dart'
;
void
main
(
)
{
group
(
'WaitForCondition'
,
()
{
test
(
'WaitForCondition serialize'
,
()
{
expect
(
const
WaitForCondition
(
NoTransientCallbacksCondition
()).
serialize
(),
<
String
,
String
>{
'command'
:
'waitForCondition'
,
'conditionName'
:
'NoTransientCallbacksCondition'
});
});
test
(
'WaitForCondition serialize with timeout'
,
()
{
expect
(
const
WaitForCondition
(
NoTransientCallbacksCondition
(),
timeout:
Duration
(
milliseconds:
10
)).
serialize
(),
<
String
,
String
>{
'command'
:
'waitForCondition'
,
'timeout'
:
'10'
,
'conditionName'
:
'NoTransientCallbacksCondition'
});
});
test
(
'WaitForCondition deserialize'
,
()
{
final
Map
<
String
,
String
>
jsonMap
=
<
String
,
String
>{
'command'
:
'waitForCondition'
,
'conditionName'
:
'NoTransientCallbacksCondition'
,
};
final
WaitForCondition
waitForCondition
=
WaitForCondition
.
deserialize
(
jsonMap
);
expect
(
waitForCondition
.
kind
,
'waitForCondition'
);
expect
(
waitForCondition
.
condition
,
equals
(
const
NoTransientCallbacksCondition
()));
});
test
(
'WaitForCondition deserialize with timeout'
,
()
{
final
Map
<
String
,
String
>
jsonMap
=
<
String
,
String
>{
'command'
:
'waitForCondition'
,
'timeout'
:
'10'
,
'conditionName'
:
'NoTransientCallbacksCondition'
,
};
final
WaitForCondition
waitForCondition
=
WaitForCondition
.
deserialize
(
jsonMap
);
expect
(
waitForCondition
.
kind
,
'waitForCondition'
);
expect
(
waitForCondition
.
condition
,
equals
(
const
NoTransientCallbacksCondition
()));
expect
(
waitForCondition
.
timeout
,
equals
(
const
Duration
(
milliseconds:
10
)));
});
});
group
(
'NoTransientCallbacksCondition'
,
()
{
test
(
'NoTransientCallbacksCondition serialize'
,
()
{
expect
(
const
NoTransientCallbacksCondition
().
serialize
(),
<
String
,
String
>{
'conditionName'
:
'NoTransientCallbacksCondition'
});
});
test
(
'NoTransientCallbacksCondition deserialize'
,
()
{
final
Map
<
String
,
String
>
jsonMap
=
<
String
,
String
>{
'conditionName'
:
'NoTransientCallbacksCondition'
,
};
final
NoTransientCallbacksCondition
condition
=
NoTransientCallbacksCondition
.
deserialize
(
jsonMap
);
expect
(
condition
,
equals
(
const
NoTransientCallbacksCondition
()));
expect
(
condition
.
serialize
(),
equals
(
jsonMap
));
});
test
(
'NoTransientCallbacksCondition deserialize error'
,
()
{
expect
(
()
=>
NoTransientCallbacksCondition
.
deserialize
(<
String
,
String
>{
'conditionName'
:
'Unknown'
}),
throwsA
(
predicate
<
SerializationException
>((
SerializationException
e
)
=>
e
.
message
==
'Error occurred during deserializing the NoTransientCallbacksCondition JSON string: {conditionName: Unknown}'
)));
});
});
group
(
'NoPendingFrameCondition'
,
()
{
test
(
'NoPendingFrameCondition serialize'
,
()
{
expect
(
const
NoPendingFrameCondition
().
serialize
(),
<
String
,
String
>{
'conditionName'
:
'NoPendingFrameCondition'
,
});
});
test
(
'NoPendingFrameCondition deserialize'
,
()
{
final
Map
<
String
,
String
>
jsonMap
=
<
String
,
String
>{
'conditionName'
:
'NoPendingFrameCondition'
,
};
final
NoPendingFrameCondition
condition
=
NoPendingFrameCondition
.
deserialize
(
jsonMap
);
expect
(
condition
,
equals
(
const
NoPendingFrameCondition
()));
expect
(
condition
.
serialize
(),
equals
(
jsonMap
));
});
test
(
'NoPendingFrameCondition deserialize error'
,
()
{
expect
(
()
=>
NoPendingFrameCondition
.
deserialize
(<
String
,
String
>{
'conditionName'
:
'Unknown'
}),
throwsA
(
predicate
<
SerializationException
>((
SerializationException
e
)
=>
e
.
message
==
'Error occurred during deserializing the NoPendingFrameCondition JSON string: {conditionName: Unknown}'
)));
});
});
group
(
'FirstFrameRasterizedCondition'
,
()
{
test
(
'FirstFrameRasterizedCondition serialize'
,
()
{
expect
(
const
FirstFrameRasterizedCondition
().
serialize
(),
<
String
,
String
>{
'conditionName'
:
'FirstFrameRasterizedCondition'
});
});
test
(
'FirstFrameRasterizedCondition deserialize'
,
()
{
final
Map
<
String
,
String
>
jsonMap
=
<
String
,
String
>{
'conditionName'
:
'FirstFrameRasterizedCondition'
,
};
final
FirstFrameRasterizedCondition
condition
=
FirstFrameRasterizedCondition
.
deserialize
(
jsonMap
);
expect
(
condition
,
equals
(
const
FirstFrameRasterizedCondition
()));
expect
(
condition
.
serialize
(),
equals
(
jsonMap
));
});
test
(
'FirstFrameRasterizedCondition deserialize error'
,
()
{
expect
(
()
=>
FirstFrameRasterizedCondition
.
deserialize
(<
String
,
String
>{
'conditionName'
:
'Unknown'
}),
throwsA
(
predicate
<
SerializationException
>((
SerializationException
e
)
=>
e
.
message
==
'Error occurred during deserializing the FirstFrameRasterizedCondition JSON string: {conditionName: Unknown}'
)));
});
});
group
(
'CombinedCondition'
,
()
{
test
(
'CombinedCondition serialize'
,
()
{
const
CombinedCondition
combinedCondition
=
CombinedCondition
(<
WaitCondition
>[
NoTransientCallbacksCondition
(),
NoPendingFrameCondition
()
]);
expect
(
combinedCondition
.
serialize
(),
<
String
,
String
>{
'conditionName'
:
'CombinedCondition'
,
'conditions'
:
'[{"conditionName":"NoTransientCallbacksCondition"},{"conditionName":"NoPendingFrameCondition"}]'
,
});
});
test
(
'CombinedCondition serialize - empty condition list'
,
()
{
const
CombinedCondition
combinedCondition
=
CombinedCondition
(<
WaitCondition
>[]);
expect
(
combinedCondition
.
serialize
(),
<
String
,
String
>{
'conditionName'
:
'CombinedCondition'
,
'conditions'
:
'[]'
,
});
});
test
(
'CombinedCondition deserialize - empty condition list'
,
()
{
final
Map
<
String
,
String
>
jsonMap
=
<
String
,
String
>{
'conditionName'
:
'CombinedCondition'
,
'conditions'
:
'[]'
,
};
final
CombinedCondition
condition
=
CombinedCondition
.
deserialize
(
jsonMap
);
expect
(
condition
.
conditions
,
equals
(<
WaitCondition
>[]));
expect
(
condition
.
serialize
(),
equals
(
jsonMap
));
});
test
(
'CombinedCondition deserialize'
,
()
{
final
Map
<
String
,
String
>
jsonMap
=
<
String
,
String
>{
'conditionName'
:
'CombinedCondition'
,
'conditions'
:
'[{"conditionName":"NoPendingFrameCondition"},{"conditionName":"NoTransientCallbacksCondition"}]'
,
};
final
CombinedCondition
condition
=
CombinedCondition
.
deserialize
(
jsonMap
);
expect
(
condition
.
conditions
,
equals
(<
WaitCondition
>[
const
NoPendingFrameCondition
(),
const
NoTransientCallbacksCondition
(),
]));
expect
(
condition
.
serialize
(),
jsonMap
);
});
test
(
'CombinedCondition deserialize - no condition list'
,
()
{
final
CombinedCondition
condition
=
CombinedCondition
.
deserialize
(<
String
,
String
>{
'conditionName'
:
'CombinedCondition'
,});
expect
(
condition
.
conditions
,
equals
(<
WaitCondition
>[]));
expect
(
condition
.
serialize
(),
<
String
,
String
>{
'conditionName'
:
'CombinedCondition'
,
'conditions'
:
'[]'
,
});
});
test
(
'CombinedCondition deserialize error'
,
()
{
expect
(
()
=>
CombinedCondition
.
deserialize
(<
String
,
String
>{
'conditionName'
:
'Unknown'
}),
throwsA
(
predicate
<
SerializationException
>((
SerializationException
e
)
=>
e
.
message
==
'Error occurred during deserializing the CombinedCondition JSON string: {conditionName: Unknown}'
)));
});
test
(
'CombinedCondition deserialize error - Unknown condition type'
,
()
{
expect
(
()
{
return
CombinedCondition
.
deserialize
(<
String
,
String
>{
'conditionName'
:
'CombinedCondition'
,
'conditions'
:
'[{"conditionName":"UnknownCondition"},{"conditionName":"NoTransientCallbacksCondition"}]'
,
});
},
throwsA
(
predicate
<
SerializationException
>((
SerializationException
e
)
=>
e
.
message
==
'Unsupported wait condition UnknownCondition in the JSON string {conditionName: UnknownCondition}'
)));
});
});
}
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