Files
sdk/pkg/analysis_server/test/socket_server_test.dart
T
Konstantin Shcheglov af2e729fca Record request / response statistics.
If following flags are specified for DAS, in IntelliJ in Registry as
"dart.server.additional.arguments":

--new-analysis-driver-log=file:/Users/scheglov/tmp/das.log
--include-protocol-to-driver-log

then abbreviated requests, and request execution statistics is
written to the file. We also write abbreviated notifications.

The goal is to be able to see what work was requested, what was
analyzed, and identify why some requests took long to get responses.


R=brianwilkerson@google.com

Change-Id: I98e99a73f10f2842c5efb350189a9675f29f45df
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/113800
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
2019-08-21 16:47:21 +00:00

138 lines
5.1 KiB
Dart

// Copyright (c) 2014, 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.
import 'dart:async';
import 'package:analysis_server/protocol/protocol.dart';
import 'package:analysis_server/protocol/protocol_constants.dart';
import 'package:analysis_server/protocol/protocol_generated.dart';
import 'package:analysis_server/src/analysis_server.dart';
import 'package:analysis_server/src/socket_server.dart';
import 'package:analyzer/instrumentation/instrumentation.dart';
import 'package:analyzer/src/generated/sdk.dart';
import 'package:test/test.dart';
import 'mocks.dart';
main() {
group('SocketServer', () {
test('createAnalysisServer_successful',
SocketServerTest.createAnalysisServer_successful);
test('createAnalysisServer_alreadyStarted',
SocketServerTest.createAnalysisServer_alreadyStarted);
test('requestHandler_exception', SocketServerTest.requestHandler_exception);
test('requestHandler_futureException',
SocketServerTest.requestHandler_futureException);
});
}
class SocketServerTest {
static void createAnalysisServer_alreadyStarted() {
SocketServer server = _createSocketServer();
MockServerChannel channel1 = new MockServerChannel();
MockServerChannel channel2 = new MockServerChannel();
server.createAnalysisServer(channel1);
expect(
channel1.notificationsReceived[0].event, SERVER_NOTIFICATION_CONNECTED);
server.createAnalysisServer(channel2);
channel1.expectMsgCount(notificationCount: 1);
channel2.expectMsgCount(responseCount: 1);
expect(channel2.responsesReceived[0].id, equals(''));
expect(channel2.responsesReceived[0].error, isNotNull);
expect(channel2.responsesReceived[0].error.code,
equals(RequestErrorCode.SERVER_ALREADY_STARTED));
channel2
.sendRequest(new ServerShutdownParams().toRequest('0'))
.then((Response response) {
expect(response.id, equals('0'));
expect(response.error, isNotNull);
expect(
response.error.code, equals(RequestErrorCode.SERVER_ALREADY_STARTED));
channel2.expectMsgCount(responseCount: 2);
});
}
static Future createAnalysisServer_successful() {
SocketServer server = _createSocketServer();
MockServerChannel channel = new MockServerChannel();
server.createAnalysisServer(channel);
channel.expectMsgCount(notificationCount: 1);
expect(
channel.notificationsReceived[0].event, SERVER_NOTIFICATION_CONNECTED);
return channel
.sendRequest(new ServerShutdownParams().toRequest('0'))
.then((Response response) {
expect(response.id, equals('0'));
expect(response.error, isNull);
channel.expectMsgCount(responseCount: 1, notificationCount: 1);
});
}
static Future requestHandler_exception() {
SocketServer server = _createSocketServer();
MockServerChannel channel = new MockServerChannel();
server.createAnalysisServer(channel);
channel.expectMsgCount(notificationCount: 1);
expect(
channel.notificationsReceived[0].event, SERVER_NOTIFICATION_CONNECTED);
_MockRequestHandler handler = new _MockRequestHandler(false);
server.analysisServer.handlers = [handler];
var request = new ServerGetVersionParams().toRequest('0');
return channel.sendRequest(request).then((Response response) {
expect(response.id, equals('0'));
expect(response.error, isNotNull);
expect(response.error.code, equals(RequestErrorCode.SERVER_ERROR));
expect(response.error.message, equals('mock request exception'));
expect(response.error.stackTrace, isNotNull);
expect(response.error.stackTrace, isNotEmpty);
channel.expectMsgCount(responseCount: 1, notificationCount: 1);
});
}
static Future requestHandler_futureException() async {
SocketServer server = _createSocketServer();
MockServerChannel channel = new MockServerChannel();
server.createAnalysisServer(channel);
_MockRequestHandler handler = new _MockRequestHandler(true);
server.analysisServer.handlers = [handler];
var request = new ServerGetVersionParams().toRequest('0');
Response response = await channel.sendRequest(request, throwOnError: false);
expect(response.id, equals('0'));
expect(response.error, isNull);
channel.expectMsgCount(responseCount: 1, notificationCount: 2);
expect(channel.notificationsReceived[1].event, SERVER_NOTIFICATION_ERROR);
}
static SocketServer _createSocketServer() {
return new SocketServer(
new AnalysisServerOptions(),
new DartSdkManager('', false),
InstrumentationService.NULL_SERVICE,
null,
null,
null,
null,
null);
}
}
class _MockRequestHandler implements RequestHandler {
final bool futureException;
_MockRequestHandler(this.futureException);
@override
Response handleRequest(Request request) {
if (futureException) {
new Future(throwException);
return new Response(request.id);
}
throw 'mock request exception';
}
void throwException() {
throw 'mock future exception';
}
}