blob: 1df1d6dc6b56f8fe6e1ad07dbc6c43d5373c553b [file] [log] [blame]
// Copyright (c) 2024, 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:collection';
import 'package:analysis_server/lsp_protocol/protocol.dart' as lsp;
import 'package:analysis_server/protocol/protocol.dart' as legacy;
import 'package:analysis_server/protocol/protocol_constants.dart';
import 'package:analysis_server/protocol/protocol_generated.dart';
import 'package:analysis_server/src/server/message_scheduler.dart';
import 'package:analyzer/src/util/performance/operation_performance.dart';
import 'package:analyzer_utilities/testing/tree_string_sink.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
void main() {
defineReflectiveSuite(() {
defineReflectiveTests(MessageSchedulerTest);
});
}
@reflectiveTest
class MessageSchedulerTest {
late MessageScheduler messageScheduler;
DtdMessage get dtdMessage {
return DtdMessage(
message: lspRquest,
performance: OperationPerformanceImpl('<root>'),
completer: Completer());
}
legacy.Request get legacyRequest {
var params = AnalysisSetAnalysisRootsParams(['a', 'b', 'c'], ['d', 'e']);
return legacy.Request('1', ANALYSIS_REQUEST_SET_ANALYSIS_ROOTS,
params.toJson(clientUriConverter: null));
}
lsp.RequestMessage get lspRquest {
var params = {'processId': 'invalid'};
return lsp.RequestMessage(
id: lsp.Either2<int, String>.t1(1),
method: lsp.Method.initialize,
params: params,
jsonrpc: lsp.jsonRpcVersion,
);
}
void setUp() {
messageScheduler = MessageScheduler();
}
void test_addMultipleToQueue() {
messageScheduler.add(LegacyMessage(request: legacyRequest));
messageScheduler.add(LspMessage(message: lspRquest));
messageScheduler.add(dtdMessage);
_assertQueueContents(r'''
incomingMessages
LegacyMessage
method: analysis.setAnalysisRoots
LspMessage
method: initialize
DtdMessage
method: initialize
''');
}
void test_addSingleToQueue() {
messageScheduler.add(LspMessage(message: lspRquest));
_assertQueueContents(r'''
incomingMessages
LspMessage
method: initialize
''');
}
void _assertQueueContents(String expected) {
var actual = _getQueueContents(messageScheduler.incomingMessages);
if (actual != expected) {
print('-------- Actual --------');
print('$actual------------------------');
}
expect(actual, expected);
}
String _getQueueContents(ListQueue<MessageObject> queue) {
var buffer = StringBuffer();
var sink = TreeStringSink(sink: buffer, indent: ' ');
sink.writeln('incomingMessages');
while (queue.isNotEmpty) {
var message = queue.removeFirst();
switch (message) {
case DtdMessage():
sink.writelnWithIndent('DtdMessage');
sink.withIndent(() {
sink.writelnWithIndent(
'method: ${message.message.method.toString()}');
});
case LegacyMessage():
sink.writelnWithIndent('LegacyMessage');
sink.withIndent(() {
sink.writelnWithIndent(
'method: ${message.request.method.toString()}');
});
case LspMessage():
sink.writelnWithIndent('LspMessage');
var msg = message.message;
if (msg case lsp.RequestMessage()) {
sink.withIndent(() {
sink.writelnWithIndent('method: ${msg.method.toString()}');
});
}
}
}
return buffer.toString();
}
}