blob: 3a557bbf3304296e51b242b22799587d36cbb8af [file] [log] [blame]
// Copyright (c) 2018, 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:convert';
import 'package:analysis_server/src/lsp/lsp_packet_transformer.dart';
import 'package:test/test.dart';
main() {
group('lsp_packet_transformer', () {
test('transforms data received as individual bytes', () async {
final payload = '{ json payload }';
final lspPacket = makeLspPacket(payload);
final output = await new Stream.fromIterable([lspPacket])
.transform(new LspPacketTransformer())
.toList();
expect(output, equals([payload]));
});
test('transforms data received in chunks', () async {
final payload = '{ json\n payload\n }';
final lspPacket = makeLspPacket(payload);
// Separate each byte into it's own "packet" to simulate chunked data
// where all the bytes for a single LSP packet don't arrive in one
// item to the stream.
final dataPackets = lspPacket.map((b) => [b]);
final output = await new Stream.fromIterable(dataPackets)
.transform(new LspPacketTransformer())
.toList();
expect(output, equals([payload]));
});
test('handles unicode characters', () async {
// This file is saved as UTF8.
final payload = '{ json payload 🎉 }';
final lspPacket = makeLspPacket(payload);
final output = await new Stream.fromIterable([lspPacket])
.transform(new LspPacketTransformer())
.toList();
expect(output, equals([payload]));
});
test('accepts "utf-8" as an encoding', () async {
final payload = '{ json payload 🎉 }';
final lspPacket =
makeLspPacket(payload, 'application/vscode-jsonrpc; charset=utf-8');
final output = await new Stream.fromIterable([lspPacket])
.transform(new LspPacketTransformer())
.toList();
expect(output, equals([payload]));
});
test('accepts "utf8" as an encoding', () async {
final payload = '{ json payload 🎉 }';
final lspPacket =
makeLspPacket(payload, 'application/vscode-jsonrpc; charset=utf8');
final output = await new Stream.fromIterable([lspPacket])
.transform(new LspPacketTransformer())
.toList();
expect(output, equals([payload]));
});
test('accepts no encoding', () async {
final payload = '{ json payload 🎉 }';
final lspPacket = makeLspPacket(payload, 'application/vscode-jsonrpc;');
final output = await new Stream.fromIterable([lspPacket])
.transform(new LspPacketTransformer())
.toList();
expect(output, equals([payload]));
});
test('rejects invalid encoding', () async {
final payload = '{ json payload }';
final lspPacket =
makeLspPacket(payload, 'application/vscode-jsonrpc; charset=ascii');
final outputStream = await new Stream.fromIterable([lspPacket])
.transform(new LspPacketTransformer());
expectLater(outputStream.toList(),
throwsA(const TypeMatcher<InvalidEncodingError>()));
});
});
}
List<int> makeLspPacket(String json, [String contentType]) {
final utf8EncodedBody = utf8.encode(json);
final header = 'Content-Length: ${utf8EncodedBody.length}' +
(contentType != null ? '\r\nContent-Type: $contentType' : '') +
'\r\n\r\n';
final asciiEncodedHeader = ascii.encode(header);
return asciiEncodedHeader.followedBy(utf8EncodedBody).toList();
}