mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
This reverts commit cb378edc9e
.
This commit is contained in:
parent
d68f95676c
commit
c2ea78d231
@ -71,8 +71,8 @@ linter:
|
||||
- avoid_init_to_null
|
||||
# - avoid_js_rounded_ints # only useful when targeting JS runtime
|
||||
- avoid_null_checks_in_equality_operators
|
||||
# - avoid_positional_boolean_parameters # would have been nice to enable this but by now there's too many places that break it
|
||||
- avoid_print
|
||||
# - avoid_positional_boolean_parameters # not yet tested
|
||||
# - avoid_print # not yet tested
|
||||
# - avoid_private_typedef_functions # we prefer having typedef (discussion in https://github.com/flutter/flutter/pull/16356)
|
||||
# - avoid_redundant_argument_values # not yet tested
|
||||
- avoid_relative_lib_imports
|
||||
|
@ -1,5 +0,0 @@
|
||||
include: ../analysis_options.yaml
|
||||
|
||||
linter:
|
||||
rules:
|
||||
avoid_print: false # We use prints as debugging tools here all the time.
|
@ -1,7 +0,0 @@
|
||||
[0-9]+:[0-9]+ [+]0: Local passes non-existent baseline for new test, null expectation *
|
||||
*No expectations provided by Skia Gold for test: library.flutter.new_golden_test.1. This may be a new test. If this is an unexpected result, check https://flutter-gold.skia.org.
|
||||
*Validate image output found at flutter/test/library/
|
||||
[0-9]+:[0-9]+ [+]0 ~1: Local passes non-existent baseline for new test, empty expectation *
|
||||
*No expectations provided by Skia Gold for test: library.flutter.new_golden_test.2. This may be a new test. If this is an unexpected result, check https://flutter-gold.skia.org.
|
||||
*Validate image output found at flutter/test/library/
|
||||
[0-9]+:[0-9]+ [+]0 ~2: All tests skipped. *
|
@ -1,77 +0,0 @@
|
||||
// Copyright 2014 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.
|
||||
|
||||
// See also packages/flutter_goldens/test/flutter_goldens_test.dart
|
||||
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:file/file.dart';
|
||||
import 'package:file/memory.dart';
|
||||
import 'package:flutter_goldens/flutter_goldens.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:platform/platform.dart';
|
||||
|
||||
// 1x1 colored pixel
|
||||
const List<int> _kFailPngBytes = <int>[137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0,
|
||||
13, 73, 72, 68, 82, 0, 0, 0, 1, 0, 0, 0, 1, 8, 6, 0, 0, 0, 31, 21, 196, 137,
|
||||
0, 0, 0, 13, 73, 68, 65, 84, 120, 1, 99, 249, 207, 240, 255, 63, 0, 7, 18, 3,
|
||||
2, 164, 147, 160, 197, 0, 0, 0, 0, 73, 69, 78, 68, 174, 66, 96, 130];
|
||||
|
||||
void main() {
|
||||
final MemoryFileSystem fs = MemoryFileSystem();
|
||||
final Directory basedir = fs.directory('flutter/test/library/')
|
||||
..createSync(recursive: true);
|
||||
final FakeSkiaGoldClient fakeSkiaClient = FakeSkiaGoldClient()
|
||||
..expectationForTestValues['flutter.new_golden_test.1'] = '';
|
||||
final FlutterLocalFileComparator comparator = FlutterLocalFileComparator(
|
||||
basedir.uri,
|
||||
fakeSkiaClient,
|
||||
fs: fs,
|
||||
platform: FakePlatform(
|
||||
environment: <String, String>{'FLUTTER_ROOT': '/flutter'},
|
||||
operatingSystem: 'macos'
|
||||
),
|
||||
);
|
||||
|
||||
test('Local passes non-existent baseline for new test, null expectation', () async {
|
||||
expect(
|
||||
await comparator.compare(
|
||||
Uint8List.fromList(_kFailPngBytes),
|
||||
Uri.parse('flutter.new_golden_test.1'),
|
||||
),
|
||||
isTrue,
|
||||
);
|
||||
});
|
||||
|
||||
test('Local passes non-existent baseline for new test, empty expectation', () async {
|
||||
expect(
|
||||
await comparator.compare(
|
||||
Uint8List.fromList(_kFailPngBytes),
|
||||
Uri.parse('flutter.new_golden_test.2'),
|
||||
),
|
||||
isTrue,
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
// See also packages/flutter_goldens/test/flutter_goldens_test.dart
|
||||
class FakeSkiaGoldClient extends Fake implements SkiaGoldClient {
|
||||
Map<String, String> expectationForTestValues = <String, String>{};
|
||||
Object? getExpectationForTestThrowable;
|
||||
@override
|
||||
Future<String> getExpectationForTest(String testName) async {
|
||||
if (getExpectationForTestThrowable != null) {
|
||||
throw getExpectationForTestThrowable!;
|
||||
}
|
||||
return expectationForTestValues[testName] ?? '';
|
||||
}
|
||||
|
||||
Map<String, List<int>> imageBytesValues = <String, List<int>>{};
|
||||
@override
|
||||
Future<List<int>> getImageBytes(String imageHash) async => imageBytesValues[imageHash]!;
|
||||
|
||||
Map<String, String> cleanTestNameValues = <String, String>{};
|
||||
@override
|
||||
String cleanTestName(String fileName) => cleanTestNameValues[fileName] ?? '';
|
||||
}
|
@ -8,5 +8,5 @@ import 'package:test/test.dart' hide TypeMatcher, isInstanceOf;
|
||||
void main() {
|
||||
test('working directory is the root of this package', () {
|
||||
expect(Directory.current.path, endsWith('automated_tests'));
|
||||
});
|
||||
});
|
||||
}
|
||||
|
@ -8,8 +8,6 @@ dependencies:
|
||||
sdk: flutter
|
||||
flutter_test:
|
||||
sdk: flutter
|
||||
flutter_goldens:
|
||||
sdk: flutter
|
||||
integration_test:
|
||||
sdk: flutter
|
||||
test: 1.17.12
|
||||
|
@ -1,10 +1,12 @@
|
||||
include: ../../analysis_options.yaml
|
||||
# Use the analysis options settings from the top level of the repo (not
|
||||
# the ones from above, which include the `public_member_api_docs` rule).
|
||||
|
||||
include: ../../../analysis_options.yaml
|
||||
|
||||
analyzer:
|
||||
exclude:
|
||||
# Ignore protoc generated files
|
||||
# Ignore protoc generated files
|
||||
- "lib/src/proto/*"
|
||||
|
||||
linter:
|
||||
rules:
|
||||
avoid_catches_without_on_clauses: true
|
||||
|
@ -1,4 +1,7 @@
|
||||
include: ../../analysis_options.yaml
|
||||
# Use the analysis options settings from the top level of the repo (not
|
||||
# the ones from above, which include the `public_member_api_docs` rule).
|
||||
|
||||
include: ../../../analysis_options.yaml
|
||||
|
||||
linter:
|
||||
rules:
|
||||
|
@ -1,4 +1,4 @@
|
||||
include: ../analysis_options.yaml
|
||||
include: ../../analysis_options.yaml
|
||||
|
||||
linter:
|
||||
rules:
|
||||
|
@ -1,4 +1,7 @@
|
||||
include: ../../analysis_options.yaml
|
||||
# Take our settings from the repo's main analysis_options.yaml file, but add
|
||||
# an exclude for the build directory.
|
||||
|
||||
include: ../../../analysis_options.yaml
|
||||
|
||||
analyzer:
|
||||
exclude:
|
||||
|
@ -47,7 +47,7 @@ class AutocompleteBasicExample extends StatelessWidget {
|
||||
});
|
||||
},
|
||||
onSelected: (String selection) {
|
||||
debugPrint('You just selected $selection');
|
||||
print('You just selected $selection');
|
||||
},
|
||||
);
|
||||
}
|
||||
|
@ -79,7 +79,7 @@ class AutocompleteBasicUserExample extends StatelessWidget {
|
||||
});
|
||||
},
|
||||
onSelected: (User selection) {
|
||||
debugPrint('You just selected ${_displayStringForOption(selection)}');
|
||||
print('You just selected ${_displayStringForOption(selection)}');
|
||||
},
|
||||
);
|
||||
}
|
||||
|
@ -35,7 +35,7 @@ class MyStatelessWidget extends StatelessWidget {
|
||||
child: InkWell(
|
||||
splashColor: Colors.blue.withAlpha(30),
|
||||
onTap: () {
|
||||
debugPrint('Card tapped.');
|
||||
print('Card tapped.');
|
||||
},
|
||||
child: const SizedBox(
|
||||
width: 300,
|
||||
|
@ -59,7 +59,7 @@ class LinkedLabelCheckbox extends StatelessWidget {
|
||||
),
|
||||
recognizer: TapGestureRecognizer()
|
||||
..onTap = () {
|
||||
debugPrint('Label has been tapped.');
|
||||
print('Label has been tapped.');
|
||||
},
|
||||
),
|
||||
),
|
||||
|
@ -45,7 +45,7 @@ class MyStatelessWidget extends StatelessWidget {
|
||||
),
|
||||
floatingActionButton: FloatingActionButton(
|
||||
onPressed: () {
|
||||
debugPrint('FAB pressed.');
|
||||
print('FAB pressed.');
|
||||
},
|
||||
tooltip: 'Increment',
|
||||
child: const Icon(Icons.add),
|
||||
|
@ -34,7 +34,7 @@ class MyStatelessWidget extends StatelessWidget {
|
||||
Widget build(BuildContext context) {
|
||||
return OutlinedButton(
|
||||
onPressed: () {
|
||||
debugPrint('Received click');
|
||||
print('Received click');
|
||||
},
|
||||
child: const Text('Click Me'),
|
||||
);
|
||||
|
@ -64,7 +64,7 @@ class LinkedLabelRadio extends StatelessWidget {
|
||||
),
|
||||
recognizer: TapGestureRecognizer()
|
||||
..onTap = () {
|
||||
debugPrint('Label has been tapped.');
|
||||
print('Label has been tapped.');
|
||||
},
|
||||
),
|
||||
),
|
||||
|
@ -59,7 +59,7 @@ class LinkedLabelSwitch extends StatelessWidget {
|
||||
),
|
||||
recognizer: TapGestureRecognizer()
|
||||
..onTap = () {
|
||||
debugPrint('Label has been tapped.');
|
||||
print('Label has been tapped.');
|
||||
},
|
||||
),
|
||||
),
|
||||
|
@ -54,7 +54,7 @@ class _MyStatefulWidgetState extends State<MyStatefulWidget> {
|
||||
constraints: BoxConstraints.tight(const Size(200, 50)),
|
||||
child: TextFormField(
|
||||
onSaved: (String? value) {
|
||||
debugPrint('Value for field $index saved as "$value"');
|
||||
print('Value for field $index saved as "$value"');
|
||||
},
|
||||
),
|
||||
),
|
||||
|
@ -92,13 +92,13 @@ class MyAction extends Action<MyIntent> {
|
||||
@override
|
||||
void addActionListener(ActionListenerCallback listener) {
|
||||
super.addActionListener(listener);
|
||||
debugPrint('Action Listener was added');
|
||||
print('Action Listener was added');
|
||||
}
|
||||
|
||||
@override
|
||||
void removeActionListener(ActionListenerCallback listener) {
|
||||
super.removeActionListener(listener);
|
||||
debugPrint('Action Listener was removed');
|
||||
print('Action Listener was removed');
|
||||
}
|
||||
|
||||
@override
|
||||
|
@ -34,7 +34,7 @@ class Model {
|
||||
|
||||
int save() {
|
||||
if (isDirty.value) {
|
||||
debugPrint('Saved Data: ${data.value}');
|
||||
print('Saved Data: ${data.value}');
|
||||
isDirty.value = false;
|
||||
}
|
||||
return data.value;
|
||||
|
@ -57,21 +57,21 @@ class _ColorfulButtonState extends State<ColorfulButton> {
|
||||
|
||||
KeyEventResult _handleKeyPress(FocusNode node, RawKeyEvent event) {
|
||||
if (event is RawKeyDownEvent) {
|
||||
debugPrint('Focus node ${node.debugLabel} got key event: ${event.logicalKey}');
|
||||
print('Focus node ${node.debugLabel} got key event: ${event.logicalKey}');
|
||||
if (event.logicalKey == LogicalKeyboardKey.keyR) {
|
||||
debugPrint('Changing color to red.');
|
||||
print('Changing color to red.');
|
||||
setState(() {
|
||||
_color = Colors.red;
|
||||
});
|
||||
return KeyEventResult.handled;
|
||||
} else if (event.logicalKey == LogicalKeyboardKey.keyG) {
|
||||
debugPrint('Changing color to green.');
|
||||
print('Changing color to green.');
|
||||
setState(() {
|
||||
_color = Colors.green;
|
||||
});
|
||||
return KeyEventResult.handled;
|
||||
} else if (event.logicalKey == LogicalKeyboardKey.keyB) {
|
||||
debugPrint('Changing color to blue.');
|
||||
print('Changing color to blue.');
|
||||
setState(() {
|
||||
_color = Colors.blue;
|
||||
});
|
||||
|
@ -38,21 +38,21 @@ class _MyStatefulWidgetState extends State<MyStatefulWidget> {
|
||||
|
||||
KeyEventResult _handleKeyPress(FocusNode node, RawKeyEvent event) {
|
||||
if (event is RawKeyDownEvent) {
|
||||
debugPrint('Focus node ${node.debugLabel} got key event: ${event.logicalKey}');
|
||||
print('Focus node ${node.debugLabel} got key event: ${event.logicalKey}');
|
||||
if (event.logicalKey == LogicalKeyboardKey.keyR) {
|
||||
debugPrint('Changing color to red.');
|
||||
print('Changing color to red.');
|
||||
setState(() {
|
||||
_color = Colors.red;
|
||||
});
|
||||
return KeyEventResult.handled;
|
||||
} else if (event.logicalKey == LogicalKeyboardKey.keyG) {
|
||||
debugPrint('Changing color to green.');
|
||||
print('Changing color to green.');
|
||||
setState(() {
|
||||
_color = Colors.green;
|
||||
});
|
||||
return KeyEventResult.handled;
|
||||
} else if (event.logicalKey == LogicalKeyboardKey.keyB) {
|
||||
debugPrint('Changing color to blue.');
|
||||
print('Changing color to blue.');
|
||||
setState(() {
|
||||
_color = Colors.blue;
|
||||
});
|
||||
|
@ -115,7 +115,7 @@ class _MyStatefulWidgetState extends State<MyStatefulWidget> {
|
||||
// This button would be not visible, but still focusable from
|
||||
// the foreground pane without the FocusScope.
|
||||
ElevatedButton(
|
||||
onPressed: () => debugPrint('You pressed the other button!'),
|
||||
onPressed: () => print('You pressed the other button!'),
|
||||
child: const Text('ANOTHER BUTTON TO FOCUS'),
|
||||
),
|
||||
DefaultTextStyle(
|
||||
|
@ -68,7 +68,7 @@ class _OrderedButtonState<T> extends State<OrderedButton<T>> {
|
||||
|
||||
void _handleOnPressed() {
|
||||
focusNode.requestFocus();
|
||||
debugPrint('Button ${widget.name} pressed.');
|
||||
print('Button ${widget.name} pressed.');
|
||||
debugDumpFocusTree();
|
||||
}
|
||||
|
||||
|
@ -40,7 +40,7 @@ class DemoButton extends StatelessWidget {
|
||||
final double order;
|
||||
|
||||
void _handleOnPressed() {
|
||||
debugPrint('Button $name pressed.');
|
||||
print('Button $name pressed.');
|
||||
debugDumpFocusTree();
|
||||
}
|
||||
|
||||
|
@ -122,10 +122,10 @@ class _IVBuilderExampleState extends State<_IVBuilderExample> {
|
||||
cellWidth: _cellWidth,
|
||||
builder: (BuildContext context, int row, int column) {
|
||||
if (!_isCellVisible(row, column, viewport)) {
|
||||
debugPrint('removing cell ($row, $column)');
|
||||
print('removing cell ($row, $column)');
|
||||
return Container(height: _cellHeight);
|
||||
}
|
||||
debugPrint('building cell ($row, $column)');
|
||||
print('building cell ($row, $column)');
|
||||
return Container(
|
||||
height: _cellHeight,
|
||||
color: row % 2 + column % 2 == 1
|
||||
|
@ -45,9 +45,9 @@ class MyStatelessWidget extends StatelessWidget {
|
||||
body: NotificationListener<ScrollNotification>(
|
||||
onNotification: (ScrollNotification scrollNotification) {
|
||||
if (scrollNotification is ScrollStartNotification) {
|
||||
debugPrint('Scrolling has started');
|
||||
print('Scrolling has started');
|
||||
} else if (scrollNotification is ScrollEndNotification) {
|
||||
debugPrint('Scrolling has ended');
|
||||
print('Scrolling has ended');
|
||||
}
|
||||
// Return true to cancel the notification bubbling.
|
||||
return true;
|
||||
|
@ -98,7 +98,7 @@ Future<void> main() async {
|
||||
final HttpServer httpServer =
|
||||
await HttpServer.bindSecure('localhost', 0, serverContext);
|
||||
final int port = httpServer.port;
|
||||
debugPrint('Listening on port $port.');
|
||||
print('Listening on port $port.');
|
||||
|
||||
// Initializes bindings before using any platform channels.
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
@ -193,7 +193,7 @@ class _MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {
|
||||
).toList();
|
||||
final DateTime started = DateTime.now();
|
||||
Future.wait(futures).then((_) {
|
||||
debugPrint(
|
||||
print(
|
||||
'===image_list=== all loaded in ${DateTime.now().difference(started).inMilliseconds}ms.',
|
||||
);
|
||||
});
|
||||
|
@ -47,8 +47,8 @@ class Calculator {
|
||||
final int n = result.length;
|
||||
onResultListener('Decoded $n results');
|
||||
} catch (e, stack) {
|
||||
debugPrint('Invalid JSON file: $e');
|
||||
debugPrint('$stack');
|
||||
print('Invalid JSON file: $e');
|
||||
print(stack);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2,10 +2,6 @@
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// This file implements debugPrint in terms of print, so avoiding
|
||||
// calling "print" is sort of a non-starter here...
|
||||
// ignore_for_file: avoid_print
|
||||
|
||||
import 'dart:async';
|
||||
import 'dart:collection';
|
||||
|
||||
|
@ -42,7 +42,6 @@ class FakeTextChannel implements MethodChannel {
|
||||
|
||||
void validateOutgoingMethodCalls(List<MethodCall> calls) {
|
||||
expect(outgoingCalls.length, calls.length);
|
||||
final StringBuffer output = StringBuffer();
|
||||
bool hasError = false;
|
||||
for (int i = 0; i < calls.length; i++) {
|
||||
final ByteData outgoingData = codec.encodeMethodCall(outgoingCalls[i]);
|
||||
@ -51,7 +50,7 @@ class FakeTextChannel implements MethodChannel {
|
||||
final String expectedString = utf8.decode(expectedData.buffer.asUint8List());
|
||||
|
||||
if (outgoingString != expectedString) {
|
||||
output.writeln(
|
||||
print(
|
||||
'Index $i did not match:\n'
|
||||
' actual: $outgoingString\n'
|
||||
' expected: $expectedString',
|
||||
@ -60,7 +59,7 @@ class FakeTextChannel implements MethodChannel {
|
||||
}
|
||||
}
|
||||
if (hasError) {
|
||||
fail('Calls did not match:\n$output');
|
||||
fail('Calls did not match.');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -26,7 +26,7 @@ void checkTree(WidgetTester tester, List<BoxDecoration> expectedDecorations) {
|
||||
}
|
||||
expect(child, isNull);
|
||||
} catch (e) {
|
||||
debugPrint(renderObject.toStringDeep());
|
||||
print(renderObject.toStringDeep());
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
|
@ -41,7 +41,7 @@ void checkTree(WidgetTester tester, List<TestParentData> expectedParentData) {
|
||||
}
|
||||
expect(child, isNull);
|
||||
} catch (e) {
|
||||
debugPrint(renderObject.toStringDeep());
|
||||
print(renderObject.toStringDeep());
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +0,0 @@
|
||||
include: ../analysis_options.yaml
|
||||
|
||||
linter:
|
||||
rules:
|
||||
avoid_print: false # This is a CLI tool, so printing to the console is fine.
|
@ -50,7 +50,7 @@ class VMServiceFlutterDriver extends FlutterDriver {
|
||||
// TODO(awdavies): Use something other than print. On fuchsia
|
||||
// `stderr`/`stdout` appear to have issues working correctly.
|
||||
driverLog = (String source, String message) {
|
||||
print('$source: $message'); // ignore: avoid_print
|
||||
print('$source: $message');
|
||||
};
|
||||
fuchsiaModuleTarget ??= Platform.environment['FUCHSIA_MODULE_TARGET'];
|
||||
if (fuchsiaModuleTarget == null) {
|
||||
|
@ -222,7 +222,11 @@ class WebFlutterDriver extends FlutterDriver {
|
||||
class FlutterWebConnection {
|
||||
/// Creates a FlutterWebConnection with WebDriver
|
||||
/// and whether the WebDriver supports timeline action.
|
||||
FlutterWebConnection(this._driver, this.supportsTimelineAction);
|
||||
FlutterWebConnection(this._driver, this.supportsTimelineAction) {
|
||||
_driver.logs.get(async_io.LogType.browser).listen((async_io.LogEntry entry) {
|
||||
print('[${entry.level}]: ${entry.message}');
|
||||
});
|
||||
}
|
||||
|
||||
final async_io.WebDriver _driver;
|
||||
|
||||
|
@ -20,7 +20,7 @@ void tryToDelete(Directory directory) {
|
||||
try {
|
||||
directory.deleteSync(recursive: true);
|
||||
} on FileSystemException catch (error) {
|
||||
driverLog('test', 'Failed to delete ${directory.path}: $error');
|
||||
print('Failed to delete ${directory.path}: $error');
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -385,7 +385,9 @@ class FlutterSkippingFileComparator extends FlutterGoldenFileComparator {
|
||||
|
||||
@override
|
||||
Future<bool> compare(Uint8List imageBytes, Uri golden) async {
|
||||
markTestSkipped('Skipping "$golden" test: $reason');
|
||||
print(
|
||||
'Skipping "$golden" test : $reason'
|
||||
);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -500,9 +502,8 @@ class FlutterLocalFileComparator extends FlutterGoldenFileComparator with LocalC
|
||||
testExpectation = await skiaClient.getExpectationForTest(testName);
|
||||
|
||||
if (testExpectation == null || testExpectation.isEmpty) {
|
||||
// There is no baseline for this test.
|
||||
markTestSkipped(
|
||||
'No expectations provided by Skia Gold for test: $golden. '
|
||||
// There is no baseline for this test
|
||||
print('No expectations provided by Skia Gold for test: $golden. '
|
||||
'This may be a new test. If this is an unexpected result, check '
|
||||
'https://flutter-gold.skia.org.\n'
|
||||
'Validate image output found at $basedir'
|
||||
|
@ -8,19 +8,18 @@
|
||||
// Fails with "flutter test --test-randomize-ordering-seed=123"
|
||||
@Tags(<String>['no-shuffle'])
|
||||
|
||||
// See also dev/automated_tests/flutter_test/flutter_gold_test.dart
|
||||
|
||||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
import 'dart:core';
|
||||
import 'dart:io' hide Directory;
|
||||
import 'dart:typed_data';
|
||||
import 'dart:ui' show hashValues, hashList;
|
||||
|
||||
import 'package:file/file.dart';
|
||||
import 'package:file/memory.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter_goldens/flutter_goldens.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:meta/meta.dart';
|
||||
import 'package:platform/platform.dart';
|
||||
import 'package:process/process.dart';
|
||||
|
||||
@ -42,6 +41,17 @@ const List<int> _kFailPngBytes =
|
||||
120, 1, 99, 249, 207, 240, 255, 63, 0, 7, 18, 3, 2, 164, 147, 160, 197, 0,
|
||||
0, 0, 0, 73, 69, 78, 68, 174, 66, 96, 130];
|
||||
|
||||
Future<void> testWithOutput(String name, Future<void> Function() body, String expectedOutput) async {
|
||||
test(name, () async {
|
||||
final StringBuffer output = StringBuffer();
|
||||
void _recordPrint(Zone self, ZoneDelegate parent, Zone zone, String line) {
|
||||
output.write(line);
|
||||
}
|
||||
await runZoned<Future<void>>(body, zoneSpecification: ZoneSpecification(print: _recordPrint));
|
||||
expect(output.toString(), expectedOutput);
|
||||
});
|
||||
}
|
||||
|
||||
void main() {
|
||||
late MemoryFileSystem fs;
|
||||
late FakePlatform platform;
|
||||
@ -559,6 +569,7 @@ void main() {
|
||||
|
||||
const String hash = '55109a4bed52acc780530f7a9aeff6c0';
|
||||
fakeSkiaClient.expectationForTestValues['flutter.golden_test.1'] = hash;
|
||||
fakeSkiaClient.expectationForTestValues['flutter.new_golden_test.1'] = '';
|
||||
fakeSkiaClient.imageBytesValues[hash] =_kTestPngBytes;
|
||||
fakeSkiaClient.cleanTestNameValues['library.flutter.golden_test.1.png'] = 'flutter.golden_test.1';
|
||||
});
|
||||
@ -573,6 +584,32 @@ void main() {
|
||||
);
|
||||
});
|
||||
|
||||
testWithOutput('passes non-existent baseline for new test, null expectation', () async {
|
||||
expect(
|
||||
await comparator.compare(
|
||||
Uint8List.fromList(_kFailPngBytes),
|
||||
Uri.parse('flutter.new_golden_test.1'),
|
||||
),
|
||||
isTrue,
|
||||
);
|
||||
}, 'No expectations provided by Skia Gold for test: library.flutter.new_golden_test.1. '
|
||||
'This may be a new test. If this is an unexpected result, check https://flutter-gold.skia.org.\n'
|
||||
'Validate image output found at flutter/test/library/'
|
||||
);
|
||||
|
||||
testWithOutput('passes non-existent baseline for new test, empty expectation', () async {
|
||||
expect(
|
||||
await comparator.compare(
|
||||
Uint8List.fromList(_kFailPngBytes),
|
||||
Uri.parse('flutter.new_golden_test.2'),
|
||||
),
|
||||
isTrue,
|
||||
);
|
||||
}, 'No expectations provided by Skia Gold for test: library.flutter.new_golden_test.2. '
|
||||
'This may be a new test. If this is an unexpected result, check https://flutter-gold.skia.org.\n'
|
||||
'Validate image output found at flutter/test/library/'
|
||||
);
|
||||
|
||||
test('compare properly awaits validation & output before failing.', () async {
|
||||
final Completer<bool> completer = Completer<bool>();
|
||||
final Future<bool> result = comparator.compare(
|
||||
@ -676,14 +713,14 @@ class FakeProcessManager extends Fake implements ProcessManager {
|
||||
workingDirectories.add(workingDirectory);
|
||||
final ProcessResult? result = processResults[RunInvocation(command.cast<String>(), workingDirectory)];
|
||||
if (result == null && fallbackProcessResult == null) {
|
||||
printOnFailure('ProcessManager.run was called with $command ($workingDirectory) unexpectedly - $processResults.');
|
||||
// Throwing here might gobble up the exception message if a test fails.
|
||||
print('ProcessManager.run was called with $command ($workingDirectory) unexpectedly - $processResults.');
|
||||
fail('See above.');
|
||||
}
|
||||
return result ?? fallbackProcessResult!;
|
||||
}
|
||||
}
|
||||
|
||||
// See also dev/automated_tests/flutter_test/flutter_gold_test.dart
|
||||
class FakeSkiaGoldClient extends Fake implements SkiaGoldClient {
|
||||
Map<String, String> expectationForTestValues = <String, String>{};
|
||||
Object? getExpectationForTestThrowable;
|
||||
|
@ -183,10 +183,9 @@ class SkiaGoldClient {
|
||||
if (result.exitCode != 0) {
|
||||
// We do not want to throw for non-zero exit codes here, as an intentional
|
||||
// change or new golden file test expect non-zero exit codes. Logging here
|
||||
// is meant to help debugging in CI when an unexpected result occurs.
|
||||
// See also: https://github.com/flutter/flutter/issues/91285
|
||||
print('goldctl imgtest add stdout: ${result.stdout}'); // ignore: avoid_print
|
||||
print('goldctl imgtest add stderr: ${result.stderr}'); // ignore: avoid_print
|
||||
// is meant to inform when an unexpected result occurs.
|
||||
print('goldctl imgtest add stdout: ${result.stdout}');
|
||||
print('goldctl imgtest add stderr: ${result.stderr}');
|
||||
}
|
||||
|
||||
return true;
|
||||
@ -302,10 +301,7 @@ class SkiaGoldClient {
|
||||
throw const FormatException('Skia gold expectations do not match expected format.');
|
||||
expectation = jsonResponse['digest'] as String?;
|
||||
} on FormatException catch (error) {
|
||||
// Ideally we'd use something like package:test's printOnError, but best reliabilty
|
||||
// in getting logs on CI for now we're just using print.
|
||||
// See also: https://github.com/flutter/flutter/issues/91285
|
||||
print( // ignore: avoid_print
|
||||
print(
|
||||
'Formatting error detected requesting expectations from Flutter Gold.\n'
|
||||
'error: $error\n'
|
||||
'url: $requestForExpectations\n'
|
||||
|
@ -6,8 +6,6 @@ import 'dart:typed_data';
|
||||
import 'dart:ui';
|
||||
|
||||
import 'package:path/path.dart' as path;
|
||||
import 'package:test_api/test_api.dart'; // ignore: deprecated_member_use
|
||||
|
||||
import '_goldens_io.dart' if (dart.library.html) '_goldens_web.dart' as _goldens;
|
||||
|
||||
/// Compares image pixels against a golden image file.
|
||||
@ -270,7 +268,7 @@ class TrivialComparator implements GoldenFileComparator {
|
||||
|
||||
@override
|
||||
Future<bool> compare(Uint8List imageBytes, Uri golden) {
|
||||
markTestSkipped('Golden file comparison requested for "$golden"; skipping...');
|
||||
print('Golden file comparison requested for "$golden"; skipping...');
|
||||
return Future<bool>.value(true);
|
||||
}
|
||||
|
||||
@ -290,7 +288,7 @@ class _TrivialWebGoldenComparator implements WebGoldenComparator {
|
||||
|
||||
@override
|
||||
Future<bool> compare(double width, double height, Uri golden) {
|
||||
markTestSkipped('Golden comparison requested for "$golden"; skipping...');
|
||||
print('Golden comparison requested for "$golden"; skipping...');
|
||||
return Future<bool>.value(true);
|
||||
}
|
||||
|
||||
|
@ -96,7 +96,7 @@ Future<void> _runLiveTest(Suite suiteConfig, LiveTest liveTest, _Reporter report
|
||||
Future<void> _runSkippedTest(Suite suiteConfig, Test test, List<Group> parents, _Reporter reporter) async {
|
||||
final LocalTest skipped = LocalTest(test.name, test.metadata, () { }, trace: test.trace);
|
||||
if (skipped.metadata.skipReason != null) {
|
||||
reporter.log('Skip: ${skipped.metadata.skipReason}');
|
||||
print('Skip: ${skipped.metadata.skipReason}');
|
||||
}
|
||||
final LiveTest liveTest = skipped.load(suiteConfig);
|
||||
reporter._onTestStarted(liveTest);
|
||||
@ -334,7 +334,7 @@ class _Reporter {
|
||||
if (message.type == MessageType.skip) {
|
||||
text = ' $_yellow$text$_noColor';
|
||||
}
|
||||
log(text);
|
||||
print(text);
|
||||
}));
|
||||
}
|
||||
|
||||
@ -351,8 +351,8 @@ class _Reporter {
|
||||
return;
|
||||
}
|
||||
_progressLine(_description(liveTest), suffix: ' $_bold$_red[E]$_noColor');
|
||||
log(_indent(error.toString()));
|
||||
log(_indent('$stackTrace'));
|
||||
print(_indent(error.toString()));
|
||||
print(_indent('$stackTrace'));
|
||||
}
|
||||
|
||||
/// A callback called when the engine is finished running tests.
|
||||
@ -421,7 +421,7 @@ class _Reporter {
|
||||
buffer.write(message);
|
||||
buffer.write(_noColor);
|
||||
|
||||
log(buffer.toString());
|
||||
print(buffer.toString());
|
||||
}
|
||||
|
||||
/// Returns a representation of [duration] as `MM:SS`.
|
||||
@ -442,13 +442,6 @@ class _Reporter {
|
||||
}
|
||||
return name;
|
||||
}
|
||||
|
||||
/// Print the message to the console.
|
||||
void log(String message) {
|
||||
// We centralize all the prints in this file through this one method so that
|
||||
// in principle we can reroute the output easily should we need to.
|
||||
print(message); // ignore: avoid_print
|
||||
}
|
||||
}
|
||||
|
||||
String _indent(String string, { int? size, String? first }) {
|
||||
|
@ -416,7 +416,7 @@ Future<void> benchmarkWidgets(
|
||||
assert(() {
|
||||
if (mayRunWithAsserts)
|
||||
return true;
|
||||
debugPrint(kDebugWarning);
|
||||
print(kDebugWarning);
|
||||
return true;
|
||||
}());
|
||||
final TestWidgetsFlutterBinding binding = TestWidgetsFlutterBinding.ensureInitialized() as TestWidgetsFlutterBinding;
|
||||
|
@ -1,11 +1,12 @@
|
||||
include: ../analysis_options.yaml
|
||||
# Use the analysis options settings from the top level of the repo (not
|
||||
# the ones from above, which include the `public_member_api_docs` rule).
|
||||
|
||||
include: ../../analysis_options.yaml
|
||||
|
||||
linter:
|
||||
rules:
|
||||
avoid_catches_without_on_clauses: true
|
||||
curly_braces_in_flow_control_structures: true
|
||||
library_private_types_in_public_api: false # Tool does not have any public API.
|
||||
no_runtimeType_toString: false # We use runtimeType for debugging in the tool.
|
||||
library_private_types_in_public_api: false # Tool does not have any public API
|
||||
prefer_relative_imports: true
|
||||
public_member_api_docs: false # Tool does not have any public API.
|
||||
unawaited_futures: true
|
||||
|
@ -1,5 +0,0 @@
|
||||
include: ../analysis_options.yaml
|
||||
|
||||
linter:
|
||||
rules:
|
||||
avoid_print: false # These are CLI tools which print as a matter of course.
|
@ -25,12 +25,6 @@
|
||||
/// about any additional exports that you add to this file, as doing so will
|
||||
/// increase the API surface that we have to test in Flutter tools, and the APIs
|
||||
/// in `dart:io` can sometimes be hard to use in tests.
|
||||
|
||||
// We allow `print()` in this file as a fallback for writing to the terminal via
|
||||
// regular stdout/stderr/stdio paths. Everything else in the flutter_tools
|
||||
// library should route terminal I/O through the [Stdio] class defined below.
|
||||
// ignore_for_file: avoid_print
|
||||
|
||||
import 'dart:async';
|
||||
import 'dart:io' as io
|
||||
show
|
||||
|
@ -247,7 +247,6 @@ class Cache {
|
||||
}
|
||||
} on Exception catch (error) {
|
||||
// There is currently no logger attached since this is computed at startup.
|
||||
// ignore: avoid_print
|
||||
print(userMessages.runnerNoRoot('$error'));
|
||||
}
|
||||
return normalize('.');
|
||||
|
@ -307,7 +307,6 @@ class DaemonDomain extends Domain {
|
||||
if (message.level == 'status') {
|
||||
// We use `print()` here instead of `stdout.writeln()` in order to
|
||||
// capture the print output for testing.
|
||||
// ignore: avoid_print
|
||||
print(message.message);
|
||||
} else if (message.level == 'error') {
|
||||
globals.stdio.stderrWrite('${message.message}\n');
|
||||
|
@ -96,7 +96,7 @@ class MacOSDevice extends DesktopDevice {
|
||||
'open', package.applicationBundle(buildMode),
|
||||
]).then((ProcessResult result) {
|
||||
if (result.exitCode != 0) {
|
||||
_logger.printError('Failed to foreground app; open returned ${result.exitCode}');
|
||||
print('Failed to foreground app; open returned ${result.exitCode}');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -2723,9 +2723,10 @@ Future<void> _ensureFlutterToolsSnapshot() async {
|
||||
'../../bin/cache/dart-sdk/bin/dart',
|
||||
snapshotArgs,
|
||||
);
|
||||
printOnFailure('Results of generating snapshot:');
|
||||
printOnFailure(snapshotResult.stdout.toString());
|
||||
printOnFailure(snapshotResult.stderr.toString());
|
||||
if (snapshotResult.exitCode != 0) {
|
||||
print(snapshotResult.stdout);
|
||||
print(snapshotResult.stderr);
|
||||
}
|
||||
expect(snapshotResult.exitCode, 0);
|
||||
}
|
||||
|
||||
@ -2767,9 +2768,10 @@ Future<void> _analyzeProject(String workingDir, { List<String> expectedFailures
|
||||
workingDirectory: workingDir,
|
||||
);
|
||||
if (expectedFailures.isEmpty) {
|
||||
printOnFailure('Results of running analyzer:');
|
||||
printOnFailure(exec.stdout.toString());
|
||||
printOnFailure(exec.stderr.toString());
|
||||
if (exec.exitCode != 0) {
|
||||
print(exec.stdout);
|
||||
print(exec.stderr);
|
||||
}
|
||||
expect(exec.exitCode, 0);
|
||||
return;
|
||||
}
|
||||
@ -2823,9 +2825,10 @@ Future<void> _runFlutterTest(Directory workingDir, { String target }) async {
|
||||
args,
|
||||
workingDirectory: workingDir.path,
|
||||
);
|
||||
printOnFailure('Output of running flutter test:');
|
||||
printOnFailure(exec.stdout.toString());
|
||||
printOnFailure(exec.stderr.toString());
|
||||
if (exec.exitCode != 0) {
|
||||
print(exec.stdout);
|
||||
print(exec.stderr);
|
||||
}
|
||||
expect(exec.exitCode, 0);
|
||||
}
|
||||
|
||||
|
@ -179,6 +179,7 @@ void main() {
|
||||
expect(logContents, contains('String: an exception % --'));
|
||||
expect(logContents, contains('CrashingFlutterCommand.runCommand'));
|
||||
expect(logContents, contains('[✓] Flutter'));
|
||||
print(globals.crashReporter.runtimeType);
|
||||
|
||||
final CrashDetails sentDetails = (globals.crashReporter as WaitingCrashReporter)._details;
|
||||
expect(sentDetails.command, 'flutter crash');
|
||||
|
@ -28,9 +28,8 @@ void main() {
|
||||
'--no-color',
|
||||
...arguments,
|
||||
], workingDirectory: projectPath);
|
||||
printOnFailure('Output of flutter ${arguments.join(" ")}');
|
||||
printOnFailure(result.stdout.toString());
|
||||
printOnFailure(result.stderr.toString());
|
||||
print(result.stdout);
|
||||
print(result.stderr);
|
||||
expect(result.exitCode, exitCode, reason: 'Expected to exit with non-zero exit code.');
|
||||
assertContains(result.stdout.toString(), statusTextContains);
|
||||
assertContains(result.stdout.toString(), errorTextContains);
|
||||
|
@ -31,9 +31,8 @@ void main() {
|
||||
'--target-platform=android-arm64'
|
||||
], workingDirectory: workingDirectory);
|
||||
|
||||
printOnFailure('Output of flutter build apk:');
|
||||
printOnFailure(result.stdout.toString());
|
||||
printOnFailure(result.stderr.toString());
|
||||
print(result.stdout);
|
||||
print(result.stderr);
|
||||
expect(result.stdout.toString(), contains('app-release.apk (total compressed)'));
|
||||
|
||||
final String line = result.stdout.toString()
|
||||
@ -68,9 +67,8 @@ void main() {
|
||||
'--no-codesign',
|
||||
], workingDirectory: workingDirectory);
|
||||
|
||||
printOnFailure('Output of flutter build ios:');
|
||||
printOnFailure(result.stdout.toString());
|
||||
printOnFailure(result.stderr.toString());
|
||||
print(result.stdout);
|
||||
print(result.stderr);
|
||||
expect(result.stdout.toString(), contains('Dart AOT symbols accounted decompressed size'));
|
||||
|
||||
final String line = result.stdout.toString()
|
||||
@ -104,9 +102,8 @@ void main() {
|
||||
'--enable-macos-desktop',
|
||||
], workingDirectory: workingDirectory);
|
||||
|
||||
printOnFailure('Output of flutter config:');
|
||||
printOnFailure(configResult.stdout.toString());
|
||||
printOnFailure(configResult.stderr.toString());
|
||||
print(configResult.stdout);
|
||||
print(configResult.stderr);
|
||||
|
||||
final ProcessResult result = await processManager.run(<String>[
|
||||
flutterBin,
|
||||
@ -116,9 +113,8 @@ void main() {
|
||||
'--code-size-directory=${codeSizeDir.path}',
|
||||
], workingDirectory: workingDirectory);
|
||||
|
||||
printOnFailure('Output of flutter build macos:');
|
||||
printOnFailure(result.stdout.toString());
|
||||
printOnFailure(result.stderr.toString());
|
||||
print(result.stdout);
|
||||
print(result.stderr);
|
||||
expect(result.stdout.toString(), contains('Dart AOT symbols accounted decompressed size'));
|
||||
|
||||
final String line = result.stdout.toString()
|
||||
@ -151,9 +147,8 @@ void main() {
|
||||
'--debug',
|
||||
], workingDirectory: fileSystem.path.join(getFlutterRoot(), 'examples', 'hello_world'));
|
||||
|
||||
printOnFailure('Output of flutter build apk:');
|
||||
printOnFailure(result.stdout.toString());
|
||||
printOnFailure(result.stderr.toString());
|
||||
print(result.stdout);
|
||||
print(result.stderr);
|
||||
expect(result.stderr.toString(), contains('"--analyze-size" can only be used on release builds'));
|
||||
|
||||
expect(result.exitCode, 1);
|
||||
|
@ -34,7 +34,7 @@ void main() {
|
||||
final Completer<void> sawBackgroundMessage = Completer<void>.sync();
|
||||
final Completer<void> sawNewBackgroundMessage = Completer<void>.sync();
|
||||
final StreamSubscription<String> subscription = flutter.stdout.listen((String line) {
|
||||
printOnFailure('[LOG]:"$line"');
|
||||
print('[LOG]:"$line"');
|
||||
if (line.contains('Main thread') && !sawForegroundMessage.isCompleted) {
|
||||
sawForegroundMessage.complete();
|
||||
}
|
||||
@ -68,7 +68,7 @@ void main() {
|
||||
final Completer<void> sawBackgroundMessage = Completer<void>.sync();
|
||||
final Completer<void> sawNewBackgroundMessage = Completer<void>.sync();
|
||||
final StreamSubscription<String> subscription = flutter.stdout.listen((String line) {
|
||||
printOnFailure('[LOG]:"$line"');
|
||||
print('[LOG]:"$line"');
|
||||
if (line.contains('Isolate thread') && !sawBackgroundMessage.isCompleted) {
|
||||
sawBackgroundMessage.complete();
|
||||
}
|
||||
|
@ -33,9 +33,8 @@ void main() {
|
||||
'--no-codesign',
|
||||
], workingDirectory: workingDirectory);
|
||||
|
||||
printOnFailure('Output of flutter build ios:');
|
||||
printOnFailure(result.stdout.toString());
|
||||
printOnFailure(result.stderr.toString());
|
||||
print(result.stdout);
|
||||
print(result.stderr);
|
||||
|
||||
expect(result.exitCode, 0);
|
||||
|
||||
|
@ -64,7 +64,11 @@ Future<void> main(List<String> args) async {
|
||||
await cache.lock();
|
||||
process.kill(io.ProcessSignal.sigkill);
|
||||
} finally {
|
||||
tryToDelete(tempDir);
|
||||
try {
|
||||
tempDir.deleteSync(recursive: true);
|
||||
} on FileSystemException {
|
||||
// Ignore filesystem exceptions when trying to delete tempdir.
|
||||
}
|
||||
Cache.flutterRoot = oldRoot;
|
||||
}
|
||||
expect(logger.statusText, isEmpty);
|
||||
|
@ -26,10 +26,8 @@ void main() {
|
||||
'--target-platform', 'android-arm',
|
||||
'--verbose',
|
||||
], workingDirectory: woringDirectory);
|
||||
|
||||
printOnFailure('Output of flutter build apk:');
|
||||
printOnFailure(result.stdout.toString());
|
||||
printOnFailure(result.stderr.toString());
|
||||
print(result.stdout);
|
||||
print(result.stderr);
|
||||
|
||||
expect(result.exitCode, 0);
|
||||
|
||||
|
@ -38,7 +38,11 @@ void main() {
|
||||
});
|
||||
|
||||
tearDown(() {
|
||||
tryToDelete(parentDirectory);
|
||||
try {
|
||||
parentDirectory.deleteSync(recursive: true);
|
||||
} on FileSystemException {
|
||||
print('Failed to delete test directory');
|
||||
}
|
||||
});
|
||||
|
||||
testWithoutContext('Can upgrade and downgrade a Flutter checkout', () async {
|
||||
@ -52,7 +56,7 @@ void main() {
|
||||
'git', 'config', '--system', 'core.longpaths', 'true',
|
||||
]);
|
||||
|
||||
printOnFailure('Step 1 - clone the $_kBranch of flutter into the test directory');
|
||||
print('Step 1 - clone the $_kBranch of flutter into the test directory');
|
||||
exitCode = await processUtils.stream(<String>[
|
||||
'git',
|
||||
'clone',
|
||||
@ -60,7 +64,7 @@ void main() {
|
||||
], workingDirectory: parentDirectory.path, trace: true);
|
||||
expect(exitCode, 0);
|
||||
|
||||
printOnFailure('Step 2 - switch to the $_kBranch');
|
||||
print('Step 2 - switch to the $_kBranch');
|
||||
exitCode = await processUtils.stream(<String>[
|
||||
'git',
|
||||
'checkout',
|
||||
@ -71,7 +75,7 @@ void main() {
|
||||
], workingDirectory: testDirectory.path, trace: true);
|
||||
expect(exitCode, 0);
|
||||
|
||||
printOnFailure('Step 3 - revert back to $_kInitialVersion');
|
||||
print('Step 3 - revert back to $_kInitialVersion');
|
||||
exitCode = await processUtils.stream(<String>[
|
||||
'git',
|
||||
'reset',
|
||||
@ -80,7 +84,7 @@ void main() {
|
||||
], workingDirectory: testDirectory.path, trace: true);
|
||||
expect(exitCode, 0);
|
||||
|
||||
printOnFailure('Step 4 - upgrade to the newest $_kBranch');
|
||||
print('Step 4 - upgrade to the newest $_kBranch');
|
||||
// This should update the persistent tool state with the sha for HEAD
|
||||
exitCode = await processUtils.stream(<String>[
|
||||
flutterBin,
|
||||
@ -90,7 +94,7 @@ void main() {
|
||||
], workingDirectory: testDirectory.path, trace: true);
|
||||
expect(exitCode, 0);
|
||||
|
||||
printOnFailure('Step 5 - verify that the version is different');
|
||||
print('Step 5 - verify that the version is different');
|
||||
final RunResult versionResult = await processUtils.run(<String>[
|
||||
'git',
|
||||
'describe',
|
||||
@ -100,9 +104,10 @@ void main() {
|
||||
'--tags',
|
||||
], workingDirectory: testDirectory.path);
|
||||
expect(versionResult.stdout, isNot(contains(_kInitialVersion)));
|
||||
printOnFailure('current version is ${versionResult.stdout.trim()}\ninitial was $_kInitialVersion');
|
||||
print('current version is ${versionResult.stdout.trim()}\ninitial was $_kInitialVersion');
|
||||
|
||||
printOnFailure('Step 6 - downgrade back to the initial version');
|
||||
print('Step 6 - downgrade back to the initial version');
|
||||
// Step 6. Downgrade back to initial version.
|
||||
exitCode = await processUtils.stream(<String>[
|
||||
flutterBin,
|
||||
'downgrade',
|
||||
@ -111,7 +116,8 @@ void main() {
|
||||
], workingDirectory: testDirectory.path, trace: true);
|
||||
expect(exitCode, 0);
|
||||
|
||||
printOnFailure('Step 7 - verify downgraded version matches original version');
|
||||
print('Step 7 - verify downgraded version matches original version');
|
||||
// Step 7. Verify downgraded version matches original version.
|
||||
final RunResult oldVersionResult = await processUtils.run(<String>[
|
||||
'git',
|
||||
'describe',
|
||||
@ -121,6 +127,6 @@ void main() {
|
||||
'--tags',
|
||||
], workingDirectory: testDirectory.path);
|
||||
expect(oldVersionResult.stdout, contains(_kInitialVersion));
|
||||
printOnFailure('current version is ${oldVersionResult.stdout.trim()}\ninitial was $_kInitialVersion');
|
||||
print('current version is ${oldVersionResult.stdout.trim()}\ninitial was $_kInitialVersion');
|
||||
});
|
||||
}
|
||||
|
@ -36,9 +36,8 @@ void main() {
|
||||
fileSystem.path.join(tempDir.path, 'main.dart'),
|
||||
]);
|
||||
|
||||
printOnFailure('Output of dart main.dart:');
|
||||
printOnFailure(result.stdout.toString());
|
||||
printOnFailure(result.stderr.toString());
|
||||
print(result.stdout);
|
||||
print(result.stderr);
|
||||
expect(result.exitCode, 0);
|
||||
});
|
||||
|
||||
@ -56,9 +55,8 @@ void main() {
|
||||
fileSystem.path.join(tempDir.path, 'main.dart'),
|
||||
]);
|
||||
|
||||
printOnFailure('Output of dart main.dart:');
|
||||
printOnFailure(result.stdout.toString());
|
||||
printOnFailure(result.stderr.toString());
|
||||
print(result.stdout);
|
||||
print(result.stderr);
|
||||
expect(result.exitCode, 1);
|
||||
});
|
||||
}
|
||||
|
@ -67,6 +67,7 @@ String unsafeString = null;
|
||||
|
||||
for (final String targetPlatform in targetPlatforms) {
|
||||
testWithoutContext('flutter build $targetPlatform --no-sound-null-safety', () {
|
||||
print(tempDir);
|
||||
final ProcessResult result = processManager.runSync(<String>[
|
||||
flutterBin,
|
||||
...getLocalEngineArguments(),
|
||||
|
@ -138,9 +138,10 @@ Future<void> _ensureFlutterToolsSnapshot() async {
|
||||
'../../bin/cache/dart-sdk/bin/dart',
|
||||
snapshotArgs,
|
||||
);
|
||||
printOnFailure('Output of dart ${snapshotArgs.join(" ")}:');
|
||||
printOnFailure(snapshotResult.stdout.toString());
|
||||
printOnFailure(snapshotResult.stderr.toString());
|
||||
if (snapshotResult.exitCode != 0) {
|
||||
print(snapshotResult.stdout);
|
||||
print(snapshotResult.stderr);
|
||||
}
|
||||
expect(snapshotResult.exitCode, 0);
|
||||
}
|
||||
|
||||
@ -236,8 +237,9 @@ Future<void> _analyzeProject(Directory workingDir) async {
|
||||
args,
|
||||
workingDirectory: workingDir.path,
|
||||
);
|
||||
printOnFailure('Output of flutter analyze:');
|
||||
printOnFailure(exec.stdout.toString());
|
||||
printOnFailure(exec.stderr.toString());
|
||||
if (exec.exitCode != 0) {
|
||||
print(exec.stdout);
|
||||
print(exec.stderr);
|
||||
}
|
||||
expect(exec.exitCode, 0);
|
||||
}
|
||||
|
@ -108,14 +108,8 @@ void main() {
|
||||
await flutter.resume(); // we start paused so we can set up our TICK 1 listener before the app starts
|
||||
unawaited(sawTick1.future.timeout(
|
||||
const Duration(seconds: 5),
|
||||
onTimeout: () {
|
||||
// This print is useful for people debugging this test. Normally we would avoid printing in
|
||||
// a test but this is an exception because it's useful ambient information.
|
||||
// ignore: avoid_print
|
||||
print('The test app is taking longer than expected to print its synchronization line...');
|
||||
},
|
||||
onTimeout: () { print('The test app is taking longer than expected to print its synchronization line...'); },
|
||||
));
|
||||
printOnFailure('waiting for synchronization line...');
|
||||
await sawTick1.future; // after this, app is in steady state
|
||||
await flutter.addBreakpoint(
|
||||
project.scheduledBreakpointUri,
|
||||
@ -132,19 +126,19 @@ void main() {
|
||||
);
|
||||
bool reloaded = false;
|
||||
final Future<void> reloadFuture = flutter.hotReload().then((void value) { reloaded = true; });
|
||||
printOnFailure('waiting for pause...');
|
||||
print('waiting for pause...');
|
||||
isolate = await flutter.waitForPause();
|
||||
expect(isolate.pauseEvent.kind, equals(EventKind.kPauseBreakpoint));
|
||||
printOnFailure('waiting for debugger message...');
|
||||
print('waiting for debugger message...');
|
||||
await sawDebuggerPausedMessage.future;
|
||||
expect(reloaded, isFalse);
|
||||
printOnFailure('waiting for resume...');
|
||||
print('waiting for resume...');
|
||||
await flutter.resume();
|
||||
printOnFailure('waiting for reload future...');
|
||||
print('waiting for reload future...');
|
||||
await reloadFuture;
|
||||
expect(reloaded, isTrue);
|
||||
reloaded = false;
|
||||
printOnFailure('subscription cancel...');
|
||||
print('subscription cancel...');
|
||||
await subscription.cancel();
|
||||
});
|
||||
|
||||
@ -154,7 +148,7 @@ void main() {
|
||||
final Completer<void> sawDebuggerPausedMessage2 = Completer<void>();
|
||||
final StreamSubscription<String> subscription = flutter.stdout.listen(
|
||||
(String line) {
|
||||
printOnFailure('[LOG]:"$line"');
|
||||
print('[LOG]:"$line"');
|
||||
if (line.contains('(((TICK 1)))')) {
|
||||
expect(sawTick1.isCompleted, isFalse);
|
||||
sawTick1.complete();
|
||||
|
@ -47,7 +47,7 @@ void main() {
|
||||
onSecondLoad.complete();
|
||||
}
|
||||
});
|
||||
flutter.stdout.listen(printOnFailure);
|
||||
flutter.stdout.listen(print);
|
||||
await flutter.run();
|
||||
await onFirstLoad.future;
|
||||
|
||||
@ -74,7 +74,7 @@ void main() {
|
||||
onSecondLoad.complete();
|
||||
}
|
||||
});
|
||||
flutter.stdout.listen(printOnFailure);
|
||||
flutter.stdout.listen(print);
|
||||
await flutter.run();
|
||||
await onFirstLoad.future;
|
||||
|
||||
|
@ -29,7 +29,7 @@ void main() {
|
||||
'flutter',
|
||||
);
|
||||
|
||||
processManager.runSync(<String>[
|
||||
final ProcessResult createResult = processManager.runSync(<String>[
|
||||
flutterBin,
|
||||
...getLocalEngineArguments(),
|
||||
'create',
|
||||
@ -39,6 +39,7 @@ void main() {
|
||||
'objc',
|
||||
'hello',
|
||||
], workingDirectory: tempDir.path);
|
||||
print(createResult.stdout);
|
||||
|
||||
projectRoot = tempDir.childDirectory('hello').path;
|
||||
});
|
||||
@ -58,7 +59,7 @@ void main() {
|
||||
File outputAppFrameworkBinary;
|
||||
|
||||
setUpAll(() {
|
||||
processManager.runSync(<String>[
|
||||
final ProcessResult buildResult = processManager.runSync(<String>[
|
||||
flutterBin,
|
||||
...getLocalEngineArguments(),
|
||||
'build',
|
||||
@ -69,6 +70,7 @@ void main() {
|
||||
'--obfuscate',
|
||||
'--split-debug-info=foo debug info/',
|
||||
], workingDirectory: projectRoot);
|
||||
print(buildResult.stdout);
|
||||
|
||||
buildPath = fileSystem.directory(fileSystem.path.join(
|
||||
projectRoot,
|
||||
@ -123,6 +125,7 @@ void main() {
|
||||
infoPlistPath,
|
||||
],
|
||||
);
|
||||
print(bonjourServices.stdout);
|
||||
final bool bonjourServicesFound = (bonjourServices.stdout as String).contains('_dartobservatory._tcp');
|
||||
expect(bonjourServicesFound, buildMode == BuildMode.debug);
|
||||
|
||||
@ -137,6 +140,7 @@ void main() {
|
||||
infoPlistPath,
|
||||
],
|
||||
);
|
||||
print(localNetworkUsage.stdout);
|
||||
final bool localNetworkUsageFound = localNetworkUsage.exitCode == 0;
|
||||
expect(localNetworkUsageFound, buildMode == BuildMode.debug);
|
||||
});
|
||||
@ -151,6 +155,7 @@ void main() {
|
||||
'arm64',
|
||||
],
|
||||
);
|
||||
print(symbols.stdout);
|
||||
final bool aotSymbolsFound = (symbols.stdout as String).contains('_kDartVmSnapshot');
|
||||
expect(aotSymbolsFound, buildMode != BuildMode.debug);
|
||||
});
|
||||
@ -192,9 +197,7 @@ void main() {
|
||||
// Skip bitcode stripping since we just checked that above.
|
||||
},
|
||||
);
|
||||
printOnFailure('Output of xcode_backend.sh:');
|
||||
printOnFailure(xcodeBackendResult.stdout.toString());
|
||||
printOnFailure(xcodeBackendResult.stderr.toString());
|
||||
print(xcodeBackendResult.stdout);
|
||||
|
||||
expect(xcodeBackendResult.exitCode, 0);
|
||||
expect(outputFlutterFrameworkBinary.existsSync(), isTrue);
|
||||
@ -208,6 +211,7 @@ void main() {
|
||||
'hello',
|
||||
outputAppFrameworkBinary.path,
|
||||
]);
|
||||
print(grepResult.stdout);
|
||||
expect(grepResult.stdout, isNot(contains('matches')));
|
||||
});
|
||||
});
|
||||
@ -229,6 +233,7 @@ void main() {
|
||||
'FLUTTER_XCODE_ONLY_ACTIVE_ARCH': 'NO',
|
||||
},
|
||||
);
|
||||
print(buildSimulator.stdout);
|
||||
// This test case would fail if arm64 or x86_64 simulators could not build.
|
||||
expect(buildSimulator.exitCode, 0);
|
||||
|
||||
@ -246,6 +251,7 @@ void main() {
|
||||
final ProcessResult archs = processManager.runSync(
|
||||
<String>['file', simulatorAppFrameworkBinary.path],
|
||||
);
|
||||
print(archs.stdout);
|
||||
expect(archs.stdout, contains('Mach-O 64-bit dynamically linked shared library x86_64'));
|
||||
expect(archs.stdout, contains('Mach-O 64-bit dynamically linked shared library arm64'));
|
||||
});
|
||||
|
@ -53,9 +53,8 @@ void main() {
|
||||
];
|
||||
final ProcessResult result = processManager.runSync(buildCommand, workingDirectory: workingDirectory);
|
||||
|
||||
printOnFailure('Output of flutter build macos:');
|
||||
printOnFailure(result.stdout.toString());
|
||||
printOnFailure(result.stderr.toString());
|
||||
print(result.stdout);
|
||||
print(result.stderr);
|
||||
expect(result.exitCode, 0);
|
||||
|
||||
expect(result.stdout, contains('Running pod install'));
|
||||
@ -135,9 +134,8 @@ void main() {
|
||||
// Build again without cleaning.
|
||||
final ProcessResult secondBuild = processManager.runSync(buildCommand, workingDirectory: workingDirectory);
|
||||
|
||||
printOnFailure('Output of second build:');
|
||||
printOnFailure(secondBuild.stdout.toString());
|
||||
printOnFailure(secondBuild.stderr.toString());
|
||||
print(secondBuild.stdout);
|
||||
print(secondBuild.stderr);
|
||||
expect(secondBuild.exitCode, 0);
|
||||
|
||||
expect(secondBuild.stdout, isNot(contains('Running pod install')));
|
||||
|
@ -27,7 +27,7 @@ Future<void> waitForObservatoryMessage(Process process, int port) async {
|
||||
process.stdout
|
||||
.transform(utf8.decoder)
|
||||
.listen((String line) {
|
||||
printOnFailure(line);
|
||||
print(line);
|
||||
if (line.contains('An Observatory debugger and profiler on Flutter test device is available at')) {
|
||||
if (line.contains('http://127.0.0.1:$port')) {
|
||||
completer.complete();
|
||||
@ -38,7 +38,7 @@ Future<void> waitForObservatoryMessage(Process process, int port) async {
|
||||
});
|
||||
process.stderr
|
||||
.transform(utf8.decoder)
|
||||
.listen(printOnFailure);
|
||||
.listen(print);
|
||||
return completer.future;
|
||||
}
|
||||
|
||||
|
@ -43,13 +43,6 @@ const ProcessManager processManager = LocalProcessManager();
|
||||
final String flutterRoot = getFlutterRoot();
|
||||
final String flutterBin = fileSystem.path.join(flutterRoot, 'bin', 'flutter');
|
||||
|
||||
void debugPrint(String message) {
|
||||
// This is called to intentionally print debugging output when a test is
|
||||
// either taking too long or has failed.
|
||||
// ignore: avoid_print
|
||||
print(message);
|
||||
}
|
||||
|
||||
typedef LineHandler = String/*?*/ Function(String line);
|
||||
|
||||
abstract class Transition {
|
||||
@ -143,7 +136,7 @@ class LogLine {
|
||||
String toString() => '$stamp $channel: $message';
|
||||
|
||||
void printClearly() {
|
||||
debugPrint('$stamp $channel: ${clarify(message)}');
|
||||
print('$stamp $channel: ${clarify(message)}');
|
||||
}
|
||||
|
||||
static String clarify(String line) {
|
||||
@ -204,9 +197,9 @@ Future<ProcessTestResult> runFlutter(
|
||||
int nextTransition = 0;
|
||||
void describeStatus() {
|
||||
if (transitions.isNotEmpty) {
|
||||
debugPrint('Expected state transitions:');
|
||||
print('Expected state transitions:');
|
||||
for (int index = 0; index < transitions.length; index += 1) {
|
||||
debugPrint(
|
||||
print(
|
||||
'${index.toString().padLeft(5)} '
|
||||
'${index < nextTransition ? 'ALREADY MATCHED ' :
|
||||
index == nextTransition ? 'NOW WAITING FOR>' :
|
||||
@ -214,9 +207,9 @@ Future<ProcessTestResult> runFlutter(
|
||||
}
|
||||
}
|
||||
if (logs.isEmpty) {
|
||||
debugPrint('So far nothing has been logged${ debug ? "" : "; use debug:true to print all output" }.');
|
||||
print('So far nothing has been logged${ debug ? "" : "; use debug:true to print all output" }.');
|
||||
} else {
|
||||
debugPrint('Log${ debug ? "" : " (only contains logged lines; use debug:true to print all output)" }:');
|
||||
print('Log${ debug ? "" : " (only contains logged lines; use debug:true to print all output)" }:');
|
||||
for (final LogLine log in logs) {
|
||||
log.printClearly();
|
||||
}
|
||||
@ -228,12 +221,12 @@ Future<ProcessTestResult> runFlutter(
|
||||
if (!streamingLogs) {
|
||||
streamingLogs = true;
|
||||
if (!debug) {
|
||||
debugPrint('Test is taking a long time (${clock.elapsed.inSeconds} seconds so far).');
|
||||
print('Test is taking a long time (${clock.elapsed.inSeconds} seconds so far).');
|
||||
}
|
||||
describeStatus();
|
||||
debugPrint('(streaming all logs from this point on...)');
|
||||
print('(streaming all logs from this point on...)');
|
||||
} else {
|
||||
debugPrint('(taking a long time...)');
|
||||
print('(taking a long time...)');
|
||||
}
|
||||
}
|
||||
String stamp() => '[${(clock.elapsed.inMilliseconds / 1000.0).toStringAsFixed(1).padLeft(5, " ")}s]';
|
||||
@ -247,7 +240,7 @@ Future<ProcessTestResult> runFlutter(
|
||||
}
|
||||
if (nextTransition < transitions.length && transitions[nextTransition].matches(line)) {
|
||||
if (streamingLogs) {
|
||||
debugPrint('(matched ${transitions[nextTransition]})');
|
||||
print('(matched ${transitions[nextTransition]})');
|
||||
}
|
||||
if (transitions[nextTransition].logging != null) {
|
||||
if (!logging && transitions[nextTransition].logging/*!*/) {
|
||||
@ -256,9 +249,9 @@ Future<ProcessTestResult> runFlutter(
|
||||
logging = transitions[nextTransition].logging/*!*/;
|
||||
if (streamingLogs) {
|
||||
if (logging) {
|
||||
debugPrint('(enabled logging)');
|
||||
print('(enabled logging)');
|
||||
} else {
|
||||
debugPrint('(disabled logging)');
|
||||
print('(disabled logging)');
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -293,8 +286,8 @@ Future<ProcessTestResult> runFlutter(
|
||||
process.stdout.transform<String>(utf8.decoder).transform<String>(const LineSplitter()).listen(processStdout);
|
||||
process.stderr.transform<String>(utf8.decoder).transform<String>(const LineSplitter()).listen(processStderr);
|
||||
unawaited(process.exitCode.timeout(expectedMaxDuration, onTimeout: () { // This is a failure timeout, must not be short.
|
||||
debugPrint('${stamp()} (process is not quitting, trying to send a "q" just in case that helps)');
|
||||
debugPrint('(a functional test should never reach this point)');
|
||||
print('${stamp()} (process is not quitting, trying to send a "q" just in case that helps)');
|
||||
print('(a functional test should never reach this point)');
|
||||
final LogLine inLog = LogLine('stdin', stamp(), 'q');
|
||||
logs.add(inLog);
|
||||
if (streamingLogs) {
|
||||
@ -305,24 +298,24 @@ Future<ProcessTestResult> runFlutter(
|
||||
}).catchError((Object error) { /* ignore errors here, they will be reported on the next line */ }));
|
||||
final int exitCode = await process.exitCode;
|
||||
if (streamingLogs) {
|
||||
debugPrint('${stamp()} (process terminated with exit code $exitCode)');
|
||||
print('${stamp()} (process terminated with exit code $exitCode)');
|
||||
}
|
||||
timeout?.cancel();
|
||||
if (nextTransition < transitions.length) {
|
||||
debugPrint('The subprocess terminated before all the expected transitions had been matched.');
|
||||
print('The subprocess terminated before all the expected transitions had been matched.');
|
||||
if (logs.any((LogLine line) => line.couldBeCrash)) {
|
||||
debugPrint('The subprocess may in fact have crashed. Check the stderr logs below.');
|
||||
print('The subprocess may in fact have crashed. Check the stderr logs below.');
|
||||
}
|
||||
debugPrint('The transition that we were hoping to see next but that we never saw was:');
|
||||
debugPrint('${nextTransition.toString().padLeft(5)} NOW WAITING FOR> ${transitions[nextTransition]}');
|
||||
print('The transition that we were hoping to see next but that we never saw was:');
|
||||
print('${nextTransition.toString().padLeft(5)} NOW WAITING FOR> ${transitions[nextTransition]}');
|
||||
if (!streamingLogs) {
|
||||
describeStatus();
|
||||
debugPrint('(process terminated with exit code $exitCode)');
|
||||
print('(process terminated with exit code $exitCode)');
|
||||
}
|
||||
throw TestFailure('Missed some expected transitions.');
|
||||
}
|
||||
if (streamingLogs) {
|
||||
debugPrint('${stamp()} (completed execution successfully!)');
|
||||
print('${stamp()} (completed execution successfully!)');
|
||||
}
|
||||
return ProcessTestResult(exitCode, logs);
|
||||
}
|
||||
|
@ -79,10 +79,6 @@ abstract class FlutterTestDriver {
|
||||
lastTime = time;
|
||||
}
|
||||
if (_printDebugOutputToStdOut) {
|
||||
// This is the one place in this file that can call print. It is gated by
|
||||
// _printDebugOutputToStdOut which should not be set to true in CI; it is
|
||||
// intended only for use in local debugging.
|
||||
// ignore: avoid_print
|
||||
print('$time$_logPrefix$line');
|
||||
}
|
||||
}
|
||||
|
@ -215,10 +215,6 @@ void main() {
|
||||
}
|
||||
expect(result.exitCode, 0);
|
||||
});
|
||||
|
||||
testWithoutContext('flutter gold skips tests where the expectations are missing', () async {
|
||||
return _testFile('flutter_gold', automatedTestsDirectory, flutterTestDirectory, exitCode: isZero);
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> _testFile(
|
||||
|
@ -40,8 +40,6 @@ void main() {
|
||||
// Regression test for https://github.com/flutter/flutter/issues/79498
|
||||
testWithoutContext('Can connect to the timeline without getting ANR from the application', () async {
|
||||
final Timer timer = Timer(const Duration(minutes: 5), () {
|
||||
// This message is intended to show up in CI logs.
|
||||
// ignore: avoid_print
|
||||
print(
|
||||
'Warning: test isolate is still active after 5 minutes. This is likely an '
|
||||
'app-not-responding error and not a flake. See https://github.com/flutter/flutter/issues/79498 '
|
||||
|
@ -4,6 +4,5 @@
|
||||
|
||||
// Not a test file, invoked by `variable_expansion_windows_test.dart`.
|
||||
void main(List<String> args) {
|
||||
// This print is used for communicating with the test host.
|
||||
print('args: $args'); // ignore: avoid_print
|
||||
print('args: $args');
|
||||
}
|
||||
|
@ -27,9 +27,6 @@ void tryToDelete(Directory directory) {
|
||||
directory.deleteSync(recursive: true);
|
||||
}
|
||||
} on FileSystemException catch (error) {
|
||||
// We print this so that it's visible in the logs, to get an idea of how
|
||||
// common this problem is, and if any patterns are ever noticed by anyone.
|
||||
// ignore: avoid_print
|
||||
print('Failed to delete ${directory.path}: $error');
|
||||
}
|
||||
}
|
||||
|
@ -127,7 +127,7 @@ void testUsingContext(
|
||||
},
|
||||
body: () {
|
||||
final String flutterRoot = getFlutterRoot();
|
||||
return runZonedGuarded<Future<dynamic>>(() {
|
||||
return runZoned<Future<dynamic>>(() {
|
||||
try {
|
||||
return context.run<dynamic>(
|
||||
// Apply the overrides to the test context in the zone since their
|
||||
@ -148,10 +148,9 @@ void testUsingContext(
|
||||
_printBufferedErrors(context);
|
||||
rethrow;
|
||||
}
|
||||
}, (Object error, StackTrace stackTrace) {
|
||||
// When things fail, it's ok to print to the console!
|
||||
print(error); // ignore: avoid_print
|
||||
print(stackTrace); // ignore: avoid_print
|
||||
}, onError: (Object error, StackTrace stackTrace) { // ignore: deprecated_member_use
|
||||
print(error);
|
||||
print(stackTrace);
|
||||
_printBufferedErrors(context);
|
||||
throw error;
|
||||
});
|
||||
@ -177,9 +176,7 @@ void _printBufferedErrors(AppContext testContext) {
|
||||
if (testContext.get<Logger>() is BufferLogger) {
|
||||
final BufferLogger bufferLogger = testContext.get<Logger>() as BufferLogger;
|
||||
if (bufferLogger.errorText.isNotEmpty) {
|
||||
// This is where the logger outputting errors is implemented, so it has
|
||||
// to use `print`.
|
||||
print(bufferLogger.errorText); // ignore: avoid_print
|
||||
print(bufferLogger.errorText);
|
||||
}
|
||||
bufferLogger.clear();
|
||||
}
|
||||
|
@ -38,6 +38,7 @@ void main() {
|
||||
testWithoutContext('newly added code executes during hot restart', () async {
|
||||
final Completer<void> completer = Completer<void>();
|
||||
final StreamSubscription<String> subscription = flutter.stdout.listen((String line) {
|
||||
print(line);
|
||||
if (line.contains('(((((RELOAD WORKED)))))')) {
|
||||
completer.complete();
|
||||
}
|
||||
@ -55,6 +56,7 @@ void main() {
|
||||
testWithoutContext('newly added code executes during hot restart - canvaskit', () async {
|
||||
final Completer<void> completer = Completer<void>();
|
||||
final StreamSubscription<String> subscription = flutter.stdout.listen((String line) {
|
||||
print(line);
|
||||
if (line.contains('(((((RELOAD WORKED)))))')) {
|
||||
completer.complete();
|
||||
}
|
||||
|
@ -1,5 +0,0 @@
|
||||
include: ../analysis_options.yaml
|
||||
|
||||
linter:
|
||||
rules:
|
||||
avoid_print: false # These are CLI tools which print as a matter of course.
|
@ -51,7 +51,6 @@ typedef LoggingFunction = void Function(LogMessage log);
|
||||
///
|
||||
/// Exits with status code 1 if the `log` is [LoggingLevel.severe].
|
||||
void defaultLoggingFunction(LogMessage log) {
|
||||
// ignore: avoid_print
|
||||
print('[${log.levelName}]::${log.tag}--${log.time}: ${log.message}');
|
||||
if (log.level == LoggingLevel.severe) {
|
||||
exit(1);
|
||||
|
@ -64,7 +64,7 @@ class IntegrationTestWidgetsFlutterBinding extends LiveTestWidgetsFlutterBinding
|
||||
},
|
||||
);
|
||||
} on MissingPluginException {
|
||||
debugPrint(r'''
|
||||
print(r'''
|
||||
Warning: integration_test plugin was not detected.
|
||||
|
||||
If you're running the tests with `flutter drive`, please make sure your tests
|
||||
@ -391,7 +391,7 @@ https://flutter.dev/docs/testing/integration-tests#testing-on-firebase-test-lab
|
||||
count++;
|
||||
await Future<void>.delayed(const Duration(seconds: 2));
|
||||
if (count > 20) {
|
||||
debugPrint('delayForFrameTimings is taking longer than expected...');
|
||||
print('delayForFrameTimings is taking longer than expected...');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,9 +2,6 @@
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// This is a CLI library; we use prints as part of the interface.
|
||||
// ignore_for_file: avoid_print
|
||||
|
||||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
|
@ -2,9 +2,6 @@
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// This is a CLI library; we use prints as part of the interface.
|
||||
// ignore_for_file: avoid_print
|
||||
|
||||
import 'dart:async';
|
||||
import 'dart:io';
|
||||
|
||||
|
@ -104,6 +104,7 @@ Future<void> main() async {
|
||||
testWidgets('Test traceAction', (WidgetTester tester) async {
|
||||
await integrationBinding.enableTimeline(vmService: fakeVM);
|
||||
await integrationBinding.traceAction(() async {});
|
||||
print(integrationBinding.reportData);
|
||||
expect(integrationBinding.reportData, isNotNull);
|
||||
expect(integrationBinding.reportData!.containsKey('timeline'), true);
|
||||
expect(
|
||||
|
@ -10,8 +10,6 @@ import 'package:integration_test/integration_test.dart';
|
||||
Future<void> main() async {
|
||||
final IntegrationTestWidgetsFlutterBinding binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized() as IntegrationTestWidgetsFlutterBinding;
|
||||
binding.allTestsPassed.future.then((_) {
|
||||
// We use this print to communicate with ../binding_fail_test.dart
|
||||
// ignore: avoid_print
|
||||
print('IntegrationTestWidgetsFlutterBinding test results: ${jsonEncode(binding.results)}');
|
||||
});
|
||||
|
||||
|
@ -10,8 +10,6 @@ import 'package:integration_test/integration_test.dart';
|
||||
Future<void> main() async {
|
||||
final IntegrationTestWidgetsFlutterBinding binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized() as IntegrationTestWidgetsFlutterBinding;
|
||||
binding.allTestsPassed.future.then((_) {
|
||||
// We use this print to communicate with ../binding_fail_test.dart
|
||||
// ignore: avoid_print
|
||||
print('IntegrationTestWidgetsFlutterBinding test results: ${jsonEncode(binding.results)}');
|
||||
});
|
||||
|
||||
|
@ -10,8 +10,6 @@ import 'package:integration_test/integration_test.dart';
|
||||
Future<void> main() async {
|
||||
final IntegrationTestWidgetsFlutterBinding binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized() as IntegrationTestWidgetsFlutterBinding;
|
||||
binding.allTestsPassed.future.then((_) {
|
||||
// We use this print to communicate with ../binding_fail_test.dart
|
||||
// ignore: avoid_print
|
||||
print('IntegrationTestWidgetsFlutterBinding test results: ${jsonEncode(binding.results)}');
|
||||
});
|
||||
|
||||
|
@ -10,8 +10,6 @@ import 'package:integration_test/integration_test.dart';
|
||||
Future<void> main() async {
|
||||
final IntegrationTestWidgetsFlutterBinding binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized() as IntegrationTestWidgetsFlutterBinding;
|
||||
binding.allTestsPassed.future.then((_) {
|
||||
// We use this print to communicate with ../binding_fail_test.dart
|
||||
// ignore: avoid_print
|
||||
print('IntegrationTestWidgetsFlutterBinding test results: ${jsonEncode(binding.results)}');
|
||||
});
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user