Index: pkg/analysis_server/test/performance/operation.dart |
diff --git a/pkg/analysis_server/test/performance/operation.dart b/pkg/analysis_server/test/performance/operation.dart |
deleted file mode 100644 |
index f9ee62a676aca7661bd3f05696a677dba58442f3..0000000000000000000000000000000000000000 |
--- a/pkg/analysis_server/test/performance/operation.dart |
+++ /dev/null |
@@ -1,238 +0,0 @@ |
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-library server.operation; |
- |
-import 'dart:async'; |
- |
-import 'package:analysis_server/src/protocol.dart'; |
-import 'package:logging/logging.dart'; |
- |
-import 'driver.dart'; |
-import 'input_converter.dart'; |
- |
-/** |
- * A [CompletionRequestOperation] tracks response time along with |
- * the first and last completion notifications. |
- */ |
-class CompletionRequestOperation extends RequestOperation { |
- Driver driver; |
- StreamSubscription<CompletionResultsParams> subscription; |
- String notificationId; |
- Stopwatch stopwatch; |
- bool firstNotification = true; |
- |
- CompletionRequestOperation( |
- CommonInputConverter converter, Map<String, dynamic> json) |
- : super(converter, json); |
- |
- @override |
- Future perform(Driver driver) { |
- this.driver = driver; |
- subscription = driver.onCompletionResults.listen(processNotification); |
- return super.perform(driver); |
- } |
- |
- void processNotification(CompletionResultsParams event) { |
- if (event.id == notificationId) { |
- Duration elapsed = stopwatch.elapsed; |
- if (firstNotification) { |
- firstNotification = false; |
- driver.results.record('completion notification first', elapsed, |
- notification: true); |
- } |
- if (event.isLast) { |
- subscription.cancel(); |
- driver.results.record('completion notification last', elapsed, |
- notification: true); |
- } |
- } |
- } |
- |
- @override |
- void processResult( |
- String id, Map<String, dynamic> result, Stopwatch stopwatch) { |
- notificationId = result['id']; |
- this.stopwatch = stopwatch; |
- super.processResult(id, result, stopwatch); |
- } |
-} |
- |
-/** |
- * An [Operation] represents an action such as sending a request to the server. |
- */ |
-abstract class Operation { |
- Future perform(Driver driver); |
-} |
- |
-/** |
- * A [RequestOperation] sends a [JSON] request to the server. |
- */ |
-class RequestOperation extends Operation { |
- final CommonInputConverter converter; |
- final Map<String, dynamic> json; |
- |
- RequestOperation(this.converter, this.json); |
- |
- @override |
- Future perform(Driver driver) { |
- Stopwatch stopwatch = new Stopwatch(); |
- String originalId = json['id']; |
- String method = json['method']; |
- json['clientRequestTime'] = new DateTime.now().millisecondsSinceEpoch; |
- driver.logger.log(Level.FINE, 'Sending request: $method\n $json'); |
- stopwatch.start(); |
- |
- void recordResult(bool success, result) { |
- Duration elapsed = stopwatch.elapsed; |
- driver.results.record(method, elapsed, success: success); |
- driver.logger.log( |
- Level.FINE, 'Response received: $method : $elapsed\n $result'); |
- } |
- |
- driver.send(method, json['params']).then((Map<String, dynamic> result) { |
- recordResult(true, result); |
- processResult(originalId, result, stopwatch); |
- }).catchError((exception) { |
- recordResult(false, exception); |
- converter.processErrorResponse(originalId, exception); |
- }); |
- return null; |
- } |
- |
- void processResult( |
- String id, Map<String, dynamic> result, Stopwatch stopwatch) { |
- converter.processResponseResult(id, result); |
- } |
-} |
- |
-/** |
- * A [ResponseOperation] waits for a [JSON] response from the server. |
- */ |
-class ResponseOperation extends Operation { |
- static final Duration responseTimeout = new Duration(seconds: 5); |
- final CommonInputConverter converter; |
- final Map<String, dynamic> requestJson; |
- final Map<String, dynamic> responseJson; |
- final Completer completer = new Completer(); |
- Driver driver; |
- |
- ResponseOperation(this.converter, this.requestJson, this.responseJson) { |
- completer.future.then(_processResult).timeout(responseTimeout); |
- } |
- |
- @override |
- Future perform(Driver driver) { |
- this.driver = driver; |
- return converter.processExpectedResponse(responseJson['id'], completer); |
- } |
- |
- bool _equal(expectedResult, actualResult) { |
- if (expectedResult is Map && actualResult is Map) { |
- if (expectedResult.length == actualResult.length) { |
- return expectedResult.keys.every((String key) { |
- return key == |
- 'fileStamp' || // fileStamp values will not be the same across runs |
- _equal(expectedResult[key], actualResult[key]); |
- }); |
- } |
- } else if (expectedResult is List && actualResult is List) { |
- if (expectedResult.length == actualResult.length) { |
- for (int i = 0; i < expectedResult.length; ++i) { |
- if (!_equal(expectedResult[i], actualResult[i])) { |
- return false; |
- } |
- } |
- return true; |
- } |
- } |
- return expectedResult == actualResult; |
- } |
- |
- /** |
- * Compare the expected and actual server response result. |
- */ |
- void _processResult(actualResult) { |
- var expectedResult = responseJson['result']; |
- if (!_equal(expectedResult, actualResult)) { |
- var expectedError = responseJson['error']; |
- String format(value) { |
- String text = '\n$value'; |
- if (text.endsWith('\n')) { |
- text = text.substring(0, text.length - 1); |
- } |
- return text.replaceAll('\n', '\n '); |
- } |
- String message = 'Request:${format(requestJson)}\n' |
- 'expected result:${format(expectedResult)}\n' |
- 'expected error:${format(expectedError)}\n' |
- 'but received:${format(actualResult)}'; |
- driver.results.recordUnexpectedResults(requestJson['method']); |
- if (expectedError == null) { |
- converter.logger.log(Level.SEVERE, message); |
- } else { |
- throw message; |
- } |
- } |
- } |
-} |
- |
-class StartServerOperation extends Operation { |
- final int diagnosticPort; |
- |
- StartServerOperation({this.diagnosticPort}); |
- |
- @override |
- Future perform(Driver driver) { |
- return driver.startServer(diagnosticPort: diagnosticPort); |
- } |
-} |
- |
-class WaitForAnalysisCompleteOperation extends Operation { |
- @override |
- Future perform(Driver driver) { |
- DateTime start = new DateTime.now(); |
- driver.logger.log(Level.FINE, 'waiting for analysis to complete'); |
- StreamSubscription<ServerStatusParams> subscription; |
- Timer timer; |
- Completer completer = new Completer(); |
- bool isAnalyzing = false; |
- subscription = driver.onServerStatus.listen((ServerStatusParams params) { |
- if (params.analysis != null) { |
- if (params.analysis.isAnalyzing) { |
- isAnalyzing = true; |
- } else { |
- subscription.cancel(); |
- timer.cancel(); |
- DateTime end = new DateTime.now(); |
- Duration delta = end.difference(start); |
- driver.logger.log(Level.FINE, 'analysis complete after $delta'); |
- completer.complete(); |
- driver.results.record('analysis complete', delta, notification: true); |
- } |
- } |
- }); |
- timer = new Timer.periodic(new Duration(milliseconds: 20), (_) { |
- if (!isAnalyzing) { |
- // TODO (danrubel) revisit this once source change requests are implemented |
- subscription.cancel(); |
- timer.cancel(); |
- driver.logger.log(Level.INFO, 'analysis never started'); |
- completer.complete(); |
- return; |
- } |
- // Timeout if no communcation received within the last 60 seconds. |
- double currentTime = driver.server.currentElapseTime; |
- double lastTime = driver.server.lastCommunicationTime; |
- if (currentTime - lastTime > 60) { |
- subscription.cancel(); |
- timer.cancel(); |
- String message = 'gave up waiting for analysis to complete'; |
- driver.logger.log(Level.WARNING, message); |
- completer.completeError(message); |
- } |
- }); |
- return completer.future; |
- } |
-} |