blob: 7acbda24fe8ba67964548f6508fcfa13f9a0e269 [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.
// @dart = 2.9
@Timeout(Duration(seconds: 60))
import 'dart:async';
import 'dart:io';
import 'package:logging/logging.dart';
import 'package:test/test.dart';
import 'package:webdev/src/logging.dart';
import 'package:webdev/src/serve/chrome.dart';
import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart';
void main() {
Chrome chrome;
Future<void> launchChrome({int port, String userDataDir}) async {
chrome = await Chrome.start([_googleUrl],
port: port ?? 0, userDataDir: userDataDir);
}
Future<void> openTab(String url) =>
chrome.chromeConnection.getUrl(_openTabUrl(url));
Future<void> closeTab(ChromeTab tab) =>
chrome.chromeConnection.getUrl(_closeTabUrl(tab.id));
Future<WipConnection> connectToTab(String url) async {
var tab = await chrome.chromeConnection.getTab((t) => t.url.contains(url));
expect(tab, isNotNull);
return tab.connect();
}
group('chrome with temp data dir', () {
tearDown(() async {
var tabs = await chrome?.chromeConnection?.getTabs();
if (tabs != null) {
for (var tab in tabs) {
await closeTab(tab);
}
}
await chrome?.close();
chrome = null;
});
test('can launch chrome', () async {
await launchChrome();
expect(chrome, isNotNull);
});
test('has a working debugger', () async {
await launchChrome();
var tabs = await chrome.chromeConnection.getTabs();
expect(
tabs,
contains(const TypeMatcher<ChromeTab>()
.having((t) => t.url, 'url', _googleUrl)));
});
test('uses open debug port if provided port is 0', () async {
await launchChrome(port: 0);
expect(chrome.debugPort, isNot(equals(0)));
});
test('has correct profile path', () async {
await launchChrome();
await openTab(_chromeVersionUrl);
var wipConnection = await connectToTab(_chromeVersionUrl);
var result = await _evaluateExpression(wipConnection.page,
"document.getElementById('profile_path').textContent");
if (Platform.isWindows) {
// --user-data-dir is not supported on Windows yet
// Issue: https://github.com/dart-lang/webdev/issues/1545
expect(result, isNot(contains('chrome_user_data')));
} else {
expect(result, contains('chrome_user_data'));
}
});
});
group('chrome with user data dir', () {
Directory dataDir;
StreamController<String> logController;
Stream<String> logStream;
setUp(() {
logController = StreamController<String>();
logStream = logController.stream;
void _logWriter(Level level, String message,
{String error, String loggerName, String stackTrace}) {
if (level >= Level.INFO) {
logController.add('[$level] $loggerName: $message');
}
}
configureLogWriter(true, customLogWriter: _logWriter);
dataDir = Directory.systemTemp.createTempSync(_userDataDirName);
});
tearDown(() async {
var tabs = await chrome?.chromeConnection?.getTabs();
if (tabs != null) {
for (var tab in tabs) {
await closeTab(tab);
}
}
await chrome?.close();
chrome = null;
// Issue: https://github.com/dart-lang/webdev/issues/1545
if (!Platform.isWindows) {
expect(
logStream,
emitsThrough(matches('Starting chrome with user data directory:'
'.*chrome_user_data_copy')));
await logController.close();
}
dataDir?.deleteSync(recursive: true);
});
test('works with debug port', () async {
await launchChrome(userDataDir: dataDir.path);
expect(chrome, isNotNull);
});
test('has a working debugger', () async {
await launchChrome(userDataDir: dataDir.path);
var tabs = await chrome.chromeConnection.getTabs();
expect(
tabs,
contains(const TypeMatcher<ChromeTab>()
.having((t) => t.url, 'url', _googleUrl)));
});
test('has correct profile path', () async {
await launchChrome(userDataDir: dataDir.path);
await openTab(_chromeVersionUrl);
var wipConnection = await connectToTab(_chromeVersionUrl);
var result = await _evaluateExpression(wipConnection.page,
"document.getElementById('profile_path').textContent");
if (Platform.isWindows) {
// --user-data-dir is not supported on Windows yet
// Issue: https://github.com/dart-lang/webdev/issues/1545
expect(result, isNot(contains('chrome_user_data_copy')));
} else {
expect(result, contains('chrome_user_data_copy'));
}
});
test('can auto detect default chrome directory', () async {
var userDataDir = autoDetectChromeUserDataDirectory();
expect(userDataDir, isNotNull);
expect(Directory(userDataDir).existsSync(), isTrue);
await launchChrome(userDataDir: userDataDir);
await openTab(_chromeVersionUrl);
var wipConnection = await connectToTab(_chromeVersionUrl);
var result = await _evaluateExpression(wipConnection.page,
"document.getElementById('profile_path').textContent");
expect(result, contains('chrome_user_data_copy'));
}, onPlatform: {
'windows': const Skip('https://github.com/dart-lang/webdev/issues/1545')
});
test('cannot auto detect default chrome directory on windows', () async {
var userDataDir = autoDetectChromeUserDataDirectory();
expect(userDataDir, isNull);
}, onPlatform: {
'linux': const Skip('https://github.com/dart-lang/webdev/issues/1545'),
'mac-os': const Skip('https://github.com/dart-lang/webdev/issues/1545'),
});
});
}
String _openTabUrl(String url) => '/json/new?$url';
String _closeTabUrl(String id) => '/json/close/$id';
Future<String> _evaluateExpression(WipPage page, String expression) async {
var result = '';
while (result == null || result.isEmpty) {
await Future.delayed(const Duration(milliseconds: 100));
var wipResponse = await page.sendCommand(
'Runtime.evaluate',
params: {'expression': expression},
);
result = wipResponse.json['result']['result']['value'] as String;
}
return result;
}
const _googleUrl = 'https://www.google.com/';
const _chromeVersionUrl = 'chrome://version/';
const _userDataDirName = 'data dir';