Version 2.17.0-266.0.dev

Merge commit '2ebad4841ff854891916b55ba6b295b138434888' into 'dev'
diff --git a/pkg/analysis_server/lib/src/domain_server.dart b/pkg/analysis_server/lib/src/domain_server.dart
index d51b88c5..a5b7b83 100644
--- a/pkg/analysis_server/lib/src/domain_server.dart
+++ b/pkg/analysis_server/lib/src/domain_server.dart
@@ -4,8 +4,10 @@
 
 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/handler/legacy/server_cancel_request.dart';
+import 'package:analysis_server/src/handler/legacy/server_get_version.dart';
+import 'package:analysis_server/src/handler/legacy/server_set_subscriptions.dart';
 import 'package:analysis_server/src/handler/legacy/server_shutdown.dart';
 import 'package:analysis_server/src/utilities/progress.dart';
 
@@ -19,51 +21,28 @@
   /// [server].
   ServerDomainHandler(this.server);
 
-  Response cancelRequest(Request request) {
-    final id = ServerCancelRequestParams.fromRequest(request).id;
-    server.cancelRequest(id);
-
-    return ServerCancelRequestResult().toResponse(request.id);
-  }
-
-  /// Return the version number of the analysis server.
-  Response getVersion(Request request) {
-    return ServerGetVersionResult(
-      server.options.reportProtocolVersion ?? PROTOCOL_VERSION,
-    ).toResponse(request.id);
-  }
-
   @override
   Response? handleRequest(
       Request request, CancellationToken cancellationToken) {
     try {
       var requestName = request.method;
       if (requestName == SERVER_REQUEST_GET_VERSION) {
-        return getVersion(request);
+        ServerGetVersionHandler(server, request, cancellationToken).handle();
+        return Response.DELAYED_RESPONSE;
       } else if (requestName == SERVER_REQUEST_SET_SUBSCRIPTIONS) {
-        return setSubscriptions(request);
+        ServerSetSubscriptionsHandler(server, request, cancellationToken)
+            .handle();
+        return Response.DELAYED_RESPONSE;
       } else if (requestName == SERVER_REQUEST_SHUTDOWN) {
         ServerShutdownHandler(server, request, cancellationToken).handle();
         return Response.DELAYED_RESPONSE;
       } else if (requestName == SERVER_REQUEST_CANCEL_REQUEST) {
-        return cancelRequest(request);
+        ServerCancelRequestHandler(server, request, cancellationToken).handle();
+        return Response.DELAYED_RESPONSE;
       }
     } on RequestFailure catch (exception) {
       return exception.response;
     }
     return null;
   }
-
-  /// Subscribe for services.
-  ///
-  /// All previous subscriptions are replaced by the given set of subscriptions.
-  Response setSubscriptions(Request request) {
-    server.serverServices =
-        ServerSetSubscriptionsParams.fromRequest(request).subscriptions.toSet();
-
-    server.requestStatistics?.isNotificationSubscribed =
-        server.serverServices.contains(ServerService.LOG);
-
-    return ServerSetSubscriptionsResult().toResponse(request.id);
-  }
 }
diff --git a/pkg/analysis_server/lib/src/handler/legacy/server_cancel_request.dart b/pkg/analysis_server/lib/src/handler/legacy/server_cancel_request.dart
new file mode 100644
index 0000000..5702aba
--- /dev/null
+++ b/pkg/analysis_server/lib/src/handler/legacy/server_cancel_request.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2022, 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_generated.dart';
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
+
+/// The handler for the `server.cancelRequest` request.
+class ServerCancelRequestHandler extends LegacyHandler {
+  /// Initialize a newly created handler to be able to service requests for the
+  /// [server].
+  ServerCancelRequestHandler(AnalysisServer server, Request request,
+      CancellationToken cancellationToken)
+      : super(server, request, cancellationToken);
+
+  @override
+  Future<void> handle() async {
+    final id = ServerCancelRequestParams.fromRequest(request).id;
+    server.cancelRequest(id);
+    sendResult(ServerCancelRequestResult());
+  }
+}
diff --git a/pkg/analysis_server/lib/src/handler/legacy/server_get_version.dart b/pkg/analysis_server/lib/src/handler/legacy/server_get_version.dart
new file mode 100644
index 0000000..21eb232
--- /dev/null
+++ b/pkg/analysis_server/lib/src/handler/legacy/server_get_version.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2022, 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/handler/legacy/legacy_handler.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
+
+/// The handler for the `server.getVersion` request.
+class ServerGetVersionHandler extends LegacyHandler {
+  /// Initialize a newly created handler to be able to service requests for the
+  /// [server].
+  ServerGetVersionHandler(AnalysisServer server, Request request,
+      CancellationToken cancellationToken)
+      : super(server, request, cancellationToken);
+
+  @override
+  Future<void> handle() async {
+    sendResult(ServerGetVersionResult(
+      server.options.reportProtocolVersion ?? PROTOCOL_VERSION,
+    ));
+  }
+}
diff --git a/pkg/analysis_server/lib/src/handler/legacy/server_set_subscriptions.dart b/pkg/analysis_server/lib/src/handler/legacy/server_set_subscriptions.dart
new file mode 100644
index 0000000..67633bf
--- /dev/null
+++ b/pkg/analysis_server/lib/src/handler/legacy/server_set_subscriptions.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2022, 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_generated.dart';
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
+
+/// The handler for the `server.setSubscriptions` request.
+class ServerSetSubscriptionsHandler extends LegacyHandler {
+  /// Initialize a newly created handler to be able to service requests for the
+  /// [server].
+  ServerSetSubscriptionsHandler(AnalysisServer server, Request request,
+      CancellationToken cancellationToken)
+      : super(server, request, cancellationToken);
+
+  @override
+  Future<void> handle() async {
+    try {
+      server.serverServices = ServerSetSubscriptionsParams.fromRequest(request)
+          .subscriptions
+          .toSet();
+      server.requestStatistics?.isNotificationSubscribed =
+          server.serverServices.contains(ServerService.LOG);
+    } on RequestFailure catch (exception) {
+      sendResponse(exception.response);
+      return;
+    }
+    sendResult(ServerSetSubscriptionsResult());
+  }
+}
diff --git a/pkg/analysis_server/test/domain_server_test.dart b/pkg/analysis_server/test/domain_server_test.dart
index b7bfaa8..9c26bd7 100644
--- a/pkg/analysis_server/test/domain_server_test.dart
+++ b/pkg/analysis_server/test/domain_server_test.dart
@@ -5,74 +5,52 @@
 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/domain_server.dart';
-import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
-import 'package:analysis_server/src/utilities/mocks.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/instrumentation/instrumentation.dart';
-import 'package:analyzer/src/generated/sdk.dart';
 import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import 'analysis_server_base.dart';
 import 'constants.dart';
 import 'mocks.dart';
 
 void main() {
-  late AnalysisServer server;
-  late ServerDomainHandler handler;
-  late MockServerChannel serverChannel;
-
-  setUp(() {
-    serverChannel = MockServerChannel();
-    var resourceProvider = MemoryResourceProvider();
-    server = AnalysisServer(
-        serverChannel,
-        resourceProvider,
-        AnalysisServerOptions(),
-        DartSdkManager(''),
-        CrashReportingAttachmentsBuilder.empty,
-        InstrumentationService.NULL_SERVICE);
-    handler = ServerDomainHandler(server);
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ServerDomainTest);
   });
+}
 
-  group('ServerDomainHandler', () {
-    test('getVersion', () {
-      var request = ServerGetVersionParams().toRequest('0');
-      var response = handler.handleRequest(request, NotCancelableToken())!;
-      expect(
-          response.toJson(),
-          equals({
-            Response.ID: '0',
-            Response.RESULT: {VERSION: PROTOCOL_VERSION}
-          }));
+@reflectiveTest
+class ServerDomainTest extends PubPackageAnalysisServerTest {
+  Future<void> test_getVersion() async {
+    var request = ServerGetVersionParams().toRequest('0');
+    var response = await handleSuccessfulRequest(request);
+    expect(
+        response.toJson(),
+        equals({
+          Response.ID: '0',
+          Response.RESULT: {VERSION: PROTOCOL_VERSION}
+        }));
+  }
+
+  Future<void> test_setSubscriptions_invalidServiceName() async {
+    var request = Request('0', SERVER_REQUEST_SET_SUBSCRIPTIONS, {
+      SUBSCRIPTIONS: ['noSuchService']
     });
+    var response = await handleRequest(request);
+    expect(response, isResponseFailure('0'));
+  }
 
-    group('setSubscriptions', () {
-      test('invalid service name', () {
-        var request = Request('0', SERVER_REQUEST_SET_SUBSCRIPTIONS, {
-          SUBSCRIPTIONS: ['noSuchService']
-        });
-        var response = handler.handleRequest(request, NotCancelableToken());
-        expect(response, isResponseFailure('0'));
-      });
+  Future<void> test_setSubscriptions_success() async {
+    expect(server.serverServices, isEmpty);
+    // send request
+    var request =
+        ServerSetSubscriptionsParams([ServerService.STATUS]).toRequest('0');
+    await handleSuccessfulRequest(request);
+    // set of services has been changed
+    expect(server.serverServices, contains(ServerService.STATUS));
+  }
 
-      test('success', () {
-        expect(server.serverServices, isEmpty);
-        // send request
-        var request =
-            ServerSetSubscriptionsParams([ServerService.STATUS]).toRequest('0');
-        var response = handler.handleRequest(request, NotCancelableToken());
-        expect(response, isResponseSuccess('0'));
-        // set of services has been changed
-        expect(server.serverServices, contains(ServerService.STATUS));
-      });
-    });
-
-    test('shutdown', () async {
-      var request = ServerShutdownParams().toRequest('0');
-      var response = await serverChannel.sendRequest(request);
-      expect(response, isResponseSuccess('0'));
-    });
-  });
+  Future<void> test_shutdown() async {
+    var request = ServerShutdownParams().toRequest('0');
+    await handleSuccessfulRequest(request);
+  }
 }
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 2aef55f..38658de 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -145,6 +145,8 @@
 vm_snapshot_analysis/test/*: SkipByDesign # Only meant to run on vm
 
 [ $system == windows ]
+dds/test/devtools_server/devtools_server_connection_test: Pass, Slow
+dds/test/devtools_server/devtools_server_test: Pass, Slow
 front_end/test/fasta/bootstrap_test: Skip # Issue 31902
 front_end/test/fasta/strong_test: Pass, Slow, Timeout
 front_end/test/fasta/text_serialization_test: Pass, Slow, Timeout
diff --git a/tools/VERSION b/tools/VERSION
index 40589b0..0ec8410 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 265
+PRERELEASE 266
 PRERELEASE_PATCH 0
\ No newline at end of file