OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 /** | 5 /** |
6 * Classes and methods for executing tests. | 6 * Classes and methods for executing tests. |
7 * | 7 * |
8 * This module includes: | 8 * This module includes: |
9 * - Managing parallel execution of tests, including timeout checks. | 9 * - Managing parallel execution of tests, including timeout checks. |
10 * - Evaluating the output of each test as pass/fail/crash/timeout. | 10 * - Evaluating the output of each test as pass/fail/crash/timeout. |
(...skipping 726 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
737 | 737 |
738 CommandOutput get lastCommandOutput { | 738 CommandOutput get lastCommandOutput { |
739 if (commandOutputs.length == 0) { | 739 if (commandOutputs.length == 0) { |
740 throw new Exception("CommandOutputs is empty, maybe no command was run? (" | 740 throw new Exception("CommandOutputs is empty, maybe no command was run? (" |
741 "displayName: '$displayName', " | 741 "displayName: '$displayName', " |
742 "configurationString: '$configurationString')"); | 742 "configurationString: '$configurationString')"); |
743 } | 743 } |
744 return commandOutputs[commands[commandOutputs.length - 1]]; | 744 return commandOutputs[commands[commandOutputs.length - 1]]; |
745 } | 745 } |
746 | 746 |
| 747 Command get lastCommandExecuted { |
| 748 if (commandOutputs.length == 0) { |
| 749 throw new Exception("CommandOutputs is empty, maybe no command was run? (" |
| 750 "displayName: '$displayName', " |
| 751 "configurationString: '$configurationString')"); |
| 752 } |
| 753 return commands[commandOutputs.length - 1]; |
| 754 } |
| 755 |
747 int get timeout { | 756 int get timeout { |
748 if (expectedOutcomes.contains(Expectation.SLOW)) { | 757 if (expectedOutcomes.contains(Expectation.SLOW)) { |
749 return configuration['timeout'] * SLOW_TIMEOUT_MULTIPLIER; | 758 return configuration['timeout'] * SLOW_TIMEOUT_MULTIPLIER; |
750 } else { | 759 } else { |
751 return configuration['timeout']; | 760 return configuration['timeout']; |
752 } | 761 } |
753 } | 762 } |
754 | 763 |
755 String get configurationString { | 764 String get configurationString { |
756 final compiler = configuration['compiler']; | 765 final compiler = configuration['compiler']; |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
864 class CommandOutputImpl extends UniqueObject implements CommandOutput { | 873 class CommandOutputImpl extends UniqueObject implements CommandOutput { |
865 Command command; | 874 Command command; |
866 int exitCode; | 875 int exitCode; |
867 | 876 |
868 bool timedOut; | 877 bool timedOut; |
869 List<int> stdout; | 878 List<int> stdout; |
870 List<int> stderr; | 879 List<int> stderr; |
871 Duration time; | 880 Duration time; |
872 List<String> diagnostics; | 881 List<String> diagnostics; |
873 bool compilationSkipped; | 882 bool compilationSkipped; |
| 883 int pid; |
874 | 884 |
875 /** | 885 /** |
876 * A flag to indicate we have already printed a warning about ignoring the VM | 886 * A flag to indicate we have already printed a warning about ignoring the VM |
877 * crash, to limit the amount of output produced per test. | 887 * crash, to limit the amount of output produced per test. |
878 */ | 888 */ |
879 bool alreadyPrintedWarning = false; | 889 bool alreadyPrintedWarning = false; |
880 | 890 |
881 // TODO(kustermann): Remove testCase from this class. | 891 // TODO(kustermann): Remove testCase from this class. |
882 CommandOutputImpl(Command this.command, | 892 CommandOutputImpl(Command this.command, |
883 int this.exitCode, | 893 int this.exitCode, |
884 bool this.timedOut, | 894 bool this.timedOut, |
885 List<int> this.stdout, | 895 List<int> this.stdout, |
886 List<int> this.stderr, | 896 List<int> this.stderr, |
887 Duration this.time, | 897 Duration this.time, |
888 bool this.compilationSkipped) { | 898 bool this.compilationSkipped, |
| 899 int this.pid) { |
889 diagnostics = []; | 900 diagnostics = []; |
890 } | 901 } |
891 | 902 |
892 Expectation result(TestCase testCase) { | 903 Expectation result(TestCase testCase) { |
893 if (hasCrashed) return Expectation.CRASH; | 904 if (hasCrashed) return Expectation.CRASH; |
894 if (hasTimedOut) return Expectation.TIMEOUT; | 905 if (hasTimedOut) return Expectation.TIMEOUT; |
895 return hasFailed(testCase) ? Expectation.FAIL : Expectation.PASS; | 906 return hasFailed(testCase) ? Expectation.FAIL : Expectation.PASS; |
896 } | 907 } |
897 | 908 |
898 bool get hasCrashed { | 909 bool get hasCrashed { |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
964 stdout, | 975 stdout, |
965 stderr, | 976 stderr, |
966 time, | 977 time, |
967 compilationSkipped) : | 978 compilationSkipped) : |
968 super(command, | 979 super(command, |
969 exitCode, | 980 exitCode, |
970 timedOut, | 981 timedOut, |
971 stdout, | 982 stdout, |
972 stderr, | 983 stderr, |
973 time, | 984 time, |
974 compilationSkipped) { | 985 compilationSkipped, |
| 986 0) { |
975 _failedBecauseOfMissingXDisplay = _didFailBecauseOfMissingXDisplay(); | 987 _failedBecauseOfMissingXDisplay = _didFailBecauseOfMissingXDisplay(); |
976 if (_failedBecauseOfMissingXDisplay) { | 988 if (_failedBecauseOfMissingXDisplay) { |
977 DebugLogger.warning("Warning: Test failure because of missing XDisplay"); | 989 DebugLogger.warning("Warning: Test failure because of missing XDisplay"); |
978 // If we get the X server error, or DRT crashes with a core dump, retry | 990 // If we get the X server error, or DRT crashes with a core dump, retry |
979 // the test. | 991 // the test. |
980 } | 992 } |
981 } | 993 } |
982 | 994 |
983 Expectation result(TestCase testCase) { | 995 Expectation result(TestCase testCase) { |
984 // Handle crashes and timeouts first | 996 // Handle crashes and timeouts first |
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1314 '${indent(result.browserOutput.stderr.toString(), 2)}\n' | 1326 '${indent(result.browserOutput.stderr.toString(), 2)}\n' |
1315 '\n'; | 1327 '\n'; |
1316 return new BrowserControllerTestOutcome._internal( | 1328 return new BrowserControllerTestOutcome._internal( |
1317 command, result, outcome, encodeUtf8(stdout), encodeUtf8(stderr)); | 1329 command, result, outcome, encodeUtf8(stdout), encodeUtf8(stderr)); |
1318 } | 1330 } |
1319 | 1331 |
1320 BrowserControllerTestOutcome._internal( | 1332 BrowserControllerTestOutcome._internal( |
1321 Command command, BrowserTestOutput result, this._rawOutcome, | 1333 Command command, BrowserTestOutput result, this._rawOutcome, |
1322 List<int> stdout, List<int> stderr) | 1334 List<int> stdout, List<int> stderr) |
1323 : super(command, 0, result.didTimeout, stdout, stderr, result.duration, | 1335 : super(command, 0, result.didTimeout, stdout, stderr, result.duration, |
1324 false) { | 1336 false, 0) { |
1325 _result = result; | 1337 _result = result; |
1326 } | 1338 } |
1327 | 1339 |
1328 Expectation result(TestCase testCase) { | 1340 Expectation result(TestCase testCase) { |
1329 // Handle timeouts first | 1341 // Handle timeouts first |
1330 if (_result.didTimeout) return Expectation.TIMEOUT; | 1342 if (_result.didTimeout) return Expectation.TIMEOUT; |
1331 | 1343 |
1332 // Multitests are handled specially | 1344 // Multitests are handled specially |
1333 if (testCase.info != null) { | 1345 if (testCase.info != null) { |
1334 if (testCase.info.hasRuntimeError) { | 1346 if (testCase.info.hasRuntimeError) { |
(...skipping 21 matching lines...) Expand all Loading... |
1356 stdout, | 1368 stdout, |
1357 stderr, | 1369 stderr, |
1358 time, | 1370 time, |
1359 compilationSkipped) : | 1371 compilationSkipped) : |
1360 super(command, | 1372 super(command, |
1361 exitCode, | 1373 exitCode, |
1362 timedOut, | 1374 timedOut, |
1363 stdout, | 1375 stdout, |
1364 stderr, | 1376 stderr, |
1365 time, | 1377 time, |
1366 compilationSkipped); | 1378 compilationSkipped, |
| 1379 0); |
1367 | 1380 |
1368 Expectation result(TestCase testCase) { | 1381 Expectation result(TestCase testCase) { |
1369 // TODO(kustermann): If we run the analyzer not in batch mode, make sure | 1382 // TODO(kustermann): If we run the analyzer not in batch mode, make sure |
1370 // that command.exitCodes matches 2 (errors), 1 (warnings), 0 (no warnings, | 1383 // that command.exitCodes matches 2 (errors), 1 (warnings), 0 (no warnings, |
1371 // no errors) | 1384 // no errors) |
1372 | 1385 |
1373 // Handle crashes and timeouts first | 1386 // Handle crashes and timeouts first |
1374 if (hasCrashed) return Expectation.CRASH; | 1387 if (hasCrashed) return Expectation.CRASH; |
1375 if (hasTimedOut) return Expectation.TIMEOUT; | 1388 if (hasTimedOut) return Expectation.TIMEOUT; |
1376 | 1389 |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1449 } | 1462 } |
1450 } | 1463 } |
1451 } | 1464 } |
1452 | 1465 |
1453 class VmCommandOutputImpl extends CommandOutputImpl | 1466 class VmCommandOutputImpl extends CommandOutputImpl |
1454 with UnittestSuiteMessagesMixin { | 1467 with UnittestSuiteMessagesMixin { |
1455 static const DART_VM_EXITCODE_COMPILE_TIME_ERROR = 254; | 1468 static const DART_VM_EXITCODE_COMPILE_TIME_ERROR = 254; |
1456 static const DART_VM_EXITCODE_UNCAUGHT_EXCEPTION = 255; | 1469 static const DART_VM_EXITCODE_UNCAUGHT_EXCEPTION = 255; |
1457 | 1470 |
1458 VmCommandOutputImpl(Command command, int exitCode, bool timedOut, | 1471 VmCommandOutputImpl(Command command, int exitCode, bool timedOut, |
1459 List<int> stdout, List<int> stderr, Duration time) | 1472 List<int> stdout, List<int> stderr, Duration time, |
1460 : super(command, exitCode, timedOut, stdout, stderr, time, false); | 1473 int pid) |
| 1474 : super(command, exitCode, timedOut, stdout, stderr, time, false, pid); |
1461 | 1475 |
1462 Expectation result(TestCase testCase) { | 1476 Expectation result(TestCase testCase) { |
1463 // Handle crashes and timeouts first | 1477 // Handle crashes and timeouts first |
1464 if (hasCrashed) return Expectation.CRASH; | 1478 if (hasCrashed) return Expectation.CRASH; |
1465 if (hasTimedOut) return Expectation.TIMEOUT; | 1479 if (hasTimedOut) return Expectation.TIMEOUT; |
1466 | 1480 |
1467 // Multitests are handled specially | 1481 // Multitests are handled specially |
1468 if (testCase.info != null) { | 1482 if (testCase.info != null) { |
1469 if (testCase.info.hasCompileError) { | 1483 if (testCase.info.hasCompileError) { |
1470 if (exitCode == DART_VM_EXITCODE_COMPILE_TIME_ERROR) { | 1484 if (exitCode == DART_VM_EXITCODE_COMPILE_TIME_ERROR) { |
(...skipping 29 matching lines...) Expand all Loading... |
1500 } | 1514 } |
1501 } | 1515 } |
1502 | 1516 |
1503 class CompilationCommandOutputImpl extends CommandOutputImpl { | 1517 class CompilationCommandOutputImpl extends CommandOutputImpl { |
1504 static const DART2JS_EXITCODE_CRASH = 253; | 1518 static const DART2JS_EXITCODE_CRASH = 253; |
1505 | 1519 |
1506 CompilationCommandOutputImpl(Command command, int exitCode, bool timedOut, | 1520 CompilationCommandOutputImpl(Command command, int exitCode, bool timedOut, |
1507 List<int> stdout, List<int> stderr, Duration time, | 1521 List<int> stdout, List<int> stderr, Duration time, |
1508 bool compilationSkipped) | 1522 bool compilationSkipped) |
1509 : super(command, exitCode, timedOut, stdout, stderr, time, | 1523 : super(command, exitCode, timedOut, stdout, stderr, time, |
1510 compilationSkipped); | 1524 compilationSkipped, 0); |
1511 | 1525 |
1512 Expectation result(TestCase testCase) { | 1526 Expectation result(TestCase testCase) { |
1513 // Handle general crash/timeout detection. | 1527 // Handle general crash/timeout detection. |
1514 if (hasCrashed) return Expectation.CRASH; | 1528 if (hasCrashed) return Expectation.CRASH; |
1515 if (hasTimedOut) return Expectation.TIMEOUT; | 1529 if (hasTimedOut) return Expectation.TIMEOUT; |
1516 | 1530 |
1517 // Handle dart2js/dart2dart specific crash detection | 1531 // Handle dart2js/dart2dart specific crash detection |
1518 if (exitCode == DART2JS_EXITCODE_CRASH || | 1532 if (exitCode == DART2JS_EXITCODE_CRASH || |
1519 exitCode == VmCommandOutputImpl.DART_VM_EXITCODE_COMPILE_TIME_ERROR || | 1533 exitCode == VmCommandOutputImpl.DART_VM_EXITCODE_COMPILE_TIME_ERROR || |
1520 exitCode == VmCommandOutputImpl.DART_VM_EXITCODE_UNCAUGHT_EXCEPTION) { | 1534 exitCode == VmCommandOutputImpl.DART_VM_EXITCODE_UNCAUGHT_EXCEPTION) { |
(...skipping 23 matching lines...) Expand all Loading... |
1544 Expectation outcome = | 1558 Expectation outcome = |
1545 exitCode == 0 ? Expectation.PASS : Expectation.COMPILETIME_ERROR; | 1559 exitCode == 0 ? Expectation.PASS : Expectation.COMPILETIME_ERROR; |
1546 return _negateOutcomeIfNegativeTest(outcome, testCase.isNegative); | 1560 return _negateOutcomeIfNegativeTest(outcome, testCase.isNegative); |
1547 } | 1561 } |
1548 } | 1562 } |
1549 | 1563 |
1550 class JsCommandlineOutputImpl extends CommandOutputImpl | 1564 class JsCommandlineOutputImpl extends CommandOutputImpl |
1551 with UnittestSuiteMessagesMixin { | 1565 with UnittestSuiteMessagesMixin { |
1552 JsCommandlineOutputImpl(Command command, int exitCode, bool timedOut, | 1566 JsCommandlineOutputImpl(Command command, int exitCode, bool timedOut, |
1553 List<int> stdout, List<int> stderr, Duration time) | 1567 List<int> stdout, List<int> stderr, Duration time) |
1554 : super(command, exitCode, timedOut, stdout, stderr, time, false); | 1568 : super(command, exitCode, timedOut, stdout, stderr, time, false, 0); |
1555 | 1569 |
1556 Expectation result(TestCase testCase) { | 1570 Expectation result(TestCase testCase) { |
1557 // Handle crashes and timeouts first | 1571 // Handle crashes and timeouts first |
1558 if (hasCrashed) return Expectation.CRASH; | 1572 if (hasCrashed) return Expectation.CRASH; |
1559 if (hasTimedOut) return Expectation.TIMEOUT; | 1573 if (hasTimedOut) return Expectation.TIMEOUT; |
1560 | 1574 |
1561 if (testCase.info != null && testCase.info.hasRuntimeError) { | 1575 if (testCase.info != null && testCase.info.hasRuntimeError) { |
1562 if (exitCode != 0) return Expectation.PASS; | 1576 if (exitCode != 0) return Expectation.PASS; |
1563 return Expectation.MISSING_RUNTIME_ERROR; | 1577 return Expectation.MISSING_RUNTIME_ERROR; |
1564 } | 1578 } |
1565 | 1579 |
1566 var outcome = exitCode == 0 ? Expectation.PASS : Expectation.RUNTIME_ERROR; | 1580 var outcome = exitCode == 0 ? Expectation.PASS : Expectation.RUNTIME_ERROR; |
1567 outcome = _negateOutcomeIfIncompleteAsyncTest(outcome, decodeUtf8(stdout)); | 1581 outcome = _negateOutcomeIfIncompleteAsyncTest(outcome, decodeUtf8(stdout)); |
1568 return _negateOutcomeIfNegativeTest(outcome, testCase.isNegative); | 1582 return _negateOutcomeIfNegativeTest(outcome, testCase.isNegative); |
1569 } | 1583 } |
1570 } | 1584 } |
1571 | 1585 |
1572 class PubCommandOutputImpl extends CommandOutputImpl { | 1586 class PubCommandOutputImpl extends CommandOutputImpl { |
1573 PubCommandOutputImpl(PubCommand command, int exitCode, bool timedOut, | 1587 PubCommandOutputImpl(PubCommand command, int exitCode, bool timedOut, |
1574 List<int> stdout, List<int> stderr, Duration time) | 1588 List<int> stdout, List<int> stderr, Duration time) |
1575 : super(command, exitCode, timedOut, stdout, stderr, time, false); | 1589 : super(command, exitCode, timedOut, stdout, stderr, time, false, 0); |
1576 | 1590 |
1577 Expectation result(TestCase testCase) { | 1591 Expectation result(TestCase testCase) { |
1578 // Handle crashes and timeouts first | 1592 // Handle crashes and timeouts first |
1579 if (hasCrashed) return Expectation.CRASH; | 1593 if (hasCrashed) return Expectation.CRASH; |
1580 if (hasTimedOut) return Expectation.TIMEOUT; | 1594 if (hasTimedOut) return Expectation.TIMEOUT; |
1581 | 1595 |
1582 if (exitCode == 0) { | 1596 if (exitCode == 0) { |
1583 return Expectation.PASS; | 1597 return Expectation.PASS; |
1584 } else if ((command as PubCommand).command == 'get') { | 1598 } else if ((command as PubCommand).command == 'get') { |
1585 return Expectation.PUB_GET_ERROR; | 1599 return Expectation.PUB_GET_ERROR; |
1586 } else { | 1600 } else { |
1587 return Expectation.FAIL; | 1601 return Expectation.FAIL; |
1588 } | 1602 } |
1589 } | 1603 } |
1590 } | 1604 } |
1591 | 1605 |
1592 class ScriptCommandOutputImpl extends CommandOutputImpl { | 1606 class ScriptCommandOutputImpl extends CommandOutputImpl { |
1593 final Expectation _result; | 1607 final Expectation _result; |
1594 | 1608 |
1595 ScriptCommandOutputImpl(ScriptCommand command, this._result, | 1609 ScriptCommandOutputImpl(ScriptCommand command, this._result, |
1596 String scriptExecutionInformation, Duration time) | 1610 String scriptExecutionInformation, Duration time) |
1597 : super(command, 0, false, [], [], time, false) { | 1611 : super(command, 0, false, [], [], time, false, 0) { |
1598 var lines = scriptExecutionInformation.split("\n"); | 1612 var lines = scriptExecutionInformation.split("\n"); |
1599 diagnostics.addAll(lines); | 1613 diagnostics.addAll(lines); |
1600 } | 1614 } |
1601 | 1615 |
1602 Expectation result(TestCase testCase) => _result; | 1616 Expectation result(TestCase testCase) => _result; |
1603 | 1617 |
1604 bool get canRunDependendCommands => _result == Expectation.PASS; | 1618 bool get canRunDependendCommands => _result == Expectation.PASS; |
1605 | 1619 |
1606 bool get successful => _result == Expectation.PASS; | 1620 bool get successful => _result == Expectation.PASS; |
1607 | 1621 |
1608 } | 1622 } |
1609 | 1623 |
1610 CommandOutput createCommandOutput(Command command, | 1624 CommandOutput createCommandOutput(Command command, |
1611 int exitCode, | 1625 int exitCode, |
1612 bool timedOut, | 1626 bool timedOut, |
1613 List<int> stdout, | 1627 List<int> stdout, |
1614 List<int> stderr, | 1628 List<int> stderr, |
1615 Duration time, | 1629 Duration time, |
1616 bool compilationSkipped) { | 1630 bool compilationSkipped, |
| 1631 [int pid = 0]) { |
1617 if (command is ContentShellCommand) { | 1632 if (command is ContentShellCommand) { |
1618 return new BrowserCommandOutputImpl( | 1633 return new BrowserCommandOutputImpl( |
1619 command, exitCode, timedOut, stdout, stderr, | 1634 command, exitCode, timedOut, stdout, stderr, |
1620 time, compilationSkipped); | 1635 time, compilationSkipped); |
1621 } else if (command is BrowserTestCommand) { | 1636 } else if (command is BrowserTestCommand) { |
1622 return new HTMLBrowserCommandOutputImpl( | 1637 return new HTMLBrowserCommandOutputImpl( |
1623 command, exitCode, timedOut, stdout, stderr, | 1638 command, exitCode, timedOut, stdout, stderr, |
1624 time, compilationSkipped); | 1639 time, compilationSkipped); |
1625 } else if (command is AnalysisCommand) { | 1640 } else if (command is AnalysisCommand) { |
1626 return new AnalysisCommandOutputImpl( | 1641 return new AnalysisCommandOutputImpl( |
1627 command, exitCode, timedOut, stdout, stderr, | 1642 command, exitCode, timedOut, stdout, stderr, |
1628 time, compilationSkipped); | 1643 time, compilationSkipped); |
1629 } else if (command is VmCommand) { | 1644 } else if (command is VmCommand) { |
1630 return new VmCommandOutputImpl( | 1645 return new VmCommandOutputImpl( |
1631 command, exitCode, timedOut, stdout, stderr, time); | 1646 command, exitCode, timedOut, stdout, stderr, time, pid); |
1632 } else if (command is CompilationCommand) { | 1647 } else if (command is CompilationCommand) { |
1633 return new CompilationCommandOutputImpl( | 1648 return new CompilationCommandOutputImpl( |
1634 command, exitCode, timedOut, stdout, stderr, time, compilationSkipped); | 1649 command, exitCode, timedOut, stdout, stderr, time, compilationSkipped); |
1635 } else if (command is JSCommandlineCommand) { | 1650 } else if (command is JSCommandlineCommand) { |
1636 return new JsCommandlineOutputImpl( | 1651 return new JsCommandlineOutputImpl( |
1637 command, exitCode, timedOut, stdout, stderr, time); | 1652 command, exitCode, timedOut, stdout, stderr, time); |
1638 } else if (command is PubCommand) { | 1653 } else if (command is PubCommand) { |
1639 return new PubCommandOutputImpl( | 1654 return new PubCommandOutputImpl( |
1640 command, exitCode, timedOut, stdout, stderr, time); | 1655 command, exitCode, timedOut, stdout, stderr, time); |
1641 } | 1656 } |
1642 | 1657 |
1643 return new CommandOutputImpl( | 1658 return new CommandOutputImpl( |
1644 command, exitCode, timedOut, stdout, stderr, | 1659 command, exitCode, timedOut, stdout, stderr, |
1645 time, compilationSkipped); | 1660 time, compilationSkipped, pid); |
1646 } | 1661 } |
1647 | 1662 |
1648 | 1663 |
1649 /** | 1664 /** |
1650 * A RunningProcess actually runs a test, getting the command lines from | 1665 * A RunningProcess actually runs a test, getting the command lines from |
1651 * its [TestCase], starting the test process (and first, a compilation | 1666 * its [TestCase], starting the test process (and first, a compilation |
1652 * process if the TestCase is a [BrowserTestCase]), creating a timeout | 1667 * process if the TestCase is a [BrowserTestCase]), creating a timeout |
1653 * timer, and recording the results in a new [CommandOutput] object, which it | 1668 * timer, and recording the results in a new [CommandOutput] object, which it |
1654 * attaches to the TestCase. The lifetime of the RunningProcess is limited | 1669 * attaches to the TestCase. The lifetime of the RunningProcess is limited |
1655 * to the time it takes to start the process, run the process, and record | 1670 * to the time it takes to start the process, run the process, and record |
1656 * the result; there are no pointers to it, so it should be available to | 1671 * the result; there are no pointers to it, so it should be available to |
1657 * be garbage collected as soon as it is done. | 1672 * be garbage collected as soon as it is done. |
1658 */ | 1673 */ |
1659 class RunningProcess { | 1674 class RunningProcess { |
1660 ProcessCommand command; | 1675 ProcessCommand command; |
1661 int timeout; | 1676 int timeout; |
1662 bool timedOut = false; | 1677 bool timedOut = false; |
1663 DateTime startTime; | 1678 DateTime startTime; |
1664 Timer timeoutTimer; | 1679 Timer timeoutTimer; |
| 1680 int pid; |
1665 List<int> stdout = <int>[]; | 1681 List<int> stdout = <int>[]; |
1666 List<int> stderr = <int>[]; | 1682 List<int> stderr = <int>[]; |
1667 bool compilationSkipped = false; | 1683 bool compilationSkipped = false; |
1668 Completer<CommandOutput> completer; | 1684 Completer<CommandOutput> completer; |
1669 | 1685 |
1670 RunningProcess(this.command, this.timeout); | 1686 RunningProcess(this.command, this.timeout); |
1671 | 1687 |
1672 Future<CommandOutput> run() { | 1688 Future<CommandOutput> run() { |
1673 completer = new Completer<CommandOutput>(); | 1689 completer = new Completer<CommandOutput>(); |
1674 startTime = new DateTime.now(); | 1690 startTime = new DateTime.now(); |
(...skipping 17 matching lines...) Expand all Loading... |
1692 StreamSubscription stdoutSubscription = | 1708 StreamSubscription stdoutSubscription = |
1693 _drainStream(process.stdout, stdout); | 1709 _drainStream(process.stdout, stdout); |
1694 StreamSubscription stderrSubscription = | 1710 StreamSubscription stderrSubscription = |
1695 _drainStream(process.stderr, stderr); | 1711 _drainStream(process.stderr, stderr); |
1696 | 1712 |
1697 var stdoutCompleter = new Completer(); | 1713 var stdoutCompleter = new Completer(); |
1698 var stderrCompleter = new Completer(); | 1714 var stderrCompleter = new Completer(); |
1699 | 1715 |
1700 bool stdoutDone = false; | 1716 bool stdoutDone = false; |
1701 bool stderrDone = false; | 1717 bool stderrDone = false; |
| 1718 pid = process.pid; |
1702 | 1719 |
1703 // This timer is used to close stdio to the subprocess once we got | 1720 // This timer is used to close stdio to the subprocess once we got |
1704 // the exitCode. Sometimes descendants of the subprocess keep stdio | 1721 // the exitCode. Sometimes descendants of the subprocess keep stdio |
1705 // handles alive even though the direct subprocess is dead. | 1722 // handles alive even though the direct subprocess is dead. |
1706 Timer watchdogTimer; | 1723 Timer watchdogTimer; |
1707 | 1724 |
1708 closeStdout([_]) { | 1725 closeStdout([_]) { |
1709 if (!stdoutDone) { | 1726 if (!stdoutDone) { |
1710 stdoutCompleter.complete(); | 1727 stdoutCompleter.complete(); |
1711 stdoutDone = true; | 1728 stdoutDone = true; |
1712 | |
1713 if (stderrDone && watchdogTimer != null) { | 1729 if (stderrDone && watchdogTimer != null) { |
1714 watchdogTimer.cancel(); | 1730 watchdogTimer.cancel(); |
1715 } | 1731 } |
1716 } | 1732 } |
1717 } | 1733 } |
1718 closeStderr([_]) { | 1734 closeStderr([_]) { |
1719 if (!stderrDone) { | 1735 if (!stderrDone) { |
1720 stderrCompleter.complete(); | 1736 stderrCompleter.complete(); |
1721 stderrDone = true; | 1737 stderrDone = true; |
1722 | 1738 |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1782 } | 1798 } |
1783 | 1799 |
1784 CommandOutput _createCommandOutput(ProcessCommand command, int exitCode) { | 1800 CommandOutput _createCommandOutput(ProcessCommand command, int exitCode) { |
1785 var commandOutput = createCommandOutput( | 1801 var commandOutput = createCommandOutput( |
1786 command, | 1802 command, |
1787 exitCode, | 1803 exitCode, |
1788 timedOut, | 1804 timedOut, |
1789 stdout, | 1805 stdout, |
1790 stderr, | 1806 stderr, |
1791 new DateTime.now().difference(startTime), | 1807 new DateTime.now().difference(startTime), |
1792 compilationSkipped); | 1808 compilationSkipped, |
| 1809 pid); |
1793 return commandOutput; | 1810 return commandOutput; |
1794 } | 1811 } |
1795 | 1812 |
1796 StreamSubscription _drainStream(Stream<List<int>> source, | 1813 StreamSubscription _drainStream(Stream<List<int>> source, |
1797 List<int> destination) { | 1814 List<int> destination) { |
1798 return source.listen(destination.addAll); | 1815 return source.listen(destination.addAll); |
1799 } | 1816 } |
1800 | 1817 |
1801 Map<String, String> _createProcessEnvironment() { | 1818 Map<String, String> _createProcessEnvironment() { |
1802 var environment = new Map.from(io.Platform.environment); | 1819 var environment = new Map.from(io.Platform.environment); |
(...skipping 1035 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2838 } | 2855 } |
2839 } | 2856 } |
2840 | 2857 |
2841 void eventAllTestsDone() { | 2858 void eventAllTestsDone() { |
2842 for (var listener in _eventListener) { | 2859 for (var listener in _eventListener) { |
2843 listener.allDone(); | 2860 listener.allDone(); |
2844 } | 2861 } |
2845 _allDone(); | 2862 _allDone(); |
2846 } | 2863 } |
2847 } | 2864 } |
OLD | NEW |