From fec88501a5e80780a2f5071e041e9f96f83aa9b0 Mon Sep 17 00:00:00 2001 From: Yegor Date: Mon, 12 Jul 2021 12:16:31 -0700 Subject: [PATCH] [web] delete e2etests and all related tooling (#27299) * [web] delete e2etests and all related tooling --- .ci.yaml | 3 - ci/licenses_golden/tool_signature | 2 +- e2etests/analysis_options.yaml | 6 - .../web/regular_integration_tests/README.md | 74 -- .../assets/images/1.5x/sample_image1.png | Bin 28340 -> 0 bytes .../assets/images/2.0x/sample_image1.png | Bin 41558 -> 0 bytes .../assets/images/sample_image1.png | Bin 14746 -> 0 bytes .../fonts/RobotoMono-Bold.ttf | Bin 87008 -> 0 bytes .../fonts/RobotoMono-Regular.ttf | Bin 86908 -> 0 bytes .../regular_integration_tests/lib/common.dart | 8 - .../lib/image_loading_main.dart | 36 - .../lib/platform_messages_main.dart | 63 -- .../lib/profile_diagnostics_main.dart | 26 - .../lib/screenshot_support.dart | 91 --- .../lib/scroll_wheel_main.dart | 115 --- .../lib/target_platform_main.dart | 53 -- .../lib/text_editing_main.dart | 111 --- .../lib/treeshaking_main.dart | 43 -- .../lib/url_strategy_main.dart | 33 - .../regular_integration_tests/pubspec.yaml | 30 - .../image_loading_integration.dart | 26 - .../image_loading_integration_test.dart | 7 - .../platform_messages_integration.dart | 60 -- .../platform_messages_integration_test.dart | 7 - .../profile_diagnostics_integration.dart | 20 - .../profile_diagnostics_integration_test.dart | 7 - .../test_driver/scroll_wheel_integration.dart | 32 - .../scroll_wheel_integration_test.dart | 11 - .../target_platform_android_integration.dart | 28 - ...get_platform_android_integration_test.dart | 7 - .../target_platform_ios_integration.dart | 28 - .../target_platform_ios_integration_test.dart | 7 - .../target_platform_macos_integration.dart | 28 - ...arget_platform_macos_integration_test.dart | 7 - .../test_driver/text_editing_integration.dart | 307 -------- .../text_editing_integration_test.dart | 9 - .../test_driver/treeshaking_integration.dart | 64 -- .../treeshaking_integration_test.dart | 7 - .../test_driver/url_strategy_integration.dart | 187 ----- .../url_strategy_integration_test.dart | 9 - .../regular_integration_tests/web/index.html | 12 - lib/web_ui/dev/README.md | 6 +- lib/web_ui/dev/browser_lock.yaml | 22 +- lib/web_ui/dev/chrome_installer.dart | 64 -- lib/web_ui/dev/driver_manager.dart | 236 ------- lib/web_ui/dev/driver_version.yaml | 15 - lib/web_ui/dev/environment.dart | 7 - lib/web_ui/dev/exceptions.dart | 9 - lib/web_ui/dev/integration_tests_manager.dart | 658 ------------------ lib/web_ui/dev/test_runner.dart | 84 +-- lib/web_ui/pubspec.yaml | 5 - tools/licenses/lib/main.dart | 3 - web_sdk/web_test_utils/lib/environment.dart | 7 - 53 files changed, 10 insertions(+), 2670 deletions(-) delete mode 100644 e2etests/analysis_options.yaml delete mode 100644 e2etests/web/regular_integration_tests/README.md delete mode 100644 e2etests/web/regular_integration_tests/assets/images/1.5x/sample_image1.png delete mode 100644 e2etests/web/regular_integration_tests/assets/images/2.0x/sample_image1.png delete mode 100644 e2etests/web/regular_integration_tests/assets/images/sample_image1.png delete mode 100644 e2etests/web/regular_integration_tests/fonts/RobotoMono-Bold.ttf delete mode 100644 e2etests/web/regular_integration_tests/fonts/RobotoMono-Regular.ttf delete mode 100644 e2etests/web/regular_integration_tests/lib/common.dart delete mode 100644 e2etests/web/regular_integration_tests/lib/image_loading_main.dart delete mode 100644 e2etests/web/regular_integration_tests/lib/platform_messages_main.dart delete mode 100644 e2etests/web/regular_integration_tests/lib/profile_diagnostics_main.dart delete mode 100644 e2etests/web/regular_integration_tests/lib/screenshot_support.dart delete mode 100644 e2etests/web/regular_integration_tests/lib/scroll_wheel_main.dart delete mode 100644 e2etests/web/regular_integration_tests/lib/target_platform_main.dart delete mode 100644 e2etests/web/regular_integration_tests/lib/text_editing_main.dart delete mode 100644 e2etests/web/regular_integration_tests/lib/treeshaking_main.dart delete mode 100644 e2etests/web/regular_integration_tests/lib/url_strategy_main.dart delete mode 100644 e2etests/web/regular_integration_tests/pubspec.yaml delete mode 100644 e2etests/web/regular_integration_tests/test_driver/image_loading_integration.dart delete mode 100644 e2etests/web/regular_integration_tests/test_driver/image_loading_integration_test.dart delete mode 100644 e2etests/web/regular_integration_tests/test_driver/platform_messages_integration.dart delete mode 100644 e2etests/web/regular_integration_tests/test_driver/platform_messages_integration_test.dart delete mode 100644 e2etests/web/regular_integration_tests/test_driver/profile_diagnostics_integration.dart delete mode 100644 e2etests/web/regular_integration_tests/test_driver/profile_diagnostics_integration_test.dart delete mode 100644 e2etests/web/regular_integration_tests/test_driver/scroll_wheel_integration.dart delete mode 100644 e2etests/web/regular_integration_tests/test_driver/scroll_wheel_integration_test.dart delete mode 100644 e2etests/web/regular_integration_tests/test_driver/target_platform_android_integration.dart delete mode 100644 e2etests/web/regular_integration_tests/test_driver/target_platform_android_integration_test.dart delete mode 100644 e2etests/web/regular_integration_tests/test_driver/target_platform_ios_integration.dart delete mode 100644 e2etests/web/regular_integration_tests/test_driver/target_platform_ios_integration_test.dart delete mode 100644 e2etests/web/regular_integration_tests/test_driver/target_platform_macos_integration.dart delete mode 100644 e2etests/web/regular_integration_tests/test_driver/target_platform_macos_integration_test.dart delete mode 100644 e2etests/web/regular_integration_tests/test_driver/text_editing_integration.dart delete mode 100644 e2etests/web/regular_integration_tests/test_driver/text_editing_integration_test.dart delete mode 100644 e2etests/web/regular_integration_tests/test_driver/treeshaking_integration.dart delete mode 100644 e2etests/web/regular_integration_tests/test_driver/treeshaking_integration_test.dart delete mode 100644 e2etests/web/regular_integration_tests/test_driver/url_strategy_integration.dart delete mode 100644 e2etests/web/regular_integration_tests/test_driver/url_strategy_integration_test.dart delete mode 100644 e2etests/web/regular_integration_tests/web/index.html delete mode 100644 lib/web_ui/dev/driver_manager.dart delete mode 100644 lib/web_ui/dev/driver_version.yaml delete mode 100644 lib/web_ui/dev/integration_tests_manager.dart diff --git a/.ci.yaml b/.ci.yaml index 30df56c206f44..5e7ccf172f8ca 100644 --- a/.ci.yaml +++ b/.ci.yaml @@ -53,7 +53,6 @@ targets: - DEPS - lib/web_ui/** - web_sdk/** - - e2etests/web/** - tools/** - ci/** - flutter_frontend_server/** @@ -65,7 +64,6 @@ targets: - DEPS - lib/web_ui/** - web_sdk/** - - e2etests/web/** - tools/** - ci/** - flutter_frontend_server/** @@ -97,7 +95,6 @@ targets: - DEPS - lib/web_ui/** - web_sdk/** - - e2etests/web/** - tools/** - ci/** - flutter_frontend_server/** diff --git a/ci/licenses_golden/tool_signature b/ci/licenses_golden/tool_signature index 2f87be53aa4d8..556caa7a6538a 100644 --- a/ci/licenses_golden/tool_signature +++ b/ci/licenses_golden/tool_signature @@ -1,2 +1,2 @@ -Signature: 6f6132591430df787d08771477f3374d +Signature: affc80a35fe2dc9647bf293dd8afcaa7 diff --git a/e2etests/analysis_options.yaml b/e2etests/analysis_options.yaml deleted file mode 100644 index 3aa82ab9675e4..0000000000000 --- a/e2etests/analysis_options.yaml +++ /dev/null @@ -1,6 +0,0 @@ -# This is a temporary file used to clean up dev/ before other directories -include: ../analysis_options.yaml - -linter: - rules: - public_member_api_docs: false # this directory only contains test code diff --git a/e2etests/web/regular_integration_tests/README.md b/e2etests/web/regular_integration_tests/README.md deleted file mode 100644 index 5e3501564680e..0000000000000 --- a/e2etests/web/regular_integration_tests/README.md +++ /dev/null @@ -1,74 +0,0 @@ -# Flutter for Web Engine Integration testing - -This directory is for Flutter Web engine integration tests that does not need a specific configuration. If an integration test needs specialized app configuration (e.g. PWA vs non-PWA packaging), please create another directory under e2etests/web. Otherwise tests such as text_editing, history, scrolling, pointer events... should all go under this package. - -Tests can be run on both 'debug', 'release' and 'profile' modes. However 'profile'/'release' modes will shorten the error stack trace. 'release' mode is for testing release code. Use 'debug' mode for troubleshooting purposes and seeing full stack traces (if there is an error). For more details on build [modes](https://flutter.dev/docs/testing/build-modes). - -## To run the application under test for troubleshooting purposes - -``` -flutter run -d web-server lib/text_editing_main.dart --local-engine=host_debug_unopt -``` - -## To run the Text Editing test and use the developer tools in the browser - -``` -flutter run test_driver/text_editing_integration.dart -d web-server --web-port=8080 --profile --local-engine=host_debug_unopt -``` - -## To run the test for Text Editing with driver - -Either of the following options: - -``` -flutter drive -v --target=test_driver/text_editing_integration.dart -d web-server --profile --local-engine=host_debug_unopt -``` - -``` -flutter drive -v --target=test_driver/text_editing_integration.dart -d web-server --release --local-engine=host_debug_unopt -``` - -## Using different browsers - -The default browser is Chrome, you can also use `android-chrome`, `safari`,`ios-safari`, `firefox` or `edge` as your browser choice. Example: - -``` -flutter drive -v --target=test_driver/text_editing_integration.dart -d web-server --release --browser-name=firefox --local-engine=host_debug_unopt -``` - -More details for "Running Flutter Driver tests with Web" can be found in [wiki](https://github.com/flutter/flutter/wiki/Running-Flutter-Driver-tests-with-Web). - -## Adding screenshot tests - -In order to test screenshot tests the tests on the driver side needs to call the `integration_test` package with an `onScreenshot` callback which can do a comparison between the `screenshotBytes` taken during the test and a golden file. We added a utility method that can do this comparison by using a golden in `flutter/goldens` repository. - -In order to use screenshot testing first, import `screenshot_support.dart` from the driver side test (example: `text_editing_integration_test.dart`). Default value for `diffRateFailure` is 0.5. - -``` -import 'package:regular_integration_tests/screenshot_support.dart' as test; - -Future main() async { - final double kMaxDiffRateFailure = 0.1; - await test.runTestWithScreenshots(diffRateFailure = kMaxDiffRateFailure); -} -``` - -In order to run the tests follow these steps: - -1. You can use two different approaches, using [felt](https://github.com/flutter/engine/blob/master/lib/web_ui/dev/README.md) tool will run all the tests, hence update all the goldens. For running individual tests, we need to set UPDATE_GOLDENS environment variable. Screenshots are saved differently per browser, therefore do not forget to also update the screenshots for other browsers. Note that, LUCI is only running screenshot testing for integration tests on Firefox and Chrome. - -``` -felt test --integration-tests-only --update-screenshot-goldens -``` - -``` -UPDATE_GOLDENS=true flutter drive -v --target=test_driver/text_editing_integration.dart -d web-server --release --local-engine=host_debug_unopt -``` - -``` -UPDATE_GOLDENS=true flutter drive -v --target=test_driver/text_editing_integration.dart -d web-server --release --local-engine=host_debug_unopt --browser-name=firefox -``` - -2. The golden will be under `engine/src/flutter/lib/web_ui/.dart_tool/goldens/engine/web/` directory, you should create a PR for that file and merge it to `flutter/goldens`. For each browser the browser name would be appended to the end of the golden file such as: `screenshot_name-chrome.png` or `screenshot_name-firefox.png` - -3. Get the commit SHA and replace the `revision` in this file: `engine/src/flutter/lib/web_ui/dev/goldens_lock.yaml` diff --git a/e2etests/web/regular_integration_tests/assets/images/1.5x/sample_image1.png b/e2etests/web/regular_integration_tests/assets/images/1.5x/sample_image1.png deleted file mode 100644 index f1e0ffab2000794b4383822e004bf7438d25ad73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28340 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

41`eR`3l$Vv=zMNJq(73Y|ij<8OWC=ZbCZutR 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 MmDnSJgEZ}b0mzqS2><{9 diff --git a/e2etests/web/regular_integration_tests/fonts/RobotoMono-Regular.ttf b/e2etests/web/regular_integration_tests/fonts/RobotoMono-Regular.ttf deleted file mode 100644 index 7c4ce36a442d14eeb12444ad707c2afa19422fd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86908 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 window.navigator.userAgent.toLowerCase().contains('firefox'); diff --git a/e2etests/web/regular_integration_tests/lib/image_loading_main.dart b/e2etests/web/regular_integration_tests/lib/image_loading_main.dart deleted file mode 100644 index e3e56003812e1..0000000000000 --- a/e2etests/web/regular_integration_tests/lib/image_loading_main.dart +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -Future main() async { - WidgetsFlutterBinding.ensureInitialized(); - const MethodChannel channel = - OptionalMethodChannel('flutter/web_test_e2e', JSONMethodCodec()); - await channel.invokeMethod( - 'setDevicePixelRatio', - '1.5', - ); - runApp(MyApp()); -} - -class MyApp extends StatefulWidget { - @override - MyAppState createState() => MyAppState(); -} - -class MyAppState extends State { - @override - Widget build(BuildContext context) { - return MaterialApp( - key: const Key('mainapp'), - title: 'Integration Test App', - home: Column(children: [ - Image.asset('assets/images/sample_image1.png'), - Image.network('assets/images/sample_image1.png'), - ]) - ); - } -} diff --git a/e2etests/web/regular_integration_tests/lib/platform_messages_main.dart b/e2etests/web/regular_integration_tests/lib/platform_messages_main.dart deleted file mode 100644 index fd4189e9ff049..0000000000000 --- a/e2etests/web/regular_integration_tests/lib/platform_messages_main.dart +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:flutter/material.dart'; - -void main() => runApp(const MyApp()); - -class MyApp extends StatelessWidget { - const MyApp({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return const MaterialApp( - key: Key('mainapp'), - title: 'Integration Test App For Platform Messages', - home: MyHomePage(title: 'Integration Test App For Platform Messages'), - ); - } -} - -class MyHomePage extends StatefulWidget { - const MyHomePage({Key? key, required this.title}) : super(key: key); - - final String title; - - @override - _MyHomePageState createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State { - final TextEditingController _controller = - TextEditingController(text: 'Text1'); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text(widget.title), - ), - body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Text('Hello World', - ), - // Create a text form field since we can't test clipboard unless - // html document has focus. - TextFormField( - key: const Key('input'), - enabled: true, - controller: _controller, - //initialValue: 'Text1', - decoration: const InputDecoration( - labelText: 'Text Input Field:', - ), - ), - ], - ), - ), - ); - } -} diff --git a/e2etests/web/regular_integration_tests/lib/profile_diagnostics_main.dart b/e2etests/web/regular_integration_tests/lib/profile_diagnostics_main.dart deleted file mode 100644 index 718426dc239b3..0000000000000 --- a/e2etests/web/regular_integration_tests/lib/profile_diagnostics_main.dart +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:flutter/material.dart'; - -void main() { - runApp(const MyApp()); -} - -class MyApp extends StatefulWidget { - const MyApp({Key? key}) : super(key: key); - - @override - MyAppState createState() => MyAppState(); -} - -class MyAppState extends State { - String kMessage = 'ABC'; - @override - Widget build(BuildContext context) { - // cause cast error. - print(kMessage as int); - return const Text('Hello'); - } -} diff --git a/e2etests/web/regular_integration_tests/lib/screenshot_support.dart b/e2etests/web/regular_integration_tests/lib/screenshot_support.dart deleted file mode 100644 index e824bc91e1d0f..0000000000000 --- a/e2etests/web/regular_integration_tests/lib/screenshot_support.dart +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:io' as io; -import 'dart:math'; - -import 'package:flutter_driver/flutter_driver.dart'; -import 'package:image/image.dart'; -// TODO(yjbanov): this depends on integration_test that's not null-safe yet -// https://github.com/flutter/flutter/issues/84014 -// ignore: import_of_legacy_library_into_null_safe -import 'package:integration_test/integration_test_driver_extended.dart' as test; -import 'package:web_test_utils/goldens.dart'; -import 'package:web_test_utils/image_compare.dart'; - -/// Tolerable pixel difference ratio between the goldens and the screenshots. -/// -/// We are allowing a higher difference rate compared to the unit tests (where -/// this rate is set to 0.28), since during the end to end tests there are -/// more components on the screen which are not related to the functionality -/// under test ex: a blinking cursor. -// TODO(nurhan): canvaskit tests results have around 1.5 mismatch. -// Investigate possible solutions. -const double kMaxDiffRateFailure = 1.8 / 100; // 0.5% - -/// SBrowser screen dimensions for the Flutter Driver test. -const int _kScreenshotWidth = 1024; -const int _kScreenshotHeight = 1024; - -/// Used for calling `integration_test` package. -/// -/// Compared to other similar classes which only included the following call: -/// ``` -/// Future main() async => test.integrationDriver(); -/// ``` -/// -/// this method is able to take screenshot. -/// -/// It provides an `onScreenshot` callback to the `integrationDriver` method. -/// It also includes options for updating the golden files. -Future runTestWithScreenshots( - {double diffRateFailure = kMaxDiffRateFailure, - int browserWidth = _kScreenshotWidth, - int browserHeight = _kScreenshotHeight}) async { - final WebFlutterDriver driver = - await FlutterDriver.connect() as WebFlutterDriver; - - // Learn the browser in use from the webDriver. - final String browser = driver.webDriver.capabilities['browserName'] as String; - - (await driver.webDriver.window).setSize(Rectangle(0, 0, browserWidth, browserHeight)); - - bool updateGoldens = false; - // We are using an environment variable instead of an argument, since - // this code is not invoked from the shell but from the `flutter drive` - // tool itself, we do not have control on the command line arguments. - // Please read the README, further info on how to update the goldens. - final String? updateGoldensFlag = io.Platform.environment['UPDATE_GOLDENS']; - // Validate if the environment variable is set correctly. - if (updateGoldensFlag != null && - !(updateGoldensFlag.toLowerCase() == 'true' || - updateGoldensFlag.toLowerCase() == 'false')) { - throw StateError( - 'UPDATE_GOLDENS environment variable is not set correctly'); - } - if (updateGoldensFlag != null && updateGoldensFlag.toLowerCase() == 'true') { - updateGoldens = true; - } - - test.integrationDriver( - driver: driver, - onScreenshot: (String screenshotName, List screenshotBytes) async { - final Image screenshot = decodePng(screenshotBytes)!; - final String result = compareImage( - screenshot, - updateGoldens, - '$screenshotName-$browser.png', - PixelComparison.fuzzy, - diffRateFailure, - write: updateGoldens, - ); - if (result == 'OK') { - return true; - } else { - io.stderr.writeln('ERROR: $result'); - return false; - } - }, - ); -} diff --git a/e2etests/web/regular_integration_tests/lib/scroll_wheel_main.dart b/e2etests/web/regular_integration_tests/lib/scroll_wheel_main.dart deleted file mode 100644 index d634e5ba452c4..0000000000000 --- a/e2etests/web/regular_integration_tests/lib/scroll_wheel_main.dart +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:html' as html; - -import 'package:flutter/material.dart'; - -void main() => runApp(const MyApp()); - -class MyApp extends StatelessWidget { - const MyApp({Key? key}) : super(key: key); - - // This widget is the root of your application. - @override - Widget build(BuildContext context) { - return MaterialApp( - title: 'Flutter Scroll Wheel Test', - theme: ThemeData( - primarySwatch: Colors.blue, - fontFamily: 'RobotoMono', - visualDensity: VisualDensity.adaptivePlatformDensity, - ), - home: const MyHomePage(title: 'Flutter Scroll Wheel Test'), - ); - } -} - -class MyHomePage extends StatefulWidget { - const MyHomePage({Key? key, required this.title}) : super(key: key); - - final String title; - - @override - _MyHomePageState createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State { - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text(widget.title), - ), - body: ListView.builder( - itemCount: 1000, - itemBuilder: (BuildContext context, int index) => Padding( - padding: const EdgeInsets.all(20), - child: Container( - height: 100, - color: Colors.lightBlue, - child: Center( - child: Text('Item $index'), - ), - ), - ), - ), - floatingActionButton: - FloatingActionButton.extended( - key: const Key('scroll-button'), - onPressed: () { - const int centerX = 100; //html.window.innerWidth ~/ 2; - const int centerY = 100; //html.window.innerHeight ~/ 2; - dispatchMouseWheelEvent(centerX, centerY, DeltaMode.kLine, 0, 1); - dispatchMouseWheelEvent(centerX, centerY, DeltaMode.kLine, 0, 1); - dispatchMouseWheelEvent(centerX, centerY, DeltaMode.kLine, 0, 1); - dispatchMouseWheelEvent(centerX, centerY, DeltaMode.kLine, 0, 1); - dispatchMouseWheelEvent(centerX, centerY, DeltaMode.kLine, 0, 1); - }, - label: const Text('Scroll'), - icon: const Icon(Icons.thumb_up), - ), - ); - } -} - - -abstract class DeltaMode { - static const int kPixel = 0x00; - static const int kLine = 0x01; - static const int kPage = 0x02; -} - -html.WheelEvent dispatchMouseWheelEvent(int mouseX, int mouseY, - int deltaMode, double deltaX, double deltaY, - {bool shiftKeyPressed = false}) { - final html.EventTarget target = html.document.elementFromPoint(mouseX, mouseY)!; - - target.dispatchEvent(html.MouseEvent('mouseover', - screenX: mouseX, - screenY: mouseY, - clientX: mouseX, - clientY: mouseY, - )); - - target.dispatchEvent(html.MouseEvent('mousemove', - screenX: mouseX, - screenY: mouseY, - clientX: mouseX, - clientY: mouseY, - )); - - final html.WheelEvent event = html.WheelEvent('wheel', - screenX: mouseX, - screenY: mouseY, - clientX: mouseX, - clientY: mouseY, - deltaMode: deltaMode, - deltaX : deltaX, - deltaY : deltaY, - shiftKey: shiftKeyPressed, - ); - target.dispatchEvent(event); - return event; -} diff --git a/e2etests/web/regular_integration_tests/lib/target_platform_main.dart b/e2etests/web/regular_integration_tests/lib/target_platform_main.dart deleted file mode 100644 index acc3653a4321d..0000000000000 --- a/e2etests/web/regular_integration_tests/lib/target_platform_main.dart +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; - -void main() => runApp(const MyApp()); - -class MyApp extends StatelessWidget { - const MyApp({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return const MaterialApp( - key: Key('mainapp'), - title: 'Platform Test', - home: MyHomePage(), - ); - } -} - -class MyHomePage extends StatelessWidget { - const MyHomePage({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - if (defaultTargetPlatform == TargetPlatform.macOS) - const Text( - 'I am running on MacOS', - key: Key('macOSKey'), - ), - if (defaultTargetPlatform == TargetPlatform.iOS) - const Text( - 'I am running on MacOS', - key: Key('iOSKey'), - ), - if (defaultTargetPlatform == TargetPlatform.android) - const Text( - 'I am running on Android', - key: Key('androidKey'), - ), - ], - ), - ), - ); - } -} diff --git a/e2etests/web/regular_integration_tests/lib/text_editing_main.dart b/e2etests/web/regular_integration_tests/lib/text_editing_main.dart deleted file mode 100644 index a961ea5344308..0000000000000 --- a/e2etests/web/regular_integration_tests/lib/text_editing_main.dart +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:flutter/material.dart'; - -void main() => runApp(const MyApp()); - -class MyApp extends StatelessWidget { - const MyApp({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return MaterialApp( - key: const Key('mainapp'), - theme: ThemeData(fontFamily: 'RobotoMono'), - title: 'Integration Test App', - home: const MyHomePage(title: 'Integration Test App'), - ); - } -} - -class MyHomePage extends StatefulWidget { - const MyHomePage({Key? key, required this.title}) : super(key: key); - - final String title; - - @override - _MyHomePageState createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State { - String infoText = 'no-enter'; - - // Controller with no initial value; - final TextEditingController _emptyController = TextEditingController(); - - final TextEditingController _controller = - TextEditingController(text: 'Text1'); - - final TextEditingController _controller2 = - TextEditingController(text: 'Text2'); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text(widget.title), - ), - body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Text( - 'Text Editing Test 1', - ), - TextFormField( - key: const Key('empty-input'), - enabled: true, - controller: _emptyController, - decoration: const InputDecoration( - contentPadding: EdgeInsets.all(10.0), - labelText: 'Empty Input Field:', - ), - ), - const Text( - 'Text Editing Test 2', - ), - TextFormField( - key: const Key('input'), - enabled: true, - controller: _controller, - decoration: const InputDecoration( - contentPadding: EdgeInsets.all(10.0), - labelText: 'Text Input Field:', - ), - ), - const Text( - 'Text Editing Test 3', - ), - TextFormField( - key: const Key('input2'), - enabled: true, - controller: _controller2, - decoration: const InputDecoration( - contentPadding: EdgeInsets.all(10.0), - labelText: 'Text Input Field 2:', - ), - onFieldSubmitted: (String str) { - print('event received'); - setState(() => infoText = 'enter pressed'); - }, - ), - Text( - infoText, - key: const Key('text'), - ), - const Padding( - padding: EdgeInsets.all(12.0), - child: SelectableText( - 'Lorem ipsum dolor sit amet', - key: Key('selectable'), - style: TextStyle(fontFamily: 'RobotoMono', fontSize: 20.0), - ), - ), - ], - ), - ), - ); - } -} diff --git a/e2etests/web/regular_integration_tests/lib/treeshaking_main.dart b/e2etests/web/regular_integration_tests/lib/treeshaking_main.dart deleted file mode 100644 index 61f284789a610..0000000000000 --- a/e2etests/web/regular_integration_tests/lib/treeshaking_main.dart +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:flutter/material.dart'; - -void main() => runApp(const MyApp()); - -class MyApp extends StatelessWidget { - const MyApp({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return const MaterialApp( - key: Key('mainapp'), - title: 'Integration Test App', - home: MyHomePage(title: 'Integration Test App'), - ); - } -} - -class MyHomePage extends StatefulWidget { - const MyHomePage({Key? key, required this.title}) : super(key: key); - - final String title; - - @override - _MyHomePageState createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State { - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text(widget.title), - ), - body: const Center( - child: Text('TreeshakingThings'), - ), - ); - } -} diff --git a/e2etests/web/regular_integration_tests/lib/url_strategy_main.dart b/e2etests/web/regular_integration_tests/lib/url_strategy_main.dart deleted file mode 100644 index 47cf919a20f36..0000000000000 --- a/e2etests/web/regular_integration_tests/lib/url_strategy_main.dart +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:flutter/material.dart'; - -final GlobalKey navKey = GlobalKey(debugLabel: 'mainNavigator'); -Map? appRoutes; - -final Map _defaultAppRoutes = { - '/': (BuildContext context) => Container(), -}; - -void main() { - runApp(MyApp(appRoutes ?? _defaultAppRoutes)); -} - -class MyApp extends StatelessWidget { - const MyApp(this.routes, {Key? key}) : super(key: key); - - final Map routes; - - @override - Widget build(BuildContext context) { - return MaterialApp( - key: const Key('mainapp'), - navigatorKey: navKey, - theme: ThemeData(fontFamily: 'RobotoMono'), - title: 'Integration Test App', - routes: routes, - ); - } -} diff --git a/e2etests/web/regular_integration_tests/pubspec.yaml b/e2etests/web/regular_integration_tests/pubspec.yaml deleted file mode 100644 index 8c99965074ffa..0000000000000 --- a/e2etests/web/regular_integration_tests/pubspec.yaml +++ /dev/null @@ -1,30 +0,0 @@ -name: regular_integration_tests -publish_to: none - -environment: - sdk: ">=2.12.0-0 <3.0.0" - -dependencies: - flutter: - sdk: flutter - flutter_web_plugins: - sdk: flutter - -dev_dependencies: - flutter_driver: - sdk: flutter - flutter_test: - sdk: flutter - integration_test: ^1.0.2+3 - http: 0.12.0+2 - web_test_utils: - path: ../../../web_sdk/web_test_utils - -flutter: - assets: - - assets/images/ - fonts: - - family: RobotoMono - fonts: - - asset: fonts/RobotoMono-Bold.ttf - - asset: fonts/RobotoMono-Regular.ttf diff --git a/e2etests/web/regular_integration_tests/test_driver/image_loading_integration.dart b/e2etests/web/regular_integration_tests/test_driver/image_loading_integration.dart deleted file mode 100644 index 011976a833277..0000000000000 --- a/e2etests/web/regular_integration_tests/test_driver/image_loading_integration.dart +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:html' as html; -import 'package:flutter_test/flutter_test.dart'; -import 'package:regular_integration_tests/image_loading_main.dart' as app; - -import 'package:integration_test/integration_test.dart'; - -void main() { - IntegrationTestWidgetsFlutterBinding.ensureInitialized(); - - testWidgets('Image loads asset variant based on device pixel ratio', - (WidgetTester tester) async { - app.main(); - await tester.pumpAndSettle(); - final List imageElements = html.querySelectorAll('img'); - expect(imageElements.length, 2); - expect(imageElements[0].naturalWidth, 1.5 * 100); - expect(imageElements[0].naturalHeight, 1.5 * 100); - expect(imageElements[0].width, 100); - expect(imageElements[0].height, 100); - expect(imageElements[1].width, isNot(0)); - }); -} diff --git a/e2etests/web/regular_integration_tests/test_driver/image_loading_integration_test.dart b/e2etests/web/regular_integration_tests/test_driver/image_loading_integration_test.dart deleted file mode 100644 index 96b5ad0bf52a4..0000000000000 --- a/e2etests/web/regular_integration_tests/test_driver/image_loading_integration_test.dart +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:integration_test/integration_test_driver.dart' as test; - -Future main() async => test.integrationDriver(); diff --git a/e2etests/web/regular_integration_tests/test_driver/platform_messages_integration.dart b/e2etests/web/regular_integration_tests/test_driver/platform_messages_integration.dart deleted file mode 100644 index f1e9c79dbcba0..0000000000000 --- a/e2etests/web/regular_integration_tests/test_driver/platform_messages_integration.dart +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// TODO(yjbanov): this depends on integration_test that's not null-safe yet -// https://github.com/flutter/flutter/issues/84014 -// @dart=2.6 - -import 'dart:html' as html; -// platformViewRegistry is exposed in the web version -import 'dart:ui' as ui show platformViewRegistry; // ignore: undefined_shown_name - -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:integration_test/integration_test.dart'; -import 'package:regular_integration_tests/platform_messages_main.dart' as app; - -void main() { - IntegrationTestWidgetsFlutterBinding.ensureInitialized(); - - testWidgets('platform message for Clipboard.setData reply with future', - (WidgetTester tester) async { - app.main(); - await tester.pumpAndSettle(); - - // TODO(nurhan): https://github.com/flutter/flutter/issues/51885 - SystemChannels.textInput.setMockMethodCallHandler(null); - // Focus on a TextFormField. - final Finder finder = find.byKey(const Key('input')); - expect(finder, findsOneWidget); - await tester.tap(find.byKey(const Key('input'))); - // Focus in input, otherwise clipboard will fail with - // 'document is not focused' platform exception. - html.document.querySelector('input')?.focus(); - await Clipboard.setData(const ClipboardData(text: 'sample text')); - }, skip: true); // https://github.com/flutter/flutter/issues/54296 - - testWidgets('Should create and dispose view embedder', - (WidgetTester tester) async { - int viewInstanceCount = 0; - - platformViewsRegistry.getNextPlatformViewId(); - // ignore: undefined_prefixed_name - ui.platformViewRegistry.registerViewFactory('MyView', (int viewId) { - ++viewInstanceCount; - return html.DivElement(); - }); - - app.main(); - await tester.pumpAndSettle(); - final Map createArgs = { - 'id': 567, - 'viewType': 'MyView', - }; - await SystemChannels.platform_views.invokeMethod('create', createArgs); - await SystemChannels.platform_views.invokeMethod('dispose', 567); - expect(viewInstanceCount, 1); - }); -} diff --git a/e2etests/web/regular_integration_tests/test_driver/platform_messages_integration_test.dart b/e2etests/web/regular_integration_tests/test_driver/platform_messages_integration_test.dart deleted file mode 100644 index 96b5ad0bf52a4..0000000000000 --- a/e2etests/web/regular_integration_tests/test_driver/platform_messages_integration_test.dart +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:integration_test/integration_test_driver.dart' as test; - -Future main() async => test.integrationDriver(); diff --git a/e2etests/web/regular_integration_tests/test_driver/profile_diagnostics_integration.dart b/e2etests/web/regular_integration_tests/test_driver/profile_diagnostics_integration.dart deleted file mode 100644 index 95c77b380a2c8..0000000000000 --- a/e2etests/web/regular_integration_tests/test_driver/profile_diagnostics_integration.dart +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:flutter_test/flutter_test.dart'; -import 'package:regular_integration_tests/profile_diagnostics_main.dart' as app; - -import 'package:integration_test/integration_test.dart'; - -void main() { - IntegrationTestWidgetsFlutterBinding.ensureInitialized(); - - testWidgets('App build method exception should form valid FlutterErrorDetails', - (WidgetTester tester) async { - app.main(); - await tester.pumpAndSettle(); - final dynamic appError = tester.takeException(); - expect(appError, isA()); - }); -} diff --git a/e2etests/web/regular_integration_tests/test_driver/profile_diagnostics_integration_test.dart b/e2etests/web/regular_integration_tests/test_driver/profile_diagnostics_integration_test.dart deleted file mode 100644 index 96b5ad0bf52a4..0000000000000 --- a/e2etests/web/regular_integration_tests/test_driver/profile_diagnostics_integration_test.dart +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:integration_test/integration_test_driver.dart' as test; - -Future main() async => test.integrationDriver(); diff --git a/e2etests/web/regular_integration_tests/test_driver/scroll_wheel_integration.dart b/e2etests/web/regular_integration_tests/test_driver/scroll_wheel_integration.dart deleted file mode 100644 index a1123e83b8c31..0000000000000 --- a/e2etests/web/regular_integration_tests/test_driver/scroll_wheel_integration.dart +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:html' as html; -import 'dart:js_util' as js_util; -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:regular_integration_tests/scroll_wheel_main.dart' as app; - -import 'package:integration_test/integration_test.dart'; - -void main() { - final IntegrationTestWidgetsFlutterBinding binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized() as IntegrationTestWidgetsFlutterBinding; - - testWidgets('Test mousewheel scroll by line', - (WidgetTester tester) async { - app.main(); - await tester.pumpAndSettle(); - - final Finder finder = find.byKey(const Key('scroll-button')); - expect(finder, findsOneWidget); - await tester.tap(find.byKey(const Key('scroll-button'))); - await tester.pumpAndSettle(); - await tester.tap(find.byKey(const Key('scroll-button'))); - await tester.pumpAndSettle(); - - // TODO: enable screenshot when - // https://github.com/flutter/flutter/issues/68502 is resolved. - await binding.takeScreenshot('wheel_scroll_by_line'); - }); -} diff --git a/e2etests/web/regular_integration_tests/test_driver/scroll_wheel_integration_test.dart b/e2etests/web/regular_integration_tests/test_driver/scroll_wheel_integration_test.dart deleted file mode 100644 index e9c65334bb294..0000000000000 --- a/e2etests/web/regular_integration_tests/test_driver/scroll_wheel_integration_test.dart +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:regular_integration_tests/screenshot_support.dart' as test; - -Future main() async { - // TODO: switch to screenshot when - // https://github.com/flutter/flutter/issues/68502 is resolved. - // await test.runTestWithScreenshots(); -} diff --git a/e2etests/web/regular_integration_tests/test_driver/target_platform_android_integration.dart b/e2etests/web/regular_integration_tests/test_driver/target_platform_android_integration.dart deleted file mode 100644 index d914d54693296..0000000000000 --- a/e2etests/web/regular_integration_tests/test_driver/target_platform_android_integration.dart +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:flutter_test/flutter_test.dart'; -import 'package:regular_integration_tests/target_platform_main.dart' as app; -import 'package:flutter/material.dart'; - -import 'package:integration_test/integration_test.dart'; - -void main() { - IntegrationTestWidgetsFlutterBinding.ensureInitialized(); - - testWidgets('Should detect android platform when running on android device', - (WidgetTester tester) async { - app.main(); - await tester.pumpAndSettle(); - - final Finder macOSFinder = find.byKey(const Key('macOSKey')); - expect(macOSFinder, findsNothing); - - final Finder iOSFinder = find.byKey(const Key('iOSKey')); - expect(iOSFinder, findsNothing); - - final Finder androidFinder = find.byKey(const Key('androidKey')); - expect(androidFinder, findsOneWidget); - }); -} diff --git a/e2etests/web/regular_integration_tests/test_driver/target_platform_android_integration_test.dart b/e2etests/web/regular_integration_tests/test_driver/target_platform_android_integration_test.dart deleted file mode 100644 index 96b5ad0bf52a4..0000000000000 --- a/e2etests/web/regular_integration_tests/test_driver/target_platform_android_integration_test.dart +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:integration_test/integration_test_driver.dart' as test; - -Future main() async => test.integrationDriver(); diff --git a/e2etests/web/regular_integration_tests/test_driver/target_platform_ios_integration.dart b/e2etests/web/regular_integration_tests/test_driver/target_platform_ios_integration.dart deleted file mode 100644 index 72a74fc73e97d..0000000000000 --- a/e2etests/web/regular_integration_tests/test_driver/target_platform_ios_integration.dart +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:flutter_test/flutter_test.dart'; -import 'package:regular_integration_tests/target_platform_main.dart' as app; -import 'package:flutter/material.dart'; - -import 'package:integration_test/integration_test.dart'; - -void main() { - IntegrationTestWidgetsFlutterBinding.ensureInitialized(); - - testWidgets('Should detect iOS platform when running on iOS device', - (WidgetTester tester) async { - app.main(); - await tester.pumpAndSettle(); - - final Finder macOSFinder = find.byKey(const Key('macOSKey')); - expect(macOSFinder, findsNothing); - - final Finder iOSFinder = find.byKey(const Key('iOSKey')); - expect(iOSFinder, findsOneWidget); - - final Finder androidFinder = find.byKey(const Key('androidKey')); - expect(androidFinder, findsNothing); - }); -} diff --git a/e2etests/web/regular_integration_tests/test_driver/target_platform_ios_integration_test.dart b/e2etests/web/regular_integration_tests/test_driver/target_platform_ios_integration_test.dart deleted file mode 100644 index 96b5ad0bf52a4..0000000000000 --- a/e2etests/web/regular_integration_tests/test_driver/target_platform_ios_integration_test.dart +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:integration_test/integration_test_driver.dart' as test; - -Future main() async => test.integrationDriver(); diff --git a/e2etests/web/regular_integration_tests/test_driver/target_platform_macos_integration.dart b/e2etests/web/regular_integration_tests/test_driver/target_platform_macos_integration.dart deleted file mode 100644 index 4a20827769eb9..0000000000000 --- a/e2etests/web/regular_integration_tests/test_driver/target_platform_macos_integration.dart +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:flutter_test/flutter_test.dart'; -import 'package:regular_integration_tests/target_platform_main.dart' as app; -import 'package:flutter/material.dart'; - -import 'package:integration_test/integration_test.dart'; - -void main() { - IntegrationTestWidgetsFlutterBinding.ensureInitialized(); - - testWidgets('Should detect MacOS platform when running on MacOS', - (WidgetTester tester) async { - app.main(); - await tester.pumpAndSettle(); - - final Finder macOSFinder = find.byKey(const Key('macOSKey')); - expect(macOSFinder, findsOneWidget); - - final Finder iOSFinder = find.byKey(const Key('iOSKey')); - expect(iOSFinder, findsNothing); - - final Finder androidFinder = find.byKey(const Key('androidKey')); - expect(androidFinder, findsNothing); - }); -} diff --git a/e2etests/web/regular_integration_tests/test_driver/target_platform_macos_integration_test.dart b/e2etests/web/regular_integration_tests/test_driver/target_platform_macos_integration_test.dart deleted file mode 100644 index 96b5ad0bf52a4..0000000000000 --- a/e2etests/web/regular_integration_tests/test_driver/target_platform_macos_integration_test.dart +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:integration_test/integration_test_driver.dart' as test; - -Future main() async => test.integrationDriver(); diff --git a/e2etests/web/regular_integration_tests/test_driver/text_editing_integration.dart b/e2etests/web/regular_integration_tests/test_driver/text_editing_integration.dart deleted file mode 100644 index 846eba095fc7e..0000000000000 --- a/e2etests/web/regular_integration_tests/test_driver/text_editing_integration.dart +++ /dev/null @@ -1,307 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// TODO(yjbanov): this depends on integration_test that's not null-safe yet -// https://github.com/flutter/flutter/issues/84014 -// @dart=2.6 - -import 'dart:html'; -import 'dart:js_util' as js_util; -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:integration_test/integration_test.dart'; - -import 'package:regular_integration_tests/common.dart'; -import 'package:regular_integration_tests/text_editing_main.dart' as app; - -void main() { - final IntegrationTestWidgetsFlutterBinding binding = - IntegrationTestWidgetsFlutterBinding.ensureInitialized() - as IntegrationTestWidgetsFlutterBinding; - - testWidgets('Focused text field creates a native input element', - (WidgetTester tester) async { - app.main(); - await tester.pumpAndSettle(); - - // TODO(nurhan): https://github.com/flutter/flutter/issues/51885 - SystemChannels.textInput.setMockMethodCallHandler(null); - - // Focus on a TextFormField. - final Finder finder = find.byKey(const Key('input')); - expect(finder, findsOneWidget); - await tester.tap(find.byKey(const Key('input'))); - - // A native input element will be appended to the DOM. - final List nodeList = document.getElementsByTagName('input'); - expect(nodeList.length, equals(1)); - final InputElement input = - document.getElementsByTagName('input')[0] as InputElement; - // The element's value will be the same as the textFormField's value. - expect(input.value, 'Text1'); - - // Change the value of the TextFormField. - final TextFormField textFormField = tester.widget(finder); - textFormField.controller?.text = 'New Value'; - // DOM element's value also changes. - expect(input.value, 'New Value'); - - // Firefox can't make up its mind about what the screenshot should - // look like between LUCI and local. - // - // https://github.com/flutter/flutter/issues/73382 - if (!isFirefox) { - await binding.takeScreenshot('focused_text_field'); - } - }); - - testWidgets('Input field with no initial value works', - (WidgetTester tester) async { - app.main(); - await tester.pumpAndSettle(); - - // TODO(nurhan): https://github.com/flutter/flutter/issues/51885 - SystemChannels.textInput.setMockMethodCallHandler(null); - - // Focus on a TextFormField. - final Finder finder = find.byKey(const Key('empty-input')); - expect(finder, findsOneWidget); - await tester.tap(find.byKey(const Key('empty-input'))); - - // A native input element will be appended to the DOM. - final List nodeList = document.getElementsByTagName('input'); - expect(nodeList.length, equals(1)); - final InputElement input = - document.getElementsByTagName('input')[0] as InputElement; - // The element's value will be empty. - expect(input.value, ''); - - // Change the value of the TextFormField. - final TextFormField textFormField = tester.widget(finder); - textFormField.controller?.text = 'New Value'; - // DOM element's value also changes. - expect(input.value, 'New Value'); - }); - - testWidgets('Pressing enter on the text field triggers submit', - (WidgetTester tester) async { - app.main(); - await tester.pumpAndSettle(); - - // TODO(nurhan): https://github.com/flutter/flutter/issues/51885 - SystemChannels.textInput.setMockMethodCallHandler(null); - - // This text will show no-enter initially. It will have 'enter-pressed' - // after `onFieldSubmitted` of TextField is triggered. - final Finder textFinder = find.byKey(const Key('text')); - expect(textFinder, findsOneWidget); - final Text text = tester.widget(textFinder); - expect(text.data, 'no-enter'); - - // Focus on a TextFormField. - final Finder textFormFielsFinder = find.byKey(const Key('input2')); - expect(textFormFielsFinder, findsOneWidget); - await tester.tap(find.byKey(const Key('input2'))); - - // // Press Tab. This should trigger `onFieldSubmitted` of TextField. - final InputElement input = - document.getElementsByTagName('input')[0] as InputElement; - dispatchKeyboardEvent(input, 'keydown', { - 'keyCode': 13, // Enter. - 'cancelable': true, - }); - - await tester.pumpAndSettle(); - - final Finder textFinder2 = find.byKey(const Key('text')); - expect(textFinder2, findsOneWidget); - final Text text2 = tester.widget(textFinder2); - expect(text2.data, 'enter pressed'); - }); - - testWidgets('Jump between TextFormFields with tab key', - (WidgetTester tester) async { - app.main(); - await tester.pumpAndSettle(); - - // TODO(nurhan): https://github.com/flutter/flutter/issues/51885 - SystemChannels.textInput.setMockMethodCallHandler(null); - - // Focus on a TextFormField. - final Finder finder = find.byKey(const Key('input')); - expect(finder, findsOneWidget); - await tester.tap(find.byKey(const Key('input'))); - - // A native input element will be appended to the DOM. - final List nodeList = document.getElementsByTagName('input'); - expect(nodeList.length, equals(1)); - final InputElement input = - document.getElementsByTagName('input')[0] as InputElement; - - // Press Tab. The focus should move to the next TextFormField. - dispatchKeyboardEvent(input, 'keydown', { - 'key': 'Tab', - 'code': 'Tab', - 'bubbles': true, - 'cancelable': true, - }); - - await tester.pumpAndSettle(); - - // A native input element for the next TextField should be attached to the - // DOM. - final InputElement input2 = - document.getElementsByTagName('input')[0] as InputElement; - expect(input2.value, 'Text2'); - }); - - testWidgets( - 'Jump between TextFormFields with tab key after CapsLock is' - 'activated', (WidgetTester tester) async { - app.main(); - await tester.pumpAndSettle(); - - // TODO(nurhan): https://github.com/flutter/flutter/issues/51885 - SystemChannels.textInput.setMockMethodCallHandler(null); - - // Focus on a TextFormField. - final Finder finder = find.byKey(const Key('input')); - expect(finder, findsOneWidget); - await tester.tap(find.byKey(const Key('input'))); - - // A native input element will be appended to the DOM. - final List nodeList = document.getElementsByTagName('input'); - expect(nodeList.length, equals(1)); - final InputElement input = - document.getElementsByTagName('input')[0] as InputElement; - - // Press and release CapsLock. - dispatchKeyboardEvent(input, 'keydown', { - 'key': 'CapsLock', - 'code': 'CapsLock', - 'bubbles': true, - 'cancelable': true, - }); - dispatchKeyboardEvent(input, 'keyup', { - 'key': 'CapsLock', - 'code': 'CapsLock', - 'bubbles': true, - 'cancelable': true, - }); - - // Press and release AltGr key. - // Regression test for https://github.com/flutter/flutter/issues/58979. - dispatchKeyboardEvent(input, 'keydown', { - 'key': 'AltGraph', - 'code': 'AltRight', - 'bubbles': true, - 'cancelable': true, - }); - dispatchKeyboardEvent(input, 'keyup', { - 'key': 'AltGraph', - 'code': 'AltRight', - 'bubbles': true, - 'cancelable': true, - }); - - // Press Tab. The focus should move to the next TextFormField. - dispatchKeyboardEvent(input, 'keydown', { - 'key': 'Tab', - 'code': 'Tab', - 'bubbles': true, - 'cancelable': true, - }); - - await tester.pumpAndSettle(); - - // A native input element for the next TextField should be attached to the - // DOM. - final InputElement input2 = - document.getElementsByTagName('input')[0] as InputElement; - expect(input2.value, 'Text2'); - }); - - testWidgets('Read-only fields work', (WidgetTester tester) async { - const String text = 'Lorem ipsum dolor sit amet'; - app.main(); - await tester.pumpAndSettle(); - - // TODO(nurhan): https://github.com/flutter/flutter/issues/51885 - SystemChannels.textInput.setMockMethodCallHandler(null); - - // Select something from the selectable text. - final Finder finder = find.byKey(const Key('selectable')); - expect(finder, findsOneWidget); - final RenderBox selectable = tester.renderObject(finder); - final Offset topLeft = selectable.localToGlobal(Offset.zero); - final Offset topRight = - selectable.localToGlobal(Offset(selectable.size.width, 0.0)); - - // Drag by mouse to select the entire selectable text. - TestGesture gesture = - await tester.startGesture(topLeft, kind: PointerDeviceKind.mouse); - addTearDown(gesture.removePointer); - await gesture.moveTo(topRight); - await gesture.up(); - - // A native input element will be appended to the DOM. - final List nodeList = document.getElementsByTagName('textarea'); - expect(nodeList.length, equals(1)); - final TextAreaElement input = nodeList[0] as TextAreaElement; - // The element's value should contain the selectable text. - expect(input.value, text); - expect(input.hasAttribute('readonly'), isTrue); - - // Make sure the entire text is selected. - TextRange range = TextRange( - start: input.selectionStart ?? 0, end: input.selectionEnd ?? 0); - expect(range.textInside(text), text); - - // Double tap to select the first word. - final Offset firstWordOffset = topLeft.translate(10.0, 0.0); - gesture = await tester.startGesture( - firstWordOffset, - kind: PointerDeviceKind.mouse, - ); - addTearDown(gesture.removePointer); - await gesture.up(); - await gesture.down(firstWordOffset); - await gesture.up(); - range = TextRange( - start: input.selectionStart ?? 0, end: input.selectionEnd ?? 0); - expect(range.textInside(text), 'Lorem'); - - // Double tap to select the last word. - final Offset lastWordOffset = topRight.translate(-10.0, 0.0); - gesture = await tester.startGesture( - lastWordOffset, - kind: PointerDeviceKind.mouse, - ); - addTearDown(gesture.removePointer); - await gesture.up(); - await gesture.down(lastWordOffset); - await gesture.up(); - range = TextRange( - start: input.selectionStart ?? 0, end: input.selectionEnd ?? 0); - expect(range.textInside(text), 'amet'); - }); -} - -KeyboardEvent dispatchKeyboardEvent( - EventTarget target, String type, Map args) { - final dynamic jsKeyboardEvent = js_util.getProperty(window, 'KeyboardEvent'); - final List eventArgs = [ - type, - args, - ]; - - final KeyboardEvent event = js_util.callConstructor( - jsKeyboardEvent, js_util.jsify(eventArgs) as List) - as KeyboardEvent; - target.dispatchEvent(event); - - return event; -} diff --git a/e2etests/web/regular_integration_tests/test_driver/text_editing_integration_test.dart b/e2etests/web/regular_integration_tests/test_driver/text_editing_integration_test.dart deleted file mode 100644 index 9c2c0fdcadc77..0000000000000 --- a/e2etests/web/regular_integration_tests/test_driver/text_editing_integration_test.dart +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:regular_integration_tests/screenshot_support.dart' as test; - -Future main() async { - await test.runTestWithScreenshots(); -} diff --git a/e2etests/web/regular_integration_tests/test_driver/treeshaking_integration.dart b/e2etests/web/regular_integration_tests/test_driver/treeshaking_integration.dart deleted file mode 100644 index 1a9951b54e10e..0000000000000 --- a/e2etests/web/regular_integration_tests/test_driver/treeshaking_integration.dart +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// TODO(yjbanov): this depends on integration_test that's not null-safe yet -// https://github.com/flutter/flutter/issues/84014 -// @dart=2.6 - -import 'dart:html' as html; -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:integration_test/integration_test.dart'; -import 'package:regular_integration_tests/treeshaking_main.dart' as app; - -void main() { - IntegrationTestWidgetsFlutterBinding.ensureInitialized(); - - testWidgets('debug+Fill+Properties for widgets is tree shaken', - (WidgetTester tester) async { - // About 11 instances are used by DiagnosticsNode and diagnostics - // for flutter framework itself. Widgets have > 100. So we check for 20 to - // so this test fails when tree-shaking is broken. - await testOccurenceCountBelow(tester, '${debugPrefix}FillProperties', 20); - }); -} - -// Used to prevent compiler optimization that will generate const string. -// Preventing counting test strings. -String get debugPrefix => ['d','e','b','u','g'].join(''); - -Future testOccurenceCountBelow(WidgetTester tester, String methodName, int count) async { - app.main(); - await tester.pumpAndSettle(); - - // Make sure app loaded. - final Finder finder = find.byKey(const Key('mainapp')); - expect(finder, findsOneWidget); - - await _loadBundleAndCheck(methodName, count); -} - -String fileContents; - -Future _loadBundleAndCheck(String methodName, int count) async { - fileContents ??= await html.HttpRequest.getString('main.dart.js'); - expect(fileContents, contains('RenderObjectToWidgetElement')); - expect(occurrenceCount(fileContents, methodName), lessThan(count)); -} - -int occurrenceCount(String contents, String word) { - int count = 0; - final int wordLength = word.length; - int pos = contents.indexOf(word); - final int contentLength = contents.length; - while (pos != -1) { - ++count; - pos += wordLength; - if (pos >= contentLength || count > 100) { - break; - } - pos = contents.indexOf(word, pos); - } - return count; -} diff --git a/e2etests/web/regular_integration_tests/test_driver/treeshaking_integration_test.dart b/e2etests/web/regular_integration_tests/test_driver/treeshaking_integration_test.dart deleted file mode 100644 index 96b5ad0bf52a4..0000000000000 --- a/e2etests/web/regular_integration_tests/test_driver/treeshaking_integration_test.dart +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:integration_test/integration_test_driver.dart' as test; - -Future main() async => test.integrationDriver(); diff --git a/e2etests/web/regular_integration_tests/test_driver/url_strategy_integration.dart b/e2etests/web/regular_integration_tests/test_driver/url_strategy_integration.dart deleted file mode 100644 index 8b59aad50b636..0000000000000 --- a/e2etests/web/regular_integration_tests/test_driver/url_strategy_integration.dart +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// TODO(yjbanov): this depends on integration_test that's not null-safe yet -// https://github.com/flutter/flutter/issues/84014 -// @dart=2.6 - -import 'dart:async'; -import 'dart:html' as html; -import 'dart:ui' as ui; -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter_web_plugins/flutter_web_plugins.dart'; -import 'package:integration_test/integration_test.dart'; -import 'package:regular_integration_tests/url_strategy_main.dart' as app; - -void main() { - IntegrationTestWidgetsFlutterBinding.ensureInitialized() as IntegrationTestWidgetsFlutterBinding; - - testWidgets('Can customize url strategy', (WidgetTester tester) async { - final TestUrlStrategy strategy = TestUrlStrategy.fromEntry( - const TestHistoryEntry('initial state', null, '/initial'), - ); - setUrlStrategy(strategy); - - app.appRoutes = { - '/': (BuildContext context) => Container(), - '/foo': (BuildContext context) => Container(), - }; - app.main(); - await tester.pumpAndSettle(); - - expect(strategy.getPath(), '/'); - - final NavigatorState navigator = app.navKey.currentState; - navigator.pushNamed('/foo'); - await tester.pump(); - expect(strategy.getPath(), '/foo'); - }); -} - -/// This URL strategy mimics the browser's history as closely as possible -/// while doing it all in memory with no interaction with the browser. -/// -/// It keeps a list of history entries and event listeners in memory and -/// manipulates them in order to achieve the desired functionality. -class TestUrlStrategy extends UrlStrategy { - /// Creates a instance of [TestUrlStrategy] with an empty string as the - /// path. - factory TestUrlStrategy() => TestUrlStrategy.fromEntry(TestHistoryEntry(null, null, '')); - - /// Creates an instance of [TestUrlStrategy] and populates it with a list - /// that has [initialEntry] as the only item. - TestUrlStrategy.fromEntry(TestHistoryEntry initialEntry) - : _currentEntryIndex = 0, - history = [initialEntry]; - - @override - String getPath() => currentEntry.url; - - @override - dynamic getState() => currentEntry.state; - - int _currentEntryIndex; - int get currentEntryIndex => _currentEntryIndex; - - final List history; - - TestHistoryEntry get currentEntry { - assert(withinAppHistory); - return history[_currentEntryIndex]; - } - - set currentEntry(TestHistoryEntry entry) { - assert(withinAppHistory); - history[_currentEntryIndex] = entry; - } - - /// Whether we are still within the history of the Flutter Web app. This - /// remains true until we go back in history beyond the entry where the app - /// started. - bool get withinAppHistory => _currentEntryIndex >= 0; - - @override - void pushState(dynamic state, String title, String url) { - assert(withinAppHistory); - _currentEntryIndex++; - // When pushing a new state, we need to remove all entries that exist after - // the current entry. - // - // If the user goes A -> B -> C -> D, then goes back to B and pushes a new - // entry called E, we should end up with: A -> B -> E in the history list. - history.removeRange(_currentEntryIndex, history.length); - history.add(TestHistoryEntry(state, title, url)); - } - - @override - void replaceState(dynamic state, String title, String url) { - assert(withinAppHistory); - if (url == null || url == '') { - url = currentEntry.url; - } - currentEntry = TestHistoryEntry(state, title, url); - } - - /// This simulates the case where a user types in a url manually. It causes - /// a new state to be pushed, and all event listeners will be invoked. - Future simulateUserTypingUrl(String url) { - assert(withinAppHistory); - return _nextEventLoop(() { - pushState(null, '', url); - _firePopStateEvent(); - }); - } - - @override - Future go(int count) { - assert(withinAppHistory); - // Browsers don't move in history immediately. They do it at the next - // event loop. So let's simulate that. - return _nextEventLoop(() { - _currentEntryIndex = _currentEntryIndex + count; - if (withinAppHistory) { - _firePopStateEvent(); - } - }); - } - - final List listeners = []; - - @override - ui.VoidCallback addPopStateListener(html.EventListener fn) { - listeners.add(fn); - return () { - // Schedule a micro task here to avoid removing the listener during - // iteration in [_firePopStateEvent]. - scheduleMicrotask(() => listeners.remove(fn)); - }; - } - - /// Simulates the scheduling of a new event loop by creating a delayed future. - /// Details explained here: https://webdev.dartlang.org/articles/performance/event-loop - Future _nextEventLoop(ui.VoidCallback callback) { - return Future.delayed(Duration.zero).then((_) => callback()); - } - - /// Invokes all the attached event listeners in order of - /// attaching. This method should be called asynchronously to make it behave - /// like a real browser. - void _firePopStateEvent() { - assert(withinAppHistory); - final html.PopStateEvent event = html.PopStateEvent( - 'popstate', - {'state': currentEntry.state}, - ); - for (int i = 0; i < listeners.length; i++) { - listeners[i](event); - } - } - - @override - String prepareExternalUrl(String internalUrl) => internalUrl; - - @override - String toString() { - final List lines = []; - for (int i = 0; i < history.length; i++) { - final TestHistoryEntry entry = history[i]; - lines.add(_currentEntryIndex == i ? '* $entry' : ' $entry'); - } - return '$runtimeType: [\n${lines.join('\n')}\n]'; - } -} - -class TestHistoryEntry { - final dynamic state; - final String title; - final String url; - - const TestHistoryEntry(this.state, this.title, this.url); - - @override - String toString() { - return '$runtimeType(state:$state, title:"$title", url:"$url")'; - } -} diff --git a/e2etests/web/regular_integration_tests/test_driver/url_strategy_integration_test.dart b/e2etests/web/regular_integration_tests/test_driver/url_strategy_integration_test.dart deleted file mode 100644 index 9c2c0fdcadc77..0000000000000 --- a/e2etests/web/regular_integration_tests/test_driver/url_strategy_integration_test.dart +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:regular_integration_tests/screenshot_support.dart' as test; - -Future main() async { - await test.runTestWithScreenshots(); -} diff --git a/e2etests/web/regular_integration_tests/web/index.html b/e2etests/web/regular_integration_tests/web/index.html deleted file mode 100644 index 4134d6bc48c1f..0000000000000 --- a/e2etests/web/regular_integration_tests/web/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Web Integration Tests - - - - - diff --git a/lib/web_ui/dev/README.md b/lib/web_ui/dev/README.md index 71fa5daaafc52..edbb743df337b 100644 --- a/lib/web_ui/dev/README.md +++ b/lib/web_ui/dev/README.md @@ -163,7 +163,9 @@ _**Note**: if `FELT_USE_SNAPSHOT` is omitted or has any value other than "false" ## Upgrade Browser Version -Since the engine code and infra recipes do not live in the same repository there are few steps to follow in order to upgrade a browser's version. For now these instructins are most relevant to Chrome. +Since the engine code and infra recipes do not live in the same repository +there are few steps to follow in order to upgrade a browser's version. For +now these instructins are most relevant to Chrome. 1. Dowload the binaries for the new browser/driver for each operaing system (macOS, linux, windows). 2. Create CIPD packages for these packages. (More documentation is available for Googlers. go/cipd-flutter-web) @@ -174,7 +176,7 @@ Note that for LUCI builders, for Chrome both unit and integration tests are usin Some useful links: 1. For Chrome downloads [link](https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html) -2. Browser and driver CIPD [packages](https://chrome-infra-packages.appspot.com/p/flutter_internal) (Note: Access rights are restricted for these packages.) +2. Browser and driver CIPD [packages](https://chrome-infra-packages.appspot.com/p/flutter_internal) (note: access is restricted for these packages) 3. LUCI web [recipe](https://flutter.googlesource.com/recipes/+/refs/heads/master/recipes/web_engine.py) 4. More general reading on CIPD packages [link](https://chromium.googlesource.com/chromium/src.git/+/master/docs/cipd.md#What-is-CIPD) diff --git a/lib/web_ui/dev/browser_lock.yaml b/lib/web_ui/dev/browser_lock.yaml index d5f9e5baeff99..51baa3e5171c5 100644 --- a/lib/web_ui/dev/browser_lock.yaml +++ b/lib/web_ui/dev/browser_lock.yaml @@ -1,32 +1,16 @@ -## Driver version in use. -## For an integration test to run, the browser's major version and the driver's -## major version should be equal. Please make sure the major version of -## the binary for `chrome` is the same with `required_driver_version`. -## (Major version meaning: For a browser that has version 13.0.5, the major -## version is 13.) -## Please refer to README's `Upgrade Browser Version` section for more details -## on how to update the version number. +# Please refer to the "Upgrade Browser Version" section in the README.md for +# more details on how to update browser version numbers. chrome: # It seems Chrome can't always release from the same build for all operating # systems, so we specify per-OS build number. Linux: 768968 # Major version 84 Mac: 768985 # Major version 84 Win: 768975 # Major version 84 -required_driver_version: - ## Make sure the major version of the binary in `browser_lock.yaml` is the - ## same for Chrome. - chrome: '84' ## Firefox does not use CIPD. To update the version, simply update it in this -## file. However geckodriver does use CIPD. When upgrading geckodriver, update -## it here, then follow the process in go/cipd-flutter-web (googlers only) to -## create a new CIPD package. +## file. firefox: version: '83.0' -## geckodriver is used for testing Firefox Browser. It works with multiple -## Firefox Browser versions. -## See: https://github.com/mozilla/geckodriver/releases -geckodriver: 'v0.28.0' edge: launcher_version: '1.2.0.0' diff --git a/lib/web_ui/dev/chrome_installer.dart b/lib/web_ui/dev/chrome_installer.dart index 9a518d96ab6c2..d84e2c1c1154d 100644 --- a/lib/web_ui/dev/chrome_installer.dart +++ b/lib/web_ui/dev/chrome_installer.dart @@ -279,18 +279,6 @@ Future fetchLatestChromeVersion() async { } } -/// Get the Chrome Driver version for the system Chrome. -// TODO(nurhan): https://github.com/flutter/flutter/issues/53179 -Future queryChromeDriverVersion() async { - final int chromeVersion = await _querySystemChromeMajorVersion(); - final io.File lockFile = io.File( - path.join(environment.webUiRootDir.path, 'dev', 'driver_version.yaml')); - YamlMap _configuration = loadYaml(lockFile.readAsStringSync()) as YamlMap; - final String chromeDriverVersion = - _configuration['chrome'][chromeVersion] as String; - return chromeDriverVersion; -} - /// Make sure LUCI bot has the pinned Chrome version and return the executable. /// /// We are using CIPD packages in LUCI. The pinned chrome version from the @@ -311,55 +299,3 @@ String preinstalledChromeExecutable() { ); } } - -Future _querySystemChromeMajorVersion() async { - String chromeExecutable = ''; - // LUCI uses the Chrome from CIPD packages. - if (isLuci) { - chromeExecutable = preinstalledChromeExecutable(); - } else if (io.Platform.isLinux) { - chromeExecutable = 'google-chrome'; - } else if (io.Platform.isMacOS) { - chromeExecutable = await _findChromeExecutableOnMac(); - } else { - throw UnimplementedError('Web installers only work on Linux and Mac.'); - } - - final io.ProcessResult versionResult = - await io.Process.run('$chromeExecutable', ['--version']); - - if (versionResult.exitCode != 0) { - throw Exception('Failed to locate system Chrome.'); - } - // The output looks like: Google Chrome 79.0.3945.36. - final String output = versionResult.stdout as String; - - print('INFO: chrome version in use $output'); - - // Version number such as 79.0.3945.36. - try { - final String versionAsString = output.trim().split(' ').last; - final String majorVersion = versionAsString.split('.')[0]; - return int.parse(majorVersion); - } catch (e) { - throw Exception( - 'Was expecting a version of the form Google Chrome 79.0.3945.36., ' - 'received $output'); - } -} - -/// Find Google Chrome App on Mac. -Future _findChromeExecutableOnMac() async { - io.Directory chromeDirectory = io.Directory('/Applications') - .listSync() - .whereType() - .firstWhere( - (d) => path.basename(d.path).endsWith('Chrome.app'), - orElse: () => throw Exception('Failed to locate system Chrome'), - ); - - final io.File chromeExecutableDir = io.File( - path.join(chromeDirectory.path, 'Contents', 'MacOS', 'Google Chrome')); - - return chromeExecutableDir.path; -} diff --git a/lib/web_ui/dev/driver_manager.dart b/lib/web_ui/dev/driver_manager.dart deleted file mode 100644 index 61550ff33b369..0000000000000 --- a/lib/web_ui/dev/driver_manager.dart +++ /dev/null @@ -1,236 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:io' as io; - -import 'package:path/path.dart' as pathlib; -import 'package:web_driver_installer/chrome_driver_installer.dart'; -import 'package:web_driver_installer/firefox_driver_installer.dart'; -import 'package:web_driver_installer/safari_driver_runner.dart'; -import 'package:yaml/yaml.dart'; - -import 'chrome_installer.dart'; -import 'common.dart'; -import 'environment.dart'; -import 'utils.dart'; - -/// [DriverManager] implementation for Chrome. -/// -/// This manager can be used for both macOS and Linux. -class ChromeDriverManager extends DriverManager { - /// Directory which contains the Chrome's major version. - /// - /// On LUCI we are using the CIPD packages to control Chrome binaries we use. - /// There will be multiple CIPD packages loaded at the same time. Yaml file - /// `driver_version.yaml` contains the version number we want to use. - /// - /// Initialized to the current first to avoid the `Non-nullable` error. - // TODO: https://github.com/flutter/flutter/issues/53179. Local integration - // tests are still using the system Chrome. - late final io.Directory _browserDriverDirWithVersion; - - ChromeDriverManager(String browser) : super(browser) { - final io.File lockFile = io.File(pathlib.join( - environment.webUiRootDir.path, 'dev', 'browser_lock.yaml')); - final YamlMap _configuration = - loadYaml(lockFile.readAsStringSync()) as YamlMap; - final String requiredChromeDriverVersion = - _configuration['required_driver_version']['chrome'] as String; - print('INFO: Major version for Chrome Driver $requiredChromeDriverVersion'); - _browserDriverDirWithVersion = io.Directory(pathlib.join( - environment.webUiDartToolDir.path, - 'drivers', - browser, - requiredChromeDriverVersion, - '${browser}driver-${io.Platform.operatingSystem.toString()}')); - } - - @override - Future _installDriver() async { - if (_browserDriverDirWithVersion.existsSync()) { - _browserDriverDirWithVersion.deleteSync(recursive: true); - } - - _browserDriverDirWithVersion.createSync(recursive: true); - temporaryDirectories.add(_drivers); - - final io.Directory temp = io.Directory.current; - io.Directory.current = _browserDriverDirWithVersion; - - try { - // TODO(nurhan): https://github.com/flutter/flutter/issues/53179 - final String chromeDriverVersion = await queryChromeDriverVersion(); - ChromeDriverInstaller chromeDriverInstaller = - ChromeDriverInstaller.withVersion(chromeDriverVersion); - await chromeDriverInstaller.install(alwaysInstall: true); - } finally { - io.Directory.current = temp; - } - } - - /// Throw an error if driver directory does not exists. - /// - /// Driver should already exist on LUCI as a CIPD package. - @override - Future _verifyDriverForLUCI() { - if (!_browserDriverDirWithVersion.existsSync()) { - throw StateError('Failed to locate Chrome driver on LUCI on path:' - '${_browserDriverDirWithVersion.path}'); - } - return Future.value(); - } - - @override - Future _startDriver() async { - await startProcess('./chromedriver/chromedriver', ['--port=4444'], - workingDirectory: _browserDriverDirWithVersion.path); - print('INFO: Driver started'); - } -} - -/// [DriverManager] implementation for Firefox. -/// -/// This manager can be used for both macOS and Linux. -class FirefoxDriverManager extends DriverManager { - FirefoxDriverManager(String browser) : super(browser); - - FirefoxDriverInstaller firefoxDriverInstaller = - FirefoxDriverInstaller(geckoDriverVersion: getLockedGeckoDriverVersion()); - - @override - Future _installDriver() async { - if (_browserDriverDir.existsSync()) { - _browserDriverDir.deleteSync(recursive: true); - } - - _browserDriverDir.createSync(recursive: true); - temporaryDirectories.add(_drivers); - - final io.Directory temp = io.Directory.current; - io.Directory.current = _browserDriverDir; - - try { - await firefoxDriverInstaller.install(alwaysInstall: false); - } finally { - io.Directory.current = temp; - } - } - - /// Throw an error if driver directory does not exist. - /// - /// Driver should already exist on LUCI as a CIPD package. - @override - Future _verifyDriverForLUCI() { - if (!_browserDriverDir.existsSync()) { - throw StateError('Failed to locate Firefox driver on LUCI on path:' - '${_browserDriverDir.path}'); - } - return Future.value(); - } - - @override - Future _startDriver() async { - await startProcess('./firefoxdriver/geckodriver', ['--port=4444'], - workingDirectory: _browserDriverDir.path); - print('INFO: Driver started'); - } - - /// Get the geckodriver version to be used with [FirefoxDriverInstaller]. - /// - /// For different versions of geckodriver. See: - /// https://github.com/mozilla/geckodriver/releases - static String getLockedGeckoDriverVersion() { - final YamlMap browserLock = BrowserLock.instance.configuration; - String geckoDriverReleaseVersion = browserLock['geckodriver'] as String; - return geckoDriverReleaseVersion; - } -} - -/// [DriverManager] implementation for Safari. -/// -/// This manager is will only be created/used for macOS. -class SafariDriverManager extends DriverManager { - SafariDriverManager(String browser) : super(browser); - - @override - Future _installDriver() { - // No-op. - // macOS comes with Safari Driver installed. - return new Future.value(); - } - - @override - Future _verifyDriverForLUCI() { - // No-op. - // macOS comes with Safari Driver installed. - return Future.value(); - } - - @override - Future _startDriver() async { - final SafariDriverRunner safariDriverRunner = SafariDriverRunner(); - - final io.Process process = - await safariDriverRunner.runDriver(version: 'system'); - - processesToCleanUp.add(process); - } -} - -/// Abstract class for preparing the browser driver before running the integration -/// tests. -abstract class DriverManager { - /// Installation directory for browser's driver. - final io.Directory _browserDriverDir; - - /// This is the parent directory for all drivers. - /// - /// This directory is saved to [temporaryDirectories] and deleted before - /// tests shutdown. - final io.Directory _drivers; - - DriverManager(String browser) - : this._browserDriverDir = io.Directory(pathlib.join( - environment.webUiDartToolDir.path, - 'drivers', - browser, - '${browser}driver-${io.Platform.operatingSystem.toString()}')), - this._drivers = io.Directory( - pathlib.join(environment.webUiDartToolDir.path, 'drivers')); - - Future prepareDriver() async { - if (!isLuci) { - // LUCI installs driver from CIPD, so we skip installing it on LUCI. - await _installDriver(); - } else { - await _verifyDriverForLUCI(); - } - await _startDriver(); - } - - /// Always re-install since driver can change frequently. - /// It usually changes with each the browser version changes. - /// A better solution would be installing the browser and the driver at the - /// same time. - /// TODO(nurhan): https://github.com/flutter/flutter/issues/53179. Partly - // solved. Remaining local integration tests using the locked Chrome version. - Future _installDriver(); - - Future _verifyDriverForLUCI(); - - Future _startDriver(); - - static DriverManager chooseDriver(String browser) { - if (browser == 'chrome') { - return ChromeDriverManager(browser); - } else if (browser == 'firefox') { - return FirefoxDriverManager(browser); - } else if (browser == 'safari' && io.Platform.isMacOS) { - return SafariDriverManager(browser); - } else { - throw StateError('Integration tests are only supported on Firefox, Chrome' - ' and on Safari (running on macOS)'); - } - } -} diff --git a/lib/web_ui/dev/driver_version.yaml b/lib/web_ui/dev/driver_version.yaml deleted file mode 100644 index 7da5245013348..0000000000000 --- a/lib/web_ui/dev/driver_version.yaml +++ /dev/null @@ -1,15 +0,0 @@ -## Map for driver versions to use for each browser version. -## See: https://chromedriver.chromium.org/downloads -chrome: - 86: '86.0.4240.22' - 85: '85.0.4183.38' - 84: '84.0.4147.30' - 83: '83.0.4103.39' - 81: '81.0.4044.69' - 80: '80.0.3987.106' - 79: '79.0.3945.36' - 78: '78.0.3904.105' - 77: '77.0.3865.40' - 76: '76.0.3809.126' - 75: '75.0.3770.140' - 74: '74.0.3729.6' diff --git a/lib/web_ui/dev/environment.dart b/lib/web_ui/dev/environment.dart index 7c85199860dcb..db77267a02920 100644 --- a/lib/web_ui/dev/environment.dart +++ b/lib/web_ui/dev/environment.dart @@ -29,8 +29,6 @@ class Environment { io.Directory(pathlib.join(hostDebugUnoptDir.path, 'dart-sdk')); final io.Directory webUiRootDir = io.Directory( pathlib.join(engineSrcDir.path, 'flutter', 'lib', 'web_ui')); - final io.Directory integrationTestsDir = io.Directory( - pathlib.join(engineSrcDir.path, 'flutter', 'e2etests', 'web')); for (io.Directory expectedDirectory in [ engineSrcDir, @@ -49,7 +47,6 @@ class Environment { webUiRootDir: webUiRootDir, engineSrcDir: engineSrcDir, engineToolsDir: engineToolsDir, - integrationTestsDir: integrationTestsDir, outDir: outDir, hostDebugUnoptDir: hostDebugUnoptDir, dartSdkDir: dartSdkDir, @@ -61,7 +58,6 @@ class Environment { required this.webUiRootDir, required this.engineSrcDir, required this.engineToolsDir, - required this.integrationTestsDir, required this.outDir, required this.hostDebugUnoptDir, required this.dartSdkDir, @@ -79,9 +75,6 @@ class Environment { /// Path to the engine's "tools" directory. final io.Directory engineToolsDir; - /// Path to the web integration tests. - final io.Directory integrationTestsDir; - /// Path to the engine's "out" directory. /// /// This is where you'll find the ninja output, such as the Dart SDK. diff --git a/lib/web_ui/dev/exceptions.dart b/lib/web_ui/dev/exceptions.dart index 167d1734e655f..acb665bf6a89e 100644 --- a/lib/web_ui/dev/exceptions.dart +++ b/lib/web_ui/dev/exceptions.dart @@ -11,15 +11,6 @@ class BrowserInstallerException implements Exception { String toString() => message; } -class DriverException implements Exception { - DriverException(this.message); - - final String message; - - @override - String toString() => message; -} - class ToolException implements Exception { ToolException(this.message); diff --git a/lib/web_ui/dev/integration_tests_manager.dart b/lib/web_ui/dev/integration_tests_manager.dart deleted file mode 100644 index 30794f9b9a77c..0000000000000 --- a/lib/web_ui/dev/integration_tests_manager.dart +++ /dev/null @@ -1,658 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:io' as io; -import 'package:args/args.dart'; -import 'package:path/path.dart' as pathlib; - -import 'chrome_installer.dart'; -import 'driver_manager.dart'; -import 'environment.dart'; -import 'exceptions.dart'; -import 'common.dart'; -import 'utils.dart'; - -const String _unsupportedConfigurationWarning = 'WARNING: integration tests ' - 'are only supported on Chrome, Firefox and on Safari (running on macOS)'; - -class IntegrationTestsManager { - final String _browser; - - final bool _useSystemFlutter; - - final DriverManager _driverManager; - - final bool _doUpdateScreenshotGoldens; - - IntegrationTestsManager( - this._browser, this._useSystemFlutter, this._doUpdateScreenshotGoldens) - : _driverManager = DriverManager.chooseDriver(_browser); - - Future runTests() async { - if (validateIfTestsShouldRun()) { - await _driverManager.prepareDriver(); - return await _runTests(); - } else { - return false; - } - } - - Future _runPubGet(String workingDirectory) async { - if (!_useSystemFlutter) { - await _cloneFlutterRepo(); - await _enableWeb(workingDirectory); - } - await runFlutter(workingDirectory, ['pub', 'get'], - useSystemFlutter: _useSystemFlutter); - } - - /// Clone flutter repository, use the youngest commit older than the engine - /// commit. - /// - /// Use engine/src/flutter/.dart_tools to clone the Flutter repo. - /// TODO(nurhan): Use git pull instead if repo exists. - Future _cloneFlutterRepo() async { - // Delete directory if exists. - if (environment.engineDartToolDir.existsSync()) { - environment.engineDartToolDir.deleteSync(recursive: true); - } - environment.engineDartToolDir.createSync(); - - final int exitCode = await runProcess( - environment.cloneFlutterScript.path, - [ - environment.engineDartToolDir.path, - ], - workingDirectory: environment.webUiRootDir.path, - ); - - if (exitCode != 0) { - throw ToolException('ERROR: Failed to clone flutter repo. Exited with ' - 'exit code $exitCode'); - } - } - - Future _enableWeb(String workingDirectory) async { - await runFlutter(workingDirectory, ['config', '--enable-web'], - useSystemFlutter: _useSystemFlutter); - } - - /// Runs all the web tests under e2e_tests/web. - Future _runTests() async { - // Only list the files under e2e_tests/web. - final List entities = - environment.integrationTestsDir.listSync(followLinks: false); - - bool allTestsPassed = true; - for (io.FileSystemEntity e in entities) { - // The tests should be under this directories. - if (e is io.Directory) { - allTestsPassed = allTestsPassed && await _validateAndRunTests(e); - } - } - return allTestsPassed; - } - - /// Run tests in a single directory under: e2e_tests/web. - /// - /// Run `flutter pub get` as the first step. - /// - /// Validate the directory before running the tests. Each directory is - /// expected to be a test project which includes a `pubspec.yaml` file - /// and a `test_driver` directory. - Future _validateAndRunTests(io.Directory directory) async { - _validateTestDirectory(directory); - await _runPubGet(directory.path); - final bool testResults = await _runTestsInDirectory(directory); - return testResults; - } - - int _numberOfPassedTests = 0; - int _numberOfFailedTests = 0; - - Future _runTestsInDirectory(io.Directory directory) async { - final io.Directory testDirectory = - io.Directory(pathlib.join(directory.path, 'test_driver')); - final List entities = testDirectory - .listSync(followLinks: false) - .whereType() - .toList(); - - final List e2eTestsToRun = []; - final List blockedTests = - blockedTestsListsMap[getBlockedTestsListMapKey(_browser)] ?? []; - - // If no target is specified run all the tests. - if (_runAllTestTargets) { - // The following loops over the contents of the directory and saves an - // expected driver file name for each e2e test assuming any dart file - // not ending with `_test.dart` is an e2e test. - // Other files are not considered since developers can add files such as - // README. - for (io.File f in entities) { - final String basename = pathlib.basename(f.path); - if (!basename.contains('_test.dart') && basename.endsWith('.dart')) { - // Do not add the basename if it is in the `blockedTests`. - if (!blockedTests.contains(basename)) { - e2eTestsToRun.add(basename); - } else { - print('INFO: Test $basename is skipped since it is blocked for ' - '${getBlockedTestsListMapKey(_browser)}'); - } - } - } - if (isVerboseLoggingEnabled) { - print( - 'INFO: In project ${directory} ${e2eTestsToRun.length} tests to run.'); - } - } else { - // If a target is specified it will run regardless of if it's blocked or - // not. There will be an info note to warn the developer. - final String targetTest = - IntegrationTestsArgumentParser.instance.testTarget; - final io.File file = - entities.singleWhere((f) => pathlib.basename(f.path) == targetTest); - final String basename = pathlib.basename(file.path); - if (blockedTests.contains(basename) && isVerboseLoggingEnabled) { - print('INFO: Test $basename do not run on CI environments. Please ' - 'remove it from the blocked tests list if you want to enable this ' - 'test on CI.'); - } - e2eTestsToRun.add(basename); - } - - final Set buildModes = _getBuildModes(); - - for (String fileName in e2eTestsToRun) { - await _runTestsTarget(directory, fileName, buildModes); - } - - final int numberOfTestsRun = _numberOfPassedTests + _numberOfFailedTests; - - print('INFO: ${numberOfTestsRun} tests run. ${_numberOfPassedTests} passed ' - 'and ${_numberOfFailedTests} failed.'); - return _numberOfFailedTests == 0; - } - - Future _runTestsTarget( - io.Directory directory, String target, Set buildModes) async { - final Set renderingBackends = _getRenderingBackends(); - for (String renderingBackend in renderingBackends) { - for (String mode in buildModes) { - if (!blockedTestsListsMapForModes[mode]!.contains(target) && - !blockedTestsListsMapForRenderBackends[renderingBackend]! - .contains(target)) { - final bool result = await _runTestsInMode(directory, target, - mode: mode, webRenderer: renderingBackend); - if (result) { - _numberOfPassedTests++; - } else { - _numberOfFailedTests++; - } - } - } - } - } - - Future _runTestsInMode(io.Directory directory, String testName, - {String mode = 'profile', String webRenderer = 'html'}) async { - String executable = - _useSystemFlutter ? 'flutter' : environment.flutterCommand.path; - Map flutterEnvironment = Map(); - if (_doUpdateScreenshotGoldens) { - flutterEnvironment['UPDATE_GOLDENS'] = 'true'; - } - final IntegrationArguments arguments = - IntegrationArguments.fromBrowser(_browser); - final int exitCode = await runProcess( - executable, - arguments.getTestArguments(testName, mode, webRenderer), - workingDirectory: directory.path, - environment: flutterEnvironment, - ); - - if (exitCode != 0) { - final String command = - arguments.getCommandToRun(testName, mode, webRenderer); - io.stderr - .writeln('ERROR: Failed to run test. Exited with exit code $exitCode' - '. To run $testName locally use the following command:' - '\n\n$command'); - return false; - } else { - return true; - } - } - - Set _getRenderingBackends() { - Set renderingBackends; - if (_renderingBackendSelected) { - final String mode = IntegrationTestsArgumentParser.instance.webRenderer; - renderingBackends = {mode}; - } else { - // TODO(nurhan): Enable `auto` when recipe is sharded. - renderingBackends = {'html', 'canvaskit'}; - } - return renderingBackends; - } - - Set _getBuildModes() { - Set buildModes; - if (_buildModeSelected) { - final String mode = IntegrationTestsArgumentParser.instance.buildMode; - if (mode == 'debug' && _browser != 'chrome') { - throw ToolException('Debug mode is only supported for Chrome.'); - } else { - buildModes = {mode}; - } - } else { - buildModes = _browser == 'chrome' - ? {'debug', 'profile', 'release'} - : {'profile', 'release'}; - } - return buildModes; - } - - /// Validate the directory has a `pubspec.yaml` file and a `test_driver` - /// directory. - /// - /// Also check the validity of files under `test_driver` directory calling - /// [_checkE2ETestsValidity] method. - void _validateTestDirectory(io.Directory directory) { - final List entities = - directory.listSync(followLinks: false); - - // Whether the project has the pubspec.yaml file. - bool pubSpecFound = false; - // The test directory 'test_driver'. - io.Directory? testDirectory; - - for (io.FileSystemEntity e in entities) { - // The tests should be under this directories. - final String baseName = pathlib.basename(e.path); - if (e is io.Directory && baseName == 'test_driver') { - testDirectory = e; - } - if (e is io.File && baseName == 'pubspec.yaml') { - pubSpecFound = true; - } - } - if (!pubSpecFound) { - throw StateError('ERROR: pubspec.yaml file not found in the test project ' - 'in the directory ${directory.path}.'); - } - if (testDirectory == null) { - throw StateError( - 'ERROR: test_driver folder not found in the test project.' - 'in the directory ${directory.path}.'); - } else { - _checkE2ETestsValidity(testDirectory); - } - } - - /// Checks if each e2e test file in the directory has a driver test - /// file to run it. - /// - /// Prints informative message to the developer if an error has found. - /// For each e2e test which has name {name}.dart there will be a driver - /// file which drives it. The driver file should be named: - /// {name}_test.dart - void _checkE2ETestsValidity(io.Directory testDirectory) { - final Iterable directories = - testDirectory.listSync(followLinks: false).whereType(); - - if (directories.length > 0) { - throw StateError('${testDirectory.path} directory should not contain ' - 'any sub-directories'); - } - - final Iterable entities = - testDirectory.listSync(followLinks: false).whereType(); - - final Set expectedDriverFileNames = Set(); - final Set foundDriverFileNames = Set(); - int numberOfTests = 0; - - // The following loops over the contents of the directory and saves an - // expected driver file name for each e2e test assuming any file - // not ending with `_test.dart` is an e2e test. - for (io.File f in entities) { - final String basename = pathlib.basename(f.path); - if (basename.contains('_test.dart')) { - // First remove this from expectedSet if not there add to the foundSet. - if (!expectedDriverFileNames.remove(basename)) { - foundDriverFileNames.add(basename); - } - } else if (basename.contains('.dart')) { - // Only run on dart files. - final String e2efileName = pathlib.basenameWithoutExtension(f.path); - final String expectedDriverName = '${e2efileName}_test.dart'; - numberOfTests++; - // First remove this from foundSet if not there add to the expectedSet. - if (!foundDriverFileNames.remove(expectedDriverName)) { - expectedDriverFileNames.add(expectedDriverName); - } - } - } - - if (numberOfTests == 0) { - throw StateError( - 'WARNING: No tests to run in this directory ${testDirectory.path}'); - } - - // TODO(nurhan): In order to reduce the work required from team members, - // remove the need for driver file, by using the same template file. - // Some driver files are missing. - if (expectedDriverFileNames.length > 0) { - for (String expectedDriverName in expectedDriverFileNames) { - print('ERROR: Test driver file named has ${expectedDriverName} ' - 'not found under directory ${testDirectory.path}. Stopping the ' - 'integration tests. Please add ${expectedDriverName}. Check to ' - 'README file on more details on how to set up integration tests.'); - } - throw StateError('Error in test files. Check the logs for ' - 'further instructions'); - } - } - - bool get _buildModeSelected => - !IntegrationTestsArgumentParser.instance.buildMode.isEmpty; - - bool get _renderingBackendSelected => - !IntegrationTestsArgumentParser.instance.webRenderer.isEmpty; - - bool get _runAllTestTargets => - IntegrationTestsArgumentParser.instance.testTarget.isEmpty; - - /// Validate the given `browser`, `platform` combination is suitable for - /// integration tests to run. - bool validateIfTestsShouldRun() { - if (_buildModeSelected) { - final String mode = IntegrationTestsArgumentParser.instance.buildMode; - if (mode == 'debug' && _browser != 'chrome') { - throw ToolException('Debug mode is only supported for Chrome.'); - } - } - - // Chrome tests should run at all Platforms (Linux, macOS, Windows). - // They can also run successfully on CI and local. - if (_browser == 'chrome') { - return true; - } else if (_browser == 'firefox' && - (io.Platform.isLinux || io.Platform.isMacOS)) { - return true; - } else if (_browser == 'safari' && io.Platform.isMacOS && !isLuci) { - return true; - } else { - io.stderr.writeln(_unsupportedConfigurationWarning); - return false; - } - } -} - -/// Interface for collecting arguments to give `flutter drive` to run the -/// integration tests. -abstract class IntegrationArguments { - IntegrationArguments(); - - factory IntegrationArguments.fromBrowser(String browser) { - if (browser == 'chrome') { - return ChromeIntegrationArguments(); - } else if (browser == 'firefox') { - return FirefoxIntegrationArguments(); - } else if (browser == 'safari' && io.Platform.isMacOS) { - return SafariIntegrationArguments(); - } else { - throw StateError(_unsupportedConfigurationWarning); - } - } - - List getTestArguments( - String testName, String mode, String webRenderer); - - String getCommandToRun(String testName, String mode, String webRenderer); -} - -/// Arguments to give `flutter drive` to run the integration tests on Chrome. -class ChromeIntegrationArguments extends IntegrationArguments { - List getTestArguments( - String testName, String mode, String webRenderer) { - return [ - 'drive', - '--target=test_driver/${testName}', - '-d', - 'web-server', - '--$mode', - '--browser-name=chrome', - if (isLuci) '--chrome-binary=${preinstalledChromeExecutable()}', - '--headless', - '--local-engine=host_debug_unopt', - '--web-renderer=$webRenderer', - ]; - } - - String getCommandToRun(String testName, String mode, String webRenderer) { - String statementToRun = 'flutter drive ' - '--target=test_driver/${testName} -d web-server --$mode ' - '--browser-name=chrome --local-engine=host_debug_unopt ' - '--web-renderer=$webRenderer'; - if (isLuci) { - statementToRun = '$statementToRun --chrome-binary=' - '${preinstalledChromeExecutable()}'; - } - return statementToRun; - } -} - -/// Arguments to give `flutter drive` to run the integration tests on Firefox. -class FirefoxIntegrationArguments extends IntegrationArguments { - List getTestArguments( - String testName, String mode, String webRenderer) { - return [ - 'drive', - '--target=test_driver/${testName}', - '-d', - 'web-server', - '--$mode', - '--browser-name=firefox', - '--headless', - '--local-engine=host_debug_unopt', - '--web-renderer=$webRenderer', - ]; - } - - String getCommandToRun(String testName, String mode, String webRenderer) { - final String arguments = - getTestArguments(testName, mode, webRenderer).join(' '); - return 'flutter $arguments'; - } -} - -/// Arguments to give `flutter drive` to run the integration tests on Safari. -class SafariIntegrationArguments extends IntegrationArguments { - SafariIntegrationArguments(); - - List getTestArguments( - String testName, String mode, String webRenderer) { - return [ - 'drive', - '--target=test_driver/${testName}', - '-d', - 'web-server', - '--$mode', - '--browser-name=safari', - '--local-engine=host_debug_unopt', - '--web-renderer=$webRenderer', - ]; - } - - String getCommandToRun(String testName, String mode, String webRenderer) { - final String arguments = - getTestArguments(testName, mode, webRenderer).join(' '); - return 'flutter $arguments'; - } -} - -/// Parses additional options that can be used when running integration tests. -class IntegrationTestsArgumentParser { - static final IntegrationTestsArgumentParser _singletonInstance = - IntegrationTestsArgumentParser._(); - - /// The [IntegrationTestsArgumentParser] singleton. - static IntegrationTestsArgumentParser get instance => _singletonInstance; - - IntegrationTestsArgumentParser._(); - - /// If target name is provided integration tests can run that one test - /// instead of running all the tests. - late final String testTarget; - - /// The build mode to run the integration tests. - /// - /// If not specified, these tests will run using 'debug, profile, release' - /// modes on Chrome and will run using 'profile, release' on other browsers. - /// - /// In order to skip a test for one of the modes, add the test to the - /// `blockedTestsListsMapForModes` list for the relevant compile mode. - late final String buildMode; - - /// Whether to use html, canvaskit or auto for web renderer. - /// - /// If not set all backends will be used one after another for integration - /// tests. If set only the provided option will be used. - late final String webRenderer; - - void populateOptions(ArgParser argParser) { - argParser - ..addOption( - 'target', - defaultsTo: '', - help: 'By default integration tests are run for all the tests under' - 'flutter/e2etests/web directory. If a test name is specified, that ' - 'only that test will run. The test name will be the name of the ' - 'integration test (e2e test) file. For example: ' - 'text_editing_integration.dart or ' - 'profile_diagnostics_integration.dart', - ) - ..addOption('build-mode', - defaultsTo: '', - help: 'Flutter supports three modes when building your app. This ' - 'option sets the build mode for the integration tests. ' - 'By default an integration test will sequentially run on ' - 'multiple modes. All three modes (debug, release, profile) are ' - 'used for Chrome. Only profile, release modes will be used for ' - 'other browsers. In other words, if a build mode is selected ' - 'tests will only be run using that mode. ' - 'See https://flutter.dev/docs/testing/build-modes for more ' - 'details on the build modes.') - ..addOption('web-renderer', - defaultsTo: '', - help: 'By default all three options (`html`, `canvaskit`, `auto`) ' - ' for rendering backends are tested when running integration ' - ' tests. If this option is set only the backend provided by this ' - ' option will be used. `auto`, `canvaskit` and `html`' - ' are the available options. '); - } - - /// Populate results of the arguments passed. - void parseOptions(ArgResults argResults) { - testTarget = argResults['target'] as String; - buildMode = argResults['build-mode'] as String; - if (!buildMode.isEmpty && - buildMode != 'debug' && - buildMode != 'profile' && - buildMode != 'release') { - throw ArgumentError('Unexpected build mode: $buildMode'); - } - webRenderer = argResults['web-renderer'] as String; - if (!webRenderer.isEmpty && - webRenderer != 'html' && - webRenderer != 'canvaskit' && - webRenderer != 'auto') { - throw ArgumentError('Unexpected rendering backend: $webRenderer'); - } - } -} - -/// Prepares a key for the [blackList] map. -/// -/// Uses the browser name and the operating system name. -String getBlockedTestsListMapKey(String browser) => - '${browser}-${io.Platform.operatingSystem}'; - -/// Tests that should be skipped run for a specific platform-browser -/// combination. -/// -/// These tests might be failing or might have been implemented for a specific -/// configuration. -/// -/// For example when adding a tests only intended for mobile browsers, it should -/// be added to [blockedTests] for `chrome-linux`, `safari-macos` and -/// `chrome-macos`. It will work on `chrome-android`, `safari-ios`. -/// -/// Note that integration tests are only running on chrome for now. -const Map> blockedTestsListsMap = >{ - 'chrome-linux': [ - 'target_platform_android_integration.dart', - 'target_platform_ios_integration.dart', - 'target_platform_macos_integration.dart', - ], - 'chrome-macos': [ - 'target_platform_ios_integration.dart', - 'target_platform_android_integration.dart', - ], - 'safari-macos': [ - 'target_platform_ios_integration.dart', - 'target_platform_android_integration.dart', - 'image_loading_integration.dart', - ], - 'firefox-linux': [ - 'target_platform_android_integration.dart', - 'target_platform_ios_integration.dart', - 'target_platform_macos_integration.dart', - ], - 'firefox-macos': [ - 'target_platform_android_integration.dart', - 'target_platform_ios_integration.dart', - ], -}; - -/// Tests blocked for one of the build modes. -/// -/// If a test is not supposed to run for one of the modes also add that test -/// to the corresponding list. -// TODO(nurhan): Remove the failing test after fixing. -const Map> blockedTestsListsMapForModes = - >{ - 'debug': [ - 'treeshaking_integration.dart', - 'text_editing_integration.dart', - 'url_strategy_integration.dart', - ], - 'profile': [], - 'release': [], -}; - -/// Tests blocked for one of the rendering backends. -/// -/// If a test is not suppose to run for one of the backends also add that test -/// to the corresponding list. -// TODO(nurhan): Remove the failing test after fixing. -const Map> blockedTestsListsMapForRenderBackends = - >{ - 'auto': [ - 'image_loading_integration.dart', - 'platform_messages_integration.dart', - 'profile_diagnostics_integration.dart', - 'scroll_wheel_integration.dart', - 'text_editing_integration.dart', - 'treeshaking_integration.dart', - 'url_strategy_integration.dart', - ], - 'html': [], - // This test failed on canvaskit on all three build modes. - 'canvaskit': [ - 'image_loading_integration.dart', - ], -}; diff --git a/lib/web_ui/dev/test_runner.dart b/lib/web_ui/dev/test_runner.dart index f0322de57dcbb..0ae6487ad7638 100644 --- a/lib/web_ui/dev/test_runner.dart +++ b/lib/web_ui/dev/test_runner.dart @@ -38,7 +38,6 @@ import 'environment.dart'; import 'exceptions.dart'; import 'firefox.dart'; import 'firefox_installer.dart'; -import 'integration_tests_manager.dart'; import 'macos_info.dart'; import 'safari_installation.dart'; import 'safari_ios.dart'; @@ -58,18 +57,6 @@ List failedShards = []; /// Whether all test shards succeeded. bool get allShardsPassed => failedShards.isEmpty; -/// The type of tests requested by the tool user. -enum TestTypesRequested { - /// For running the unit tests only. - unit, - - /// For running the integration tests only. - integration, - - /// For running both unit and integration tests. - all, -} - /// Command-line argument parsers that parse browser-specific options. final List _browserArgParsers = [ ChromeArgParser.instance, @@ -116,13 +103,6 @@ class TestCommand extends Command with ArgUtils { help: 'felt test command runs the unit tests and the integration tests ' 'at the same time. If this flag is set, only run the unit tests.', ) - ..addFlag( - 'integration-tests-only', - defaultsTo: false, - help: 'felt test command runs the unit tests and the integration tests ' - 'at the same time. If this flag is set, only run the integration ' - 'tests.', - ) ..addFlag('use-system-flutter', defaultsTo: false, help: @@ -170,7 +150,6 @@ class TestCommand extends Command with ArgUtils { browserArgParser.populateOptions(argParser); } GeneralTestsArgumentParser.instance.populateOptions(argParser); - IntegrationTestsArgumentParser.instance.populateOptions(argParser); } @override @@ -193,25 +172,6 @@ class TestCommand extends Command with ArgUtils { /// repeat them. bool _testPreparationReady = false; - /// Check the flags to see what type of tests are requested. - TestTypesRequested get testType { - if (boolArg('unit-tests-only')! && boolArg('integration-tests-only')!) { - throw ArgumentError('Conflicting arguments: unit-tests-only and ' - 'integration-tests-only are both set'); - } else if (boolArg('unit-tests-only')!) { - print('Running the unit tests only'); - return TestTypesRequested.unit; - } else if (boolArg('integration-tests-only')!) { - if (!isChrome && !isSafariOnMacOS && !isFirefox) { - throw UnimplementedError( - 'Integration tests are only available on Chrome Desktop for now'); - } - return TestTypesRequested.integration; - } else { - return TestTypesRequested.all; - } - } - @override Future run() async { for (BrowserArgParser browserArgParser in _browserArgParsers) { @@ -277,46 +237,7 @@ class TestCommand extends Command with ArgUtils { return message.toString(); } - Future runTests() async { - try { - switch (testType) { - case TestTypesRequested.unit: - return runUnitTests(); - case TestTypesRequested.integration: - return runIntegrationTests(); - case TestTypesRequested.all: - if (runAllTests && isIntegrationTestsAvailable) { - bool unitTestResult = await runUnitTests(); - bool integrationTestResult = await runIntegrationTests(); - if (integrationTestResult != unitTestResult) { - print( - 'Tests run. Integration tests passed: $integrationTestResult ' - 'unit tests passed: $unitTestResult'); - } - return integrationTestResult && unitTestResult; - } else { - return await runUnitTests(); - } - } - } on TestFailureException { - return true; - } - } - - Future runIntegrationTests() async { - // Parse additional arguments specific for integration testing. - IntegrationTestsArgumentParser.instance.parseOptions(argResults!); - await _prepare(); - final bool result = await IntegrationTestsManager( - browser, useSystemFlutter, doUpdateScreenshotGoldens) - .runTests(); - if (!result) { - failedShards.add('Integration tests'); - } - return result; - } - - Future runUnitTests() async { + Future runUnitTests() async { _copyTestFontsIntoWebUi(); await _buildHostPage(); await _prepare(); @@ -327,7 +248,6 @@ class TestCommand extends Command with ArgUtils { } else { await _runSpecificTests(targetFiles); } - return true; } /// Preparations before running the tests such as booting simulators or @@ -887,6 +807,6 @@ class TestRunnerStep implements PipelineStep { @override Future run() async { - await testCommand.runTests(); + await testCommand.runUnitTests(); } } diff --git a/lib/web_ui/pubspec.yaml b/lib/web_ui/pubspec.yaml index b9d0e711a9a24..64046a798235d 100644 --- a/lib/web_ui/pubspec.yaml +++ b/lib/web_ui/pubspec.yaml @@ -28,8 +28,3 @@ dev_dependencies: url: git://github.com/flutter/web_installers.git path: packages/simulators/ ref: 4a7b0a2c84b8993bf4d19030218de38c18838c26 - web_driver_installer: - git: - url: git://github.com/flutter/web_installers.git - path: packages/web_drivers/ - ref: 4a7b0a2c84b8993bf4d19030218de38c18838c26 diff --git a/tools/licenses/lib/main.dart b/tools/licenses/lib/main.dart index 4a96ab499f299..b05c45a965ef8 100644 --- a/tools/licenses/lib/main.dart +++ b/tools/licenses/lib/main.dart @@ -2122,9 +2122,6 @@ class _RepositoryFlutterDirectory extends _RepositoryDirectory { && entry.name != 'build' && entry.name != 'ci' && entry.name != 'flutter_frontend_server' - // The directory that contains end to end tests. - // Should be excluded from the licence checks. - && entry.name != 'e2etests' // None of the web_sdk code is linked into Flutter apps. It's only used // by engine tests and tools. && entry.name != 'web_sdk' diff --git a/web_sdk/web_test_utils/lib/environment.dart b/web_sdk/web_test_utils/lib/environment.dart index 5cc9eb8a6bf79..1ba54b6b4745a 100644 --- a/web_sdk/web_test_utils/lib/environment.dart +++ b/web_sdk/web_test_utils/lib/environment.dart @@ -48,8 +48,6 @@ class Environment { io.Directory(pathlib.join(hostDebugUnoptDir.path, 'dart-sdk')); final io.Directory webUiRootDir = io.Directory( pathlib.join(engineSrcDir.path, 'flutter', 'lib', 'web_ui')); - final io.Directory integrationTestsDir = io.Directory( - pathlib.join(engineSrcDir.path, 'flutter', 'e2etests', 'web')); for (final io.Directory expectedDirectory in [ engineSrcDir, @@ -68,7 +66,6 @@ class Environment { webUiRootDir: webUiRootDir, engineSrcDir: engineSrcDir, engineToolsDir: engineToolsDir, - integrationTestsDir: integrationTestsDir, outDir: outDir, hostDebugUnoptDir: hostDebugUnoptDir, dartSdkDir: dartSdkDir, @@ -80,7 +77,6 @@ class Environment { required this.webUiRootDir, required this.engineSrcDir, required this.engineToolsDir, - required this.integrationTestsDir, required this.outDir, required this.hostDebugUnoptDir, required this.dartSdkDir, @@ -98,9 +94,6 @@ class Environment { /// Path to the engine's "tools" directory. final io.Directory engineToolsDir; - /// Path to the web integration tests. - final io.Directory integrationTestsDir; - /// Path to the engine's "out" directory. /// /// This is where you'll find the ninja output, such as the Dart SDK.