Files
sdk/pkg/analysis_server/benchmark/perf/memory_tests.dart
T
Konstantin Shcheglov 4324d46080 Use an available socket port for memory benchmark.
R=devoncarew@google.com

Change-Id: I96472010b6bfa01e0ae2254f105d8e71bb7e86d5
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/105683
Reviewed-by: Devon Carew <devoncarew@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
2019-06-12 16:18:14 +00:00

100 lines
2.9 KiB
Dart

// Copyright (c) 2016, 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 'dart:io';
import 'package:analysis_server/protocol/protocol_generated.dart';
import 'package:analysis_server/src/status/diagnostics.dart';
import 'package:test/test.dart';
import '../../test/integration/support/integration_tests.dart';
/**
* Base class for analysis server memory usage tests.
*/
class AnalysisServerMemoryUsageTest
extends AbstractAnalysisServerIntegrationTest {
int _vmServicePort;
Future<int> getMemoryUsage() async {
Uri uri = Uri.parse('ws://127.0.0.1:$_vmServicePort/ws');
final ServiceProtocol service = await ServiceProtocol.connect(uri);
final Map vm = await service.call('getVM');
int total = 0;
List isolateRefs = vm['isolates'];
for (Map isolateRef in isolateRefs) {
Map isolate =
await service.call('getIsolate', {'isolateId': isolateRef['id']});
Map _heaps = isolate['_heaps'];
total += _heaps['new']['used'] + _heaps['new']['external'];
total += _heaps['old']['used'] + _heaps['old']['external'];
}
service.dispose();
return total;
}
/**
* Send the server an 'analysis.setAnalysisRoots' command directing it to
* analyze [sourceDirectory].
*/
Future setAnalysisRoot() =>
sendAnalysisSetAnalysisRoots([sourceDirectory.path], []);
/**
* The server is automatically started before every test.
*/
@override
Future setUp() async {
_vmServicePort = await _findAvailableSocketPort();
onAnalysisErrors.listen((AnalysisErrorsParams params) {
currentAnalysisErrors[params.file] = params.errors;
});
onServerError.listen((ServerErrorParams params) {
// A server error should never happen during an integration test.
fail('${params.message}\n${params.stackTrace}');
});
Completer serverConnected = new Completer();
onServerConnected.listen((_) {
outOfTestExpect(serverConnected.isCompleted, isFalse);
serverConnected.complete();
});
return startServer(servicesPort: _vmServicePort).then((_) {
server.listenToOutput(dispatchNotification);
server.exitCode.then((_) {
skipShutdown = true;
});
return serverConnected.future;
});
}
/**
* After every test, the server is stopped.
*/
Future shutdown() async => await shutdownIfNeeded();
/**
* Enable [ServerService.STATUS] notifications so that [analysisFinished]
* can be used.
*/
Future subscribeToStatusNotifications() async {
await sendServerSetSubscriptions([ServerService.STATUS]);
}
static Future<int> _findAvailableSocketPort() async {
var socket = await ServerSocket.bind(InternetAddress.loopbackIPv4, 0);
try {
return socket.port;
} finally {
await socket.close();
}
}
}