// 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. import 'package:file/file.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:vm_service/vm_service.dart'; import 'package:vm_service/vm_service_io.dart'; import '../integration.shard/test_data/basic_project.dart'; import '../integration.shard/test_driver.dart'; import '../integration.shard/test_utils.dart'; import '../src/common.dart'; void main() { late Directory tempDir; final BasicProjectWithUnaryMain project = BasicProjectWithUnaryMain(); late FlutterRunTestDriver flutter; setUp(() async { tempDir = createResolvedTempDirectorySync('run_test.'); await project.setUpIn(tempDir); flutter = FlutterRunTestDriver(tempDir); }); tearDown(() async { await flutter.stop(); tryToDelete(tempDir); }); Future<void> start({bool verbose = false}) async { // The non-test project has a loop around its breakpoints. // No need to start paused as all breakpoint would be eventually reached. await flutter.run( withDebugger: true, chrome: true, additionalCommandArgs: <String>[ if (verbose) '--verbose', '--web-renderer=html', ]); } Future<void> evaluate() async { final ObjRef res = await flutter.evaluate('package:characters/characters.dart', 'true'); expect(res, isA<InstanceRef>() .having((InstanceRef o) => o.kind, 'kind', 'Bool')); } Future<void> sendEvent(Map<String, Object> event) async { final VmService client = await vmServiceConnectUri( '${flutter.vmServiceWsUri}'); final Response result = await client.callServiceExtension( 'ext.dwds.sendEvent', args: event, ); expect(result, isA<Success>()); await client.dispose(); } testWithoutContext('flutter run outputs info messages from dwds in verbose mode', () async { final Future<dynamic> info = expectLater( flutter.stdout, emitsThrough(contains('Loaded debug metadata'))); await start(verbose: true); await evaluate(); await flutter.stop(); await info; }); testWithoutContext('flutter run outputs warning messages from dwds in non-verbose mode', () async { final Future<dynamic> warning = expectLater( flutter.stderr, emitsThrough(contains('Ignoring unknown event'))); await start(); await sendEvent(<String, Object>{'type': 'DevtoolsEvent'}); await warning; }, skip: true); // Skipping for 'https://github.com/dart-lang/webdev/issues/1562' testWithoutContext( 'flutter run output skips DartUri warning messages from dwds', () async { bool containsDartUriWarning = false; flutter.stderr.listen((String msg) { if (msg.contains('DartUri')) { containsDartUriWarning = true; } }); await start(); await flutter.stop(); expect(containsDartUriWarning, isFalse); }); }