Unverified Commit c2ea78d2 authored by Mouad Debbar's avatar Mouad Debbar Committed by GitHub

Revert "Enable `avoid_print` lint. (#91332)" (#91438)

This reverts commit cb378edc.
parent d68f9567
......@@ -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
......
include: ../analysis_options.yaml
linter:
rules:
avoid_print: false # We use prints as debugging tools here all the time.
[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. *
// 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
......
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
......
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:
......
include: ../analysis_options.yaml
include: ../../analysis_options.yaml
linter:
rules:
......
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;
}
}
......
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;
......
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
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();
}
......
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)}');
});
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment