916272331b
This avoids accidentally using the converter when talking to plugins, (at least for now) URIs are never expected, and file paths should always be used regardless of which mode the server is in. This unfortunately touches a _lot_ of code, so I've pushed in many separate patch sets to Gerrit. Fixes https://github.com/Dart-Code/Dart-Code/issues/5156 Change-Id: I312c3e2cbc35a05a078aaa0138aec7288b3c7dd6 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/373745 Reviewed-by: Samuel Rawlins <srawlins@google.com> Reviewed-by: Brian Wilkerson <brianwilkerson@google.com> Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
225 lines
7.0 KiB
Dart
225 lines
7.0 KiB
Dart
// Copyright (c) 2014, 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/protocol/protocol.dart';
|
|
import 'package:analysis_server/protocol/protocol_generated.dart';
|
|
import 'package:analysis_server/src/protocol/protocol_internal.dart';
|
|
import 'package:test/test.dart';
|
|
import 'package:test_reflective_loader/test_reflective_loader.dart';
|
|
|
|
import 'constants.dart';
|
|
|
|
void main() {
|
|
defineReflectiveSuite(() {
|
|
defineReflectiveTests(NotificationTest);
|
|
defineReflectiveTests(RequestTest);
|
|
defineReflectiveTests(RequestErrorTest);
|
|
defineReflectiveTests(ResponseTest);
|
|
});
|
|
}
|
|
|
|
@reflectiveTest
|
|
class NotificationTest {
|
|
void test_fromJson() {
|
|
var original = Notification('foo');
|
|
var notification = Notification.fromJson(original.toJson());
|
|
expect(notification.event, equals('foo'));
|
|
expect(notification.toJson().keys, isNot(contains('params')));
|
|
}
|
|
|
|
void test_fromJson_withParams() {
|
|
var original = Notification('foo', {'x': 'y'});
|
|
var notification = Notification.fromJson(original.toJson());
|
|
expect(notification.event, equals('foo'));
|
|
expect(notification.toJson()['params'], equals({'x': 'y'}));
|
|
}
|
|
|
|
void test_toJson_noParams() {
|
|
var notification = Notification('foo');
|
|
expect(notification.event, equals('foo'));
|
|
expect(notification.toJson().keys, isNot(contains('params')));
|
|
expect(notification.toJson(), equals({'event': 'foo'}));
|
|
}
|
|
|
|
void test_toJson_withParams() {
|
|
var notification = Notification('foo', {'x': 'y'});
|
|
expect(notification.event, equals('foo'));
|
|
expect(notification.toJson()['params'], equals({'x': 'y'}));
|
|
expect(
|
|
notification.toJson(),
|
|
equals({
|
|
'event': 'foo',
|
|
'params': {'x': 'y'}
|
|
}));
|
|
}
|
|
}
|
|
|
|
@reflectiveTest
|
|
class RequestErrorTest {
|
|
void test_create() {
|
|
var error = RequestError(RequestErrorCode.INVALID_REQUEST, 'msg');
|
|
expect(error.code, RequestErrorCode.INVALID_REQUEST);
|
|
expect(error.message, 'msg');
|
|
expect(error.toJson(clientUriConverter: null),
|
|
equals({CODE: 'INVALID_REQUEST', MESSAGE: 'msg'}));
|
|
}
|
|
|
|
void test_fromJson() {
|
|
var trace = 'a stack trace\r\nfoo';
|
|
var json = {
|
|
CODE: RequestErrorCode.INVALID_PARAMETER.name,
|
|
MESSAGE: 'foo',
|
|
STACK_TRACE: trace
|
|
};
|
|
var error = RequestError.fromJson(ResponseDecoder(null), '', json,
|
|
clientUriConverter: null);
|
|
expect(error.code, RequestErrorCode.INVALID_PARAMETER);
|
|
expect(error.message, 'foo');
|
|
expect(error.stackTrace, trace);
|
|
}
|
|
|
|
void test_toJson() {
|
|
var trace = 'a stack trace\r\nbar';
|
|
var error = RequestError(RequestErrorCode.UNKNOWN_REQUEST, 'msg',
|
|
stackTrace: trace);
|
|
expect(error.toJson(clientUriConverter: null),
|
|
{CODE: 'UNKNOWN_REQUEST', MESSAGE: 'msg', STACK_TRACE: trace});
|
|
}
|
|
}
|
|
|
|
@reflectiveTest
|
|
class RequestTest {
|
|
void test_fromString() {
|
|
var original = Request('one', 'aMethod');
|
|
var jsonData = json.encode(original.toJson());
|
|
var request = Request.fromString(jsonData)!;
|
|
expect(request.id, equals('one'));
|
|
expect(request.method, equals('aMethod'));
|
|
expect(request.clientRequestTime, isNull);
|
|
}
|
|
|
|
void test_fromString_invalidId_notString() {
|
|
var json = '{"id":{"one":"two"},"method":"aMethod","params":{"foo":"bar"}}';
|
|
var request = Request.fromString(json);
|
|
expect(request, isNull);
|
|
}
|
|
|
|
void test_fromString_invalidMethod_notString() {
|
|
var json = '{"id":"one","method":{"boo":"aMethod"},"params":{"foo":"bar"}}';
|
|
var request = Request.fromString(json);
|
|
expect(request, isNull);
|
|
}
|
|
|
|
void test_fromString_invalidParams_notMap() {
|
|
var json = '{"id":"one","method":"aMethod","params":"foobar"}';
|
|
var request = Request.fromString(json);
|
|
expect(request, isNull);
|
|
}
|
|
|
|
void test_fromString_withBadClientTime() {
|
|
var original = Request('one', 'aMethod', null, 347);
|
|
var map = original.toJson();
|
|
// Insert bad value - should be int but client sent string instead
|
|
map[Request.CLIENT_REQUEST_TIME] = '347';
|
|
var jsonData = json.encode(map);
|
|
var request = Request.fromString(jsonData);
|
|
expect(request, isNull);
|
|
}
|
|
|
|
void test_fromString_withClientTime() {
|
|
var original = Request('one', 'aMethod', null, 347);
|
|
var jsonData = json.encode(original.toJson());
|
|
var request = Request.fromString(jsonData)!;
|
|
expect(request.id, equals('one'));
|
|
expect(request.method, equals('aMethod'));
|
|
expect(request.clientRequestTime, 347);
|
|
}
|
|
|
|
void test_fromString_withParams() {
|
|
var original = Request('one', 'aMethod', {'foo': 'bar'});
|
|
var jsonData = json.encode(original.toJson());
|
|
var request = Request.fromString(jsonData)!;
|
|
expect(request.id, equals('one'));
|
|
expect(request.method, equals('aMethod'));
|
|
expect(request.toJson()['params'], equals({'foo': 'bar'}));
|
|
}
|
|
|
|
void test_toJson() {
|
|
var request = Request('one', 'aMethod');
|
|
expect(request.toJson(),
|
|
equals({Request.ID: 'one', Request.METHOD: 'aMethod'}));
|
|
}
|
|
|
|
void test_toJson_withParams() {
|
|
var request = Request('one', 'aMethod', {'foo': 'bar'});
|
|
expect(
|
|
request.toJson(),
|
|
equals({
|
|
Request.ID: 'one',
|
|
Request.METHOD: 'aMethod',
|
|
Request.PARAMS: {'foo': 'bar'}
|
|
}));
|
|
}
|
|
}
|
|
|
|
@reflectiveTest
|
|
class ResponseTest {
|
|
void test_create_invalidRequestFormat() {
|
|
var response = Response.invalidRequestFormat();
|
|
expect(response.id, equals(''));
|
|
expect(response.error, isNotNull);
|
|
expect(
|
|
response.toJson(),
|
|
equals({
|
|
Response.ID: '',
|
|
Response.ERROR: {
|
|
'code': 'INVALID_REQUEST',
|
|
'message': 'Invalid request'
|
|
}
|
|
}));
|
|
}
|
|
|
|
void test_create_unknownRequest() {
|
|
var response = Response.unknownRequest(Request('0', ''));
|
|
expect(response.id, equals('0'));
|
|
expect(response.error, isNotNull);
|
|
expect(
|
|
response.toJson(),
|
|
equals({
|
|
Response.ID: '0',
|
|
Response.ERROR: {
|
|
'code': 'UNKNOWN_REQUEST',
|
|
'message': 'Unknown request'
|
|
}
|
|
}));
|
|
}
|
|
|
|
void test_fromJson() {
|
|
var original = Response('myId');
|
|
var response = Response.fromJson(original.toJson())!;
|
|
expect(response.id, equals('myId'));
|
|
}
|
|
|
|
void test_fromJson_withError() {
|
|
var original = Response.invalidRequestFormat();
|
|
var response = Response.fromJson(original.toJson())!;
|
|
expect(response.id, equals(''));
|
|
expect(response.error, isNotNull);
|
|
var error = response.error!;
|
|
expect(error.code, equals(RequestErrorCode.INVALID_REQUEST));
|
|
expect(error.message, equals('Invalid request'));
|
|
}
|
|
|
|
void test_fromJson_withResult() {
|
|
var original = Response('myId', result: {'foo': 'bar'});
|
|
var response = Response.fromJson(original.toJson())!;
|
|
expect(response.id, equals('myId'));
|
|
var result = response.toJson()['result'] as Map<String, Object?>;
|
|
expect(result.length, equals(1));
|
|
expect(result['foo'], equals('bar'));
|
|
}
|
|
}
|