diff --git a/lib/web_ui/dev/felt.dart b/lib/web_ui/dev/felt.dart index a81d4bcafc727..8e8817ec99391 100644 --- a/lib/web_ui/dev/felt.dart +++ b/lib/web_ui/dev/felt.dart @@ -47,12 +47,18 @@ void main(List args) async { } on ToolException catch (e) { io.stderr.writeln(e.message); exitCode = 1; + } on ProcessException catch (e) { + io.stderr.writeln('description: ${e.description}' + 'executable: ${e.executable} ' + 'arguments: ${e.arguments} ' + 'exit code: ${e.exitCode}'); + exitCode = e.exitCode; } catch (e) { rethrow; } finally { await cleanup(); // The exit code is changed by one of the branches. - if(exitCode != -1) { + if (exitCode != -1) { io.exit(exitCode); } } diff --git a/lib/web_ui/dev/macos_info.dart b/lib/web_ui/dev/macos_info.dart new file mode 100644 index 0000000000000..40742c1e84943 --- /dev/null +++ b/lib/web_ui/dev/macos_info.dart @@ -0,0 +1,70 @@ +// Copyright 2013 The Flutter 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 'utils.dart'; + +class MacOSInfo { + /// Print information collected from the operating system. + /// + /// Built in tools such as `system_profiler` and `defaults` are utilized. + Future printInformation() async { + try { + await _printSafariApplications(); + } catch (error) { + print('Error thrown while getting Safari Applications: $error'); + } + + try { + await _printSafariDefaults(); + } catch (error) { + print('Error thrown while getting Safari defaults: $error'); + } + + try { + await _printUserLimits(); + } catch (error) { + print('Error thrown while getting user limits defaults: $error'); + } + } + + /// Print information on applications in the system that contains string + /// `Safari`. + Future _printSafariApplications() async { + final String systemProfileJson = await evalProcess( + 'system_profiler', ['SPApplicationsDataType', '-json']); + + final Map json = + jsonDecode(systemProfileJson) as Map; + final List systemProfile = json.values.first as List; + for (int i = 0; i < systemProfile.length; i++) { + final Map application = + systemProfile[i] as Map; + final String applicationName = application['_name'] as String; + if (applicationName.contains('Safari')) { + print('application: $applicationName ' + 'fullInfo: ${application.toString()}'); + } + } + } + + /// Print all the defaults in the system related to Safari. + Future _printSafariDefaults() async { + final String defaults = + await evalProcess('/usr/bin/defaults', ['find', 'Safari']); + + print('Safari related defaults:\n $defaults'); + } + + /// Print user limits (file and process). + Future _printUserLimits() async { + final String fileLimit = await evalProcess('ulimit', ['-n']); + + print('MacOS file limit: $fileLimit'); + + final String processLimit = await evalProcess('ulimit', ['-u']); + + print('MacOS process limit: $processLimit'); + } +} diff --git a/lib/web_ui/dev/test_runner.dart b/lib/web_ui/dev/test_runner.dart index ec03447ccf4ae..e6cad8771fb29 100644 --- a/lib/web_ui/dev/test_runner.dart +++ b/lib/web_ui/dev/test_runner.dart @@ -16,9 +16,11 @@ import 'package:test_core/src/executable.dart' as test; // ignore: implementation_imports import 'package:simulators/simulator_manager.dart'; +import 'common.dart'; import 'environment.dart'; import 'exceptions.dart'; import 'integration_tests_manager.dart'; +import 'macos_info.dart'; import 'safari_installation.dart'; import 'supported_browsers.dart'; import 'test_platform.dart'; @@ -124,6 +126,16 @@ class TestCommand extends Command with ArgUtils { // Check the flags to see what type of integration tests are requested. testTypesRequested = findTestType(); + if (isSafariOnMacOS) { + /// Collect information on the bot. + final MacOSInfo macOsInfo = new MacOSInfo(); + await macOsInfo.printInformation(); + /// Tests may fail on the CI, therefore exit test_runner. + if (isLuci) { + return true; + } + } + switch (testTypesRequested) { case TestTypesRequested.unit: return runUnitTests();