blob: 8d830e857bdc2464eb48065ea1d6fb4aee39cefe [file]
// 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.
import 'dart:io';
import 'package:build_daemon/data/build_status.dart' as daemon;
import 'package:dwds/data/build_result.dart';
import 'package:dwds/dwds.dart';
import 'package:http_multi_server/http_multi_server.dart';
import 'package:logging/logging.dart';
import 'package:shelf/shelf.dart';
import 'package:shelf/shelf_io.dart' as shelf_io;
import 'package:shelf_proxy/shelf_proxy.dart';
import 'package:test/test.dart';
import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart';
class TestServer {
final HttpServer _server;
final String target;
final Dwds dwds;
final Stream<BuildResult> buildResults;
final AssetReader assetReader;
TestServer._(
this.target,
this._server,
this.dwds,
this.buildResults,
bool autoRun,
this.assetReader,
) {
if (autoRun) {
dwds.connectedApps.listen((connection) {
connection.runMain();
});
}
}
String get host => _server.address.host;
int get port => _server.port;
Future<void> stop() async {
await dwds.stop();
await _server.close(force: true);
}
static Future<TestServer> start(
String hostname,
int port,
int assetServerPort,
String target,
Stream<daemon.BuildResults> buildResults,
Future<ChromeConnection> Function() chromeConnection,
ReloadConfiguration reloadConfiguration,
bool serveDevTools,
bool enableDebugExtension,
bool autoRun,
bool enableDebugging,
UrlEncoder urlEncoder,
bool restoreBreakpoints) async {
var pipeline = const Pipeline();
var filteredBuildResults = buildResults.asyncMap<BuildResult>((results) {
var result =
results.results.firstWhere((result) => result.target == target);
switch (result.status) {
case daemon.BuildStatus.started:
return BuildResult((b) => b.status = BuildStatus.started);
case daemon.BuildStatus.failed:
return BuildResult((b) => b.status = BuildStatus.failed);
case daemon.BuildStatus.succeeded:
return BuildResult((b) => b.status = BuildStatus.succeeded);
}
throw StateError('Unexpected Daemon build result: $result');
});
var logWriter = (Level level, String message) => printOnFailure(message);
var assetReader = ProxyServerAssetReader(
assetServerPort, target, 'localhost', port, logWriter);
var dwds = await Dwds.start(
assetReader: assetReader,
buildResults: filteredBuildResults,
chromeConnection: chromeConnection,
logWriter: logWriter,
reloadConfiguration: reloadConfiguration,
serveDevTools: serveDevTools,
enableDebugExtension: enableDebugExtension,
enableDebugging: enableDebugging,
hostname: hostname,
verbose: true,
urlEncoder: urlEncoder,
// ignore: deprecated_member_use_from_same_package
restoreBreakpoints: restoreBreakpoints,
);
var server = await HttpMultiServer.bind('localhost', port);
shelf_io.serveRequests(
server,
pipeline.addMiddleware(dwds.middleware).addHandler(Cascade()
.add(dwds.handler)
.add(proxyHandler('http://localhost:$assetServerPort/$target/'))
.handler));
return TestServer._(
target,
server,
dwds,
filteredBuildResults,
autoRun,
assetReader,
);
}
}