add tests to ensure the sdk is well-formed (#41408)
add tests to ensure the sdk is well-formed
diff --git a/packages/flutter_tools/test/general.shard/dart/sdk_validation_test.dart b/packages/flutter_tools/test/general.shard/dart/sdk_validation_test.dart
new file mode 100644
index 0000000..0ac767e
--- /dev/null
+++ b/packages/flutter_tools/test/general.shard/dart/sdk_validation_test.dart
@@ -0,0 +1,137 @@
+// Copyright 2019 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/cache.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:meta/meta.dart';
+
+import '../../src/common.dart';
+import '../../src/context.dart';
+
+void main() {
+ group('sdk validation', () {
+ AnalysisServer server;
+ Directory tempDir;
+
+ setUpAll(() {
+ Cache.disableLocking();
+ tempDir =
+ fs.systemTempDirectory.createTempSync('sdk_validation_test').absolute;
+ });
+
+ tearDownAll(() {
+ Cache.enableLocking();
+ tryToDelete(tempDir);
+ return server?.dispose();
+ });
+
+ testUsingContext('contains dart:ui', () async {
+ createSampleProject(tempDir, dartSource: '''
+import 'dart:ui' as ui;
+void main() {
+ // ignore: unnecessary_statements
+ ui.Window;
+}
+''');
+
+ await pubGet(context: PubContext.flutterTests, directory: tempDir.path);
+
+ server = AnalysisServer(dartSdkPath, <String>[tempDir.path]);
+
+ final int errorCount = await analyze(server);
+ expect(errorCount, 0);
+ });
+
+ testUsingContext('contains dart:html', () async {
+ createSampleProject(tempDir, dartSource: '''
+import 'dart:html' as html;
+void main() {
+ // ignore: unnecessary_statements
+ html.HttpStatus;
+}
+''');
+
+ await pubGet(context: PubContext.flutterTests, directory: tempDir.path);
+
+ server = AnalysisServer(dartSdkPath, <String>[tempDir.path]);
+
+ final int errorCount = await analyze(server);
+ expect(errorCount, 0);
+ });
+
+ testUsingContext('contains dart:js', () async {
+ createSampleProject(tempDir, dartSource: '''
+import 'dart:js' as js;
+void main() {
+ // ignore: unused_local_variable
+ var foo = js.allowInterop(null);
+}
+''');
+
+ await pubGet(context: PubContext.flutterTests, directory: tempDir.path);
+
+ server = AnalysisServer(dartSdkPath, <String>[tempDir.path]);
+
+ final int errorCount = await analyze(server);
+ expect(errorCount, 0);
+ });
+
+ testUsingContext('contains dart:js_util', () async {
+ createSampleProject(tempDir, dartSource: '''
+import 'dart:js_util' as js_util;
+void main() {
+ // ignore: unused_local_variable
+ var bar = js_util.jsify(null);
+}
+''');
+
+ await pubGet(context: PubContext.flutterTests, directory: tempDir.path);
+
+ server = AnalysisServer(dartSdkPath, <String>[tempDir.path]);
+
+ final int errorCount = await analyze(server);
+ expect(errorCount, 0);
+ });
+ });
+}
+
+void createSampleProject(Directory directory, {@required String dartSource}) {
+ final File pubspecFile =
+ fs.file(fs.path.join(directory.path, 'pubspec.yaml'));
+ pubspecFile.writeAsStringSync('''
+name: foo_project
+dependencies:
+ flutter:
+ sdk: flutter
+''');
+
+ final File dartFile =
+ fs.file(fs.path.join(directory.path, 'lib', 'main.dart'));
+ dartFile.parent.createSync();
+ dartFile.writeAsStringSync(dartSource);
+}
+
+Future<int> analyze(AnalysisServer server, {bool printErrors = true}) async {
+ int errorCount = 0;
+ final Future<bool> onDone =
+ server.onAnalyzing.where((bool analyzing) => analyzing == false).first;
+ server.onErrors.listen((FileAnalysisErrors errors) {
+ if (printErrors) {
+ for (AnalysisError error in errors.errors) {
+ print(error.toString().trim());
+ }
+ }
+ errorCount += errors.errors.length;
+ });
+
+ await server.start();
+ await onDone;
+
+ return errorCount;
+}