blob: ae9c8db8db52e6ebc733766a5d65add3483dbd20 [file] [log] [blame]
// Copyright (c) 2019, 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.
@TestOn('vm')
@Timeout(Duration(minutes: 2))
library;
import 'dart:io';
import 'package:test/test.dart';
import 'package:test_common/test_sdk_configuration.dart';
import 'package:vm_service/vm_service.dart';
import 'package:vm_service/vm_service_io.dart';
import 'fixtures/context.dart';
import 'fixtures/project.dart';
import 'fixtures/utilities.dart';
void main() {
final provider = TestSdkConfigurationProvider();
tearDownAll(provider.dispose);
final context = TestContext(TestProject.test, provider);
setUpAll(() async {
// Disable DDS as we're testing DWDS behavior.
await context.setUp(
debugSettings: TestDebugSettings.noDevTools().copyWith(spawnDds: false),
);
});
tearDownAll(() async {
await context.tearDown();
});
test('Refuses connections without the auth token', () async {
expect(
vmServiceConnectUri('ws://localhost:${context.debugConnection.port}/ws'),
throwsA(isA<WebSocketException>()),
);
});
test('Accepts connections with the auth token', () async {
expect(
vmServiceConnectUri(
'${context.debugConnection.uri}/ws',
).then((client) => client.dispose()),
completes,
);
});
test('Refuses additional connections when in single client mode', () async {
final fakeDds = await vmServiceConnectUri(
'${context.debugConnection.uri}/ws',
);
final result = await fakeDds.callMethod(
'_yieldControlToDDS',
args: {'uri': 'http://localhost:123'},
);
expect(result, isA<Success>());
// While DDS is connected, expect additional connections to fail.
await expectLater(
vmServiceConnectUri('${context.debugConnection.uri}/ws'),
throwsA(isA<WebSocketException>()),
);
// However, once DDS is disconnected, additional clients can connect again.
await fakeDds.dispose();
expect(
vmServiceConnectUri(
'${context.debugConnection.uri}/ws',
).then((client) => client.dispose()),
completes,
);
});
test('Refuses to yield to dwds if existing clients found', () async {
final fakeDds = await vmServiceConnectUri(
'${context.debugConnection.uri}/ws',
);
// Connect to vm service.
final client = await vmServiceConnectUri(
'${context.debugConnection.uri}/ws',
);
final result = await fakeDds.callMethod(
'_yieldControlToDDS',
args: {'uri': 'http://localhost:123'},
);
expect(result, isA<Success>());
// The other VM service client should be closed automatically.
await client.onDone;
await fakeDds.dispose();
});
}