Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(66)

Side by Side Diff: pkg/analysis_server/bin/fuzz.dart

Issue 584963002: first cut fuzz test for analysis server (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 import 'dart:async';
6 import 'dart:io';
7
8 import 'package:args/args.dart';
9 import 'package:matcher/matcher.dart';
10 import 'package:path/path.dart' as path;
11
12 import 'fuzz/server_manager.dart';
13
14 /**
15 * Start analysis server as a separate process and use the stdio to communicate
16 * with the server.
17 */
18 void main(List<String> args) {
19 new _FuzzTest().run(args);
20 }
21
22 /**
23 * Instances of [_FuzzTest] launch and test an analysis server.
24 * You must specify the location of the Dart SDK and the directory
25 * containing sources to be analyzed.
26 */
27 class _FuzzTest {
28
29 //TODO (danrubel) extract common behavior for use in multiple test scenarios
30 //TODO (danrubel) cleanup test to use async/await for better readability
31 // VM flag --enable_async
32
33 static const String DART_SDK_OPTION = 'dart-sdk';
34 static const String HELP_OPTION = 'help';
35
36 File serverSnapshot;
37 Directory appDir;
38
39 /// Parse the arguments and initialize the receiver
40 /// Return `true` if proper arguments were provided
41 bool parseArgs(List<String> args) {
42 ArgParser parser = new ArgParser();
43
44 void error(String errMsg) {
45 stderr.writeln(errMsg);
46 print('');
47 _printUsage(parser);
48 exitCode = 11;
49 }
50
51 parser.addOption(DART_SDK_OPTION, help: '[sdkPath] path to Dart SDK');
52 parser.addFlag(
53 HELP_OPTION,
54 help: 'print this help message without starting analysis',
55 defaultsTo: false,
56 negatable: false);
57
58 ArgResults results;
59 try {
60 results = parser.parse(args);
61 } on FormatException catch (e) {
62 error(e.message);
63 return false;
64 }
65 if (results[HELP_OPTION]) {
66 _printUsage(parser);
67 return false;
68 }
69 String sdkPath = results[DART_SDK_OPTION];
70 if (sdkPath is! String) {
71 error('Missing path to Dart SDK');
72 return false;
73 }
74 Directory sdkDir = new Directory(sdkPath);
75 if (!sdkDir.existsSync()) {
76 error('Specified Dart SDK does not exist: $sdkPath');
77 return false;
78 }
79 if (results.rest.length == 0) {
80 error('Expected directory to analyze');
81 return false;
82 }
83 appDir = new Directory(results.rest[0]);
84 if (!appDir.existsSync()) {
lukechurch 2014/09/21 05:36:10 What is an application directory? Do you mean that
danrubel 2014/09/22 18:27:25 This is the root directory containing the files to
85 error('Specified application directory does not exist: $appDir');
86 return false;
87 }
88 if (results.rest.length > 1) {
89 error('Unexpected arguments after $appDir');
90 return false;
91 }
92 serverSnapshot = new File(
93 path.join(sdkDir.path, 'bin', 'snapshots', 'analysis_server.dart.snapsho t'));
94 if (!serverSnapshot.existsSync()) {
95 error('Analysis Server snapshot not found: $serverSnapshot');
96 return false;
97 }
98 return true;
99 }
100
101 /// Main entry point for launching, testing, and shutting down the server
102 void run(List<String> args) {
103 if (!parseArgs(args)) return;
104 ServerManager.start(serverSnapshot.path).then((ServerManager manager) {
105 runZoned(() {
106 test(manager).then(manager.stop).then((_) {
107 expect(manager.errorOccurred, isFalse);
108 print('Test completed successfully');
lukechurch 2014/09/21 05:36:11 I don't really see these as tests as such, but mor
danrubel 2014/09/22 18:27:25 I'm happy to refactor in subsequent CLs as we/I be
109 });
110 }, onError: (error, stack) {
111 stderr.writeln(error);
lukechurch 2014/09/21 05:36:11 From experience of writing a couple of these thing
danrubel 2014/09/22 18:27:25 Fair enough. Will refactor in subsequent CLs.
112 print(stack);
113 exitCode = 12;
lukechurch 2014/09/21 05:36:11 Why 12?
danrubel 2014/09/22 18:27:25 Just picking a random exit code that's not 1 and u
114 manager.stop();
115 });
116 });
117 }
118
119 /// Use manager to exercise the analysis server
120 Future test(ServerManager manager) {
121
122 // perform initial analysis
123 return manager.analyze(appDir).then((AnalysisResults analysisResults) {
124 print(
125 'Found ${analysisResults.errorCount} errors,'
126 ' ${analysisResults.warningCount} warnings,'
127 ' and ${analysisResults.hintCount} hints in ${analysisResults.elap sed}');
128
129 // edit a method body
130 return manager.openFileNamed(
131 'domain_completion.dart').then((Editor editor) {
132 return editor.moveAfter('Response processRequest(Request request) {');
133 }).then((Editor editor) {
134 return editor.replace(0, '\nOb');
135 }).then((Editor editor) {
136
137 // request code completion and assert results
138 return editor.getSuggestions().then((List<CompletionResults> list) {
139 expect(list, isNotNull);
140 expect(list.length, equals(0));
lukechurch 2014/09/21 05:36:11 I don't follow this. Why would the list has of len
danrubel 2014/09/22 18:27:25 I'm getting an exception after text replacement bu
141 list.forEach((CompletionResults results) {
142 print('${results.elapsed} received ${results.suggestionCount} sugges tions');
143 });
144 return editor;
145 });
146
147 }).then((Editor editor) {
148 print('tests complete');
149 });
150 });
151 }
152
153 void _printAnalysisSummary(AnalysisResults results) {
154 print(
155 'Found ${results.errorCount} errors, ${results.warningCount} warnings,'
156 ' and ${results.hintCount} hints in $results.elapsed');
157 }
158
159 /// Print information about how to use the server.
160 void _printUsage(ArgParser parser) {
161 print('Usage: analyzer [flags] <application_directory>');
162 print('');
163 print('Supported flags are:');
164 print(parser.getUsage());
165 }
166 }
OLDNEW
« no previous file with comments | « no previous file | pkg/analysis_server/bin/fuzz/README.txt » ('j') | pkg/analysis_server/bin/fuzz/server_manager.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698