| // Copyright 2016 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| import 'dart:async'; | |
| import 'package:flutter_tools/src/base/file_system.dart'; | |
| import 'package:flutter_tools/src/base/os.dart'; | |
| import 'package:flutter_tools/src/dart/analysis.dart'; | |
| import 'package:flutter_tools/src/dart/pub.dart'; | |
| import 'package:flutter_tools/src/dart/sdk.dart'; | |
| import 'package:flutter_tools/src/runner/flutter_command_runner.dart'; | |
| import '../src/common.dart'; | |
| import '../src/context.dart'; | |
| void main() { | |
| AnalysisServer server; | |
| Directory tempDir; | |
| setUp(() { | |
| FlutterCommandRunner.initFlutterRoot(); | |
| tempDir = fs.systemTempDirectory.createTempSync('flutter_analysis_test.'); | |
| }); | |
| tearDown(() { | |
| tryToDelete(tempDir); | |
| return server?.dispose(); | |
| }); | |
| group('analyze --watch', () { | |
| testUsingContext('AnalysisServer success', () async { | |
| _createSampleProject(tempDir); | |
| await pubGet(context: PubContext.flutterTests, directory: tempDir.path); | |
| server = AnalysisServer(dartSdkPath, <String>[tempDir.path]); | |
| int errorCount = 0; | |
| final Future<bool> onDone = server.onAnalyzing.where((bool analyzing) => analyzing == false).first; | |
| server.onErrors.listen((FileAnalysisErrors errors) => errorCount += errors.errors.length); | |
| await server.start(); | |
| await onDone; | |
| expect(errorCount, 0); | |
| }, overrides: <Type, Generator>{ | |
| OperatingSystemUtils: () => os | |
| }); | |
| }); | |
| testUsingContext('AnalysisServer errors', () async { | |
| _createSampleProject(tempDir, brokenCode: true); | |
| await pubGet(context: PubContext.flutterTests, directory: tempDir.path); | |
| server = AnalysisServer(dartSdkPath, <String>[tempDir.path]); | |
| int errorCount = 0; | |
| final Future<bool> onDone = server.onAnalyzing.where((bool analyzing) => analyzing == false).first; | |
| server.onErrors.listen((FileAnalysisErrors errors) { | |
| errorCount += errors.errors.length; | |
| }); | |
| await server.start(); | |
| await onDone; | |
| expect(errorCount, greaterThan(0)); | |
| }, overrides: <Type, Generator>{ | |
| OperatingSystemUtils: () => os | |
| }); | |
| testUsingContext('Returns no errors when source is error-free', () async { | |
| const String contents = "StringBuffer bar = StringBuffer('baz');"; | |
| tempDir.childFile('main.dart').writeAsStringSync(contents); | |
| server = AnalysisServer(dartSdkPath, <String>[tempDir.path]); | |
| int errorCount = 0; | |
| final Future<bool> onDone = server.onAnalyzing.where((bool analyzing) => analyzing == false).first; | |
| server.onErrors.listen((FileAnalysisErrors errors) { | |
| errorCount += errors.errors.length; | |
| }); | |
| await server.start(); | |
| await onDone; | |
| expect(errorCount, 0); | |
| }, overrides: <Type, Generator>{ | |
| OperatingSystemUtils: () => os | |
| }); | |
| } | |
| void _createSampleProject(Directory directory, { bool brokenCode = false }) { | |
| final File pubspecFile = fs.file(fs.path.join(directory.path, 'pubspec.yaml')); | |
| pubspecFile.writeAsStringSync(''' | |
| name: foo_project | |
| '''); | |
| final File dartFile = fs.file(fs.path.join(directory.path, 'lib', 'main.dart')); | |
| dartFile.parent.createSync(); | |
| dartFile.writeAsStringSync(''' | |
| void main() { | |
| print('hello world'); | |
| ${brokenCode ? 'prints("hello world");' : ''} | |
| } | |
| '''); | |
| } |