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>
diff --git a/pkg/analysis_server/benchmark/perf/memory_tests.dart b/pkg/analysis_server/benchmark/perf/memory_tests.dart
index 6af8813..84385b6 100644
--- a/pkg/analysis_server/benchmark/perf/memory_tests.dart
+++ b/pkg/analysis_server/benchmark/perf/memory_tests.dart
@@ -3,6 +3,7 @@
 // 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';
@@ -15,10 +16,10 @@
  */
 class AnalysisServerMemoryUsageTest
     extends AbstractAnalysisServerIntegrationTest {
-  static const int vmServicePort = 12345;
+  int _vmServicePort;
 
   Future<int> getMemoryUsage() async {
-    Uri uri = Uri.parse('ws://127.0.0.1:$vmServicePort/ws');
+    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');
 
@@ -50,7 +51,9 @@
    * The server is automatically started before every test.
    */
   @override
-  Future setUp() {
+  Future setUp() async {
+    _vmServicePort = await _findAvailableSocketPort();
+
     onAnalysisErrors.listen((AnalysisErrorsParams params) {
       currentAnalysisErrors[params.file] = params.errors;
     });
@@ -63,7 +66,7 @@
       outOfTestExpect(serverConnected.isCompleted, isFalse);
       serverConnected.complete();
     });
-    return startServer(servicesPort: vmServicePort).then((_) {
+    return startServer(servicesPort: _vmServicePort).then((_) {
       server.listenToOutput(dispatchNotification);
       server.exitCode.then((_) {
         skipShutdown = true;
@@ -84,4 +87,13 @@
   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();
+    }
+  }
 }