blob: a2bff8938b9b310ba4890313bd1c12c2d505c710 [file] [log] [blame]
// Copyright 2022 The Chromium Authors. 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 'dart:io';
import 'package:test/test.dart';
import 'utils/server_driver.dart';
late final DevToolsServerTestController testController;
void main() {
testController = DevToolsServerTestController();
final baseHrefRegex = RegExp('<base href="([^"]+)"');
setUp(() async {
await testController.setUp();
});
tearDown(() async {
await testController.tearDown();
});
group('serves index.html', () {
DevToolsServerDriver? server;
late Uri devToolsUrl;
final httpClient = HttpClient();
setUpAll(() async {
server = await DevToolsServerDriver.create();
final startedEvent = (await server!.stdout.firstWhere(
(map) => map!['event'] == 'server.started',
))!;
final host = startedEvent['params']['host'];
final port = startedEvent['params']['port'];
devToolsUrl = Uri(scheme: 'http', host: host, port: port);
});
tearDownAll(() {
httpClient.close(force: true);
server?.kill();
});
test('correct content for /inspector', () async {
final req = await httpClient.getUrl(devToolsUrl.resolve('/inspector'));
final resp = await req.close();
expect(resp.statusCode, 200);
final bodyContent = await resp.transform(utf8.decoder).join();
expect(bodyContent, contains('Dart DevTools'));
}, timeout: const Timeout.factor(10));
test('serves 404 for requests that are not pages', () async {
// The index page is only served up for extension-less requests.
final req =
await httpClient.getUrl(devToolsUrl.resolve('/inspector.html'));
final resp = await req.close();
expect(resp.statusCode, 404);
await resp.drain();
}, timeout: const Timeout.factor(10));
/// A set of test cases to verify base hrefs for.
///
/// The key is a suffix to go after /devtools/ in the URI.
/// The value is the expected base href (which should always resolve back to
/// `/devtools/` or in the case of an extension, the base of the extension).
final testBaseHrefs = {
'': '.',
'inspector': '.',
// TODO(dantup): Is there a way we could verify extension URLs here?
// 'devtools_extensions/foo/': '.',
// 'devtools_extensions/foo/bar': '.',
// 'devtools_extensions/foo/bar/': '..',
// 'devtools_extensions/foo/bar/baz': '../..',
};
for (final MapEntry(key: suffix, value: expectedBaseHref)
in testBaseHrefs.entries) {
test('with correct base href for /$suffix', () async {
final req = await httpClient.getUrl(devToolsUrl.resolve('/inspector'));
final resp = await req.close();
expect(resp.statusCode, 200);
final bodyContent = await resp.transform(utf8.decoder).join();
// Extract the base href so if the test failures, we get a simpler error
// than just the entire content.
final actualBaseHref = baseHrefRegex.firstMatch(bodyContent)!.group(1);
expect(actualBaseHref, htmlEscape.convert(expectedBaseHref));
}, timeout: const Timeout.factor(10));
}
}, timeout: const Timeout.factor(10));
}