From 31d2ee9c0cf259bc607bfbcaf112d4b8c2c360c1 Mon Sep 17 00:00:00 2001 From: Yegor Jbanov Date: Fri, 28 Jul 2017 00:05:01 -0700 Subject: [PATCH] tests for waitFor/waitForAbsent --- dev/devicelab/lib/tasks/integration_ui.dart | 1 + dev/integration_tests/ui/lib/driver.dart | 57 +++++++++++++ .../ui/test_driver/driver_test.dart | 81 +++++++++++++++++++ 3 files changed, 139 insertions(+) create mode 100644 dev/integration_tests/ui/lib/driver.dart create mode 100644 dev/integration_tests/ui/test_driver/driver_test.dart diff --git a/dev/devicelab/lib/tasks/integration_ui.dart b/dev/devicelab/lib/tasks/integration_ui.dart index 50fe7f5ea7..83c4b3f015 100644 --- a/dev/devicelab/lib/tasks/integration_ui.dart +++ b/dev/devicelab/lib/tasks/integration_ui.dart @@ -22,6 +22,7 @@ Future runEndToEndTests() async { await prepareProvisioningCertificates(testDirectory.path); await flutter('drive', options: ['--verbose', '-d', deviceId, 'lib/keyboard_resize.dart']); + await flutter('drive', options: ['--verbose', '-d', deviceId, 'lib/driver.dart']); }); return new TaskResult.success({}); diff --git a/dev/integration_tests/ui/lib/driver.dart b/dev/integration_tests/ui/lib/driver.dart new file mode 100644 index 0000000000..b4625518ba --- /dev/null +++ b/dev/integration_tests/ui/lib/driver.dart @@ -0,0 +1,57 @@ +// Copyright 2017 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/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_driver/driver_extension.dart'; + +void main() { + enableFlutterDriverExtension(); + runApp(new DriverTestApp()); +} + +class DriverTestApp extends StatefulWidget { + @override + State createState() { + return new DriverTestAppState(); + } +} + +class DriverTestAppState extends State { + bool present = true; + + @override + Widget build(BuildContext context) { + return new MaterialApp( + home: new Scaffold( + appBar: new AppBar( + title: const Text('FlutterDriver test'), + ), + body: new ListView( + padding: const EdgeInsets.all(5.0), + children: [ + new Row( + children: [ + new Expanded( + child: new Text(present ? 'present' : 'absent'), + ), + new RaisedButton( + child: const Text( + 'toggle', + key: const ValueKey('togglePresent'), + ), + onPressed: () { + setState(() { + present = !present; + }); + }, + ), + ], + ), + ], + ), + ), + ); + } +} diff --git a/dev/integration_tests/ui/test_driver/driver_test.dart b/dev/integration_tests/ui/test_driver/driver_test.dart new file mode 100644 index 0000000000..cd35ebdcd0 --- /dev/null +++ b/dev/integration_tests/ui/test_driver/driver_test.dart @@ -0,0 +1,81 @@ +// Copyright 2017 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 'dart:async'; + +import 'package:flutter_driver/flutter_driver.dart'; +import 'package:test/test.dart'; + +void main() { + group('FlutterDriver', () { + final SerializableFinder presentText = find.text('present'); + FlutterDriver driver; + + setUpAll(() async { + driver = await FlutterDriver.connect(); + }); + + tearDownAll(() async { + await driver.close(); + }); + + test('waitFor should find text "present"', () async { + await driver.waitFor(presentText); + }); + + test('waitForAbsent should time out waiting for text "present" to disappear', () async { + try { + await driver.waitForAbsent(presentText, timeout: const Duration(seconds: 1)); + fail('expected DriverError'); + } on DriverError catch(error) { + expect(error.message, contains('Timeout while executing waitForAbsent')); + } + }); + + test('waitForAbsent should resolve when text "present" disappears', () async { + // Begin waiting for it to disappear + final Completer whenWaitForAbsentResolves = new Completer(); + driver.waitForAbsent(presentText).then( + whenWaitForAbsentResolves.complete, + onError: whenWaitForAbsentResolves.completeError, + ); + + // Wait 1 second then make it disappear + await new Future.delayed(const Duration(seconds: 1)); + await driver.tap(find.byValueKey('togglePresent')); + + // Ensure waitForAbsent resolves + await whenWaitForAbsentResolves.future; + }); + + test('waitFor times out waiting for "present" to reappear', () async { + try { + await driver.waitFor(presentText, timeout: const Duration(seconds: 1)); + fail('expected DriverError'); + } on DriverError catch(error) { + expect(error.message, contains('Timeout while executing waitFor')); + } + }); + + test('waitFor should resolve when text "present" reappears', () async { + // Begin waiting for it to reappear + final Completer whenWaitForResolves = new Completer(); + driver.waitFor(presentText).then( + whenWaitForResolves.complete, + onError: whenWaitForResolves.completeError, + ); + + // Wait 1 second then make it appear + await new Future.delayed(const Duration(seconds: 1)); + await driver.tap(find.byValueKey('togglePresent')); + + // Ensure waitFor resolves + await whenWaitForResolves.future; + }); + + test('waitForAbsent resolves immediately when the element does not exist', () async { + await driver.waitForAbsent(find.text('that does not exist')); + }); + }); +}