2020-07-15 21:30:09 +00:00
|
|
|
// Copyright (c) 2020, 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:convert';
|
|
|
|
import 'dart:io';
|
|
|
|
|
|
|
|
import 'package:dds/dds.dart';
|
|
|
|
import 'package:shelf/shelf.dart' as shelf;
|
|
|
|
import 'package:shelf/shelf_io.dart' as io;
|
|
|
|
import 'package:shelf_static/shelf_static.dart';
|
|
|
|
import 'package:sse/server/sse_handler.dart';
|
|
|
|
import 'package:test/test.dart';
|
|
|
|
import 'package:vm_service/vm_service.dart' as service;
|
|
|
|
import 'package:webdriver/io.dart';
|
|
|
|
|
|
|
|
import 'common/test_helper.dart';
|
|
|
|
|
|
|
|
// NOTE: this test requires that Chrome is available via PATH or CHROME_PATH
|
|
|
|
// environment variables.
|
|
|
|
|
|
|
|
void main() {
|
2021-05-24 16:59:23 +00:00
|
|
|
late Process chromeDriver;
|
|
|
|
late DartDevelopmentService dds;
|
|
|
|
late SseHandler handler;
|
|
|
|
Process? process;
|
|
|
|
late HttpServer server;
|
|
|
|
late WebDriver webdriver;
|
2020-07-15 21:30:09 +00:00
|
|
|
|
|
|
|
setUpAll(() async {
|
|
|
|
final chromedriverUri = Platform.script.resolveUri(
|
|
|
|
Uri.parse('../../../third_party/webdriver/chrome/chromedriver'));
|
|
|
|
try {
|
|
|
|
chromeDriver = await Process.start(chromedriverUri.path, [
|
|
|
|
'--port=4444',
|
|
|
|
'--url-base=wd/hub',
|
|
|
|
]);
|
|
|
|
} catch (e) {
|
|
|
|
throw StateError(
|
|
|
|
'Could not start ChromeDriver. Is it installed?\nError: $e');
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
tearDownAll(() {
|
|
|
|
chromeDriver.kill();
|
|
|
|
});
|
|
|
|
|
|
|
|
group('DDS', () {
|
|
|
|
setUp(() async {
|
|
|
|
process = await spawnDartProcess('smoke.dart');
|
|
|
|
|
|
|
|
handler = SseHandler(Uri.parse('/test'));
|
|
|
|
final cascade = shelf.Cascade()
|
|
|
|
.add(handler.handler)
|
|
|
|
.add(_faviconHandler)
|
|
|
|
.add(createStaticHandler(Platform.script.resolve('web').path,
|
|
|
|
listDirectories: true, defaultDocument: 'index.html'));
|
|
|
|
|
|
|
|
server = await io.serve(cascade.handler, 'localhost', 0);
|
|
|
|
|
|
|
|
final capabilities = Capabilities.chrome
|
|
|
|
..addAll({
|
|
|
|
Capabilities.chromeOptions: {
|
|
|
|
'args': ['--headless'],
|
|
|
|
'binary': Platform.environment['CHROME_PATH'] ?? '',
|
|
|
|
},
|
|
|
|
});
|
|
|
|
webdriver = await createDriver(
|
|
|
|
desired: capabilities,
|
|
|
|
);
|
|
|
|
});
|
|
|
|
|
|
|
|
tearDown(() async {
|
2021-05-24 16:59:23 +00:00
|
|
|
await dds.shutdown();
|
2020-07-15 21:30:09 +00:00
|
|
|
process?.kill();
|
|
|
|
await webdriver.quit();
|
|
|
|
await server.close();
|
|
|
|
process = null;
|
|
|
|
});
|
|
|
|
|
|
|
|
void createTest(bool useAuthCodes) {
|
|
|
|
test(
|
|
|
|
'SSE Smoke Test with ${useAuthCodes ? "" : "no "}authentication codes',
|
|
|
|
() async {
|
|
|
|
dds = await DartDevelopmentService.startDartDevelopmentService(
|
|
|
|
remoteVmServiceUri,
|
|
|
|
serviceUri: Uri.parse('http://localhost:0'),
|
|
|
|
enableAuthCodes: useAuthCodes,
|
|
|
|
);
|
|
|
|
expect(dds.isRunning, true);
|
|
|
|
await webdriver.get('http://localhost:${server.port}');
|
|
|
|
final testeeConnection = await handler.connections.next;
|
|
|
|
|
2020-09-10 16:44:10 +00:00
|
|
|
// Replace the sse scheme with http as sse isn't supported for CORS.
|
|
|
|
testeeConnection.sink
|
2021-05-24 16:59:23 +00:00
|
|
|
.add(dds.sseUri!.replace(scheme: 'http').toString());
|
2020-07-15 21:30:09 +00:00
|
|
|
final response = json.decode(await testeeConnection.stream.first);
|
2021-05-24 16:59:23 +00:00
|
|
|
final version = service.Version.parse(response)!;
|
|
|
|
expect(version.major! > 0, isTrue);
|
|
|
|
expect(version.minor! >= 0, isTrue);
|
2020-07-15 21:30:09 +00:00
|
|
|
},
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
createTest(true);
|
|
|
|
createTest(false);
|
2021-01-13 21:06:03 +00:00
|
|
|
}, timeout: Timeout.none);
|
2020-07-15 21:30:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
FutureOr<shelf.Response> _faviconHandler(shelf.Request request) {
|
|
|
|
if (request.url.path.endsWith('favicon.ico')) {
|
|
|
|
return shelf.Response.ok('');
|
|
|
|
}
|
|
|
|
return shelf.Response.notFound('');
|
|
|
|
}
|